diff --git a/changelog/unreleased/SOLR-solrqueryresponse-return-types.yml b/changelog/unreleased/SOLR-solrqueryresponse-return-types.yml new file mode 100644 index 000000000000..6b13f8f6c1a3 --- /dev/null +++ b/changelog/unreleased/SOLR-solrqueryresponse-return-types.yml @@ -0,0 +1,10 @@ +title: > + SolrQueryResponse.getResponseHeader()/addResponseHeader() are now declared to return/accept + SimpleOrderedMap instead of NamedList. External code compiled against the old + signature will get a NoSuchMethodError at runtime and must recompile. +type: changed +authors: + - name: Serhiy Bzhezytskyy +links: + - name: PR#4809 + url: https://github.com/apache/solr/pull/4809 diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java index 291d06eadcea..6f1c40731c6e 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrCore.java +++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java @@ -2946,7 +2946,7 @@ public void execute(SolrRequestHandler handler, SolrQueryRequest req, SolrQueryR public static void preDecorateResponse(SolrQueryRequest req, SolrQueryResponse rsp) { // setup response header - final NamedList responseHeader = new SimpleOrderedMap<>(); + final SimpleOrderedMap responseHeader = new SimpleOrderedMap<>(); rsp.addResponseHeader(responseHeader); rsp.addToLog(PATH, req.getContext().get(PATH)); diff --git a/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java index 28b4a80bb6ec..5447b57a79cb 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java @@ -457,7 +457,6 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { if (thereArePartialResults) { rb.rsp .getResponseHeader() - .asShallowMap() .put(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY, Boolean.TRUE); } if (segmentTerminatedEarly != null) { @@ -474,10 +473,7 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { } else if (!Boolean.TRUE.equals(existingSegmentTerminatedEarly) && segmentTerminatedEarly) { rb.rsp .getResponseHeader() - .remove(SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY); - rb.rsp - .getResponseHeader() - .add(SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY, true); + .put(SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY, true); } } if (maxHitsTerminatedEarly) { diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index 3c8c2a7a5bdd..0cd1c0760601 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -1239,7 +1239,6 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { if (thereArePartialResults) { rb.rsp .getResponseHeader() - .asShallowMap() .put(SolrQueryResponse.RESPONSE_HEADER_PARTIAL_RESULTS_KEY, Boolean.TRUE); } if (segmentTerminatedEarly != null) { @@ -1257,10 +1256,7 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { && Boolean.TRUE.equals(segmentTerminatedEarly)) { rb.rsp .getResponseHeader() - .remove(SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY); - rb.rsp - .getResponseHeader() - .add( + .put( SolrQueryResponse.RESPONSE_HEADER_SEGMENT_TERMINATED_EARLY_KEY, segmentTerminatedEarly); } diff --git a/solr/core/src/java/org/apache/solr/response/SolrQueryResponse.java b/solr/core/src/java/org/apache/solr/response/SolrQueryResponse.java index 5f2b67622d63..9e3a6dcb7c81 100644 --- a/solr/core/src/java/org/apache/solr/response/SolrQueryResponse.java +++ b/solr/core/src/java/org/apache/solr/response/SolrQueryResponse.java @@ -258,7 +258,7 @@ public Exception getException() { } /** Set response header */ - public void addResponseHeader(NamedList header) { + public void addResponseHeader(SimpleOrderedMap header) { values.add(RESPONSE_HEADER_KEY, header); } @@ -268,10 +268,9 @@ public void removeResponseHeader() { } /** Response header to be logged */ - public NamedList getResponseHeader() { - @SuppressWarnings("unchecked") - SimpleOrderedMap header = (SimpleOrderedMap) values.get(RESPONSE_HEADER_KEY); - return header; + @SuppressWarnings("unchecked") + public SimpleOrderedMap getResponseHeader() { + return (SimpleOrderedMap) values.get(RESPONSE_HEADER_KEY); } /** Set response */ diff --git a/solr/core/src/java/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactory.java index 9e8eff7cb553..f4d8abb901e4 100644 --- a/solr/core/src/java/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactory.java +++ b/solr/core/src/java/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactory.java @@ -139,7 +139,7 @@ public void processCommit(CommitUpdateCommand cmd) throws IOException { IgnoreCommitOptimizeUpdateProcessorFactory.log.info( "{} from client application ignored with status code: 200", cmdType); if (responseMsg != null) { - NamedList responseHeader = rsp.getResponseHeader(); + SimpleOrderedMap responseHeader = rsp.getResponseHeader(); if (responseHeader != null) { responseHeader.add("msg", responseMsg); } else { diff --git a/solr/core/src/test/org/apache/solr/handler/component/MockResponseBuilder.java b/solr/core/src/test/org/apache/solr/handler/component/MockResponseBuilder.java index 241ff703fb5f..fa8bca48727d 100644 --- a/solr/core/src/test/org/apache/solr/handler/component/MockResponseBuilder.java +++ b/solr/core/src/test/org/apache/solr/handler/component/MockResponseBuilder.java @@ -20,7 +20,7 @@ import java.util.List; import org.apache.solr.common.params.ShardParams; import org.apache.solr.common.params.SolrParams; -import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.schema.IndexSchema; @@ -48,7 +48,7 @@ public static MockResponseBuilder create() { SchemaField uniqueIdField = new SchemaField("id", new StrField()); // we need this because QueryComponent adds a property to it. - NamedList responseHeader = new NamedList<>(); + SimpleOrderedMap responseHeader = new SimpleOrderedMap<>(); // the mock implementations Mockito.when(request.getSchema()).thenReturn(indexSchema); diff --git a/solr/core/src/test/org/apache/solr/response/TestSolrQueryResponse.java b/solr/core/src/test/org/apache/solr/response/TestSolrQueryResponse.java index 3d6fbe46e57c..b414eb5bdd7a 100644 --- a/solr/core/src/test/org/apache/solr/response/TestSolrQueryResponse.java +++ b/solr/core/src/test/org/apache/solr/response/TestSolrQueryResponse.java @@ -279,7 +279,7 @@ public void testException() { public void testResponseHeader() { final SolrQueryResponse response = new SolrQueryResponse(); assertNull("responseHeader initially present", response.getResponseHeader()); - final NamedList newValue = new SimpleOrderedMap<>(); + final SimpleOrderedMap newValue = new SimpleOrderedMap<>(); newValue.add("key1", "value1"); response.add("key2", "value2"); response.addResponseHeader(newValue); @@ -300,7 +300,7 @@ public void testHttpCaching() { @Test public void testConvertToHEADStyleResponse() { final SolrQueryResponse response = new SolrQueryResponse(); - final NamedList newValue = new SimpleOrderedMap<>(); + final SimpleOrderedMap newValue = new SimpleOrderedMap<>(); newValue.add("responseHeaderKey1", "value1"); response.add("responseHeaderKey2", "value2"); response.addResponseHeader(newValue);