mirror of https://github.com/apache/lucene.git
SOLR-8902: Make sure ReturnFields only returns the requested fields
This commit is contained in:
parent
a9eb26c44a
commit
ffd557b117
|
@ -67,6 +67,9 @@ Bug Fixes
|
|||
|
||||
* SOLR-8855: The HDFS BlockDirectory should not clean up it's cache on shutdown. (Mark Miller)
|
||||
|
||||
* 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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -51,6 +51,7 @@ public class SolrReturnFields extends ReturnFields {
|
|||
private final List<String> 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<String> 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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue