in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/query/parsing/impl/Neo4jPropertyHelper.java [71:131]
public PropertyIdentifier getPropertyIdentifier(String entityType, List<String> propertyPath, int requiredDepth) {
// we analyze the property path to find all the associations/embedded which are in the way and create proper
// aliases for them
String entityAlias = aliasResolver.findAliasForType( entityType );
String propertyEntityType = entityType;
String propertyAlias = entityAlias;
String propertyName;
List<String> currentPropertyPath = new ArrayList<>();
List<String> lastAssociationPath = Collections.emptyList();
OgmEntityPersister currentPersister = getPersister( entityType );
boolean isLastElementAssociation = false;
int depth = 1;
for ( String property : propertyPath ) {
currentPropertyPath.add( property );
Type currentPropertyType = getPropertyType( entityType, currentPropertyPath );
// determine if the current property path is still part of requiredPropertyMatch
boolean optionalMatch = depth > requiredDepth;
if ( currentPropertyType.isAssociationType() ) {
AssociationType associationPropertyType = (AssociationType) currentPropertyType;
Joinable associatedJoinable = associationPropertyType.getAssociatedJoinable( getSessionFactory() );
if ( associatedJoinable.isCollection()
&& !( (OgmCollectionPersister) associatedJoinable ).getType().isEntityType() ) {
// we have a collection of embedded
propertyAlias = aliasResolver.createAliasForEmbedded( entityAlias, currentPropertyPath, optionalMatch );
}
else {
propertyEntityType = associationPropertyType.getAssociatedEntityName( getSessionFactory() );
currentPersister = getPersister( propertyEntityType );
String targetNodeType = currentPersister.getEntityKeyMetadata().getTable();
propertyAlias = aliasResolver.createAliasForAssociation( entityAlias, currentPropertyPath, targetNodeType, optionalMatch );
lastAssociationPath = new ArrayList<>( currentPropertyPath );
isLastElementAssociation = true;
}
}
else if ( currentPropertyType.isComponentType()
&& !isIdProperty( currentPersister, propertyPath.subList( lastAssociationPath.size(), propertyPath.size() ) ) ) {
// we are in the embedded case and the embedded is not the id of the entity (the id is stored as normal
// properties)
propertyAlias = aliasResolver.createAliasForEmbedded( entityAlias, currentPropertyPath, optionalMatch );
}
else {
isLastElementAssociation = false;
}
depth++;
}
if ( isLastElementAssociation ) {
// even the last element is an association, we need to find a suitable identifier property
propertyName = getSessionFactory().getMetamodel().entityPersister( propertyEntityType ).getIdentifierPropertyName();
}
else {
// the last element is a property so we can build the test with this property
propertyName = getColumnName( propertyEntityType, propertyPath.subList( lastAssociationPath.size(), propertyPath.size() ) );
}
return new PropertyIdentifier( propertyAlias, propertyName );
}