docs: 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 );
  	}