You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2011/11/13 20:11:53 UTC
svn commit: r1201479 - in /lucene/dev/branches/branch_3x/solr: CHANGES.txt
core/src/java/org/apache/solr/schema/TrieField.java
example/solr/conf/schema.xml
Author: erick
Date: Sun Nov 13 19:11:52 2011
New Revision: 1201479
URL: http://svn.apache.org/viewvc?rev=1201479&view=rev
Log:
Fixes for SOLR-2881, making Trie fields respect sortMissingFirst/Last
Modified:
lucene/dev/branches/branch_3x/solr/CHANGES.txt
lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/schema/TrieField.java
lucene/dev/branches/branch_3x/solr/example/solr/conf/schema.xml
Modified: lucene/dev/branches/branch_3x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/CHANGES.txt?rev=1201479&r1=1201478&r2=1201479&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/solr/CHANGES.txt Sun Nov 13 19:11:52 2011
@@ -62,6 +62,9 @@ New Features
* SOLR-1926: Add hl.q parameter. (koji)
+* SOLR-2881: Numeric types now support sortMissingFirst/Last. This includes Trie and date types
+ (Ryan McKinley, Mike McCandless, Erick Erickson)
+
Optimizations
----------------------
Modified: lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/schema/TrieField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/schema/TrieField.java?rev=1201479&r1=1201478&r2=1201479&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/schema/TrieField.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/schema/TrieField.java Sun Nov 13 19:11:52 2011
@@ -60,6 +60,8 @@ public class TrieField extends FieldType
protected int precisionStepArg = TrieField.DEFAULT_PRECISION_STEP; // the one passed in or defaulted
protected int precisionStep; // normalized
protected TrieTypes type;
+ protected Object missingValue;
+
/**
* Used for handling date types following the same semantics as DateField
@@ -125,16 +127,48 @@ public class TrieField extends FieldType
public SortField getSortField(SchemaField field, boolean top) {
field.checkSortability();
+ Object missingValue = null;
+ boolean sortMissingLast = field.sortMissingLast();
+ boolean sortMissingFirst = field.sortMissingFirst();
+
switch (type) {
case INTEGER:
- return new SortField(field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top);
+ if( sortMissingLast ) {
+ missingValue = top ? Integer.MIN_VALUE : Integer.MAX_VALUE;
+ }
+ else if( sortMissingFirst ) {
+ missingValue = top ? Integer.MAX_VALUE : Integer.MIN_VALUE;
+ }
+ return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top).setMissingValue(missingValue);
+
case FLOAT:
- return new SortField(field.getName(), FieldCache.NUMERIC_UTILS_FLOAT_PARSER, top);
+ if( sortMissingLast ) {
+ missingValue = top ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
+ }
+ else if( sortMissingFirst ) {
+ missingValue = top ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY;
+ }
+ return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_FLOAT_PARSER, top).setMissingValue(missingValue);
+
case DATE: // fallthrough
case LONG:
- return new SortField(field.getName(), FieldCache.NUMERIC_UTILS_LONG_PARSER, top);
+ if( sortMissingLast ) {
+ missingValue = top ? Long.MIN_VALUE : Long.MAX_VALUE;
+ }
+ else if( sortMissingFirst ) {
+ missingValue = top ? Long.MAX_VALUE : Long.MIN_VALUE;
+ }
+ return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_LONG_PARSER, top).setMissingValue(missingValue);
+
case DOUBLE:
- return new SortField(field.getName(), FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, top);
+ if( sortMissingLast ) {
+ missingValue = top ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+ }
+ else if( sortMissingFirst ) {
+ missingValue = top ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
+ }
+ return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, top).setMissingValue(missingValue);
+
default:
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + field.name);
}
@@ -441,10 +475,6 @@ class TrieDateFieldSource extends LongFi
super(field, parser);
}
- public TrieDateFieldSource(String field) {
- super(field);
- }
-
@Override
public String description() {
return "date(" + field + ')';
Modified: lucene/dev/branches/branch_3x/solr/example/solr/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/example/solr/conf/schema.xml?rev=1201479&r1=1201478&r2=1201479&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/example/solr/conf/schema.xml (original)
+++ lucene/dev/branches/branch_3x/solr/example/solr/conf/schema.xml Sun Nov 13 19:11:52 2011
@@ -75,8 +75,10 @@
<fieldtype name="binary" class="solr.BinaryField"/>
<!-- The optional sortMissingLast and sortMissingFirst attributes are
- currently supported on types that are sorted internally as strings.
- This includes "string","boolean","sint","slong","sfloat","sdouble","pdate"
+ currently supported on types that are sorted internally as strings
+ and on numeric types.
+ This includes "string","boolean", and, as of 3.5 (and 4.x),
+ int, float, long, date, double, including the "Trie" variants.
- If sortMissingLast="true", then a sort on this field will cause documents
without the field to come after documents with the field,
regardless of the requested sort order (asc or desc).
@@ -157,8 +159,8 @@
<!--
Note:
- These should only be used for compatibility with existing indexes (created with older Solr versions)
- or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
+ These should only be used for compatibility with existing indexes (created with older Solr versions).
+ Use Trie based fields instead. As of Solr 3.5 and 4.x, Trie based fields support sortMissingFirst/Last
Numeric field types that manipulate the value into
a string value that isn't human-readable in its internal form,
@@ -581,7 +583,7 @@
<dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/>
<dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/>
<dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/>
-
+
<dynamicField name="*_pi" type="pint" indexed="true" stored="true"/>
<dynamicField name="ignored_*" type="ignored" multiValued="true"/>