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
|
||||
2D int array formats. (David Smiley)
|
||||
|
||||
* SOLR-7019: Support changing field key when using interval faceting.
|
||||
(Tomás Fernández Löbbe)
|
||||
|
||||
Bug Fixes
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -175,7 +175,11 @@ public class DistributedIntervalFacetingTest extends
|
|||
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 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
|
||||
* 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.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 extends SolrTestCaseJ4 {
|
|||
|
||||
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");
|
||||
|
|
|
@ -277,9 +277,14 @@ public class SolrQuery extends ModifiableSolrParams
|
|||
/**
|
||||
* 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 ModifiableSolrParams
|
|||
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) {
|
||||
|
|
Loading…
Reference in New Issue