From 8a996753920170ac1e6e8960d6b63848ccc1ea44 Mon Sep 17 00:00:00 2001 From: Tomas Fernandez Lobbe Date: Wed, 22 Mar 2017 10:52:14 -0700 Subject: [PATCH 1/2] SOLR-9986: Add javadoc to DatePointField class --- .../apache/solr/schema/DatePointField.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/solr/core/src/java/org/apache/solr/schema/DatePointField.java b/solr/core/src/java/org/apache/solr/schema/DatePointField.java index 377f571f299..50f85e30d30 100644 --- a/solr/core/src/java/org/apache/solr/schema/DatePointField.java +++ b/solr/core/src/java/org/apache/solr/schema/DatePointField.java @@ -36,8 +36,70 @@ import org.apache.lucene.util.mutable.MutableValueDate; import org.apache.lucene.util.mutable.MutableValueLong; import org.apache.solr.search.QParser; import org.apache.solr.uninverting.UninvertingReader; +import org.apache.solr.update.processor.TimestampUpdateProcessorFactory; import org.apache.solr.util.DateMathParser; +/** + * FieldType that can represent any Date/Time with millisecond precision. + *

+ * Date Format for the XML, incoming and outgoing: + *

+ *
+ * A date field shall be of the form 1995-12-31T23:59:59Z + * The trailing "Z" designates UTC time and is mandatory + * (See below for an explanation of UTC). + * Optional fractional seconds are allowed, as long as they do not end + * in a trailing 0 (but any precision beyond milliseconds will be ignored). + * All other parts are mandatory. + *
+ *

+ * This format was derived to be standards compliant (ISO 8601) and is a more + * restricted form of the + * canonical + * representation of dateTime from XML schema part 2. Examples... + *

+ * + *

+ * Note that DatePointField is lenient with regards to parsing fractional + * seconds that end in trailing zeros and will ensure that those values + * are indexed in the correct canonical format. + *

+ *

+ * This FieldType also supports incoming "Date Math" strings for computing + * values by adding/rounding internals of time relative either an explicit + * datetime (in the format specified above) or the literal string "NOW", + * ie: "NOW+1YEAR", "NOW/DAY", "1995-12-31T23:59:59.999Z+5MINUTES", etc... + * -- see {@link DateMathParser} for more examples. + *

+ *

+ * NOTE: Although it is possible to configure a DatePointField + * instance with a default value of "NOW" to compute a timestamp + * of when the document was indexed, this is not advisable when using SolrCloud + * since each replica of the document may compute a slightly different value. + * {@link TimestampUpdateProcessorFactory} is recommended instead. + *

+ * + *

+ * Explanation of "UTC"... + *

+ *
+ * "In 1970 the Coordinated Universal Time system was devised by an + * international advisory group of technical experts within the International + * Telecommunication Union (ITU). The ITU felt it was best to designate a + * single abbreviation for use in all languages in order to minimize + * confusion. Since unanimous agreement could not be achieved on using + * either the English word order, CUT, or the French word order, TUC, the + * acronym UTC was chosen as a compromise." + *
+ * + * @see TrieDateField + * @see PointField + */ public class DatePointField extends PointField implements DateValueFieldType { public DatePointField() { From 725cd4e2f546a71ccf43218ffc88739a3e05a260 Mon Sep 17 00:00:00 2001 From: yonik Date: Wed, 22 Mar 2017 19:53:50 -0400 Subject: [PATCH 2/2] SOLR-7452: facet refinement - don't generate domain if skipping bucket --- .../org/apache/solr/search/facet/FacetFieldProcessor.java | 6 +++--- .../java/org/apache/solr/search/facet/FacetProcessor.java | 6 +----- 2 files changed, 4 insertions(+), 8 deletions(-) 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 1ba252e3a75..e8b234d6ed0 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 @@ -528,9 +528,9 @@ abstract class FacetFieldProcessor extends FacetProcessor { } protected SimpleOrderedMap refineFacets() throws IOException { - List leaves = asList(fcontext.facetInfo.get("_l")); - List skip = asList(fcontext.facetInfo.get("_s")); - List missing = asList(fcontext.facetInfo.get("_m")); + List leaves = asList(fcontext.facetInfo.get("_l")); // We have not seen this bucket: do full faceting for this bucket, including all sub-facets + List skip = asList(fcontext.facetInfo.get("_s")); // We have seen this bucket, so skip stats on it, and skip sub-facets except for the specified sub-facets that should calculate specified buckets. + List missing = asList(fcontext.facetInfo.get("_m")); // We have not seen this bucket, do full faceting for this bucket, and most sub-facets... but some sub-facets should only visit specified buckets. // For leaf refinements, we do full faceting for each leaf bucket. Any sub-facets of these buckets will be fully evaluated. Because of this, we should never // encounter leaf refinements that have sub-facets that return partial results. diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java index cf4d0fe9cb1..9f05d8e56f6 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java @@ -366,13 +366,9 @@ public abstract class FacetProcessor { } } - // TODO: rather than just have a raw "response", perhaps we should model as a bucket object that contains the response plus extra info? void fillBucket(SimpleOrderedMap bucket, Query q, DocSet result, boolean skip, Map facetInfo) throws IOException { - // TODO: we don't need the DocSet if we've already calculated everything during the first phase - boolean needDocSet = freq.getFacetStats().size() > 0 || freq.getSubFacets().size() > 0; - - // TODO: put info in for the merger (like "skip=true"?) Maybe we don't need to if we leave out all extraneous info? + boolean needDocSet = (skip==false && freq.getFacetStats().size() > 0) || freq.getSubFacets().size() > 0; int count;