This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d8c971a6a8916297d08e5d8641eb9640d09456cc
Author: Andrea Cosentino <[email protected]>
AuthorDate: Thu Apr 22 15:25:27 2021 +0200

    CAMEL-16544 - Camel-Solr: Support Query natively as producer operation
---
 .../apache/camel/component/solr/SolrConstants.java |  2 ++
 .../apache/camel/component/solr/SolrProducer.java  | 24 ++++++++++++++++++++++
 .../camel/component/solr/SolrUpdateTest.java       | 22 ++++++++++++++++++++
 3 files changed, 48 insertions(+)

diff --git 
a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
 
b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
index 13ea976..9016c20 100644
--- 
a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
+++ 
b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
@@ -31,6 +31,8 @@ public final class SolrConstants {
     public static final String OPERATION_ADD_BEANS = "ADD_BEANS";
     public static final String OPERATION_DELETE_BY_ID = "DELETE_BY_ID";
     public static final String OPERATION_DELETE_BY_QUERY = "DELETE_BY_QUERY";
+    public static final String OPERATION_QUERY = "QUERY";
+    public static final String QUERY_STRING = "CamelSolrQueryString";
 
     public static final String PARAM_STREAMING_QUEUE_SIZE = 
"streamingQueueSize";
     public static final String PARAM_STREAMING_THREAD_COUNT = 
"streamingThreadCount";
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 d60c912..f37eece 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
@@ -17,9 +17,13 @@
 package org.apache.camel.component.solr;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.activation.MimetypesFileTypeMap;
@@ -29,10 +33,15 @@ import org.apache.camel.WrappedFile;
 import org.apache.camel.support.DefaultProducer;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
 import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
 import org.apache.solr.client.solrj.request.DirectXmlRequest;
+import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 
@@ -110,12 +119,27 @@ public class SolrProducer extends DefaultProducer {
             UpdateRequest updateRequest = createUpdateRequest();
             updateRequest.setAction(ACTION.OPTIMIZE, true, true, 1);
             updateRequest.process(serverToUse);
+        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_QUERY)) {
+            query(exchange, serverToUse);
         } else {
             throw new IllegalArgumentException(
                     SolrConstants.OPERATION + " header value '" + operation + 
"' is not supported");
         }
     }
 
+    private void query(Exchange exchange, SolrClient serverToUse) throws 
SolrServerException, IOException {
+        SolrQuery solrQuery = new SolrQuery();
+        if 
(ObjectHelper.isNotEmpty(exchange.getMessage().getHeader(SolrConstants.QUERY_STRING)))
 {
+            
solrQuery.setQuery(exchange.getMessage().getHeader(SolrConstants.QUERY_STRING, 
String.class));
+        } else {
+            throw new IllegalArgumentException("Query String needs to be set 
as header while querying Solr");
+        }
+        QueryRequest queryRequest = new QueryRequest(solrQuery);
+        queryRequest.setBasicAuthCredentials(getEndpoint().getUsername(), 
getEndpoint().getPassword());
+        QueryResponse p = queryRequest.process(serverToUse);
+        exchange.getMessage().setBody(p.getResults());
+    }
+
     private void insert(Exchange exchange, SolrClient solrServer) throws 
Exception {
         Object body = exchange.getIn().getBody();
         boolean invalid = false;
diff --git 
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
 
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
index 7364b61..4a54a31 100644
--- 
a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
+++ 
b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
@@ -22,11 +22,13 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
 import org.apache.camel.test.junit5.params.Test;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.UpdateParams;
 import org.junit.jupiter.api.BeforeEach;
@@ -261,6 +263,26 @@ public class SolrUpdateTest extends 
SolrComponentTestSupport {
     }
 
     @Test
+    public void queryDocumentsToCSVUpdateHandlerWithoutParameters() throws 
Exception {
+        solrEndpoint.setRequestHandler("/update/csv");
+
+        Exchange exchange = createExchangeWithBody(new 
File("src/test/resources/data/books.csv"));
+        exchange.getIn().setHeader(SolrConstants.OPERATION, 
SolrConstants.OPERATION_INSERT);
+        exchange.getIn().setHeader(SolrConstants.PARAM + 
UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
+        template.send("direct:start", exchange);
+        solrCommit();
+
+        Exchange exchange1 = createExchangeWithBody(null);
+        exchange1.getIn().setHeader(SolrConstants.OPERATION, 
SolrConstants.OPERATION_QUERY);
+        exchange1.getIn().setHeader(SolrConstants.QUERY_STRING, 
"id:0553573403");
+        Exchange result = template.send("direct:start", exchange1);
+
+        SolrDocumentList list = 
result.getMessage().getBody(SolrDocumentList.class);
+        assertEquals("A Game of Thrones", list.get(0).getFieldValue("name"));
+        assertEquals(7.99f, list.get(0).getFieldValue("price"));
+    }
+
+    @Test
     public void indexDocumentsToCSVUpdateHandlerWithParameters() throws 
Exception {
         solrEndpoint.setRequestHandler("/update/csv");
 

Reply via email to