You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by tf...@apache.org on 2015/02/11 06:25:30 UTC
svn commit: r1658876 - in /lucene/dev/branches/branch_5x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/request/
solr/core/src/test/org/apache/solr/
solr/core/src/test/org/apache/solr/request/ solr/solrj/
solr/solrj/src/java/org/apache/solr/cl...
Author: tflobbe
Date: Wed Feb 11 05:25:30 2015
New Revision: 1658876
URL: http://svn.apache.org/r1658876
Log:
SOLR-7019: Support changing field key when using interval faceting
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
lucene/dev/branches/branch_5x/solr/solrj/ (props changed)
lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java
Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1658876&r1=1658875&r2=1658876&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Wed Feb 11 05:25:30 2015
@@ -60,6 +60,9 @@ New Features
* SOLR-7005: Spatial 2D heatmap faceting on RPT fields via new facet.heatmap with PNG and
2D int array formats. (David Smiley)
+* SOLR-7019: Support changing field key when using interval faceting.
+ (Tomás Fernández Löbbe)
+
Bug Fixes
----------------------
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1658876&r1=1658875&r2=1658876&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Wed Feb 11 05:25:30 2015
@@ -1500,8 +1500,8 @@ public class SimpleFacets {
for (String field : fields) {
parseParams(FacetParams.FACET_INTERVAL, field);
- String[] intervalStrs = required.getFieldParams(field, FacetParams.FACET_INTERVAL_SET);
- SchemaField schemaField = searcher.getCore().getLatestSchema().getField(field);
+ String[] intervalStrs = required.getFieldParams(facetValue, FacetParams.FACET_INTERVAL_SET);
+ SchemaField schemaField = searcher.getCore().getLatestSchema().getField(facetValue);
if (!schemaField.hasDocValues()) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Interval Faceting only on fields with doc values");
}
@@ -1510,7 +1510,7 @@ public class SimpleFacets {
}
SimpleOrderedMap<Integer> fieldResults = new SimpleOrderedMap<Integer>();
- res.add(field, fieldResults);
+ res.add(key, fieldResults);
IntervalFacets intervalFacets = new IntervalFacets(schemaField, searcher, docs, intervalStrs, params);
for (FacetInterval interval : intervalFacets) {
fieldResults.add(interval.getKey(), interval.getCount());
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java?rev=1658876&r1=1658875&r2=1658876&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java Wed Feb 11 05:25:30 2015
@@ -175,7 +175,11 @@ public class DistributedIntervalFaceting
params.set("facet", "true");
params.set("rows", "0");
String field = fields[random().nextInt(fields.length)]; //choose from any of the fields
- params.set("facet.interval", field);
+ if (random().nextBoolean()) {
+ params.set("facet.interval", field);
+ } else {
+ params.set("facet.interval", getFieldWithKey(field));
+ }
// number of intervals
for (int i = 0; i < 1 + random().nextInt(20); i++) {
Integer[] interval = getRandomRange(cardinality, field);
@@ -187,6 +191,10 @@ public class DistributedIntervalFaceting
}
+ private String getFieldWithKey(String field) {
+ return "{!key='_some_key_for_" + field + "_" + System.currentTimeMillis() + "'}" + field;
+ }
+
/**
* Returns a random range. It's guaranteed that the first
* number will be lower than the second, and both of them
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java?rev=1658876&r1=1658875&r2=1658876&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java Wed Feb 11 05:25:30 2015
@@ -22,6 +22,10 @@ import java.util.Comparator;
import org.apache.lucene.util.BytesRef;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
@@ -840,6 +844,95 @@ public class TestIntervalFaceting extend
assertIntervalQueriesString("test_s_dv");
}
+
+ @Test
+ public void testChangeFieldKey() {
+ assertU(adoc("id", "1", "test_s_dv", "dog", "test_l_dv", "1"));
+ assertU(adoc("id", "2", "test_s_dv", "cat", "test_l_dv", "2"));
+ assertU(commit());
+
+ assertQ(req("q", "*:*", "facet", "true", "facet.interval", "{!key=foo}test_s_dv",
+ "facet.interval", "{!key=bar}test_l_dv", "f.test_s_dv.facet.interval.set", "[cat,dog]",
+ "f.test_l_dv.facet.interval.set", "[0,1]",
+ "f.test_l_dv.facet.interval.set", "[2,*]"),
+ "//lst[@name='facet_intervals']/lst[@name='foo']/int[@name='[cat,dog]'][.=2]",
+ "//lst[@name='facet_intervals']/lst[@name='bar']/int[@name='[0,1]'][.=1]",
+ "//lst[@name='facet_intervals']/lst[@name='bar']/int[@name='[2,*]'][.=1]");
+ }
+
+
+ @Test
+ public void testFilterExclusion() {
+ assertU(adoc("id", "1", "test_s_dv", "dog"));
+ assertU(adoc("id", "2", "test_s_dv", "cat"));
+ assertU(adoc("id", "3", "test_s_dv", "bird"));
+ assertU(adoc("id", "4", "test_s_dv", "cat"));
+ assertU(adoc("id", "5", "test_s_dv", "turtle"));
+ assertU(adoc("id", "6", "test_s_dv", "dog"));
+ assertU(adoc("id", "7", "test_s_dv", "dog"));
+ assertU(adoc("id", "8", "test_s_dv", "dog"));
+ assertU(adoc("id", "9", "test_s_dv", "cat"));
+ assertU(adoc("id", "10"));
+ assertU(commit());
+
+ assertQ(req("q", "*:*", "facet", "true", "facet.interval", "test_s_dv", "rows", "0",
+ "f.test_s_dv.facet.interval.set", "[a,d]",
+ "f.test_s_dv.facet.interval.set", "[d,z]"),
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[a,d]'][.=4]",
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[d,z]'][.=5]");
+
+ assertQ(req("q", "*:*", "facet", "true", "facet.interval", "test_s_dv", "rows", "0",
+ "f.test_s_dv.facet.interval.set", "[a,d]",
+ "f.test_s_dv.facet.interval.set", "[d,z]",
+ "fq", "test_s_dv:dog"),
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[a,d]'][.=0]",
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[d,z]'][.=4]");
+
+ assertQ(req("q", "*:*", "facet", "true", "facet.interval", "{!ex=dogs}test_s_dv", "rows", "0",
+ "f.test_s_dv.facet.interval.set", "[a,d]",
+ "f.test_s_dv.facet.interval.set", "[d,z]",
+ "fq", "{!tag='dogs'}test_s_dv:dog"),
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[a,d]'][.=4]",
+ "//lst[@name='facet_intervals']/lst[@name='test_s_dv']/int[@name='[d,z]'][.=5]");
+ }
+
+ @Test
+ public void testSolrJ() throws Exception {
+ assertU(adoc("id", "1", "test_i_dv", "0"));
+ assertU(adoc("id", "2", "test_i_dv", "1"));
+ assertU(adoc("id", "3", "test_i_dv", "2"));
+ assertU(commit());
+
+ // Don't close this client, it would shutdown the CoreContainer
+ @SuppressWarnings("resource")
+ SolrClient client = new EmbeddedSolrServer(h.getCore());
+
+ SolrQuery q = new SolrQuery();
+ q.setQuery("*:*");
+ q.addIntervalFacets("test_i_dv", new String[]{"[0,1]","[2,*]"});
+ QueryResponse response = client.query(q);
+ assertEquals(1, response.getIntervalFacets().size());
+ assertEquals("test_i_dv", response.getIntervalFacets().get(0).getField());
+ assertEquals(2, response.getIntervalFacets().get(0).getIntervals().size());
+ assertEquals("[0,1]", response.getIntervalFacets().get(0).getIntervals().get(0).getKey());
+ assertEquals("[2,*]", response.getIntervalFacets().get(0).getIntervals().get(1).getKey());
+
+ q = new SolrQuery();
+ q.setQuery("*:*");
+ q.setFacet(true);
+ q.add("facet.interval", "{!key=foo}test_i_dv");
+ q.add("f.test_i_dv.facet.interval.set", "{!key=first}[0,1]");
+ q.add("f.test_i_dv.facet.interval.set", "{!key=second}[2,*]");
+ response = client.query(q);
+ assertEquals(1, response.getIntervalFacets().size());
+ assertEquals("foo", response.getIntervalFacets().get(0).getField());
+ assertEquals(2, response.getIntervalFacets().get(0).getIntervals().size());
+ assertEquals("first", response.getIntervalFacets().get(0).getIntervals().get(0).getKey());
+ assertEquals("second", response.getIntervalFacets().get(0).getIntervals().get(1).getKey());
+
+ }
+
+
private void assertIntervalQueriesNumeric(String field) {
assertIntervalQuery(field, "[0,1]", "2");
Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java?rev=1658876&r1=1658875&r2=1658876&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/SolrQuery.java Wed Feb 11 05:25:30 2015
@@ -277,9 +277,14 @@ public class SolrQuery extends Modifiabl
/**
* Add Interval Faceting on a field. All intervals for the same field should be included
* in the same call to this method.
- * For syntax documentation see <a href="https://wiki.apache.org/solr/SimpleFacetParameters#Interval_Faceting">Solr wiki</a>
+ * For syntax documentation see <a href="https://wiki.apache.org/solr/SimpleFacetParameters#Interval_Faceting">Solr wiki</a>.
+ * <br>
+ * Key substitution, filter exclusions or other local params on the field are not supported when using this method,
+ * if this is needed, use the lower level {@link #add} method.<br>
+ * Key substitution IS supported on intervals when using this method.
*
- * @param field the field to add facet intervals
+ *
+ * @param field the field to add facet intervals. Must be an existing field and can't be null
* @param intervals Intervals to be used for faceting. It can be an empty array, but it can't
* be <code>null</code>
* @return this
@@ -288,6 +293,9 @@ public class SolrQuery extends Modifiabl
if (intervals == null) {
throw new IllegalArgumentException("Can't add null intervals");
}
+ if (field == null) {
+ throw new IllegalArgumentException("Field can't be null");
+ }
set(FacetParams.FACET, true);
add(FacetParams.FACET_INTERVAL, field);
for (String interval:intervals) {