diff --git a/solr/core/src/java/org/apache/solr/cli/ExportTool.java b/solr/core/src/java/org/apache/solr/cli/ExportTool.java index b5a58377ba3..7d0b386d733 100644 --- a/solr/core/src/java/org/apache/solr/cli/ExportTool.java +++ b/solr/core/src/java/org/apache/solr/cli/ExportTool.java @@ -75,8 +75,8 @@ import org.apache.solr.common.cloud.Slice; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.CursorMarkParams; -import org.apache.solr.common.params.MapSolrParams; import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.CollectionUtil; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.JavaBinCodec; @@ -251,7 +251,7 @@ void fetchUniqueKey() throws SolrServerException, IOException { new GenericSolrRequest( SolrRequest.METHOD.GET, "/schema/uniquekey", - new MapSolrParams(Collections.singletonMap("collection", coll))) + SolrParams.of("collection", coll)) .setRequiresCollection(true)); uniqueKey = (String) response.get("uniqueKey"); } diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java index d9453757dcc..3ea1883af66 100644 --- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java +++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java @@ -282,7 +282,6 @@ private void commitOnLeader(String leaderBaseUrl, String coreName) throws SolrServerException, IOException { try (SolrClient client = recoverySolrClientBuilder(leaderBaseUrl, coreName).build()) { UpdateRequest ureq = new UpdateRequest(); - ureq.setParams(new ModifiableSolrParams()); // ureq.getParams().set(DistributedUpdateProcessor.COMMIT_END_POINT, true); // ureq.getParams().set(UpdateParams.OPEN_SEARCHER, onlyLeaderIndexes); // Why do we need to open searcher if "onlyLeaderIndexes"? diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java index 1816d96f5d7..a0eb4d3233f 100644 --- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java +++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java @@ -250,7 +250,6 @@ static UpdateResponse softCommit(String baseUrl, String coreName) .withSocketTimeout(120000, TimeUnit.MILLISECONDS) .build()) { UpdateRequest ureq = new UpdateRequest(); - ureq.setParams(new ModifiableSolrParams()); ureq.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, true, true); return ureq.process(client); } diff --git a/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java b/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java index b4df16a6fe7..88a10bf923e 100644 --- a/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java +++ b/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java @@ -79,6 +79,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw } try { SolrParams params = req.getParams(); + assert params != null; UpdateRequestProcessorChain processorChain = req.getCore().getUpdateProcessorChain(params); UpdateRequestProcessor processor = processorChain.createProcessor(req, rsp); diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java index 8b126b5cc06..9e64371a971 100644 --- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java @@ -450,7 +450,7 @@ static Long getCheckSum(Checksum checksum, Path f) { private volatile IndexFetcher currentIndexFetcher; public IndexFetchResult doFetch(SolrParams solrParams, boolean forceReplication) { - String leaderUrl = solrParams == null ? null : solrParams.get(LEADER_URL, null); + String leaderUrl = solrParams.get(LEADER_URL, null); if (!indexFetchLock.tryLock()) return IndexFetchResult.LOCK_OBTAIN_FAILED; if (core.getCoreContainer().isShutDown()) { log.warn("I was asked to replicate but CoreContainer is shutting down"); @@ -1196,7 +1196,7 @@ private void setupPolling(String intervalStr) { try { log.debug("Polling for index modifications"); markScheduledExecutionStart(); - IndexFetchResult fetchResult = doFetch(null, false); + IndexFetchResult fetchResult = doFetch(SolrParams.of(), false); if (pollListener != null) pollListener.onComplete(core, fetchResult); } catch (Exception e) { log.error("Exception in fetching index", e); diff --git a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java index 96164a1121c..7b5d791ae42 100644 --- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java +++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; @@ -53,10 +52,6 @@ public static void addExperimentalFormatWarning(SolrQueryResponse rsp) { public static boolean handleCommit( SolrQueryRequest req, UpdateRequestProcessor processor, SolrParams params, boolean force) throws IOException { - if (params == null) { - params = new MapSolrParams(new HashMap<>()); - } - boolean optimize = params.getBool(UpdateParams.OPTIMIZE, false); boolean commit = params.getBool(UpdateParams.COMMIT, false); boolean softCommit = params.getBool(UpdateParams.SOFT_COMMIT, false); @@ -97,8 +92,6 @@ public static void validateCommitParams(SolrParams params) { /** Modify UpdateCommand based on request parameters */ public static void updateCommit(CommitUpdateCommand cmd, SolrParams params) { - if (params == null) return; - cmd.openSearcher = params.getBool(UpdateParams.OPEN_SEARCHER, cmd.openSearcher); cmd.waitSearcher = params.getBool(UpdateParams.WAIT_SEARCHER, cmd.waitSearcher); cmd.softCommit = params.getBool(UpdateParams.SOFT_COMMIT, cmd.softCommit); @@ -114,13 +107,7 @@ public static void updateCommit(CommitUpdateCommand cmd, SolrParams params) { public static boolean handleRollback( SolrQueryRequest req, UpdateRequestProcessor processor, SolrParams params, boolean force) throws IOException { - if (params == null) { - params = new MapSolrParams(new HashMap<>()); - } - - boolean rollback = params.getBool(UpdateParams.ROLLBACK, false); - - if (rollback || force) { + if (force || params.getBool(UpdateParams.ROLLBACK, false)) { RollbackUpdateCommand cmd = new RollbackUpdateCommand(req); processor.processRollback(cmd); return true; diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java index 805a712e0a5..e1634cf8fd6 100644 --- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java @@ -26,7 +26,6 @@ import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.MapSolrParams; -import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.params.UpdateParams; import org.apache.solr.common.util.ContentStream; @@ -124,15 +123,8 @@ public void init(NamedList args) { } protected void setAssumeContentType(String ct) { - if (invariants == null) { - Map map = new HashMap<>(); - map.put(UpdateParams.ASSUME_CONTENT_TYPE, ct); - invariants = new MapSolrParams(map); - } else { - ModifiableSolrParams params = new ModifiableSolrParams(invariants); - params.set(UpdateParams.ASSUME_CONTENT_TYPE, ct); - invariants = params; - } + invariants = + SolrParams.wrapDefaults(SolrParams.of(UpdateParams.ASSUME_CONTENT_TYPE, ct), invariants); } private Map pathVsLoaders = new HashMap<>(); diff --git a/solr/core/src/java/org/apache/solr/handler/api/V2ApiUtils.java b/solr/core/src/java/org/apache/solr/handler/api/V2ApiUtils.java index 22f492abf92..9a96b34afc0 100644 --- a/solr/core/src/java/org/apache/solr/handler/api/V2ApiUtils.java +++ b/solr/core/src/java/org/apache/solr/handler/api/V2ApiUtils.java @@ -91,9 +91,6 @@ public static void squashIntoNamedListWithoutHeader( } public static String getMediaTypeFromWtParam(SolrParams params, String defaultMediaType) { - if (params == null) { - return defaultMediaType; - } final String wtParam = params.get(WT); if (StrUtils.isBlank(wtParam)) return defaultMediaType; diff --git a/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java b/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java index 611cea3d58f..e2ddb5ee051 100644 --- a/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java +++ b/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java @@ -78,10 +78,6 @@ public SampleDocuments parseDocsFromStream( return SampleDocuments.NONE; } - if (params == null) { - params = new ModifiableSolrParams(); - } - Long streamSize = stream.getSize(); if (streamSize != null && streamSize > MAX_STREAM_SIZE) { throw new SolrException( diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java index 4b2a4d543d4..52ab91fcf9f 100644 --- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java +++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java @@ -75,7 +75,7 @@ static boolean disallowPartialResults(SolrParams params) { return !allowPartialResults(params); } - /** returns the current request parameters */ + /** The parameters for this request; never null. Use {@link #setParams(SolrParams)} to change. */ SolrParams getParams(); /** @@ -88,8 +88,8 @@ static boolean disallowPartialResults(SolrParams params) { Iterable getContentStreams(); /** - * Returns the original request parameters. As this does not normally include configured defaults - * it's more suitable for logging. + * The original request parameters; never null. As this does not normally include configured + * defaults, it's more suitable for logging. */ SolrParams getOriginalParams(); diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java index 363022c3979..806a08e43e8 100644 --- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java +++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.solr.api.ApiBag; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.SolrParams; @@ -62,8 +63,8 @@ public abstract class SolrQueryRequestBase implements SolrQueryRequest, Closeabl public SolrQueryRequestBase(SolrCore core, SolrParams params, RTimerTree requestTimer) { this.core = core; this.schema = null == core ? null : core.getLatestSchema(); - this.params = this.origParams = params; - this.requestTimer = requestTimer; + this.params = this.origParams = Objects.requireNonNull(params); + this.requestTimer = Objects.requireNonNull(requestTimer); this.startTime = System.currentTimeMillis(); } @@ -90,7 +91,7 @@ public SolrParams getOriginalParams() { @Override public void setParams(SolrParams params) { - this.params = params; + this.params = Objects.requireNonNull(params); } // Get the start time of this request in milliseconds diff --git a/solr/core/src/java/org/apache/solr/search/QParser.java b/solr/core/src/java/org/apache/solr/search/QParser.java index e6723cff3bf..09c7a05fe84 100644 --- a/solr/core/src/java/org/apache/solr/search/QParser.java +++ b/solr/core/src/java/org/apache/solr/search/QParser.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.lucene.search.Query; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; @@ -62,10 +63,11 @@ public abstract class QParser { /** * Constructor for the QParser * - * @param qstr The part of the query string specific to this parser - * @param localParams The set of parameters that are specific to this QParser. See + * @param qstr The query string to be parsed + * @param localParams Params scoped to this query, customizing the parsing. Null if none. Most + * params the parser needs are resolved here first, overlaying the request. See * https://solr.apache.org/guide/solr/latest/query-guide/local-params.html - * @param params The rest of the {@link org.apache.solr.common.params.SolrParams} + * @param params Params for the request, taken from {@link SolrQueryRequest#getParams()}; not null * @param req The original {@link org.apache.solr.request.SolrQueryRequest}. */ public QParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { @@ -97,7 +99,7 @@ public QParser(String qstr, SolrParams localParams, SolrParams params, SolrQuery } } - this.params = params; + this.params = Objects.requireNonNull(params); this.req = req; } @@ -160,7 +162,7 @@ public SolrParams getParams() { } public void setParams(SolrParams params) { - this.params = params; + this.params = Objects.requireNonNull(params); } public SolrQueryRequest getReq() { diff --git a/solr/core/src/java/org/apache/solr/search/QParserPlugin.java b/solr/core/src/java/org/apache/solr/search/QParserPlugin.java index 8146c585cf0..f87b35b55dc 100644 --- a/solr/core/src/java/org/apache/solr/search/QParserPlugin.java +++ b/solr/core/src/java/org/apache/solr/search/QParserPlugin.java @@ -95,7 +95,11 @@ public abstract class QParserPlugin implements NamedListInitializedPlugin, SolrI standardPlugins = Collections.unmodifiableMap(map); } - /** return a {@link QParser} */ + /** + * Creates the {@link QParser}. + * + * @see QParser#QParser(String, SolrParams, SolrParams, SolrQueryRequest) + */ public abstract QParser createParser( String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req); 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 53846093168..9e8eff7cb55 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 @@ -50,13 +50,13 @@ public class IgnoreCommitOptimizeUpdateProcessorFactory extends UpdateRequestPro @Override public void init(final NamedList args) { - SolrParams params = (args != null) ? args.toSolrParams() : null; - if (params == null) { + if (args == null) { errorCode = ErrorCode.FORBIDDEN; // default is 403 error responseMsg = DEFAULT_RESPONSE_MSG; ignoreOptimizeOnly = false; return; } + SolrParams params = args.toSolrParams(); ignoreOptimizeOnly = params.getBool("ignoreOptimizeOnly", false); diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java index 1bc87e4f4e1..180f687abb3 100644 --- a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java @@ -38,7 +38,6 @@ import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.cloud.Replica; import org.apache.solr.common.cloud.ZkStateReader; -import org.apache.solr.common.params.ModifiableSolrParams; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -241,8 +240,6 @@ protected void indexDoc(Object... fields) throws IOException, SolrServerExceptio UpdateRequest ureq = new UpdateRequest(); ureq.add(doc); - ModifiableSolrParams params = new ModifiableSolrParams(); - ureq.setParams(params); ureq.process(cloudClient); } diff --git a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java index d9e501e69b6..b88dca262f9 100644 --- a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java @@ -43,7 +43,6 @@ import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.cloud.Replica; import org.apache.solr.common.cloud.ZkStateReader; -import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.core.CoreContainer; import org.apache.solr.metrics.SolrMetricManager; import org.junit.Test; @@ -369,8 +368,6 @@ protected void indexDoc(Object... fields) throws IOException, SolrServerExceptio UpdateRequest ureq = new UpdateRequest(); ureq.add(doc); - ModifiableSolrParams params = new ModifiableSolrParams(); - ureq.setParams(params); ureq.process(cloudClient); } diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java index 1cca0d6666e..df4cc03abec 100644 --- a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java +++ b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java @@ -625,11 +625,8 @@ protected long addDocAndGetVersion(Object... fields) throws Exception { SolrInputDocument doc = new SolrInputDocument(); addFields(doc, fields); - ModifiableSolrParams params = new ModifiableSolrParams(); - params.add("versions", "true"); - UpdateRequest ureq = new UpdateRequest(); - ureq.setParams(params); + ureq.getParams().set("versions", true); ureq.add(doc); UpdateResponse resp; @@ -647,10 +644,10 @@ protected long addDocAndGetVersion(Object... fields) throws Exception { protected long deleteDocAndGetVersion( String id, ModifiableSolrParams params, boolean deleteByQuery) throws Exception { - params.add("versions", "true"); - UpdateRequest ureq = new UpdateRequest(); - ureq.setParams(params); + ureq.getParams().add(params); + ureq.getParams().set("versions", true); + if (deleteByQuery) { ureq.deleteByQuery("id:" + id); } else { diff --git a/solr/core/src/test/org/apache/solr/handler/TestSampleDocumentsLoader.java b/solr/core/src/test/org/apache/solr/handler/TestSampleDocumentsLoader.java index 7bd82ec60b1..d56000c1b36 100644 --- a/solr/core/src/test/org/apache/solr/handler/TestSampleDocumentsLoader.java +++ b/solr/core/src/test/org/apache/solr/handler/TestSampleDocumentsLoader.java @@ -52,7 +52,7 @@ public void setup() throws IOException { @Test public void testJson() throws Exception { - loadTestDocs(null, new File(exampleDir, "films/films.json"), 500, 500); + loadTestDocs(SolrParams.of(), new File(exampleDir, "films/films.json"), 500, 500); } @Test @@ -78,7 +78,7 @@ public void testCsv() throws Exception { @Test public void testSolrXml() throws Exception { - loadTestDocs(null, new File(exampleDir, "films/films.xml"), 1000, 1000); + loadTestDocs(SolrParams.of(), new File(exampleDir, "films/films.xml"), 1000, 1000); } protected List loadTestDocs( diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java index 8600ed8236b..f89d14364d5 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java @@ -250,7 +250,6 @@ public void read(SolrQueryRequest req, SolrQueryResponse rsp) { private static SolrQueryResponse v2ApiInvoke( ApiBag bag, String uri, String method, SolrParams params, InputStream payload) { - if (params == null) params = new ModifiableSolrParams(); SolrQueryResponse rsp = new SolrQueryResponse(); HashMap templateVals = new HashMap<>(); Api[] currentApi = new Api[1]; diff --git a/solr/core/src/test/org/apache/solr/handler/api/V2ApiUtilsTest.java b/solr/core/src/test/org/apache/solr/handler/api/V2ApiUtilsTest.java index 78f2f8d5fb9..9a4945cfb94 100644 --- a/solr/core/src/test/org/apache/solr/handler/api/V2ApiUtilsTest.java +++ b/solr/core/src/test/org/apache/solr/handler/api/V2ApiUtilsTest.java @@ -22,6 +22,7 @@ import jakarta.ws.rs.core.MediaType; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.params.SolrParams; import org.junit.Test; public class V2ApiUtilsTest extends SolrTestCaseJ4 { @@ -44,9 +45,7 @@ public void testReadsDisableV2ApiSysprop() { @Test public void testConvertsWtToMediaTypeString() { - assertEquals( - "someDefault", - V2ApiUtils.getMediaTypeFromWtParam(new ModifiableSolrParams(), "someDefault")); + assertEquals("someDefault", V2ApiUtils.getMediaTypeFromWtParam(SolrParams.of(), "someDefault")); var params = new ModifiableSolrParams(); params.add("wt", "json"); diff --git a/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java b/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java index 196120ca628..c861dc2458c 100644 --- a/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java +++ b/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java @@ -840,7 +840,7 @@ public MockAuthorizationContext(Map values) { @Override public SolrParams getParams() { SolrParams params = (SolrParams) values.get("params"); - return params == null ? new MapSolrParams(new HashMap<>()) : params; + return params == null ? SolrParams.of() : params; } @Override diff --git a/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java index bf44c671380..ffa5cdc7d8d 100644 --- a/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java +++ b/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java @@ -47,13 +47,15 @@ public void after() throws Exception { public void testSimple() throws Exception { - ModifiableSolrParams params = - new ModifiableSolrParams() - .add("processor", "template") - .add("template.field", "id:{firstName}_{lastName}") - .add("template.field", "another:{lastName}_{firstName}") - .add("template.field", "missing:{lastName}_{unKnown}"); - AddUpdateCommand cmd = new AddUpdateCommand(new LocalSolrQueryRequest(null, params)); + var cmd = + new AddUpdateCommand( + new LocalSolrQueryRequest( + null, + new ModifiableSolrParams() + .add("processor", "template") + .add("template.field", "id:{firstName}_{lastName}") + .add("template.field", "another:{lastName}_{firstName}") + .add("template.field", "missing:{lastName}_{unKnown}"))); cmd.solrDoc = new SolrInputDocument(); cmd.solrDoc.addField("firstName", "Tom"); @@ -69,14 +71,11 @@ public void testSimple() throws Exception { SolrInputDocument solrDoc = new SolrInputDocument(); solrDoc.addField("id", "1"); - params = - new ModifiableSolrParams() - .add("processor", "template") - .add("commit", "true") - .add("template.field", "x_s:key_{id}"); - params.add("commit", "true"); UpdateRequest add = new UpdateRequest().add(solrDoc); - add.setParams(params); + add.getParams() + .add("processor", "template") + .add("template.field", "x_s:key_{id}") + .add("commit", "true"); NamedList result = cluster .getSolrClient() diff --git a/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java index 5413e4d36b5..7eaec9480e7 100644 --- a/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java +++ b/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java @@ -136,7 +136,7 @@ public void testInvalidAdds() throws IOException { assertAddsSucceedWithErrors( "tolerant-chain-max-errors-10", Arrays.asList(new SolrInputDocument[] {invalidDoc1}), - null, + SolrParams.of(), "(unknown)"); // a valid doc @@ -149,7 +149,7 @@ public void testInvalidAdds() throws IOException { () -> add( "not-tolerant", - null, + SolrParams.of(), Arrays.asList(new SolrInputDocument[] {invalidDoc1, validDoc1}))); assertTrue(e.getMessage().contains("Document is missing mandatory uniqueKey field")); @@ -159,7 +159,7 @@ public void testInvalidAdds() throws IOException { assertAddsSucceedWithErrors( "tolerant-chain-max-errors-10", Arrays.asList(new SolrInputDocument[] {invalidDoc1, validDoc1}), - null, + SolrParams.of(), "(unknown)"); assertU(commit()); @@ -176,7 +176,7 @@ public void testInvalidAdds() throws IOException { () -> add( "not-tolerant", - null, + SolrParams.of(), Arrays.asList(new SolrInputDocument[] {invalidDoc2, validDoc2}))); assertTrue(e.getMessage().contains("Error adding field")); @@ -186,7 +186,7 @@ public void testInvalidAdds() throws IOException { assertAddsSucceedWithErrors( "tolerant-chain-max-errors-10", Arrays.asList(new SolrInputDocument[] {invalidDoc2, validDoc2}), - null, + SolrParams.of(), "2"); assertU(commit()); @@ -201,7 +201,7 @@ public void testInvalidAdds() throws IOException { public void testMaxErrorsDefault() throws IOException { // by default the TolerantUpdateProcessor accepts all errors, so this batch should succeed with // 10 errors. - assertAddsSucceedWithErrors("tolerant-chain-max-errors-not-set", docs, null, badIds); + assertAddsSucceedWithErrors("tolerant-chain-max-errors-not-set", docs, SolrParams.of(), badIds); assertU(commit()); assertQ(req("q", "*:*"), "//result[@numFound='10']"); } @@ -240,7 +240,7 @@ public void testMaxErrorsThrowsException() { public void testMaxErrorsInfinite() throws IOException { ModifiableSolrParams requestParams = new ModifiableSolrParams(); requestParams.add("maxErrors", "-1"); - assertAddsSucceedWithErrors("tolerant-chain-max-errors-not-set", docs, null, badIds); + assertAddsSucceedWithErrors("tolerant-chain-max-errors-not-set", docs, SolrParams.of(), badIds); assertU(commit()); assertQ(req("q", "*:*"), "//result[@numFound='10']"); @@ -421,7 +421,7 @@ private void assertAddsSucceedWithErrors( protected SolrQueryResponse add(final String chain, final SolrInputDocument doc) throws IOException { - return add(chain, null, Arrays.asList(new SolrInputDocument[] {doc})); + return add(chain, SolrParams.of(), Arrays.asList(new SolrInputDocument[] {doc})); } protected SolrQueryResponse add( @@ -435,10 +435,6 @@ protected SolrQueryResponse add( SolrQueryResponse rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap<>()); - if (requestParams == null) { - requestParams = new ModifiableSolrParams(); - } - SolrQueryRequest req = new LocalSolrQueryRequest(core, requestParams); UpdateRequestProcessor processor = null; try { diff --git a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/messageprocessor/SolrMessageProcessor.java b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/messageprocessor/SolrMessageProcessor.java index 2f4e090bab4..6824fd876ac 100644 --- a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/messageprocessor/SolrMessageProcessor.java +++ b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/messageprocessor/SolrMessageProcessor.java @@ -331,7 +331,8 @@ void preventCircularMirroring(MirroredSolrRequest mirroredSolrRequest) { } } else { SolrParams params = mirroredSolrRequest.getSolrRequest().getParams(); - String shouldMirror = (params == null ? null : params.get(CrossDcConstants.SHOULD_MIRROR)); + assert params != null; + String shouldMirror = params.get(CrossDcConstants.SHOULD_MIRROR); if (shouldMirror == null) { if (params instanceof ModifiableSolrParams) { log.warn("{} param is missing - setting to false", CrossDcConstants.SHOULD_MIRROR); diff --git a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java index 5a466d8f5f6..8f8f8fd801d 100644 --- a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java +++ b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java @@ -52,7 +52,6 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest; import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.common.SolrInputDocument; -import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.SolrNamedThreadFactory; import org.apache.solr.common.util.Utils; @@ -279,7 +278,7 @@ public void testHandleValidMirroredSolrRequest() { doc.addField("id", "1"); UpdateRequest validRequest = new UpdateRequest(); validRequest.add(doc); - validRequest.setParams(new ModifiableSolrParams().add("commit", "true")); + validRequest.getParams().set("commit", true); // Create a valid MirroredSolrRequest ConsumerRecord> record = new ConsumerRecord<>("test-topic", 0, 0, "key", new MirroredSolrRequest<>(validRequest)); @@ -459,7 +458,7 @@ protected KafkaMirroringSink createKafkaMirroringSink(KafkaCrossDcConf conf) { UpdateRequest invalidRequest = new UpdateRequest(); // no updates on request - invalidRequest.setParams(new ModifiableSolrParams().add("invalid_param", "invalid_value")); + invalidRequest.getParams().add("invalid_param", "invalid_value"); ConsumerRecord> record = new ConsumerRecord<>("test-topic", 0, 0, "key", new MirroredSolrRequest<>(invalidRequest)); diff --git a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequest.java b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequest.java index 53e2351cf47..8af651c664f 100644 --- a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequest.java +++ b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequest.java @@ -59,10 +59,9 @@ public static final Type get(String s) { } public static class MirroredAdminRequest extends CollectionAdminRequest { - private ModifiableSolrParams params; + private SolrParams params; - public MirroredAdminRequest( - CollectionParams.CollectionAction action, ModifiableSolrParams params) { + public MirroredAdminRequest(CollectionParams.CollectionAction action, SolrParams params) { super(action); this.params = params; } @@ -72,7 +71,7 @@ public SolrParams getParams() { return params; } - public void setParams(ModifiableSolrParams params) { + public void setParams(SolrParams params) { this.params = params; } @@ -247,10 +246,10 @@ public boolean equals(final Object o) { } public static void setParams(SolrRequest request, ModifiableSolrParams params) { - if (request instanceof MirroredAdminRequest) { - ((MirroredAdminRequest) request).setParams(params); - } else if (request instanceof UpdateRequest) { - ((UpdateRequest) request).setParams(params); + if (request instanceof MirroredAdminRequest mReq) { + mReq.setParams(params); + } else if (request instanceof UpdateRequest uReq) { + uReq.setParams(params); } else { throw new UnsupportedOperationException("Can't setParams on request " + request); } diff --git a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequestSerializer.java b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequestSerializer.java index 667b94ba5b5..2e01c2e2047 100644 --- a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequestSerializer.java +++ b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroredSolrRequestSerializer.java @@ -32,6 +32,7 @@ import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.common.params.MapSolrParams; import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.CollectionUtil; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.JavaBinCodec; @@ -80,11 +81,9 @@ public MirroredSolrRequest deserialize(String topic, byte[] data) { int attempt = Integer.parseInt(String.valueOf(requestMap.getOrDefault("attempt", "-1"))); long submitTimeNanos = Long.parseLong(String.valueOf(requestMap.getOrDefault("submitTimeNanos", "-1"))); - ModifiableSolrParams params; + SolrParams params; if (requestMap.get("params") != null) { - params = - ModifiableSolrParams.of( - new MapSolrParams((Map) requestMap.get("params"))); + params = new MapSolrParams((Map) requestMap.get("params")); } else { params = new ModifiableSolrParams(); } @@ -110,7 +109,7 @@ public MirroredSolrRequest deserialize(String topic, byte[] data) { updateRequest.deleteByQuery(delQuery); } } - updateRequest.setParams(params); + updateRequest.setParams(ModifiableSolrParams.of(params)); } else if (type == MirroredSolrRequest.Type.ADMIN) { CollectionParams.CollectionAction action = CollectionParams.CollectionAction.get(params.get(CoreAdminParams.ACTION)); diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java index a122cf5bda1..4e06f697f88 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java @@ -188,6 +188,13 @@ public void setQueryParams(Set queryParams) { /** This method defines the type of this Solr request. */ public abstract String getRequestType(); + /** + * The parameters for this request; never null. The runtime type may be mutable but modifications + * may not affect this {@link SolrRequest} instance, as it may return a new instance here + * every time. If the subclass specifies the response type as {@link + * org.apache.solr.common.params.ModifiableSolrParams}, then one can expect it to change this + * request. If the subclass has a setter then one can expect this method to return the value set. + */ public abstract SolrParams getParams(); /** @@ -270,7 +277,7 @@ public final T process(SolrClient client) throws SolrServerException, IOExceptio } public String getCollection() { - return getParams() == null ? null : getParams().get("collection"); + return getParams().get("collection"); } public void addHeader(String key, String value) { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java index 5f3b4cab9d4..760b9756a44 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java @@ -1012,9 +1012,7 @@ protected NamedList sendRequest(SolrRequest request, List inp } SolrParams reqParams = request.getParams(); - if (reqParams == null) { // TODO fix getParams to never return null! - reqParams = new ModifiableSolrParams(); - } + assert reqParams != null; ReplicaListTransformer replicaListTransformer = requestRLTGenerator.getReplicaListTransformer(reqParams); diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java index b5755335cf6..c09f0f64a42 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java @@ -331,14 +331,14 @@ public void setAuthenticationStore(AuthenticationStore authenticationStore) { public static class OutStream implements Closeable { private final String origCollection; - private final ModifiableSolrParams origParams; + private final SolrParams origParams; private final OutputStreamRequestContent content; private final InputStreamResponseListener responseListener; private final boolean isXml; public OutStream( String origCollection, - ModifiableSolrParams origParams, + SolrParams origParams, OutputStreamRequestContent content, InputStreamResponseListener responseListener, boolean isXml) { @@ -380,7 +380,7 @@ public InputStreamResponseListener getResponseListener() { public OutStream initOutStream(String baseUrl, UpdateRequest updateRequest, String collection) throws IOException { String contentType = requestWriter.getUpdateContentType(); - final ModifiableSolrParams origParams = new ModifiableSolrParams(updateRequest.getParams()); + final SolrParams origParams = updateRequest.getParams(); ModifiableSolrParams requestParams = initializeSolrParams(updateRequest, responseParser(updateRequest)); @@ -412,6 +412,7 @@ public void send(OutStream outStream, SolrRequest req, String collection) thr if (outStream.isXml) { // check for commit or optimize SolrParams params = req.getParams(); + assert params != null : "params should not be null"; if (params != null) { String fmt = null; if (params.getBool(UpdateParams.OPTIMIZE, false)) { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java index 64201b03c13..b2072e26ea4 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java @@ -55,7 +55,6 @@ import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; -import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.ObjectReleaseTracker; @@ -483,11 +482,8 @@ public Rsp request(Req req) throws SolrServerException, IOException { * @return time allowed in nanos, returns -1 if no time_allowed is specified. */ private static long getTimeAllowedInNanos(final SolrRequest req) { - SolrParams reqParams = req.getParams(); - return reqParams == null - ? -1 - : TimeUnit.NANOSECONDS.convert( - reqParams.getInt(CommonParams.TIME_ALLOWED, -1), TimeUnit.MILLISECONDS); + return TimeUnit.NANOSECONDS.convert( + req.getParams().getInt(CommonParams.TIME_ALLOWED, -1), TimeUnit.MILLISECONDS); } private static boolean isTimeExceeded(long timeAllowedNano, long timeOutTime) { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java index 2df8e8c5af9..81c555d8d1a 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java @@ -16,15 +16,15 @@ */ package org.apache.solr.client.solrj.request; +import java.util.Objects; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.UpdateParams; -/** */ public abstract class AbstractUpdateRequest extends CollectionRequiringSolrRequest implements IsUpdateRequest { - protected ModifiableSolrParams params; + protected ModifiableSolrParams params = new ModifiableSolrParams(); // maybe make final; no setter protected int commitWithin = -1; public enum ACTION { @@ -53,8 +53,6 @@ public AbstractUpdateRequest setAction( public AbstractUpdateRequest setAction( ACTION action, boolean waitFlush, boolean waitSearcher, boolean softCommit, int maxSegments) { - if (params == null) params = new ModifiableSolrParams(); - if (action == ACTION.OPTIMIZE) { params.set(UpdateParams.OPTIMIZE, "true"); params.set(UpdateParams.MAX_OPTIMIZE_SEGMENTS, maxSegments); @@ -104,20 +102,17 @@ public AbstractUpdateRequest setAction( * @since Solr 1.4 */ public AbstractUpdateRequest rollback() { - if (params == null) params = new ModifiableSolrParams(); - params.set(UpdateParams.ROLLBACK, "true"); return this; } public void setParam(String param, String value) { - if (params == null) params = new ModifiableSolrParams(); params.set(param, value); } /** Sets the parameters for this update request, overwriting any previous */ public void setParams(ModifiableSolrParams params) { - this.params = params; + this.params = Objects.requireNonNull(params); } @Override @@ -136,11 +131,10 @@ public String getRequestType() { } public boolean isWaitSearcher() { - return params != null && params.getBool(UpdateParams.WAIT_SEARCHER, false); + return params.getBool(UpdateParams.WAIT_SEARCHER, false); } public ACTION getAction() { - if (params == null) return null; if (params.getBool(UpdateParams.COMMIT, false)) return ACTION.COMMIT; if (params.getBool(UpdateParams.OPTIMIZE, false)) return ACTION.OPTIMIZE; return null; diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java index 4fbe8b08158..560aa30ab32 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java @@ -20,6 +20,7 @@ import org.apache.solr.client.solrj.request.RequestWriter.StringPayloadContentWriter; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.client.solrj.util.ClientUtils; +import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; /** @@ -50,7 +51,7 @@ protected UpdateResponse createResponse(SolrClient client) { @Override public SolrParams getParams() { - return params; + return params != null ? params : new ModifiableSolrParams(); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java index 069a263fef1..3d81d04cbda 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java @@ -31,6 +31,7 @@ import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.params.AnalysisParams; import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.params.SolrParams; /** * A request for the org.apache.solr.handler.DocumentAnalysisRequestHandler. @@ -85,7 +86,7 @@ protected DocumentAnalysisResponse createResponse(SolrClient client) { } @Override - public ModifiableSolrParams getParams() { + public SolrParams getParams() { ModifiableSolrParams params = new ModifiableSolrParams(); if (query != null) { params.add(AnalysisParams.QUERY, query); diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericSolrRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericSolrRequest.java index fab6f6470e7..745e7b56845 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericSolrRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericSolrRequest.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.util.Objects; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.request.RequestWriter.ContentWriter; @@ -26,7 +27,7 @@ import org.apache.solr.common.params.SolrParams; public class GenericSolrRequest extends SolrRequest { - public SolrParams params; + private final SolrParams params; // not null public SimpleSolrResponse response = new SimpleSolrResponse(); public ContentWriter contentWriter; public boolean requiresCollection; @@ -50,7 +51,7 @@ public GenericSolrRequest(METHOD m, String path) { */ public GenericSolrRequest(METHOD m, String path, SolrParams params) { super(m, path); - this.params = params; + this.params = Objects.requireNonNull(params); } /** diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericV2SolrRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericV2SolrRequest.java index f4267ab7815..d17a549299c 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericV2SolrRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/GenericV2SolrRequest.java @@ -40,8 +40,7 @@ public GenericV2SolrRequest(METHOD m, String path) { * @param params query parameter names and values for making this request. */ public GenericV2SolrRequest(METHOD m, String path, SolrParams params) { - super(m, path); - this.params = params; + super(m, removeLeadingApiRoot(path), params); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java index 77a7165bdf5..3f1cbb3f405 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java @@ -47,12 +47,11 @@ public void setMaxGenerationLag(int maxLagAllowed) { @Override public SolrParams getParams() { + ModifiableSolrParams params = new ModifiableSolrParams(); if (maxLagAllowed.isPresent()) { - ModifiableSolrParams params = new ModifiableSolrParams(); params.set(PARAM_MAX_GENERATION_LAG, maxLagAllowed.getAsInt()); - return params; } - return null; + return params; } @Override diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java index 07e4ce48d35..3e72746c4ba 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java @@ -34,7 +34,6 @@ import org.apache.solr.common.SolrInputField; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.ShardParams; -import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.CollectionUtil; import org.apache.solr.common.util.DataInputInputStream; import org.apache.solr.common.util.JavaBinCodec; @@ -70,7 +69,7 @@ public JavaBinUpdateRequestCodec setReadStringAsCharSeq(boolean flag) { */ public void marshal(UpdateRequest updateRequest, OutputStream os) throws IOException { NamedList nl = new NamedList<>(); - NamedList params = solrParamsToNamedList(updateRequest.getParams()); + NamedList params = updateRequest.getParams().toNamedList(); if (updateRequest.getCommitWithin() != -1) { params.add("commitWithin", updateRequest.getCommitWithin()); } @@ -128,7 +127,7 @@ public UpdateRequest unmarshal(InputStream is, final StreamingUpdateHandler hand // NOTE: if the update request contains only delete commands the params // must be loaded now - if (updateRequest.getParams() == null) { + if (updateRequest.getParams().iterator().hasNext() == false) { // no params NamedList params = (NamedList) namedList[0].get("params"); if (params != null) { updateRequest.setParams(new ModifiableSolrParams(params.toSolrParams())); @@ -179,11 +178,6 @@ public UpdateRequest unmarshal(InputStream is, final StreamingUpdateHandler hand return updateRequest; } - private NamedList solrParamsToNamedList(SolrParams params) { - if (params == null) return new NamedList<>(); - return params.toNamedList(); - } - public interface StreamingUpdateHandler { void update( SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean override); diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java index 082b88cd101..c8652fa3887 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java @@ -16,6 +16,7 @@ */ package org.apache.solr.client.solrj.request; +import java.util.Objects; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.params.CommonParams; @@ -26,26 +27,27 @@ */ public class QueryRequest extends CollectionRequiringSolrRequest { - private SolrParams query; + private final SolrParams query; public QueryRequest() { super(METHOD.GET, null); + query = SolrParams.of(); } public QueryRequest(SolrParams q) { super(METHOD.GET, null); - query = q; + query = Objects.requireNonNull(q); } public QueryRequest(SolrParams q, METHOD method) { super(method, null); - query = q; + query = Objects.requireNonNull(q); } /** Use the params 'QT' parameter if it exists */ @Override public String getPath() { - String qt = query == null ? null : query.get(CommonParams.QT); + String qt = query.get(CommonParams.QT); if (qt == null) { qt = super.getPath(); } diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java index 49fcd3015ea..1fa5634d637 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java @@ -34,7 +34,7 @@ public class SolrPing extends CollectionRequiringSolrRequest { private static final long serialVersionUID = 5828246236669090017L; /** Request parameters. */ - private ModifiableSolrParams params; + private final ModifiableSolrParams params; /** Create a new SolrPing object. */ public SolrPing() { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java index 6e485c5a30d..a64a927e38e 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java @@ -65,7 +65,7 @@ public boolean isForceV2() { @Override public SolrParams getParams() { - return solrParams; + return solrParams != null ? solrParams : SolrParams.of(); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/schema/AbstractSchemaRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/schema/AbstractSchemaRequest.java index 57edce799ba..1547e13d1a1 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/schema/AbstractSchemaRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/schema/AbstractSchemaRequest.java @@ -18,19 +18,20 @@ import org.apache.solr.client.solrj.SolrResponse; import org.apache.solr.client.solrj.request.CollectionRequiringSolrRequest; +import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; public abstract class AbstractSchemaRequest extends CollectionRequiringSolrRequest { - private SolrParams params = null; + private final SolrParams params; public AbstractSchemaRequest(METHOD m, String path) { - super(m, path); + this(m, path, null); } public AbstractSchemaRequest(METHOD m, String path, SolrParams params) { - this(m, path); - this.params = params; + super(m, path); + this.params = params != null ? params : new ModifiableSolrParams(); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/common/params/EmptySolrParams.java b/solr/solrj/src/java/org/apache/solr/common/params/EmptySolrParams.java new file mode 100644 index 00000000000..4259948bd49 --- /dev/null +++ b/solr/solrj/src/java/org/apache/solr/common/params/EmptySolrParams.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.solr.common.params; + +import java.util.Iterator; +import java.util.Map.Entry; + +/** Empty, immutable, SolrParams. */ +class EmptySolrParams extends SolrParams { + + static final SolrParams INSTANCE = new EmptySolrParams(); + + @SuppressWarnings("rawtypes") + private static final Iterator EMPTY_ITERATOR = + new Iterator() { + @Override + public boolean hasNext() { + return false; + } + + @Override + public Object next() { + throw new IllegalStateException("No elements available in iterator"); + } + }; + + @Override + public String get(String param) { + return null; + } + + @Override + public String[] getParams(String param) { + return null; + } + + @SuppressWarnings("unchecked") + @Override + public Iterator getParameterNamesIterator() { + return EMPTY_ITERATOR; + } + + @SuppressWarnings("unchecked") + @Override + public Iterator> iterator() { + return EMPTY_ITERATOR; + } +} diff --git a/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java b/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java index 0ac7e8de317..a7e7457382d 100644 --- a/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java +++ b/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java @@ -526,4 +526,14 @@ public String toString() { } return sb.toString(); } + + /** An empty, immutable SolrParams. */ + public static SolrParams of() { + return EmptySolrParams.INSTANCE; + } + + /** An immutable SolrParams holding one pair (not null). */ + public static SolrParams of(String k, String v) { + return new MapSolrParams(Map.of(k, v)); + } } diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java index b043c097f64..8fd212930e6 100644 --- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java +++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java @@ -283,11 +283,9 @@ protected void indexDoc(List skipServers, Object... fields) UpdateRequest ureq = new UpdateRequest(); ureq.add(doc); - ModifiableSolrParams params = new ModifiableSolrParams(); for (CloudJettyRunner skip : skipServers) { - params.add("test.distrib.skip.servers", skip.url + "/"); + ureq.getParams().add("test.distrib.skip.servers", skip.url + "/"); } - ureq.setParams(params); ureq.process(cloudClient); } diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ConfigRequest.java b/solr/test-framework/src/java/org/apache/solr/cloud/ConfigRequest.java index 9a805141d79..2ddf05aeb44 100644 --- a/solr/test-framework/src/java/org/apache/solr/cloud/ConfigRequest.java +++ b/solr/test-framework/src/java/org/apache/solr/cloud/ConfigRequest.java @@ -23,6 +23,7 @@ import org.apache.solr.client.solrj.request.RequestWriter; import org.apache.solr.client.solrj.response.SolrResponseBase; import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; /** @@ -41,7 +42,7 @@ public ConfigRequest(String message) { @Override public SolrParams getParams() { - return null; + return new ModifiableSolrParams(); } @Override