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