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

Judith Silverman commented on SOLR-6203:
----------------------------------------

Hi, Christine, thanks for the quick response.                                   
                                                                                
                                                                                
                                                   
The code in QueryComponent.java which calls weightSort() in the                 
                                                   
non-grouped case proceeds to iterate through sortSpec.getSchemaFields()         
                                                               without 
modifying that (immutable) list of SchemaFields at all:

       ...
      SortSpec sortSpec = rb.getSortSpec();                                     
                                                   
      Sort sort = searcher.weightSort(sortSpec.getSort());                      
                                                   
      SortField[] sortFields = sort==null ? new 
SortField[]{SortField.FIELD_SCORE} : sort.getSort();                            
   
      List<SchemaField> schemaFields = sortSpec.getSchemaFields();              
                                                   
                                                                                
                                                   
      for (int fld = 0; fld < schemaFields.size(); fld++) {                     
                                                   
             SchemaField schemaField = schemaFields.get(fld);                   
                                                        
             FieldType ft = null == schemaField? null : schemaField.getType();  
        ...


On the basis of that code, I would tentatively answer your questions as 
follows:                                                                
                                                                                
                                                   
Question #1: yes                                                                
                                                   
Question #2: the original SchemaField object(s) (I suspect that rewrite/weight 
does                                                                   not turn 
a non-null into a null)                                                         
              
                                                                                
                                                   
The SortSpecParser adds a null to the SchemaFields list for any                 
                                                   
SortField that doesn't correspond to a plain old field,                         
                                                   
i.e. SortFields corresponding to ValueSource and FunctionQueries---             
                                                   
exactly the ones the weightSort()/rewrite()/createWeight() business is used to  
                                                                  
support, if I understand correctly (cf. SOLR-2533). (Sorts by score             
                                                   
and lucene docid also get null schemaFields.)                                   
                                                   
                                                                                
                                                   
My understanding is that any SortField actually modified by rewrite() is        
                                                       
associated to a null SchemaField to begin with, and that it would be            
                                                        
inappropriate to replace that null with something else when we call             
                                                    rewrite() on the SortField. 
 Our new utility functions will see that null
and refrain from marshalling/unmarshalling.

Cheers,
Judith

> cast exception while searching with sort function and result grouping
> ---------------------------------------------------------------------
>
>                 Key: SOLR-6203
>                 URL: https://issues.apache.org/jira/browse/SOLR-6203
>             Project: Solr
>          Issue Type: Bug
>          Components: search
>    Affects Versions: 4.7, 4.8
>            Reporter: Nate Dire
>            Assignee: Christine Poerschke
>         Attachments: README, SOLR-6203.patch, SOLR-6203.patch, 
> SOLR-6203.patch, SOLR-6203.patch, SOLR-6203.patch, SOLR-6203.patch, 
> SOLR-6203-unittest.patch, SOLR-6203-unittest.patch
>
>
> After upgrading from 4.5.1 to 4.7+, a schema including a {{"*"}} dynamic 
> field as text gets a cast exception when using a sort function and result 
> grouping.  
> Repro (with example config):
> # Add {{"*"}} dynamic field as a {{TextField}}, eg:
> {noformat}
> <dynamicField name="*" type="text_general" multiValued="true" />
> {noformat}
> #  Create  sharded collection
> {noformat}
> curl 
> 'http://localhost:8983/solr/admin/collections?action=CREATE&name=test&numShards=2&maxShardsPerNode=2'
> {noformat}
> # Add example docs (query must have some results)
> # Submit query which sorts on a function result and uses result grouping:
> {noformat}
> {
>   "responseHeader": {
>     "status": 500,
>     "QTime": 50,
>     "params": {
>       "sort": "sqrt(popularity) desc",
>       "indent": "true",
>       "q": "*:*",
>       "_": "1403709010008",
>       "group.field": "manu",
>       "group": "true",
>       "wt": "json"
>     }
>   },
>   "error": {
>     "msg": "java.lang.Double cannot be cast to 
> org.apache.lucene.util.BytesRef",
>     "code": 500
>   }
> }
> {noformat}
> Source exception from log:
> {noformat}
> ERROR - 2014-06-25 08:10:10.055; org.apache.solr.common.SolrException; 
> java.lang.ClassCastException: java.lang.Double cannot be cast to 
> org.apache.lucene.util.BytesRef
>     at 
> org.apache.solr.schema.FieldType.marshalStringSortValue(FieldType.java:981)
>     at org.apache.solr.schema.TextField.marshalSortValue(TextField.java:176)
>     at 
> org.apache.solr.search.grouping.distributed.shardresultserializer.SearchGroupsResultTransformer.serializeSearchGroup(SearchGroupsResultTransformer.java:125)
>     at 
> org.apache.solr.search.grouping.distributed.shardresultserializer.SearchGroupsResultTransformer.transform(SearchGroupsResultTransformer.java:65)
>     at 
> org.apache.solr.search.grouping.distributed.shardresultserializer.SearchGroupsResultTransformer.transform(SearchGroupsResultTransformer.java:43)
>     at 
> org.apache.solr.search.grouping.CommandHandler.processResult(CommandHandler.java:193)
>     at 
> org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:340)
>     at 
> org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:218)
>     at 
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
>   ...
> {noformat}
> It looks like {{serializeSearchGroup}} is matching the sort expression as the 
> {{"*"}} dynamic field, which is a TextField in the repro.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to