public void resolve(boolean generateJoin, boolean implicitJoin, String classAlias, AST parent, AST parentPredicate) { if (!isResolved()) { if ( getWalker().getCurrentFromClause().isFromElementAlias( getText() ) ) { FromElement fromElement = getWalker().getCurrentFromClause().getFromElement( getText() ); if ( fromElement.getQueryableCollection() != null && fromElement.getQueryableCollection().getElementType().isComponentType() ) { if ( getWalker().isInSelect() ) { setFromElement( fromElement ); super.setDataType( fromElement.getQueryableCollection().getElementType() ); this.columns = resolveColumns( fromElement.getQueryableCollection() ); initText( getColumns() ); setFirstChild( null ); resolveAsAlias(); else if ( resolveAsAlias() ) { setResolved(); getColumns() != null && ( getWalker().getAST() instanceof AbstractMapComponentNode || getWalker().getAST() instanceof IndexNode ) && getWalker().getCurrentFromClause().isFromElementAlias( getOriginalText() ) ) { setText( getOriginalText() ); if ( resolveAsAlias() ) { setResolved(); DotNode dot = (DotNode) parent; if (parent.getFirstChild() == this) { if (resolveAsNakedComponentPropertyRefLHS(dot)) {
if (!(isResolved() && nakedPropertyRef)) { throw new UnsupportedOperationException(); String propertyName = getOriginalText(); if (!getDataType().isCollectionType()) { throw new SemanticException("Collection expected; [" + propertyName + "] does not refer to a collection property"); CollectionType type = (CollectionType) getDataType(); String role = type.getRole(); QueryableCollection queryableCollection = getSessionFactoryHelper().requireQueryableCollection(role); String columnTableAlias = getFromElement().getTableAlias(); JoinType joinType = JoinType.INNER_JOIN; boolean fetch = false; getWalker().getCurrentFromClause(), getFromElement(), propertyName, alias, getFromElement().toColumns(columnTableAlias, propertyName, false), true ); FromElement elem = factory.createCollection(queryableCollection, role, joinType, fetch, true); setFromElement(elem); getWalker().addQuerySpaces(queryableCollection.getCollectionSpaces()); // Always add the collection's query spaces.
private DereferenceType resolveAsNakedPropertyRef() { FromElement fromElement = locateSingleFromElement(); if (fromElement == null) { return DereferenceType.UNKNOWN; } Queryable persister = fromElement.getQueryable(); if (persister == null) { return DereferenceType.UNKNOWN; } Type propertyType = getNakedPropertyType(fromElement); if (propertyType == null) { // assume this ident's text does *not* refer to a property on the given persister return DereferenceType.UNKNOWN; } if ((propertyType.isComponentType() || propertyType.isAssociationType() )) { return DereferenceType.COMPONENT_REF; } setFromElement(fromElement); String property = getText(); String[] columns = getWalker().isSelectStatement() ? persister.toColumns(fromElement.getTableAlias(), property) : persister.toColumns(property); String text = String.join(", ", columns); setText(columns.length == 1 ? text : "(" + text + ")"); setType(SqlTokenTypes.SQL_TOKEN); // these pieces are needed for usage in select clause super.setDataType(propertyType); nakedPropertyRef = true; return DereferenceType.PROPERTY_REF; }
@Override public String getDisplayText() { StringBuilder buf = new StringBuilder(); if (getType() == SqlTokenTypes.ALIAS_REF) { buf.append("{alias=").append(getOriginalText()); if (getFromElement() == null) { buf.append(", no from element"); } else { buf.append(", className=").append(getFromElement().getClassName()); buf.append(", tableAlias=").append(getFromElement().getTableAlias()); } buf.append("}"); } else { buf.append( "{originalText=" ).append( getOriginalText() ).append( "}" ); } return buf.toString(); }
private boolean resolveAsNakedComponentPropertyRefRHS(DotNode parent) { FromElement fromElement = locateSingleFromElement(); if (fromElement == null) { return false; } Type propertyType; String propertyPath = parent.getLhs().getText() + "." + getText(); try { // check to see if our "propPath" actually // represents a property on the persister propertyType = fromElement.getPropertyType(getText(), propertyPath); } catch (Throwable t) { // assume we do *not* refer to a property on the given persister return false; } setFromElement(fromElement); // this piece is needed for usage in select clause super.setDataType(propertyType); nakedPropertyRef = true; return true; }
public void resolve(boolean generateJoin, boolean implicitJoin, String classAlias, AST parent) { if (!isResolved()) { if (getWalker().getCurrentFromClause().isFromElementAlias(getText())) { if (resolveAsAlias()) { setResolved(); DotNode dot = (DotNode) parent; if (parent.getFirstChild() == this) { if (resolveAsNakedComponentPropertyRefLHS(dot)) { setResolved(); if (resolveAsNakedComponentPropertyRefRHS(dot)) { setResolved(); int result = resolveAsNakedPropertyRef(); if (result == PROPERTY_REF) { setResolved(); if (!isResolved()) { try { getWalker().getLiteralProcessor().processConstant(this, false);
private boolean resolveAsNakedComponentPropertyRefLHS(DotNode parent) { FromElement fromElement = locateSingleFromElement(); if (fromElement == null) { return false; } Type componentType = getNakedPropertyType(fromElement); if ( componentType == null ) { throw new QueryException( "Unable to resolve path [" + parent.getPath() + "], unexpected token [" + getOriginalText() + "]" ); } if (!componentType.isComponentType()) { throw new QueryException("Property '" + getOriginalText() + "' is not a component. Use an alias to reference associations or collections."); } Type propertyType; String propertyPath = getText() + "." + getNextSibling().getText(); try { // check to see if our "propPath" actually // represents a property on the persister propertyType = fromElement.getPropertyType(getText(), propertyPath); } catch (Throwable t) { // assume we do *not* refer to a property on the given persister return false; } setFromElement(fromElement); parent.setPropertyPath(propertyPath); parent.setDataType(propertyType); return true; }
private boolean resolveAsAlias() { final String alias = getText(); final FromElement element = getWalker().getCurrentFromClause().getFromElement( alias ); if ( element == null ) { return false; element.applyTreatAsDeclarations( getWalker().getTreatAsDeclarationsByPath( alias ) ); setType( SqlTokenTypes.ALIAS_REF ); setFromElement( element ); final Dialect dialect = getWalker().getSessionFactoryHelper().getFactory().getDialect(); final boolean isInCount = getWalker().isInCount(); final boolean isInDistinctCount = isInCount && getWalker().isInCountDistinct(); final boolean isInNonDistinctCount = isInCount && ! getWalker().isInCountDistinct(); final boolean isCompositeValue = columnExpressions.length > 1; if ( isCompositeValue ) { if ( isInNonDistinctCount && ! dialect.supportsTupleCounts() ) { setText( columnExpressions[0] ); (isInDistinctCount && ! dialect.requiresParensForTupleDistinctCounts()) || isInNonDistinctCount || getWalker().getCurrentTopLevelClauseType() == HqlSqlTokenTypes.ORDER || getWalker().getCurrentTopLevelClauseType() == HqlSqlTokenTypes.GROUP; if ( ! shouldSkipWrappingInParenthesis ) { joinedFragment = "(" + joinedFragment + ")"; setText( joinedFragment );
@Override public Type getDataType() { Type type = super.getDataType(); if ( type != null ) { return type; } FromElement fe = getFromElement(); if ( fe != null ) { return fe.getDataType(); } SQLFunction sf = getWalker().getSessionFactoryHelper().findSQLFunction( getText() ); if ( sf != null ) { return sf.getReturnType( null, getWalker().getSessionFactoryHelper().getFactory() ); } return null; }
private Type getNakedPropertyType(FromElement fromElement) { if (fromElement == null) { return null; } String property = getOriginalText(); Type propertyType = null; try { propertyType = fromElement.getPropertyType(property, property); } catch (Throwable ignore) { } return propertyType; }
public void setScalarColumnText(int i) throws SemanticException { if (nakedPropertyRef) { // do *not* over-write the column text, as that has already been // "rendered" during resolve ColumnHelper.generateSingleScalarColumn(this, i); } else { FromElement fe = getFromElement(); if (fe != null) { setText(fe.renderScalarIdentifierSelect(i)); } else { ColumnHelper.generateSingleScalarColumn(this, i); } } }
public void setScalarColumnText(int i) throws SemanticException { if (nakedPropertyRef) { // do *not* over-write the column text, as that has already been // "rendered" during resolve ColumnHelper.generateSingleScalarColumn(this, i); } else { FromElement fe = getFromElement(); if (fe != null) { if ( fe.getQueryableCollection() != null && fe.getQueryableCollection().getElementType().isComponentType() ) { ColumnHelper.generateScalarColumns( this, getColumns(), i ); } else { setText(fe.renderScalarIdentifierSelect(i)); } } else { ColumnHelper.generateSingleScalarColumn(this, i); } } }
protected String[] resolveColumns(QueryableCollection collectionPersister) { final FromElement fromElement = getFromElement(); return fromElement.toColumns( fromElement.getCollectionTableAlias(), "elements", // the JPA VALUE "qualifier" is the same concept as the HQL ELEMENTS function/property getWalker().isInSelect() ); }
private FromElement locateSingleFromElement() { List fromElements = getWalker().getCurrentFromClause().getFromElements(); if (fromElements == null || fromElements.size() != 1) { // TODO : should this be an error? return null; } FromElement element = (FromElement) fromElements.get(0); if (element.getClassAlias() != null) { // naked property-refs cannot be used with an aliased from element return null; } return element; }
final String typeName = typeNode.getText(); this.castType = getSessionFactoryHelper().getFactory().getTypeResolver().heuristicType( typeName ); if ( castType == null ) {
public void resolve(boolean generateJoin, boolean implicitJoin, String classAlias, AST parent) { if (!isResolved()) { if (getWalker().getCurrentFromClause().isFromElementAlias(getText())) { if (resolveAsAlias()) { setResolved(); DotNode dot = (DotNode) parent; if (parent.getFirstChild() == this) { if (resolveAsNakedComponentPropertyRefLHS(dot)) { setResolved(); if (resolveAsNakedComponentPropertyRefRHS(dot)) { setResolved(); int result = resolveAsNakedPropertyRef(); if (result == PROPERTY_REF) { setResolved(); if (!isResolved()) { try { getWalker().getLiteralProcessor().processConstant(this, false);
private boolean resolveAsNakedComponentPropertyRefLHS(DotNode parent) { FromElement fromElement = locateSingleFromElement(); if (fromElement == null) { return false; } Type componentType = getNakedPropertyType(fromElement); if ( componentType == null ) { throw new QueryException( "Unable to resolve path [" + parent.getPath() + "], unexpected token [" + getOriginalText() + "]" ); } if (!componentType.isComponentType()) { throw new QueryException("Property '" + getOriginalText() + "' is not a component. Use an alias to reference associations or collections."); } Type propertyType = null; // used to set the type of the parent dot node String propertyPath = getText() + "." + getNextSibling().getText(); try { // check to see if our "propPath" actually // represents a property on the persister propertyType = fromElement.getPropertyType(getText(), propertyPath); } catch (Throwable t) { // assume we do *not* refer to a property on the given persister return false; } setFromElement(fromElement); parent.setPropertyPath(propertyPath); parent.setDataType(propertyType); return true; }
private boolean resolveAsAlias() { // This is not actually a constant, but a reference to FROM element. FromElement element = getWalker().getCurrentFromClause().getFromElement(getText()); if (element != null) { setFromElement(element); setText(element.getIdentityColumn()); setType(SqlTokenTypes.ALIAS_REF); return true; } return false; }
@Override public String getDisplayText() { StringBuffer buf = new StringBuffer(); if (getType() == SqlTokenTypes.ALIAS_REF) { buf.append("{alias=").append(getOriginalText()); if (getFromElement() == null) { buf.append(", no from element"); } else { buf.append(", className=").append(getFromElement().getClassName()); buf.append(", tableAlias=").append(getFromElement().getTableAlias()); } buf.append("}"); } else { buf.append("{originalText=" + getOriginalText()).append("}"); } return buf.toString(); }