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) {

Reply via email to