You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2018/03/05 16:42:49 UTC
lucene-solr:master: SOLR-12020: fix refinement of terms facet on date
field (don't use Date.toString)
Repository: lucene-solr
Updated Branches:
refs/heads/master e0d6465af -> fc2fd1dc2
SOLR-12020: fix refinement of terms facet on date field (don't use Date.toString)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/fc2fd1dc
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/fc2fd1dc
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/fc2fd1dc
Branch: refs/heads/master
Commit: fc2fd1dc25dbfda1764e044090dce60c22f724c6
Parents: e0d6465
Author: yonik <yo...@apache.org>
Authored: Mon Mar 5 11:03:48 2018 -0500
Committer: yonik <yo...@apache.org>
Committed: Mon Mar 5 11:03:48 2018 -0500
----------------------------------------------------------------------
solr/CHANGES.txt | 3 +++
.../solr/search/facet/FacetFieldProcessor.java | 7 +++++--
.../apache/solr/search/facet/FacetModule.java | 22 +++++++++++++++++++-
.../solr/search/facet/TestJsonFacets.java | 11 ++++++++++
4 files changed, 40 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fc2fd1dc/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d531311..1639e14 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -247,6 +247,9 @@ Bug Fixes
* SOLR-12011: Consistence problem when in-sync replicas are DOWN. (Cao Manh Dat)
+* SOLR-12020: JSON Facet API: terms facet on date field fails in refinement phase with
+ "Invalid Date String" error. (yonik)
+
Optimizations
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fc2fd1dc/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessor.java
index 143cfd6..50f4676 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessor.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessor.java
@@ -18,8 +18,10 @@
package org.apache.solr.search.facet;
import java.io.IOException;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@@ -682,9 +684,10 @@ abstract class FacetFieldProcessor extends FacetProcessor<FacetField> {
FieldType ft = sf.getType();
bucketVal = ft.toNativeType(bucketVal); // refinement info passed in as JSON will cause int->long and float->double
bucket.add("val", bucketVal);
- // String internal = ft.toInternal( tobj.toString() ); // TODO - we need a better way to get from object to query...
- Query domainQ = ft.getFieldQuery(null, sf, bucketVal.toString());
+ // fieldQuery currently relies on a string input of the value...
+ String bucketStr = bucketVal instanceof Date ? Instant.ofEpochMilli(((Date)bucketVal).getTime()).toString() : bucketVal.toString();
+ Query domainQ = ft.getFieldQuery(null, sf, bucketStr);
fillBucket(bucket, domainQ, null, skip, facetInfo);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fc2fd1dc/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
index 7fc016b..759ece7 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
@@ -17,7 +17,9 @@
package org.apache.solr.search.facet;
import java.io.IOException;
+import java.time.Instant;
import java.util.Collection;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -38,7 +40,9 @@ import org.apache.solr.handler.component.ShardResponse;
import org.apache.solr.search.QueryContext;
import org.apache.solr.search.SyntaxError;
import org.apache.solr.util.RTimer;
+import org.noggit.CharArr;
import org.noggit.JSONUtil;
+import org.noggit.JSONWriter;
import org.noggit.ObjectBuilder;
public class FacetModule extends SearchComponent {
@@ -234,7 +238,23 @@ public class FacetModule extends SearchComponent {
Map<String,Object> finfo = new HashMap<>(1);
finfo.put(FACET_REFINE, refinement);
- String finfoStr = JSONUtil.toJSON(finfo, -1);
+
+ // String finfoStr = JSONUtil.toJSON(finfo, -1); // this doesn't handle formatting of Date objects the way we want
+ CharArr out = new CharArr();
+ JSONWriter jsonWriter = new JSONWriter(out, -1) {
+ @Override
+ public void handleUnknownClass(Object o) {
+ // handle date formatting correctly
+ if (o instanceof Date) {
+ String s = Instant.ofEpochMilli(((Date)o).getTime()).toString();
+ writeString(s);
+ return;
+ }
+ super.handleUnknownClass(o);
+ }
+ };
+ jsonWriter.write(finfo);
+ String finfoStr = out.toString();
// System.err.println("##################### REFINE=" + finfoStr);
shardsRefineRequest.params.add(FACET_INFO, finfoStr);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fc2fd1dc/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
index 753c7dc..632c006 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
@@ -746,6 +746,17 @@ public class TestJsonFacets extends SolrTestCaseHS {
);
}
+ // test field faceting on date field
+ client.testJQ(params(p, "q", "*:*"
+ , "json.facet", "{" +
+ " f1:{${terms} type:field, field:${date}}" +
+ "}"
+ )
+ , "facets=={count:6 " +
+ ",f1:{ buckets:[ {val:'2001-01-01T01:01:01Z', count:1},{val:'2001-02-03T01:02:03Z', count:1},{val:'2002-02-02T02:02:02Z', count:1},{val:'2002-03-01T03:02:01Z', count:1},{val:'2003-03-03T03:03:03Z', count:1} ] }" +
+ "}"
+ );
+
// percentiles 0,10,50,90,100
// catA: 2.0 2.2 3.0 3.8 4.0