/** * 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.camel.component.solr; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.camel.Exchange; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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.SolrInputDocument; import org.apache.solr.common.params.UpdateParams; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @Ignore("Need refactoring in SolrComponentTestSupport, with new schema and solr-config from solr 5.2.1 and new Cloud Solr cluster instantiation") public class SolrUpdateTest extends SolrComponentTestSupport { private SolrEndpoint solrEndpoint; public SolrUpdateTest(SolrFixtures.TestServerType serverToTest) { super(serverToTest); } @Override @Before public void setUp() throws Exception { super.setUp(); solrEndpoint = getMandatoryEndpoint(solrRouteUri(), SolrEndpoint.class); } @Test public void testInsertSolrInputDocumentAsXMLWithoutAddRoot() throws Exception { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "MA147LL/A", 1.0f); String docAsXml = ClientUtils.toXML(doc); template.sendBodyAndHeader("direct:start", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void testInsertSolrInputDocumentAsXMLWithAddRoot() throws Exception { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "MA147LL/A", 1.0f); String docAsXml = "<add>" + ClientUtils.toXML(doc) + "</add>"; template.sendBodyAndHeader("direct:start", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void testInsertSolrInputDocument() throws Exception { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "MA147LL/A", 1.0f); template.sendBodyAndHeader("direct:start", doc, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void testInsertSolrInputDocumentList() throws Exception { List<SolrInputDocument> docList = new ArrayList<SolrInputDocument>(2); SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "MA147LL/A", 1.0f); docList.add(doc); doc = new SolrInputDocument(); doc.addField("id", "KP147LL/A", 1.0f); docList.add(doc); template.sendBodyAndHeader("direct:start", docList, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); response = executeSolrQuery("id:KP147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); response = executeSolrQuery("id:KP147LL/ABC"); assertEquals(0, response.getStatus()); assertEquals(0, response.getResults().getNumFound()); } @Test public void testInsertStreaming() throws Exception { Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT_STREAMING); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); template.send("direct:start", exchange); Thread.sleep(500); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void indexSingleDocumentOnlyWithId() throws Exception { Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); template.send("direct:start", exchange); solrCommit(); // Check things were indexed. QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void caughtSolrExceptionIsHandledElegantly() throws Exception { Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.name", "Missing required field throws exception."); template.send("direct:start", exchange); //noinspection ThrowableResultOfMethodCallIgnored assertEquals(HttpSolrServer.RemoteSolrException.class, exchange.getException().getClass()); } @Test public void setHeadersAsSolrFields() throws Exception { Exchange exchange = createExchangeWithBody("Body is ignored"); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black"); exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc."); template.send("direct:start", exchange); solrCommit(); QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); SolrDocument doc = response.getResults().get(0); assertEquals("Apple 60 GB iPod with Video Playback Black", doc.getFieldValue("name")); assertEquals("Apple Computer Inc.", doc.getFieldValue("manu")); } @Test public void setMultiValuedFieldInHeader() throws Exception { String[] categories = {"electronics", "apple"}; Exchange exchange = createExchangeWithBody("Test body for iPod."); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); exchange.getIn().setHeader("SolrField.cat", categories); template.send("direct:start", exchange); solrCommit(); // Check things were indexed. QueryResponse response = executeSolrQuery("id:MA147LL/A"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); SolrDocument doc = response.getResults().get(0); assertArrayEquals(categories, ((List<?>) doc.getFieldValue("cat")).toArray()); } @Test public void indexDocumentsAndThenCommit() throws Exception { Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black"); exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc."); template.send("direct:start", exchange); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(0, response.getResults().getNumFound()); solrCommit(); QueryResponse afterCommitResponse = executeSolrQuery("*:*"); assertEquals(0, afterCommitResponse.getStatus()); assertEquals(1, afterCommitResponse.getResults().getNumFound()); } @Test public void invalidSolrParametersAreIgnored() throws Exception { Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrField.id", "MA147LL/A"); exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black"); exchange.getIn().setHeader("SolrParam.invalid-param", "this is ignored"); template.send("direct:start", exchange); solrCommit(); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); } @Test public void indexDocumentsToCSVUpdateHandlerWithoutParameters() 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(); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(10, response.getResults().getNumFound()); response = executeSolrQuery("id:0553573403"); SolrDocument doc = response.getResults().get(0); assertEquals("A Game of Thrones", doc.getFieldValue("name")); assertEquals(7.99f, doc.getFieldValue("price")); } @Test public void indexDocumentsToCSVUpdateHandlerWithParameters() 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"); exchange.getIn().setHeader("SolrParam.fieldnames", "id,cat,name,price,inStock,author_t,series_t,sequence_i,genre_s"); exchange.getIn().setHeader("SolrParam.skip", "cat,sequence_i,genre_s"); exchange.getIn().setHeader("SolrParam.skipLines", 1); template.send("direct:start", exchange); solrCommit(); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(10, response.getResults().getNumFound()); SolrDocument doc = response.getResults().get(0); assertFalse(doc.getFieldNames().contains("cat")); } @Test public void indexPDFDocumentToExtractingRequestHandler() throws Exception { solrEndpoint.setRequestHandler("/update/extract"); Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/tutorial.pdf")); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrParam.literal.id", "tutorial.pdf"); template.send("direct:start", exchange); solrCommit(); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); SolrDocument doc = response.getResults().get(0); assertEquals("Solr", doc.getFieldValue("subject")); assertEquals("tutorial.pdf", doc.getFieldValue("id")); assertEquals(Arrays.asList("application/pdf"), doc.getFieldValue("content_type")); } @Test @Ignore("No real advantage has yet been discovered to specifying the file in a header.") public void indexPDFDocumentSpecifyingFileInParameters() throws Exception { solrEndpoint.setRequestHandler("/update/extract"); Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT); exchange.getIn().setHeader("SolrParam.stream.file", "src/test/resources/data/tutorial.pdf"); exchange.getIn().setHeader("SolrParam.literal.id", "tutorial.pdf"); template.send("direct:start", exchange); solrCommit(); QueryResponse response = executeSolrQuery("*:*"); assertEquals(0, response.getStatus()); assertEquals(1, response.getResults().getNumFound()); SolrDocument doc = response.getResults().get(0); assertEquals("Solr", doc.getFieldValue("subject")); assertEquals("tutorial.pdf", doc.getFieldValue("id")); assertEquals(Arrays.asList("application/pdf"), doc.getFieldValue("content_type")); } }