ISPN028502: Unknown alias - when Group By with advanced where clause
gregory.orciuch May 25, 2017 8:14 AMHi,
We do have a challenge with GroupBy using projections including not so complicated (but nasted field) WHERE conditions;
For example running this query (via Ickle or via DSL):
select min(_gen0.publicId) FROM Offering _gen0 WHERE (_gen0.imagesVTOList.name = 'MEN') GROUP BY _gen0.relationSetId
Results in having exception root cause (debug in ISPN server side)
[org.infinispan.query.dsl.embedded.impl.QueryEngine] (HotRod-ServerHandler-6-8) Building query 'select min(_gen0.publicId) FROM Offering _gen0 WHERE (_gen0.imagesVTOList.name = 'MEN') GROUP BY _gen0.relationSetId ' with parameters null
[org.infinispan.server.hotrod.HotRodExceptionHandler] (HotRod-ServerWorker-4-1) Exception caught: org.infinispan.objectfilter.ParsingException: ISPN028502: Unknown alias: imagesVTOList.
However, when removing grouping, query against nasted property inside imagesVTOList works very well. Query like that is very fine: 'select _gen0.publicId FROM Offering _gen0 WHERE (_gen0.imagesVTOList.name = 'MEN') ' - -OK.
Meaning it can understand nested field clause query, just grouping causes a problem that it lost an alias?
What I do wrong? or maybe, what is worse, such query is not supported.
I stepped into this infinispan/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/query at master · infinispan/infinispan · Git… but there is no grouping example on a List based WHERE.
Environment is like that:
1. Infinispan Server 9.0.0. Final. HotRod connector enabled.
2. RemoteCache client which fires above queries against the server over hotrod protocol; Proto schemas registered well, Other DSL queries which dont require grouping and projections work well.
3. Entities annotated with @ProtoField and @ProtoDoc
4. I've tried various combinations of below but now luck.
//@ProtoDoc("@Field(name=\"hierarchyTypes\",store = Store.YES, analyze = Analyze.NO)")
//@ProtoDoc("@IndexedEmbedded(prefix=\"bla\")")
//@ProtoDoc("@ContainedIn")
//@ProtoDoc("@IndexedEmbedded(includePaths = { \"name\" })")
//@ProtoDoc("@Field(store = Store.YES)")
//@ProtoDoc("@IndexedField")
5. Below I pasted full stack trace from server as well as samples of my entities;
Tagging anistor as author of tests in ispn and as author of QueryResolverDelegateImpl which thrown runtime execption at :101 because of empty map : Map<String, PropertyPath<TypeDescriptor<TypeMetadata>>> aliasToPropertyPath;
Thanks in advance for any help.
BR,
Gregory
----
0:47:49,546 DEBUG [org.infinispan.server.hotrod.HotRodExceptionHandler] (HotRod-ServerWorker-4-1) Exception caught: org.infinispan.objectfilter.ParsingException: ISPN028502: Unknown alias: imagesVTOList. at org.infinispan.objectfilter.impl.syntax.parser.QueryResolverDelegateImpl.normalizeUnqualifiedRoot(QueryResolverDelegateImpl.java:101) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.pathedPropertyReferenceSource(QueryResolver.java:7858) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.pathedPropertyReference(QueryResolver.java:7716) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.propertyReferencePath(QueryResolver.java:7567) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.propertyReferenceExpression(QueryResolver.java:5689) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.valueExpressionPrimary(QueryResolver.java:5495) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.valueExpression(QueryResolver.java:5271) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.rowValueConstructor(QueryResolver.java:4490) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.predicate(QueryResolver.java:3326) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.searchCondition(QueryResolver.java:2979) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.whereClause(QueryResolver.java:655) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.querySpec(QueryResolver.java:510) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.queryStatement(QueryResolver.java:379) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.queryStatementSet(QueryResolver.java:292) at org.infinispan.objectfilter.impl.ql.parse.QueryResolver.statement(QueryResolver.java:220) at org.infinispan.objectfilter.impl.ql.QueryParser.resolve(QueryParser.java:81) at org.infinispan.objectfilter.impl.ql.QueryParser.parseQuery(QueryParser.java:69) at org.infinispan.objectfilter.impl.syntax.parser.IckleParser.parse(IckleParser.java:19) at org.infinispan.query.dsl.embedded.impl.QueryEngine.lambda$parse$1(QueryEngine.java:663) at org.infinispan.query.dsl.embedded.impl.QueryCache.lambda$get$0(QueryCache.java:79) at org.infinispan.cache.impl.TypeConverterDelegatingAdvancedCache.lambda$convertFunction$1(TypeConverterDelegatingAdvancedCache.java:101) at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324) at org.infinispan.cache.impl.AbstractDelegatingCache.computeIfAbsent(AbstractDelegatingCache.java:343) at org.infinispan.cache.impl.TypeConverterDelegatingAdvancedCache.computeIfAbsent(TypeConverterDelegatingAdvancedCache.java:161) at org.infinispan.query.dsl.embedded.impl.QueryCache.get(QueryCache.java:79) at org.infinispan.query.dsl.embedded.impl.QueryEngine.parse(QueryEngine.java:663) at org.infinispan.query.dsl.embedded.impl.QueryEngine.buildQueryWithAggregations(QueryEngine.java:299) at org.infinispan.query.dsl.embedded.impl.QueryEngine.buildQuery(QueryEngine.java:139) at org.infinispan.query.dsl.embedded.impl.DelegatingQuery.createQuery(DelegatingQuery.java:91) at org.infinispan.query.dsl.embedded.impl.DelegatingQuery.list(DelegatingQuery.java:98) at org.infinispan.query.remote.impl.QueryFacadeImpl.makeResponse(QueryFacadeImpl.java:61) at org.infinispan.query.remote.impl.QueryFacadeImpl.query(QueryFacadeImpl.java:53) at org.infinispan.server.hotrod.HotRodServer.query(HotRodServer.java:116) at org.infinispan.server.hotrod.ContextHandler.realRead(ContextHandler.java:148) at org.infinispan.server.hotrod.ContextHandler.lambda$null$0(ContextHandler.java:59) at org.infinispan.security.Security.doAs(Security.java:143) at org.infinispan.server.hotrod.ContextHandler.lambda$channelRead0$1(ContextHandler.java:58) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:748)
and classses:
@ProtoDoc("@Indexed")
public class Offering implements Serializable {
private String name;
private List<String> imageUrl = new ArrayList<>();
private List<ImagesVTO> imagesVTOList = new ArrayList<>();
private Integer relationSetId;
@ProtoDoc("@Field(store = Store.YES, analyze = Analyze.YES)")
@ProtoField(number = 5, required = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ProtoField(number = 15, collectionImplementation = ArrayList.class)
public List<String> getImageUrl() {
return imageUrl;
}
public void setImageUrl(List<String> imageUrl) {
this.imageUrl = imageUrl;
}
@ProtoDoc("@Field(store = Store.YES)")
@ProtoField(number = 30, collectionImplementation = ArrayList.class)
public List<ImagesVTO> getImagesVTOList() {
return imagesVTOList;
}
public void setImagesVTOList(List<ImagesVTO> imagesVTOList) {
this.imagesVTOList = imagesVTOList;
}
@ProtoField(number = 44)
public Integer getRelationSetId() {
return relationSetId;
}
public void setRelationSetId(Integer relationSetId) {
this.relationSetId = relationSetId;
}
}
@ProtoDoc("@Indexed")
public class ImagesVTO implements Serializable {
private String name;
private List<String> images = new ArrayList<>();
@ProtoDoc("@Field(store = Store.YES)")
@ProtoField(number = 1, required = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ProtoField(number = 2, collectionImplementation = ArrayList.class)
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
}