Skip to content

Commit deba680

Browse files
committed
code cleanups in SqmBasicValuedSimplePath
1 parent e28bd8c commit deba680

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmBasicValuedSimplePath.java

+32-16
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.query.spi.QueryEngine;
1212
import org.hibernate.query.sqm.UnknownPathException;
1313
import org.hibernate.query.sqm.function.SelfRenderingSqmFunction;
14+
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
1415
import org.hibernate.query.sqm.tree.expression.SqmExpression;
1516
import org.hibernate.query.sqm.tree.from.SqmFrom;
1617
import org.hibernate.spi.NavigablePath;
@@ -98,31 +99,43 @@ public SqmPath<?> resolveIndexedAccess(
9899
SqmExpression<?> selector,
99100
boolean isTerminal,
100101
SqmCreationState creationState) {
101-
final SqmPathRegistry pathRegistry = creationState.getCurrentProcessingState().getPathRegistry();
102+
final SqmPathRegistry pathRegistry =
103+
creationState.getCurrentProcessingState().getPathRegistry();
102104
final String alias = selector.toHqlString();
103-
final NavigablePath navigablePath = getNavigablePath().getParent().append(
104-
CollectionPart.Nature.ELEMENT.getName(),
105-
alias
106-
);
105+
final NavigablePath navigablePath =
106+
getNavigablePath().getParent()
107+
.append( CollectionPart.Nature.ELEMENT.getName(), alias );
107108
final SqmFrom<?, ?> indexedPath = pathRegistry.findFromByPath( navigablePath );
108109
if ( indexedPath != null ) {
109110
return indexedPath;
110111
}
111-
final DomainType<T> sqmPathType = getNodeType().getPathType();
112-
final QueryEngine queryEngine = creationState.getCreationContext().getQueryEngine();
113-
final SelfRenderingSqmFunction<?> result;
112+
else {
113+
final SqmFunctionPath<Object> path =
114+
new SqmFunctionPath<>(
115+
getIndexFunction(
116+
selector,
117+
getNodeType().getPathType(),
118+
creationState.getCreationContext().getQueryEngine()
119+
)
120+
);
121+
pathRegistry.register( path );
122+
return path;
123+
}
124+
}
125+
126+
private SelfRenderingSqmFunction<?> getIndexFunction(
127+
SqmExpression<?> selector, DomainType<T> sqmPathType, QueryEngine queryEngine) {
128+
final SqmFunctionRegistry registry = queryEngine.getSqmFunctionRegistry();
114129
if ( sqmPathType instanceof BasicPluralType<?, ?> ) {
115-
result = queryEngine.getSqmFunctionRegistry()
116-
.findFunctionDescriptor( "array_get" )
130+
return registry.findFunctionDescriptor( "array_get" )
117131
.generateSqmExpression(
118132
asList( this, selector ),
119133
null,
120134
queryEngine
121135
);
122136
}
123-
else if ( sqmPathType.resolveExpressible( nodeBuilder() ).getRelationalJavaType().getJavaTypeClass() == String.class ) {
124-
result = queryEngine.getSqmFunctionRegistry()
125-
.findFunctionDescriptor( "substring" )
137+
else if ( getJavaTypeClass( sqmPathType ) == String.class ) {
138+
return registry.findFunctionDescriptor( "substring" )
126139
.generateSqmExpression(
127140
asList( this, selector, nodeBuilder().literal( 1 ) ),
128141
nodeBuilder().getCharacterType(),
@@ -132,9 +145,12 @@ else if ( sqmPathType.resolveExpressible( nodeBuilder() ).getRelationalJavaType(
132145
else {
133146
throw new UnsupportedOperationException( "Index access is only supported for basic plural and string types, but got: " + sqmPathType );
134147
}
135-
final SqmFunctionPath<Object> path = new SqmFunctionPath<>( result );
136-
pathRegistry.register( path );
137-
return path;
148+
}
149+
150+
private Class<?> getJavaTypeClass(DomainType<T> sqmPathType) {
151+
return sqmPathType.resolveExpressible( nodeBuilder() )
152+
.getRelationalJavaType()
153+
.getJavaTypeClass();
138154
}
139155

140156

0 commit comments

Comments
 (0)