You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2014/11/06 21:15:54 UTC
svn commit: r1637204 [2/2] - in /lucene/dev/branches/branch_5x: ./
dev-tools/ lucene/ lucene/analysis/
lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/
lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/
...
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java?rev=1637204&r1=1637203&r2=1637204&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java Thu Nov 6 20:15:52 2014
@@ -23,6 +23,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
@@ -163,19 +164,25 @@ public class QueryResponse extends SolrR
}
private void extractStatsInfo(NamedList<Object> info) {
+ _fieldStatsInfo = extractFieldStatsInfo(info);
+ }
+
+ private Map<String, FieldStatsInfo> extractFieldStatsInfo(NamedList<Object> info) {
if( info != null ) {
- _fieldStatsInfo = new HashMap<>();
+ Map<String, FieldStatsInfo> fieldStatsInfoMap = new TreeMap<>();
NamedList<NamedList<Object>> ff = (NamedList<NamedList<Object>>) info.get( "stats_fields" );
if( ff != null ) {
for( Map.Entry<String,NamedList<Object>> entry : ff ) {
NamedList<Object> v = entry.getValue();
if( v != null ) {
- _fieldStatsInfo.put( entry.getKey(),
+ fieldStatsInfoMap.put( entry.getKey(),
new FieldStatsInfo( v, entry.getKey() ) );
}
}
}
+ return fieldStatsInfoMap;
}
+ return null;
}
private void extractDebugInfo( NamedList<Object> debug )
@@ -396,14 +403,38 @@ public class QueryResponse extends SolrR
Object v = nl.getVal( 1 );
assert "count".equals(nl.getName(2));
int cnt = ((Integer)nl.getVal( 2 )).intValue();
- List<PivotField> p = null;
+
+ List<PivotField> subPivots = null;
+ Map<String,FieldStatsInfo> fieldStatsInfos = null;
+
if (4 <= nl.size()) {
- assert "pivot".equals(nl.getName(3));
- Object subPiv = nl.getVal(3);
- assert null != subPiv : "Server sent back 'null' for sub pivots?";
- p = readPivots( (List<NamedList>) subPiv );
+ for(int index = 3; index < nl.size(); index++) {
+ final String key = nl.getName(index);
+ final Object val = nl.getVal(index);
+ switch (key) {
+
+ case "pivot": {
+ assert null != val : "Server sent back 'null' for sub pivots?";
+ assert val instanceof List : "Server sent non-List for sub pivots?";
+
+ subPivots = readPivots( (List<NamedList>) val );
+ break;
+ }
+ case "stats": {
+ assert null != val : "Server sent back 'null' for stats?";
+ assert val instanceof NamedList : "Server sent non-NamedList for stats?";
+
+ fieldStatsInfos = extractFieldStatsInfo((NamedList<Object>) val);
+ break;
+ }
+ default:
+ throw new RuntimeException( "unknown key in pivot: "+ key+ " ["+val+"]");
+
+ }
+ }
}
- values.add( new PivotField( f, v, cnt, p ) );
+
+ values.add( new PivotField( f, v, cnt, subPivots, fieldStatsInfos ) );
}
return values;
}
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1637204&r1=1637203&r2=1637204&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Thu Nov 6 20:15:52 2014
@@ -57,12 +57,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
-import java.util.Set;
/**
* This should include tests against the example solr config
@@ -814,6 +811,197 @@ abstract public class SolrExampleTests e
doPivotFacetTest(false);
}
+ @Test
+ public void testPivotFacetsStats() throws Exception {
+ SolrServer server = getSolrServer();
+
+ // Empty the database...
+ server.deleteByQuery("*:*");// delete everything!
+ server.commit();
+ assertNumFound("*:*", 0); // make sure it got in
+
+ int id = 1;
+ ArrayList<SolrInputDocument> docs = new ArrayList<>();
+ docs.add(makeTestDoc("id", id++, "features", "aaa", "manu", "apple", "cat", "a", "inStock", true, "popularity", 12, "price", .017));
+ docs.add(makeTestDoc("id", id++, "features", "aaa", "manu", "lg", "cat", "a", "inStock", false, "popularity", 13, "price", 16.04));
+ docs.add(makeTestDoc("id", id++, "features", "aaa", "manu", "samsung", "cat", "a", "inStock", true, "popularity", 14, "price", 12.34));
+ docs.add(makeTestDoc("id", id++, "features", "aaa", "manu", "lg", "cat", "b", "inStock", false, "popularity", 24, "price", 51.39));
+ docs.add(makeTestDoc("id", id++, "features", "aaa", "manu", "nokia", "cat", "b", "inStock", true, "popularity", 28, "price", 131.39));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "ztc", "cat", "a", "inStock", false, "popularity", 32));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "htc", "cat", "a", "inStock", true, "popularity", 31, "price", 131.39));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "apple", "cat", "b", "inStock", false, "popularity", 36));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "lg", "cat", "b", "inStock", true, "popularity", 37, "price", 1.39));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "ztc", "cat", "b", "inStock", false, "popularity", 38, "price", 47.98));
+ docs.add(makeTestDoc("id", id++, "features", "bbb", "manu", "ztc", "cat", "b", "inStock", true, "popularity", -38));
+ docs.add(makeTestDoc("id", id++, "cat", "b")); // something not matching all fields
+ server.add(docs);
+ server.commit();
+
+ for (String pivot : new String[] { "{!key=pivot_key stats=s1}features,manu",
+ "{!key=pivot_key stats=s1}features,manu,cat",
+ "{!key=pivot_key stats=s1}features,manu,cat,inStock"
+ }) {
+
+ // for any of these pivot params, the assertions we check should be teh same
+ // (we stop asserting at the "manu" level)
+
+ SolrQuery query = new SolrQuery("*:*");
+ query.addFacetPivotField(pivot);
+ query.setFacetLimit(1);
+ query.addGetFieldStatistics("{!key=foo_price tag=s1}price", "{!tag=s1}popularity");
+ query.setFacetMinCount(0);
+ query.setRows(0);
+
+ QueryResponse rsp = server.query(query);
+
+ // check top (ie: non-pivot) stats
+ Map<String, FieldStatsInfo> map = rsp.getFieldStatsInfo();
+ FieldStatsInfo intValueStatsInfo = map.get("popularity");
+ assertEquals(-38.0d, intValueStatsInfo.getMin());
+ assertEquals(38.0d, intValueStatsInfo.getMax());
+ assertEquals(11l, intValueStatsInfo.getCount().longValue());
+ assertEquals(1l, intValueStatsInfo.getMissing().longValue());
+ assertEquals(227.0d, intValueStatsInfo.getSum());
+ assertEquals(20.636363636363637d, intValueStatsInfo.getMean());
+
+ FieldStatsInfo doubleValueStatsInfo = map.get("foo_price");
+ assertEquals(.017d, (double) doubleValueStatsInfo.getMin(), .01d);
+ assertEquals(131.39d, (double) doubleValueStatsInfo.getMax(), .01d);
+ assertEquals(8l, doubleValueStatsInfo.getCount().longValue());
+ assertEquals(4l, doubleValueStatsInfo.getMissing().longValue());
+ assertEquals(391.93d, (double) doubleValueStatsInfo.getSum(), .01d);
+ assertEquals(48.99d, (double) doubleValueStatsInfo.getMean(), .01d);
+
+ // now get deeper and look at the pivots...
+
+ NamedList<List<PivotField>> pivots = rsp.getFacetPivot();
+ assertTrue( ! pivots.get("pivot_key").isEmpty() );
+
+ List<PivotField> list = pivots.get("pivot_key");
+ PivotField featuresBBBPivot = list.get(0);
+ assertEquals("features", featuresBBBPivot.getField());
+ assertEquals("bbb", featuresBBBPivot.getValue());
+ assertNotNull(featuresBBBPivot.getFieldStatsInfo());
+ assertEquals(2, featuresBBBPivot.getFieldStatsInfo().size());
+
+ FieldStatsInfo featuresBBBPivotStats1 = featuresBBBPivot.getFieldStatsInfo().get("foo_price");
+ assertEquals("foo_price", featuresBBBPivotStats1.getName());
+ assertEquals(131.39d, (double) featuresBBBPivotStats1.getMax(), .01d);
+ assertEquals(1.38d, (double) featuresBBBPivotStats1.getMin(), .01d);
+ assertEquals(180.75d, (double) featuresBBBPivotStats1.getSum(), .01d);
+ assertEquals(3, (long) featuresBBBPivotStats1.getCount());
+ assertEquals(3, (long) featuresBBBPivotStats1.getMissing());
+ assertEquals(60.25d, (double) featuresBBBPivotStats1.getMean(), .01d);
+ assertEquals(65.86d, featuresBBBPivotStats1.getStddev(), .01d);
+ assertEquals(19567.34d, featuresBBBPivotStats1.getSumOfSquares(), .01d);
+
+ FieldStatsInfo featuresBBBPivotStats2 = featuresBBBPivot.getFieldStatsInfo().get("popularity");
+ assertEquals("popularity", featuresBBBPivotStats2.getName());
+ assertEquals(38.0d, (double) featuresBBBPivotStats2.getMax(), .01d);
+ assertEquals(-38.0d, (double) featuresBBBPivotStats2.getMin(), .01d);
+ assertEquals(136.0d, (double) featuresBBBPivotStats2.getSum(), .01d);
+ assertEquals(6, (long) featuresBBBPivotStats2.getCount());
+ assertEquals(0, (long) featuresBBBPivotStats2.getMissing());
+ assertEquals(22.66d, (double) featuresBBBPivotStats2.getMean(), .01d);
+ assertEquals(29.85d, featuresBBBPivotStats2.getStddev(), .01d);
+ assertEquals(7538.0d, featuresBBBPivotStats2.getSumOfSquares(), .01d);
+
+ List<PivotField> nestedPivotList = featuresBBBPivot.getPivot();
+ PivotField featuresBBBPivotPivot = nestedPivotList.get(0);
+ assertEquals("manu", featuresBBBPivotPivot.getField());
+ assertEquals("ztc", featuresBBBPivotPivot.getValue());
+ assertNotNull(featuresBBBPivotPivot.getFieldStatsInfo());
+ assertEquals(2, featuresBBBPivotPivot.getFieldStatsInfo().size());
+
+ FieldStatsInfo featuresBBBManuZtcPivotStats1 = featuresBBBPivotPivot.getFieldStatsInfo().get("foo_price");
+ assertEquals("foo_price", featuresBBBManuZtcPivotStats1.getName());
+ assertEquals(47.97d, (double) featuresBBBManuZtcPivotStats1.getMax(), .01d);
+ assertEquals(47.97d, (double) featuresBBBManuZtcPivotStats1.getMin(), .01d);
+ assertEquals(47.97d, (double) featuresBBBManuZtcPivotStats1.getSum(), .01d);
+ assertEquals(1, (long) featuresBBBManuZtcPivotStats1.getCount());
+ assertEquals(2, (long) featuresBBBManuZtcPivotStats1.getMissing());
+ assertEquals(47.97d, (double) featuresBBBManuZtcPivotStats1.getMean(), .01d);
+ assertEquals(0.0d, featuresBBBManuZtcPivotStats1.getStddev(), .01d);
+ assertEquals(2302.08d, featuresBBBManuZtcPivotStats1.getSumOfSquares(), .01d);
+
+
+ FieldStatsInfo featuresBBBManuZtcPivotStats2 = featuresBBBPivotPivot.getFieldStatsInfo().get("popularity");
+ assertEquals("popularity", featuresBBBManuZtcPivotStats2.getName());
+ assertEquals(38.0d, (double) featuresBBBManuZtcPivotStats2.getMax(), .01d);
+ assertEquals(-38.0d, (double) featuresBBBManuZtcPivotStats2.getMin(), .01d);
+ assertEquals(32.0, (double) featuresBBBManuZtcPivotStats2.getSum(), .01d);
+ assertEquals(3, (long) featuresBBBManuZtcPivotStats2.getCount());
+ assertEquals(0, (long) featuresBBBManuZtcPivotStats2.getMissing());
+ assertEquals(10.66d, (double) featuresBBBManuZtcPivotStats2.getMean(), .01d);
+ assertEquals(42.25d, featuresBBBManuZtcPivotStats2.getStddev(), .01d);
+ assertEquals(3912.0d, featuresBBBManuZtcPivotStats2.getSumOfSquares(), .01d);
+ }
+ }
+
+ @Test
+ public void testPivotFacetsStatsNotSupported() throws Exception {
+ SolrServer server = getSolrServer();
+
+ // Empty the database...
+ server.deleteByQuery("*:*");// delete everything!
+ server.commit();
+ assertNumFound("*:*", 0); // make sure it got in
+
+ // results of this test should be the same regardless of wether any docs in index
+ if (random().nextBoolean()) {
+ server.add(makeTestDoc("id", 1, "features", "aaa", "cat", "a", "inStock", true, "popularity", 12, "price", .017));
+ server.commit();
+ }
+
+ ignoreException("is not currently supported");
+
+ // boolean field
+ SolrQuery query = new SolrQuery("*:*");
+ query.addFacetPivotField("{!stats=s1}features,manu");
+ query.addGetFieldStatistics("{!key=inStock_val tag=s1}inStock");
+ try {
+ server.query(query);
+ fail("SolrException should be thrown on query");
+ } catch (SolrException e) {
+ assertEquals("Pivot facet on boolean is not currently supported, bad request returned", 400, e.code());
+ assertTrue(e.getMessage().contains("is not currently supported"));
+ assertTrue(e.getMessage().contains("boolean"));
+ }
+
+ // asking for multiple stat tags -- see SOLR-6663
+ query = new SolrQuery("*:*");
+ query.addFacetPivotField("{!stats=tag1,tag2}features,manu");
+ query.addGetFieldStatistics("{!tag=tag1}price", "{!tag=tag2}popularity");
+ query.setFacetMinCount(0);
+ query.setRows(0);
+ try {
+ server.query(query);
+ fail("SolrException should be thrown on query");
+ } catch (SolrException e) {
+ assertEquals(400, e.code());
+ assertTrue(e.getMessage().contains("stats"));
+ assertTrue(e.getMessage().contains("comma"));
+ assertTrue(e.getMessage().contains("tag"));
+ }
+
+ // text field
+ query = new SolrQuery("*:*");
+ query.addFacetPivotField("{!stats=s1}features,manu");
+ query.addGetFieldStatistics("{!tag=s1}features");
+ query.setFacetMinCount(0);
+ query.setRows(0);
+ try {
+ server.query(query);
+ fail("SolrException should be thrown on query");
+ } catch (SolrException e) {
+ assertEquals("Pivot facet on string is not currently supported, bad request returned", 400, e.code());
+ assertTrue(e.getMessage().contains("is not currently supported"));
+ assertTrue(e.getMessage().contains("text_general"));
+ }
+
+
+ }
+
public void testPivotFacetsMissing() throws Exception {
doPivotFacetTest(true);
}