mirror of https://github.com/apache/lucene.git
SOLR-7019: Support changing field key when using interval faceting
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1658860 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a88309b88c
commit
78e1153dcb
|
@ -108,6 +108,9 @@ New Features
|
||||||
* SOLR-7005: Spatial 2D heatmap faceting on RPT fields via new facet.heatmap with PNG and
|
* SOLR-7005: Spatial 2D heatmap faceting on RPT fields via new facet.heatmap with PNG and
|
||||||
2D int array formats. (David Smiley)
|
2D int array formats. (David Smiley)
|
||||||
|
|
||||||
|
* SOLR-7019: Support changing field key when using interval faceting.
|
||||||
|
(Tomás Fernández Löbbe)
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|
|
@ -1500,8 +1500,8 @@ public class SimpleFacets {
|
||||||
|
|
||||||
for (String field : fields) {
|
for (String field : fields) {
|
||||||
parseParams(FacetParams.FACET_INTERVAL, field);
|
parseParams(FacetParams.FACET_INTERVAL, field);
|
||||||
String[] intervalStrs = required.getFieldParams(field, FacetParams.FACET_INTERVAL_SET);
|
String[] intervalStrs = required.getFieldParams(facetValue, FacetParams.FACET_INTERVAL_SET);
|
||||||
SchemaField schemaField = searcher.getCore().getLatestSchema().getField(field);
|
SchemaField schemaField = searcher.getCore().getLatestSchema().getField(facetValue);
|
||||||
if (!schemaField.hasDocValues()) {
|
if (!schemaField.hasDocValues()) {
|
||||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Interval Faceting only on fields with doc values");
|
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>();
|
SimpleOrderedMap<Integer> fieldResults = new SimpleOrderedMap<Integer>();
|
||||||
res.add(field, fieldResults);
|
res.add(key, fieldResults);
|
||||||
IntervalFacets intervalFacets = new IntervalFacets(schemaField, searcher, docs, intervalStrs, params);
|
IntervalFacets intervalFacets = new IntervalFacets(schemaField, searcher, docs, intervalStrs, params);
|
||||||
for (FacetInterval interval : intervalFacets) {
|
for (FacetInterval interval : intervalFacets) {
|
||||||
fieldResults.add(interval.getKey(), interval.getCount());
|
fieldResults.add(interval.getKey(), interval.getCount());
|
||||||
|
|
|
@ -175,7 +175,11 @@ public class DistributedIntervalFacetingTest extends
|
||||||
params.set("facet", "true");
|
params.set("facet", "true");
|
||||||
params.set("rows", "0");
|
params.set("rows", "0");
|
||||||
String field = fields[random().nextInt(fields.length)]; //choose from any of the fields
|
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
|
// number of intervals
|
||||||
for (int i = 0; i < 1 + random().nextInt(20); i++) {
|
for (int i = 0; i < 1 + random().nextInt(20); i++) {
|
||||||
Integer[] interval = getRandomRange(cardinality, field);
|
Integer[] interval = getRandomRange(cardinality, field);
|
||||||
|
@ -187,6 +191,10 @@ public class DistributedIntervalFacetingTest extends
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getFieldWithKey(String field) {
|
||||||
|
return "{!key='_some_key_for_" + field + "_" + System.currentTimeMillis() + "'}" + field;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a random range. It's guaranteed that the first
|
* Returns a random range. It's guaranteed that the first
|
||||||
* number will be lower than the second, and both of them
|
* number will be lower than the second, and both of them
|
||||||
|
|
|
@ -22,6 +22,10 @@ import java.util.Comparator;
|
||||||
|
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.solr.SolrTestCaseJ4;
|
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.SolrException;
|
||||||
import org.apache.solr.common.params.ModifiableSolrParams;
|
import org.apache.solr.common.params.ModifiableSolrParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
@ -840,6 +844,95 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
|
||||||
|
|
||||||
assertIntervalQueriesString("test_s_dv");
|
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) {
|
private void assertIntervalQueriesNumeric(String field) {
|
||||||
assertIntervalQuery(field, "[0,1]", "2");
|
assertIntervalQuery(field, "[0,1]", "2");
|
||||||
|
|
|
@ -277,9 +277,14 @@ public class SolrQuery extends ModifiableSolrParams
|
||||||
/**
|
/**
|
||||||
* Add Interval Faceting on a field. All intervals for the same field should be included
|
* Add Interval Faceting on a field. All intervals for the same field should be included
|
||||||
* in the same call to this method.
|
* 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
|
* @param intervals Intervals to be used for faceting. It can be an empty array, but it can't
|
||||||
* be <code>null</code>
|
* be <code>null</code>
|
||||||
* @return this
|
* @return this
|
||||||
|
@ -288,6 +293,9 @@ public class SolrQuery extends ModifiableSolrParams
|
||||||
if (intervals == null) {
|
if (intervals == null) {
|
||||||
throw new IllegalArgumentException("Can't add null intervals");
|
throw new IllegalArgumentException("Can't add null intervals");
|
||||||
}
|
}
|
||||||
|
if (field == null) {
|
||||||
|
throw new IllegalArgumentException("Field can't be null");
|
||||||
|
}
|
||||||
set(FacetParams.FACET, true);
|
set(FacetParams.FACET, true);
|
||||||
add(FacetParams.FACET_INTERVAL, field);
|
add(FacetParams.FACET_INTERVAL, field);
|
||||||
for (String interval:intervals) {
|
for (String interval:intervals) {
|
||||||
|
|
Loading…
Reference in New Issue