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");
