public void resolveCollectionProperty(AST expr) throws SemanticException { String propertyName = CollectionProperties.getNormalizedPropertyName(getMethodName()); if (expr instanceof FromReferenceNode) { FromReferenceNode collectionNode = (FromReferenceNode) expr; // If this is 'elements' then create a new FROM element. if (CollectionPropertyNames.COLLECTION_ELEMENTS.equals(propertyName)) { handleElements(collectionNode, propertyName); } else { // Not elements(x) fromElement = collectionNode.getFromElement(); setDataType(fromElement.getPropertyType(propertyName, propertyName)); selectColumns = fromElement.toColumns(fromElement.getTableAlias(), propertyName, inSelect); } if (collectionNode instanceof DotNode) { prepareAnyImplicitJoins((DotNode) collectionNode); } if (!inSelect) { fromElement.setText(""); fromElement.setUseWhereFragment(false); } prepareSelectColumns(selectColumns); setText(selectColumns[0]); setType(SqlTokenTypes.SQL_TOKEN); } else { throw new SemanticException( "Unexpected expression " + expr + " found for collection function " + propertyName); } }
private void handleElements(FromReferenceNode collectionNode, String propertyName) { FromElement collectionFromElement = collectionNode.getFromElement(); QueryableCollection queryableCollection = collectionFromElement.getQueryableCollection(); String path = collectionNode.getPath() + "[]." + propertyName; log.debug("Creating elements for " + path); fromElement = collectionFromElement; if (!collectionFromElement.isCollectionOfValuesOrComponents()) { getWalker().addQuerySpaces(queryableCollection.getElementPersister().getQuerySpaces()); } setDataType(queryableCollection.getElementType()); selectColumns = collectionFromElement.toColumns(fromElement.getTableAlias(), propertyName, inSelect); }