@Override
public Expression visit(PathExpression expression) {
if (expression.getBaseNode() == null) {
Expression aliasedExpression = ((SelectInfo) aliasManager.getAliasInfo(expression.toString())).getExpression();
Expression newExpression = aliasedExpression.accept(this);
return aliasedExpression == newExpression ? expression : newExpression;
}
if (expression == expressionToSplit) {
List<PathElementExpression> expressions = new ArrayList<>(expression.getExpressions());
for (String subAttributePart : subAttribute.split("\\.")) {
expressions.add(new PropertyExpression(subAttributePart));
}
String field;
if (expression.getField() == null) {
field = subAttribute;
} else {
field = expression.getField() + "." + subAttribute;
}
JoinNode node = (JoinNode) expression.getBaseNode();
Class<?> fieldClass = jpaProvider.getJpaMetamodelAccessor().getAttributePath(metamodel, node.getManagedType(), field).getAttributeClass();
Type<?> fieldType = metamodel.type(fieldClass);
return new PathExpression(
expressions,
new SimplePathReference(node, field, fieldType),
expression.isUsedInCollectionFunction(),
expression.isCollectionKeyPath()
);
}
return expression;
}