private TypeDiscriminatorMetadata buildTypeDiscriminatorMetadata() { final String aliasToUse = getTableAlias(); Queryable queryable = getQueryable(); if ( queryable == null ) { QueryableCollection collection = getQueryableCollection(); if ( ! collection.getElementType().isEntityType() ) { throw new QueryException( "type discrimination cannot be applied to value collection [" + collection.getRole() + "]" ); } queryable = (Queryable) collection.getElementPersister(); } handlePropertyBeingDereferenced( getDataType(), DISCRIMINATOR_PROPERTY_NAME ); return new TypeDiscriminatorMetadataImpl( queryable.getTypeDiscriminatorMetadata(), aliasToUse ); }
for ( int i = 0; i < length; i++ ) { FromElement collectionFromElement = (FromElement) collectionFromElements.get( i ); collectionPersisters[i] = collectionFromElement.getQueryableCollection(); collectionOwners[i] = fromElementList.indexOf( collectionFromElement.getOrigin() ); collectionSuffixes[i] = collectionFromElement.getCollectionSuffix(); entityPersisters[i] = (Queryable) element.getEntityPersister(); throw new IllegalStateException( "No entity persister for " + element.toString() ); entityEagerPropertyFetches[i] = element.isAllPropertyFetch(); sqlAliases[i] = element.getTableAlias(); entityAliases[i] = element.getClassAlias(); sqlAliasByEntityAlias.put( entityAliases[i], sqlAliases[i] ); includeInSelect[i] = !element.isFetch(); if ( includeInSelect[i] ) { selectLength++; if ( element.isFetch() ) { if ( element.isCollectionJoin() || element.getQueryableCollection() != null ) { else if ( element.getDataType().isEntityType() ) { EntityType entityType = (EntityType) element.getDataType(); if ( entityType.isOneToOne() ) { owners[i] = fromElementList.indexOf( element.getOrigin() );
@Override public String getDisplayText() { StringBuilder buf = new StringBuilder(); FromElement fromElement = getFromElement(); buf.append( "{propertyName=" ).append( propertyName ); buf.append( ",dereferenceType=" ).append( dereferenceType.name() ); buf.append( ",getPropertyPath=" ).append( propertyPath ); buf.append( ",path=" ).append( getPath() ); if ( fromElement != null ) { buf.append( ",tableAlias=" ).append( fromElement.getTableAlias() ); buf.append( ",className=" ).append( fromElement.getClassName() ); buf.append( ",classAlias=" ).append( fromElement.getClassAlias() ); } else { buf.append( ",no from element" ); } buf.append( '}' ); return buf.toString(); }
@Override public boolean include(AST node) { FromElement fromElement = (FromElement) node; return fromElement.isFetch() && fromElement.getQueryableCollection() != null; } };
public FromElement getFetchOrigin() { if ( origin == null ) { return null; } if ( !origin.isFetch() ) { return origin; } if ( origin.getText() == null || "".equals( origin.getText() ) ) { return origin.getFetchOrigin(); } return origin; }
public FromElement getRealOrigin() { if ( origin == null ) { return null; } if ( origin.getText() == null || "".equals( origin.getText() ) ) { return origin.getRealOrigin(); } return origin; }
String joinPath) throws SemanticException { FromElement elem = createJoin( entityClass, tableAlias, joinSequence, type, false ); elem.setFetch( fetchFlag ); elem.applyTreatAsDeclarations( fromClause.getWalker().getTreatAsDeclarationsByPath( joinPath ) ); EntityPersister entityPersister = elem.getEntityPersister(); int numberOfTables = entityPersister.getQuerySpaces().length; if ( numberOfTables > 1 && implied && !elem.useFromFragment() ) { LOG.debug( "createEntityJoin() : Implied multi-table entity join" ); elem.setUseFromFragment( true ); elem.setUseFromFragment( true ); elem.setImpliedInFromClause( true ); if ( elem.getWalker().isSubQuery() ) { if ( elem.getFromClause() != elem.getOrigin().getFromClause() || elem.setType( FROM_FRAGMENT ); joinSequence.setUseThetaStyle( true ); elem.setUseFromFragment( false ); elem.setRole( role );
protected void appendDisplayText(StringBuilder buf) { buf.append( isImplied() ? ( isImpliedInFromClause() ? "implied in FROM clause" : "implied" ) : "explicit" ); buf.append( "," ).append( isCollectionJoin() ? "collection join" : "not a collection join" ); buf.append( "," ).append( fetch ? "fetch join" : "not a fetch join" ); buf.append( "," ).append( isAllPropertyFetch ? "fetch all properties" : "fetch non-lazy properties" ); buf.append( ",classAlias=" ).append( getClassAlias() ); buf.append( ",role=" ).append( role ); buf.append( ",tableName=" ).append( getTableName() ); buf.append( ",tableAlias=" ).append( getTableAlias() ); FromElement origin = getRealOrigin(); buf.append( ",origin=" ).append( origin == null ? "null" : origin.getText() ); buf.append( ",columns={" ); if ( columns != null ) { for ( int i = 0; i < columns.length; i++ ) { buf.append( columns[i] ); if ( i < columns.length ) { buf.append( " " ); } } } buf.append( ",className=" ).append( className ); buf.append( "}" ); }
private void prepareAnyImplicitJoins(DotNode dotNode) throws SemanticException { if ( dotNode.getLhs() instanceof DotNode ) { DotNode lhs = (DotNode) dotNode.getLhs(); FromElement lhsOrigin = lhs.getFromElement(); if ( lhsOrigin != null && "".equals( lhsOrigin.getText() ) ) { String lhsOriginText = lhsOrigin.getQueryable().getTableName() + " " + lhsOrigin.getTableAlias(); lhsOrigin.setText( lhsOriginText ); } prepareAnyImplicitJoins( lhs ); } }
if ( fromElement.isFetch() ) { FromElement origin = null; if ( fromElement.getRealOrigin() == null ) { if ( fromElement.getOrigin() == null ) { throw new QueryException( "Unable to determine origin of join fetch [" + fromElement.getDisplayText() + "]" ); origin = fromElement.getOrigin(); origin = fromElement.getRealOrigin(); && ( !fromElement.isCollectionJoin() || !fromElementsForLoad.contains( fromElement.getFetchOrigin() ) ) ) { throw new QueryException( "query specified join fetching, but the owner " + "of the fetched association was not present in the select list " + "[" + fromElement.getDisplayText() + "]" ); Type type = fromElement.getSelectType(); addCollectionFromElement( fromElement ); if ( type != null ) { boolean collectionOfElements = fromElement.isCollectionOfValuesOrComponents(); if ( !collectionOfElements ) { fromElement.setIncludeSubclasses( true ); fromElementsForLoad.add( fromElement ); String text = fromElement.renderIdentifierSelect( size, k ); alreadyRenderedIdentifiers.add( text );
private boolean isMultiTable() { // should be safe to only ever expect EntityPersister references here return fromElement.getQueryable() != null && fromElement.getQueryable().isMultiTable(); }
private void addJoinNodes(QueryNode query, JoinSequence join, FromElement fromElement) { JoinFragment joinFragment = join.toJoinFragment( walker.getEnabledFilters(), fromElement.useFromFragment() || fromElement.isDereferencedBySuperclassOrSubclassProperty(), fromElement.getWithClauseFragment(), fromElement.getWithClauseJoinAlias() ); if ( fromElement.getType() == JOIN_FRAGMENT && ( join.isThetaStyle() || StringHelper.isNotEmpty( whereFrag ) ) ) { fromElement.setType( FROM_FRAGMENT ); fromElement.getJoinSequence().setUseThetaStyle( true ); // this is used during SqlGenerator processing if ( fromElement.useFromFragment() /*&& StringHelper.isNotEmpty( frag )*/ ) { String fromFragment = processFromFragment( frag, join ).trim(); LOG.debugf( "Using FROM fragment [%s]", fromFragment );
if ( fromElement.getOrigin() == null ) { owner = fromElement; break; if ( primaryOrdering != null ) { String [] idColNames = owner.getQueryable().getIdentifierColumnNames(); String expectedPrimaryOrderSeq = String.join( ", ", StringHelper.qualify( owner.getTableAlias(), idColNames ) ); if ( !primaryOrdering.getText().startsWith( expectedPrimaryOrderSeq ) ) {
public static MapKeyEntityFromElement buildKeyJoin(FromElement collectionFromElement) { final HqlSqlWalker walker = collectionFromElement.getWalker(); final SessionFactoryHelper sfh = walker.getSessionFactoryHelper(); final SessionFactoryImplementor sf = sfh.getFactory(); final QueryableCollection collectionPersister = collectionFromElement.getQueryableCollection(); final Type indexType = collectionPersister.getIndexType(); if ( indexType == null ) { final boolean useThetaJoin = collectionFromElement.getJoinSequence().isThetaStyle(); join.initialize( collectionFromElement.getWalker() ); collectionFromElement.getFromClause(), indexEntityPersister.getEntityName(), indexEntityPersister, indexEntityType, "<map-key-join-" + collectionFromElement.getClassAlias() + ">", rhsAlias ); String[] joinColumns = collectionPersister.getIndexColumnNames( collectionFromElement.getCollectionTableAlias() ); collectionFromElement.getJoinSequence().getFirstJoin().getJoinType(), joinColumns ); join.setUseFromFragment( collectionFromElement.useFromFragment() ); join.setUseWhereFragment( collectionFromElement.useWhereFragment() );
lhsFromElement = lhsFromElement.getOrigin(); final Queryable persister = lhsFromElement.getQueryable(); if ( persister.isMultiTable() ) { useAlias = true; final String lhsTableName = lhsFromElement.getQueryable().getTableName(); columns = getFromElement().toColumns( lhsTableName, propertyPath, false, true ); elem.setText( "" ); elem.setUseWhereFragment( false ); EntityPersister entityPersister = elem.getEntityPersister(); if ( entityPersister != null ) { getWalker().addQuerySpaces( entityPersister.getQuerySpaces() );
final String className = origin.getClassName(); final String classAlias = origin.getClassAlias(); final String originTableAlias = origin.getTableAlias(); final Type propertyType = origin.getPropertyType( attributeName, attributeName ); final EntityType entityType = (EntityType) propertyType; final String[] columns = origin.toColumns( originTableAlias, attributeName, false ); final String tableAlias = walker.getAliasGenerator().createName( entityType.getAssociatedEntityName() final String[] columns = origin.toColumns( originTableAlias, attributeName, false ); fromElement.setInProjectionList( true ); fromElement.setFetch( true );
if (LOG.isDebugEnabled()) LOG.debugf("dereferenceEntityJoin() : generating join for %s in %s (%s) parent = %s", propertyName, getFromElement().getClassName(), classAlias == null ? "<no alias>" : classAlias, ASTUtil.getDebugString(parent)); boolean useFoundFromElement = found && ( elem.isImplied() || areSame( classAlias, elem.getClassAlias() ) ); lhsFromElement = lhsFromElement.getOrigin(); getWalker().addQuerySpaces( elem.getEntityPersister().getQuerySpaces() );
private void addJoinNodes(QueryNode query, JoinSequence join, FromElement fromElement) { JoinFragment joinFragment = join.toJoinFragment( walker.getEnabledFilters(), fromElement.useFromFragment() || fromElement.isDereferencedBySuperclassOrSubclassProperty(), fromElement.getWithClauseFragment() ); if ( fromElement.getType() == JOIN_FRAGMENT && ( join.isThetaStyle() || StringHelper.isNotEmpty( whereFrag ) ) ) { fromElement.setType( FROM_FRAGMENT ); fromElement.getJoinSequence().setUseThetaStyle( true ); // this is used during SqlGenerator processing if ( fromElement.useFromFragment() || ( fromElement.getFromClause().isSubQuery() && fromElement.isDereferencedBySuperclassOrSubclassProperty() ) /*&& StringHelper.isNotEmpty( frag )*/ ) { String fromFragment = processFromFragment( frag, join ).trim(); LOG.debugf( "Using FROM fragment [%s]", fromFragment );
text = fromElement.renderPropertySelect( nonscalarSize, k ); text = fromElement.renderMapEntryPropertySelectFragment( nonscalarSize, k ); text = fromElement.renderPropertySelect( nonscalarSize, k ); if ( fromElement.getQueryableCollection() != null && fromElement.isFetch() ) { String subText1 = fromElement.renderCollectionSelectFragment( nonscalarSize, k ); appender.append( SqlTokenTypes.SQL_TOKEN, subText1, false ); while ( itr.hasNext() ) { FromElement child = (FromElement) itr.next(); if ( child.isCollectionOfValuesOrComponents() && child.isFetch() ) { final String subText2 = child.renderValueCollectionSelectFragment( nonscalarSize, nonscalarSize + k ); appender.append( SqlTokenTypes.SQL_TOKEN, subText2, false );
public void setOrigin(FromElement origin, boolean manyToMany) { this.origin = origin; this.manyToMany = manyToMany; origin.addDestination( this ); if ( origin.getFromClause() == this.getFromClause() ) { // TODO: Figure out a better way to get the FROM elements in a proper tree structure. // If this is not the destination of a many-to-many, add it as a child of the origin. if ( manyToMany ) { ASTUtil.appendSibling( origin, this ); } else { if ( !getWalker().isInFrom() && !getWalker().isInSelect() && !getWalker().isInEntityGraph() ) { getFromClause().addChild( this ); } else { origin.addChild( this ); } } } else if ( !getWalker().isInFrom() ) { // HHH-276 : implied joins in a subselect where clause - The destination needs to be added // to the destination's from clause. getFromClause().addChild( this ); // Not sure if this is will fix everything, but it works. } else { // Otherwise, the destination node was implied by the FROM clause and the FROM clause processor // will automatically add it in the right place. } }