package uk.co.flax.biosolr;
import java.util.List;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.SolrQueryResponse;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Unit tests for the SimpleTreeFacetComponent, using a basic
* Solr instance for integration testing.
*
* @author mlp
*/
public class SimpleTreeFacetComponentTest extends SolrTestCaseJ4 {
static String requestHandler = "facetTree";
@BeforeClass
public static void beforeClass() throws Exception {
// Initialise a single Solr core
initCore("solrconfig.xml", "schema.xml", "facetTree/solr", "hierarchy");
// Add some records
assertNull(h.validateUpdate(adoc("id", "0", "node_id", "A", "child_ids", "AA", "child_ids", "AB", "child_ids", "AC", "name", "nodeA", "label", "nodeA")));
assertNull(h.validateUpdate(adoc("id", "1", "node_id", "AA", "child_ids", "AAA", "child_ids", "AAB", "name", "nodeAA", "label", "nodeAA")));
assertNull(h.validateUpdate(adoc("id", "2", "node_id", "AAA", "name", "nodeAAA", "label", "nodeAAA")));
assertNull(h.validateUpdate(adoc("id", "3", "node_id", "AAB", "name", "nodeAAB", "label", "nodeAAB")));
assertNull(h.validateUpdate(adoc("id", "4", "node_id", "AB", "name", "nodeAB", "label", "nodeAB")));
assertNull(h.validateUpdate(adoc("id", "5", "node_id", "AC", "name", "nodeAC", "label", "nodeAC")));
assertNull(h.validateUpdate(commit()));
}
@Test
public void testBadRequest_missingLocalParams() {
SolrCore core = h.getCore();
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "*:*");
params.add("facet", "true");
params.add("facet.tree", "true");
params.add("facet.tree.field", "node_id");
SolrQueryResponse rsp = new SolrQueryResponse();
rsp.add("responseHeader", new SimpleOrderedMap<>());
SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
SolrRequestHandler handler = core.getRequestHandler(requestHandler);
handler.handleRequest(req, rsp);
req.close();
assertNotNull(rsp.getException());
}
@Test
public void testBadRequest_missingChildField() {
SolrCore core = h.getCore();
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "*:*");
params.add("facet", "true");
params.add("facet.tree", "true");
params.add("facet.tree.field", "{!ftree childField=blah}node_id");
SolrQueryResponse rsp = new SolrQueryResponse();
rsp.add("responseHeader", new SimpleOrderedMap<>());
SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
SolrRequestHandler handler = core.getRequestHandler(requestHandler);
handler.handleRequest(req, rsp);
req.close();
assertNotNull(rsp.getException());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testSingleResult() {
SolrCore core = h.getCore();
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "name:nodeAAA");
params.add("facet", "true");
params.add("facet.tree", "true");
params.add("facet.tree.field", "{!ftree childField=child_ids}node_id");
SolrQueryResponse rsp = new SolrQueryResponse();
rsp.add("responseHeader", new SimpleOrderedMap<>());
SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
SolrRequestHandler handler = core.getRequestHandler(requestHandler);
handler.handleRequest(req, rsp);
req.close();
assertNull(rsp.getException());
NamedList results = rsp.getValues();
NamedList facetTree = (NamedList) ((NamedList)(results.get("facet_counts"))).get("facet_trees");
assertNotNull(facetTree);
// Check the generated hierarchy - should be three levels deep
List<Object> nodes = (List) facetTree.get("node_id");
assertEquals(1, nodes.size());
NamedList level1 = (NamedList) nodes.get(0);
assertEquals("A", level1.get("value"));
assertEquals(0L, level1.get("count"));
assertEquals(1L, level1.get("total"));
List level2Nodes = (List)level1.get("hierarchy");
NamedList level2 = (NamedList)level2Nodes.get(0);
assertEquals("AA", level2.get("value"));
assertEquals(0L, level2.get("count"));
assertEquals(1L, level2.get("total"));
List level3Nodes = (List)level2.get("hierarchy");
NamedList level3 = (NamedList)level3Nodes.get(0);
assertEquals("AAA", level3.get("value"));
assertEquals(1L, level3.get("count"));
assertEquals(1L, level3.get("total"));
assertNull(level3.get("hierarchy"));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testMultipleResults() {
SolrCore core = h.getCore();
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "name:nodeA*");
params.add("facet", "true");
params.add("facet.tree", "true");
params.add("facet.tree.field", "{!ftree childField=child_ids}node_id");
SolrQueryResponse rsp = new SolrQueryResponse();
rsp.add("responseHeader", new SimpleOrderedMap<>());
SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
SolrRequestHandler handler = core.getRequestHandler(requestHandler);
handler.handleRequest(req, rsp);
req.close();
assertNull(rsp.getException());
NamedList results = rsp.getValues();
NamedList facetTree = (NamedList) ((NamedList)(results.get("facet_counts"))).get("facet_trees");
assertNotNull(facetTree);
// Check the generated hierarchy - should be three levels deep
List<Object> nodes = (List) facetTree.get("node_id");
assertEquals(1, nodes.size());
NamedList level1 = (NamedList) nodes.get(0);
assertEquals("A", level1.get("value"));
assertEquals(1L, level1.get("count"));
assertEquals(6L, level1.get("total"));
List level2Nodes = (List)level1.get("hierarchy");
assertEquals(3, level2Nodes.size());
NamedList level2 = (NamedList)level2Nodes.get(0);
assertEquals(1L, level2.get("count"));
assertEquals(3L, level2.get("total"));
List level3Nodes = (List)level2.get("hierarchy");
assertEquals(2, level3Nodes.size());
NamedList level3 = (NamedList)level3Nodes.get(0);
assertEquals(1L, level3.get("count"));
assertEquals(1L, level3.get("total"));
assertNull(level3.get("hierarchy"));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testResultsWithOtherFacets() {
SolrCore core = h.getCore();
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "name:nodeA*");
params.add("facet", "true");
params.add("facet.tree", "true");
params.add("facet.tree.field", "{!ftree childField=child_ids}node_id");
params.add("facet.field", "label");
params.add("facet.field", "node_id");
SolrQueryResponse rsp = new SolrQueryResponse();
rsp.add("responseHeader", new SimpleOrderedMap<>());
SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
SolrRequestHandler handler = core.getRequestHandler(requestHandler);
handler.handleRequest(req, rsp);
req.close();
assertNull(rsp.getException());
NamedList results = rsp.getValues();
NamedList facetFields = (NamedList)((NamedList)(results.get("facet_counts"))).get("facet_fields");
assertNotNull(facetFields);
assertNotNull(facetFields.get("label"));
assertNotNull(facetFields.get("node_id"));
NamedList facetTree = (NamedList) ((NamedList)(results.get("facet_counts"))).get("facet_trees");
assertNotNull(facetTree);
// Check the generated hierarchy - should be three levels deep
List<Object> nodes = (List) facetTree.get("node_id");
assertEquals(1, nodes.size());
NamedList level1 = (NamedList) nodes.get(0);
assertEquals("A", level1.get("value"));
assertEquals(1L, level1.get("count"));
assertEquals(6L, level1.get("total"));
List level2Nodes = (List)level1.get("hierarchy");
assertEquals(3, level2Nodes.size());
NamedList level2 = (NamedList)level2Nodes.get(0);
assertEquals(1L, level2.get("count"));
assertEquals(3L, level2.get("total"));
List level3Nodes = (List)level2.get("hierarchy");
assertEquals(2, level3Nodes.size());
NamedList level3 = (NamedList)level3Nodes.get(0);
assertEquals(1L, level3.get("count"));
assertEquals(1L, level3.get("total"));
assertNull(level3.get("hierarchy"));
}
}