This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 4179fcab060 CAMEL-22465 Allow multiple occurrences with SolrParam.x
headers (#19363)
4179fcab060 is described below
commit 4179fcab06054f5dd86b6fa12f4e68cd6df9ea6a
Author: James Dyer <[email protected]>
AuthorDate: Mon Sep 29 09:08:14 2025 -0500
CAMEL-22465 Allow multiple occurrences with SolrParam.x headers (#19363)
* Allow users to send the same parameter multiple times to Solr via the
"SolrParam.xx" syntax
* auto re-format
---
.../apache/camel/component/solr/SolrProducer.java | 9 ++++-
.../solr/integration/SolrPingAndSearchTest.java | 39 ++++++++++++++++++++++
.../solr/integration/SolrTestSupport.java | 18 +++++++---
3 files changed, 60 insertions(+), 6 deletions(-)
diff --git
a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
index ee3b5bbb067..241ed1856ba 100644
---
a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
+++
b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
@@ -135,7 +135,14 @@ public class SolrProducer extends DefaultAsyncProducer {
.filter(entry ->
entry.getKey().startsWith(SolrConstants.HEADER_PARAM_PREFIX))
.forEach(entry -> {
String paramName =
entry.getKey().substring(SolrConstants.HEADER_PARAM_PREFIX.length());
- modifiableSolrParams.add(paramName,
entry.getValue().toString());
+ Object value = entry.getValue();
+ if (value instanceof Iterable<?> iterable) {
+ for (Object val : iterable) {
+ modifiableSolrParams.add(paramName,
val.toString());
+ }
+ } else {
+ modifiableSolrParams.add(paramName,
entry.getValue().toString());
+ }
});
return modifiableSolrParams;
}
diff --git
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
index c46c2c42a4c..78f376241ba 100644
---
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
+++
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
@@ -31,8 +31,12 @@ import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.jupiter.api.Test;
+import static
org.apache.camel.component.solr.SolrConstants.HEADER_PARAM_PREFIX;
+import static org.apache.camel.component.solr.SolrConstants.PARAM_SOLR_PARAMS;
import static org.junit.jupiter.api.Assertions.*;
class SolrPingAndSearchTest extends SolrTestSupport {
@@ -107,6 +111,39 @@ class SolrPingAndSearchTest extends SolrTestSupport {
assertEquals(1, responseFrom3.getResults().size());
}
+ @Test
+ void testQueryWithMultipleFilters() {
+ // this indexes 5 documents with ids 1-5
+ List<Map<String, String>> content
+ = IntStream.range(1, 6).mapToObj(i -> Map.of("id", "" + i,
"content", "content" + i)).toList();
+ template.requestBodyAndHeaders("direct:index", content,
SolrUtils.getHeadersForCommit());
+
+ // we can construct a ModifiableSolrParams object to send 2 filter
queries to solr
+ ModifiableSolrParams msp
+ = new ModifiableSolrParams(Map.of("fq", new String[] {
"-content:content1", "-content:content4" }));
+ SolrDocumentList sdl = executeSolrQuery("direct:search", "*:*",
Map.of(PARAM_SOLR_PARAMS, msp)).getResults();
+
+ assertEquals(3, sdl.size());
+ List<String> returnedValues = sdl.stream().map(sd ->
sd.getFirstValue("content").toString()).toList();
+ assertTrue(returnedValues.contains("content2"));
+ assertTrue(returnedValues.contains("content3"));
+ assertTrue(returnedValues.contains("content5"));
+ assertFalse(returnedValues.contains("content1"));
+ assertFalse(returnedValues.contains("content4"));
+
+ // we can also send the 2 filters by using the 'SolrParam.fq' header
and passing an Iterable.
+ Map<String, Object> solrFilters = Map.of(HEADER_PARAM_PREFIX + "fq",
List.of("-content:content2", "-content:content3"));
+ sdl = executeSolrQuery("direct:search", "*:*",
solrFilters).getResults();
+
+ assertEquals(3, sdl.size());
+ returnedValues = sdl.stream().map(sd ->
sd.getFirstValue("content").toString()).toList();
+ assertTrue(returnedValues.contains("content1"));
+ assertTrue(returnedValues.contains("content4"));
+ assertTrue(returnedValues.contains("content5"));
+ assertFalse(returnedValues.contains("content2"));
+ assertFalse(returnedValues.contains("content3"));
+ }
+
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@@ -126,6 +163,8 @@ class SolrPingAndSearchTest extends SolrTestSupport {
// query tests
from("direct:index")
.to("solr:default?operation=insert");
+ from("direct:search")
+ .to("solr:default?operation=search");
from("direct:searchWithSizeTwo")
.to("solr:default?operation=search&size=2");
from("direct:searchFrom3")
diff --git
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
index e25a83aa0ca..33bea4a09f4 100644
---
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
+++
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.solr.integration;
import java.nio.file.Path;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@@ -210,13 +211,20 @@ public abstract class SolrTestSupport implements
CamelTestSupportHelper, Configu
}
public QueryResponse executeSolrQuery(String uri, String queryString) {
- Exchange exchange = ExchangeBuilder.anExchange(camelContext())
+ return executeSolrQuery(uri, queryString, Collections.emptyMap());
+ }
+
+ public QueryResponse executeSolrQuery(String uri, String queryString,
Map<String, Object> additionalExchangeHeaders) {
+ var exchangeBuilder = ExchangeBuilder.anExchange(camelContext())
.withHeader(SolrConstants.PARAM_OPERATION,
SolrOperation.SEARCH)
.withHeader(SolrConstants.PARAM_QUERY_STRING, queryString)
- .withHeader(SolrConstants.PARAM_REQUEST_HANDLER, null)
- .build();
- Exchange exchange1 = processRequest(uri, exchange);
- return exchange1.getMessage().getBody(QueryResponse.class);
+ .withHeader(SolrConstants.PARAM_REQUEST_HANDLER, null);
+ if (additionalExchangeHeaders != null) {
+ for (var entry : additionalExchangeHeaders.entrySet()) {
+ exchangeBuilder.withHeader(entry.getKey(), entry.getValue());
+ }
+ }
+ return processRequest(uri,
exchangeBuilder.build()).getMessage().getBody(QueryResponse.class);
}
public Exchange pingInstance(String uri) {