You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@lucene.apache.org by "Thomas Taroni (Jira)" <ji...@apache.org> on 2020/06/27 20:35:00 UTC

[jira] [Comment Edited] (SOLR-14601) Using [child] and [subquery] DocTransformer / FieldList

    [ https://issues.apache.org/jira/browse/SOLR-14601?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17147101#comment-17147101 ] 

Thomas Taroni edited comment on SOLR-14601 at 6/27/20, 8:34 PM:
----------------------------------------------------------------

Have checked that, it looks not that this is working.
 child has only three allowed parameters: parentFilter,childFilter and limit.

Have now investigated the Problem a bit more deeper. It's some kind of recursion.

In ChildDocTransformerFactory the variable childReturnFields also includes the other augmenter queries like customer:[subquery] because it picks the full "fl" parameter. It calls then the SolrReturnFields with that. Inside the SolrReturnFields its adding all the Augementers in a for loop for all the fiels. It means if [child] is processed the customer:[subquery] is also processed. If then the customer:[subquery] will be processed by the SubQueryAugmenterFactory the field customer:[subquery] is already there. This ends up then in the "is duplicate" Exception.

 

In my Opinion the ChildDocTransformerFactory should not process things like [subquery] or [shard] or the SubQueryAugmenterFactory should not check that for duplicates.
 I dont really now the exactly reason why in ChildDocTransformerFactory the full "fl" is processed and not only the "[child]" fields.

 

Have forked the Project to: [https://github.com/phoenix-systems/lucene-solr] and done a short hack, that solves for us the Problem.

Commit: [https://github.com/phoenix-systems/lucene-solr/commit/5ce0461ae5da6cf226f435d7e8837132fb045c9d]

But i think the better Solution is to change the ChildDocTransformerFactory.


was (Author: thomas taroni):
Have checked that, it looks not that this is working.
child has only three allowed parameters: parentFilter,childFilter and limit.

Have now investigated the Problem a bit more deeper. It's some kind of recursion.

In ChildDocTransformerFactory the variable childReturnFields also includes the other augmenter queries like customer:[subquery] because it picks the full "fl" parameter. It calls then the SolrReturnFields with that. Inside the SolrReturnFields its adding all the Augementers in a for loop for all the fiels. It means if [child] is processed the customer:[subquery] is also processed. If then the customer:[subquery] will be processed by the SubQueryAugmenterFactory the field customer:[subquery] is already there. This ends up then in the "is duplicate" Exception.

 

In my Opinion the ChildDocTransformerFactory should not process things like [subquery] or [shard] or the SubQueryAugmenterFactory should not check that for duplicates.
I dont really now the exactly reason why in ChildDocTransformerFactory the full "fl" is processed and not only the "[child]" fields.

 

Have simpli forked the Project to: [https://github.com/phoenix-systems/lucene-solr] and done a short hack, that solves for us the Problem.

Commit: [https://github.com/phoenix-systems/lucene-solr/commit/5ce0461ae5da6cf226f435d7e8837132fb045c9d]

But i think the better Solution is to change the ChildDocTransformerFactory.

> Using [child] and [subquery] DocTransformer / FieldList
> -------------------------------------------------------
>
>                 Key: SOLR-14601
>                 URL: https://issues.apache.org/jira/browse/SOLR-14601
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: SearchComponents - other
>    Affects Versions: master (9.0), 8.5.2
>         Environment: Docker Container 8.5.2 from Docker Hub
> Already existing in 9.0.0
>            Reporter: Thomas Taroni
>            Priority: Major
>
> If you are using in the fl parameter something like that and luceneMatchVersion is higher or equals then 8.0.0 :
> fl=*,[child],customer:[subquery] or
>  fl=*,customer:[subquery],[child]
> It ends Up in any case in the following error (BadRequest) inside the SubQueryAugmenterFactory:
> {code:java}
> // code placeholder
> if (conflictMap.containsKey(field)) {
>  throw new SolrException(ErrorCode.BAD_REQUEST,"[subquery] name "+field+" is uplicated");
> } else {
>  conflictMap.put(field, true);
> }
> {code}
> It looks like that the following Snippet in ChildDocTransformerFactory(8.5.2 and 9.0.0) already have added that field to the context.
> {code:java}
> // code placeholder 8.5.2
> String childReturnFields = params.get("fl");
> SolrReturnFields childSolrReturnFields;
> if(childReturnFields != null) {
>   childSolrReturnFields = new SolrReturnFields(childReturnFields, req);
> } else if(req.getSchema().getDefaultLuceneMatchVersion().major < 8) {
>   // ensure backwards for versions prior to SOLR 8
>   childSolrReturnFields = new SolrReturnFields();
> } else {
>   childSolrReturnFields = new SolrReturnFields(req);
> }
> {code}
> {code:java}
> // code placeholder master 9.0.0
> String childReturnFields = params.get("fl");
> SolrReturnFields childSolrReturnFields;
> if (childReturnFields != null) {
>   childSolrReturnFields = new SolrReturnFields(childReturnFields, req);
> } else {
>   childSolrReturnFields = new SolrReturnFields(req);
> }
> {code}
> It looks like childReturnFields includes also the customer:[subquery], eventually is a good idea to remove fields from other AugmenterFactories like [shard] or [subquery] from the childReturnFields variable
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@lucene.apache.org
For additional commands, e-mail: issues-help@lucene.apache.org