diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index a9731e16f9a..baca0df101f 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -55,6 +55,9 @@ Bug Fixes * SOLR-8857: HdfsUpdateLog does not use configured or new default number of version buckets and is hard coded to 256. (Mark Miller, yonik, Gregory Chanan) +* SOLR-8902: Make sure ReturnFields only returns the requested fields from (fl=) evn when + DocumentTransformers ask for getExtraRequestFields() (ryan) + Optimizations ---------------------- * SOLR-8722: Don't force a full ZkStateReader refresh on every Overseer operation. diff --git a/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java b/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java index 6878f16ccb0..885bf78a021 100644 --- a/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java +++ b/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java @@ -72,8 +72,7 @@ public class BinaryResponseWriter implements BinaryQueryResponseWriter { public static class Resolver implements JavaBinCodec.ObjectResolver , JavaBinCodec.WritableDocFields { protected final SolrQueryRequest solrQueryRequest; protected IndexSchema schema; - protected SolrIndexSearcher searcher; // TODO - this is never set? always null? - protected final ReturnFields returnFields; + protected ReturnFields returnFields; public Resolver(SolrQueryRequest req, ReturnFields returnFields) { solrQueryRequest = req; @@ -83,7 +82,13 @@ public class BinaryResponseWriter implements BinaryQueryResponseWriter { @Override public Object resolve(Object o, JavaBinCodec codec) throws IOException { if (o instanceof ResultContext) { - writeResults((ResultContext) o, codec); + ReturnFields orig = returnFields; + ResultContext res = (ResultContext)o; + if(res.getReturnFields()!=null) { + returnFields = res.getReturnFields(); + } + writeResults(res, codec); + returnFields = orig; return null; // null means we completely handled it } if (o instanceof DocList) { diff --git a/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java b/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java index b84f4de5528..b667f0e2e46 100644 --- a/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java +++ b/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java @@ -51,6 +51,7 @@ public class SolrReturnFields extends ReturnFields { private final List globs = new ArrayList<>(1); // The lucene field names to request from the SolrIndexSearcher + // This *may* include fields that will not be in the final response private final Set fields = new HashSet<>(); // Field names that are OK to include in the response. @@ -130,17 +131,6 @@ public class SolrReturnFields extends ReturnFields { augmenters.addTransformer( new RenameFieldTransformer( from, to, copy ) ); } - if( !_wantsAllFields ) { - if( !globs.isEmpty() ) { - // TODO??? need to fill up the fields with matching field names in the index - // and add them to okFieldNames? - // maybe just get all fields? - // this would disable field selection optimization... i think thatis OK - fields.clear(); // this will get all fields, and use wantsField to limit - } - okFieldNames.addAll( fields ); - } - if( augmenters.size() == 1 ) { transformer = augmenters.getTransformer(0); } diff --git a/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java b/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java index f72aee8385d..459f9596c6a 100644 --- a/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java +++ b/solr/core/src/test/org/apache/solr/search/ReturnFieldsTest.java @@ -264,6 +264,14 @@ public class ReturnFieldsTest extends SolrTestCaseJ4 { assertFalse( rf.wantsField( "id" ) ); assertFalse(rf.wantsAllFields()); assertNull(rf.getTransformer()); + + // Don't return 'store_rpt' just because it is required by the transformer + rf = new SolrReturnFields( req("fl", "[geo f=store_rpt]") ); + assertFalse( rf.wantsScore() ); + assertTrue(rf.wantsField("[geo]")); + assertFalse( rf.wantsField( "store_rpt" ) ); + assertFalse(rf.wantsAllFields()); + assertNotNull(rf.getTransformer()); } @Test