package com.lucidworks.storm.solr;
import java.io.File;
import java.util.Date;
import backtype.storm.tuple.Tuple;
import com.lucidworks.storm.spring.SpringBolt;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.json.simple.JSONArray;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertTrue;
/**
* Tests the SolrBoltAction
*/
public class SolrBoltActionTest extends TestSolrCloudClusterSupport {
class TestDoc {
public String id;
public String text;
public int number;
private Date timestamp;
TestDoc(String id, String text, int number) {
this.id = id;
this.text = text;
this.number = number;
this.timestamp = new Date();
}
public Date getTimestamp() {
return timestamp;
}
}
@Before
public void setupCollection() throws Exception {
String confName = "testConfig";
File confDir = new File("src/test/resources/conf");
String testCollection = "test";
int numShards = 1;
int replicationFactor = 1;
createCollection(testCollection, numShards, replicationFactor, confName, confDir);
cloudSolrClient.setDefaultCollection(testCollection);
}
@Test
public void testBoltAction() throws Exception {
doBoltActionTest();
//doNestedDocTest();
}
protected void doBoltActionTest() throws Exception {
// Spring @Autowired property at runtime
SolrBoltAction sba = new SolrBoltAction(cloudSolrClient);
sba.setUpdateRequestStrategy(new DefaultUpdateRequestStrategy());
sba.setMaxBufferSize(1); // to avoid buffering docs
// Mock the Storm tuple
String docId = "1";
TestDoc testDoc = new TestDoc(docId, "foo", 10);
Tuple mockTuple = mock(Tuple.class);
when(mockTuple.size()).thenReturn(2);
when(mockTuple.getString(0)).thenReturn(docId);
when(mockTuple.getValue(1)).thenReturn(testDoc);
SpringBolt.ExecuteResult result = sba.execute(mockTuple, null);
assertTrue(result == SpringBolt.ExecuteResult.ACK);
cloudSolrClient.commit();
// verify the object to Solr mapping worked correctly using reflection and dynamic fields
SolrQuery query = new SolrQuery("id:" + docId);
QueryResponse qr = cloudSolrClient.query(query);
SolrDocumentList results = qr.getResults();
assertTrue(results.getNumFound() == 1);
SolrDocument doc = results.get(0);
assertNotNull(doc);
assertEquals("foo", doc.getFirstValue("text_s"));
assertEquals(new Integer(testDoc.number), doc.getFirstValue("number_i"));
assertTrue(doc.getFirstValue("timestamp_tdt") != null);
}
protected void doNestedDocTest() throws Exception {
SolrBoltAction sba = new SolrBoltAction(cloudSolrClient);
sba.setSolrInputDocumentMapper(new NestedDocumentMapper());
sba.setUpdateRequestStrategy(new DefaultUpdateRequestStrategy());
sba.setMaxBufferSize(1); // to avoid buffering docs
String docId = "1";
JSONArray jsonDocs = NestedDocumentMapperTest.loadNestedDocs();
Tuple mockTuple = mock(Tuple.class);
when(mockTuple.size()).thenReturn(2);
when(mockTuple.getString(0)).thenReturn(docId);
when(mockTuple.getValue(1)).thenReturn(jsonDocs.get(0));
SpringBolt.ExecuteResult result = sba.execute(mockTuple, null);
assertTrue(result == SpringBolt.ExecuteResult.ACK);
cloudSolrClient.commit();
// verify the object to Solr mapping worked correctly using reflection and dynamic fields
SolrQuery query = new SolrQuery("id:" + docId);
query.set("fl", "*,[child parentFilter=id:"+docId+" limit=100]");
QueryResponse qr = cloudSolrClient.query(query);
SolrDocumentList results = qr.getResults();
assertTrue(results.getNumFound() == 1);
SolrDocument doc = results.get(0);
assertNotNull(doc);
System.out.println("\n\n>> doc: "+doc+"\n\n");
if (doc.hasChildDocuments()) {
for (SolrDocument child : doc.getChildDocuments()) {
System.out.println("\n>> "+child+"\n");
}
} else {
System.out.println("no child documents returned");
}
}
}