package com.villemos.ispace.solr; import java.util.Date; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.impl.DefaultExchange; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests; import com.villemos.ispace.api.ResultSet; import com.villemos.ispace.api.SolrOptions; @ContextConfiguration (locations={"SolrTest-context.xml"}) public class SolrTest extends AbstractJUnit38SpringContextTests { @Autowired protected CamelContext context = null; @Autowired protected ProducerTemplate producer = null; @Produce(uri = "direct:store") protected ProducerTemplate storeRoute = null; @Produce(uri = "direct:retrieve") protected ProducerTemplate retrieveRoute = null; @DirtiesContext @Test public void testSolrAccess() { /** Test deletion. */ Exchange exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.delete, "*:*"); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Ensure the local archive is empty. */ Exchange countExchange = new DefaultExchange(context); countExchange.getIn().getHeaders().put(SolrOptions.count, true); countExchange.getIn().getHeaders().put(SolrOptions.query, "*:*"); countExchange.getIn().getHeaders().put(SolrOptions.stream, false); storeRoute.send(countExchange); assertTrue((Integer) countExchange.getOut().getHeaders().get(SolrOptions.count) == 0); /** Inject a IO object. */ InformationObject io = new InformationObject(); io.hasUri = "testUriOne"; io.hasTitle = "1.testTitle"; io.isAttachedTo.add("1.testAttachedTo.1"); io.isAttachedTo.add("1.testAttachedTo.2"); io.fromSource = "1.testSource"; io.ofMimeType = "1.testMimetype"; io.ofEntityType = "1.testEntitytype"; io.withReferenceId = "1.testReferenceId"; io.withIssue = "1"; io.withRevision = "0"; io.isPartOf = "1.testPartof"; io.hasPart.add("1.testPart.1"); io.hasPart.add("1.testPart.2"); io.withRawText = "This is a test text KEYWORDONE"; io.withAttachedLog.add("1.testLog.1"); io.withAttachedLog.add("1.testLog.2"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.1"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.2"); io.dynamic.put("1.testDynamicField2", "testDynamicFieldValue.1"); exchange = new DefaultExchange(context); exchange.getIn().setBody(io); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Inject a second one. */ io = new InformationObject(); io.hasUri = "testUriTwo"; io.hasTitle = "2.testTitle"; io.isAttachedTo.add("2.testAttachedTo.1"); io.isAttachedTo.add("2.testAttachedTo.2"); io.fromSource = "2.testSource"; io.ofMimeType = "2.testMimetype"; io.ofEntityType = "2.testEntitytype"; io.withReferenceId = "2.testReferenceId"; io.withIssue = "1"; io.withRevision = "0"; io.isPartOf = "2.testPartof"; io.hasPart.add("2.testPart.1"); io.hasPart.add("2.testPart.2"); io.withRawText = "This is a test text KEYWORDTWO"; io.withAttachedLog.add("2.testLog.1"); io.withAttachedLog.add("2.testLog.2"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.1"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.2"); io.dynamic.put("2.testDynamicField2", "testDynamicFieldValue.1"); exchange = new DefaultExchange(context); exchange.getIn().setBody(io); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Insert a comment. */ io = new InformationObject(); io.hasUri = "testUriThree"; io.hasTitle = "3.testTitle"; io.isAttachedTo.add("testUriTwo"); io.fromSource = "3.testSource"; io.ofMimeType = "3.testMimetype"; io.ofEntityType = "Comment"; io.withReferenceId = "3.testReferenceId"; io.withIssue = "1"; io.withRevision = "0"; io.isPartOf = "3.testPartof"; io.hasPart.add("3.testPart.1"); io.hasPart.add("3.testPart.2"); io.withRawText = "This is a test text KEYWORDTHREE"; io.withAttachedLog.add("3.testLog.1"); io.withAttachedLog.add("3.testLog.2"); exchange = new DefaultExchange(context); exchange.getIn().setBody(io); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Do a count search. */ storeRoute.send(countExchange); assertTrue((Integer) countExchange.getOut().getHeaders().get(SolrOptions.count) == 3); /** Search WITHOUT comments. */ exchange = new DefaultExchange(context); exchange.getIn().setHeader(SolrOptions.count, false); exchange.getIn().setHeader(SolrOptions.comments, false); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); storeRoute.send(exchange); assertTrue((Integer) exchange.getOut().getHeader(SolrOptions.count) == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.size() == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.get(0).comments.size() == 0); /** Search WITH comments. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); storeRoute.send(exchange); assertTrue((Integer) exchange.getOut().getHeader(SolrOptions.count) == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.size() == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.get(0).comments.size() == 1); /** Search WITH facets. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); storeRoute.send(exchange); assertTrue((Integer) exchange.getOut().getHeader(SolrOptions.count) == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.size() == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.get(0).comments.size() == 1); assertTrue(((ResultSet) exchange.getOut().getBody()).facets.size() > 0); /** Test deletion of a single IO. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.delete, "hasUri:testUriOne"); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Search WITH comments for teh document we just deleted, i.e. should not find anything. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDONE"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); storeRoute.send(exchange); assertTrue((Integer) exchange.getOut().getHeader(SolrOptions.count) == 0); assertTrue(((ResultSet) exchange.getOut().getBody()).informationobjects.size() == 0); assertTrue(((ResultSet) exchange.getOut().getBody()).facets.size() > 0); /** Search WITHOUT comments. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); exchange.getIn().getHeaders().put(SolrOptions.stream, true); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 1); assertTrue(RetrievalBuffer.buffer.io.get(0).comments.size() == 0); RetrievalBuffer.buffer.clear(); /** Search WITH comments. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 1); assertTrue(RetrievalBuffer.buffer.io.get(0).comments.size() == 1); RetrievalBuffer.buffer.clear(); /** Search WITH facets. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDTWO"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 1); assertTrue(RetrievalBuffer.buffer.io.get(0).comments.size() == 1); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); RetrievalBuffer.buffer.clear(); /** Search WITH facets that should not return anything. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "KEYWORDONE"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 0); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); RetrievalBuffer.buffer.clear(); } @DirtiesContext @Test public void testSolrContinuedDelivery() { /** Test deletion. */ Exchange exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.delete, "*:*"); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); /** Ensure the local archive is empty. */ Exchange countExchange = new DefaultExchange(context); countExchange.getIn().getHeaders().put(SolrOptions.count, true); countExchange.getIn().getHeaders().put(SolrOptions.stream, false); countExchange.getIn().getHeaders().put(SolrOptions.query, "*:*"); storeRoute.send(countExchange); assertTrue((Integer) countExchange.getOut().getHeaders().get(SolrOptions.count) == 0); /** Inject a high number of documents, without forcing a commit. */ Date start = new Date(); for (int count = 0; count < 2000; count++) { /** Inject a IO object. */ InformationObject io = new InformationObject(); io.hasUri = "testUri" + count; io.hasTitle = "1.testTitle"; io.isAttachedTo.add("1.testAttachedTo.1"); io.isAttachedTo.add("1.testAttachedTo.2"); io.fromSource = "1.testSource"; io.ofMimeType = "1.testMimetype"; io.ofEntityType = "1.testEntitytype"; io.withReferenceId = "1.testReferenceId"; io.withIssue = "1"; io.withRevision = "0"; io.isPartOf = "1.testPartof"; io.hasPart.add("1.testPart.1"); io.hasPart.add("1.testPart.2"); io.withRawText = "This is a test text KEYWORDONE"; io.withAttachedLog.add("1.testLog.1"); io.withAttachedLog.add("1.testLog.2"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.1"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.2"); io.dynamic.put("1.testDynamicField2", "testDynamicFieldValue.1"); exchange = new DefaultExchange(context); exchange.getIn().setHeader(SolrOptions.commit, false); exchange.getIn().setBody(io); storeRoute.send(exchange); } /** Inject comments. */ for (int count = 2000; count < 3000; count++) { /** Inject a IO object. */ InformationObject io = new InformationObject(); io.hasUri = "testUri" + count; io.hasTitle = "1.testTitle"; io.isAttachedTo.add("testUri" + (count - 2000)); io.fromSource = "1.testSource"; io.ofMimeType = "1.testMimetype"; io.ofEntityType = "1.testEntitytype"; io.withReferenceId = "1.testReferenceId"; io.withIssue = "1"; io.withRevision = "0"; io.isPartOf = "1.testPartof"; io.hasPart.add("1.testPart.1"); io.hasPart.add("1.testPart.2"); io.withRawText = "This is a test text KEYWORDONE"; io.withAttachedLog.add("1.testLog.1"); io.withAttachedLog.add("1.testLog.2"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.1"); io.dynamic.put("1.testDynamicField1", "testDynamicFieldValue.2"); io.dynamic.put("1.testDynamicField2", "testDynamicFieldValue.1"); exchange = new DefaultExchange(context); if (count == 3000) { exchange.getIn().setHeader(SolrOptions.commit, true); } exchange.getIn().setBody(io); storeRoute.send(exchange); } Date end = new Date(); double duration = (double) (end.getTime() - start.getTime()) / 1000d; logger.info("Inserted 3000 entries in " + duration + " seconds. An average of " + 3000 / duration + " entries per second."); /** Force commit. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.commit, true); storeRoute.send(exchange); start = new Date(); /** Search WITH facets, retrieving an EQUAL number of 100. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "test"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); exchange.getIn().getHeaders().put(SolrOptions.rows, 500); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 500); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); end = new Date(); duration = (double) (end.getTime() - start.getTime()) / 1000d; logger.info("Retrieved 500 entries in " + duration + " seconds. An average of " + 500 / duration + " entries per second."); start = new Date(); RetrievalBuffer.buffer.clear(); /** Search WITH facets, retrieving an DECIMAL number of 100. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "test"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); exchange.getIn().getHeaders().put(SolrOptions.rows, 175); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 175); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); end = new Date(); duration = (double) (end.getTime() - start.getTime()) / 1000d; logger.info("Retrieved 175 entries in " + duration + " seconds. An average of " + 175 / duration + " entries per second."); start = new Date(); RetrievalBuffer.buffer.clear(); /** Search WITH facets, retrieving LESS than 100. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "test"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); exchange.getIn().getHeaders().put(SolrOptions.rows, 50); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 50); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); end = new Date(); duration = (double) (end.getTime() - start.getTime()) / 1000d; logger.info("Retrieved 50 entries in " + duration + " seconds. An average of " + 50 / duration + " entries per second."); start = new Date(); RetrievalBuffer.buffer.clear(); /** Search WITH facets, retrieving MORE than 3000. */ exchange = new DefaultExchange(context); exchange.getIn().getHeaders().put(SolrOptions.query, "test"); exchange.getIn().getHeaders().put(SolrOptions.comments, true); exchange.getIn().getHeaders().put(SolrOptions.facets, true); exchange.getIn().getHeaders().put(SolrOptions.stream, true); exchange.getIn().getHeaders().put(SolrOptions.rows, 4000); storeRoute.send(exchange); assertTrue(RetrievalBuffer.buffer.io.size() == 3000); assertTrue(RetrievalBuffer.buffer.facet.size() > 0); end = new Date(); duration = (double) (end.getTime() - start.getTime()) / 1000d; logger.info("Retrieved 3000 entries in " + duration + " seconds. An average of " + 3000 / duration + " entries per second."); RetrievalBuffer.buffer.clear(); } }