You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by gs...@apache.org on 2008/02/02 04:06:10 UTC
svn commit: r617745 - in /lucene/java/trunk: ./
src/java/org/apache/lucene/search/ src/test/org/apache/lucene/search/
Author: gsingers
Date: Fri Feb 1 19:06:08 2008
New Revision: 617745
URL: http://svn.apache.org/viewvc?rev=617745&view=rev
Log:
LUCENE-1045: Added short, byte support
Modified:
lucene/java/trunk/CHANGES.txt
lucene/java/trunk/src/java/org/apache/lucene/search/FieldDocSortedHitQueue.java
lucene/java/trunk/src/java/org/apache/lucene/search/FieldSortedHitQueue.java
lucene/java/trunk/src/java/org/apache/lucene/search/SortField.java
lucene/java/trunk/src/test/org/apache/lucene/search/TestSort.java
Modified: lucene/java/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/trunk/CHANGES.txt?rev=617745&r1=617744&r2=617745&view=diff
==============================================================================
--- lucene/java/trunk/CHANGES.txt (original)
+++ lucene/java/trunk/CHANGES.txt Fri Feb 1 19:06:08 2008
@@ -27,6 +27,8 @@
check only a specific segment or segments in your index. (Mike
McCandless)
+ 3. LUCENE-1045: Reopened this issue to add support for short and bytes.
+
Optimizations
1. LUCENE-705: When building a compound file, use
Modified: lucene/java/trunk/src/java/org/apache/lucene/search/FieldDocSortedHitQueue.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/FieldDocSortedHitQueue.java?rev=617745&r1=617744&r2=617745&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/FieldDocSortedHitQueue.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/FieldDocSortedHitQueue.java Fri Feb 1 19:06:08 2008
@@ -160,6 +160,20 @@
if (d1 > d2) c = 1;
break;
}
+ case SortField.BYTE:{
+ int i1 = ((Byte)docA.fields[i]).byteValue();
+ int i2 = ((Byte)docB.fields[i]).byteValue();
+ if (i1 < i2) c = -1;
+ if (i1 > i2) c = 1;
+ break;
+ }
+ case SortField.SHORT:{
+ int i1 = ((Short)docA.fields[i]).shortValue();
+ int i2 = ((Short)docB.fields[i]).shortValue();
+ if (i1 < i2) c = -1;
+ if (i1 > i2) c = 1;
+ break;
+ }
case SortField.CUSTOM:{
c = docA.fields[i].compareTo (docB.fields[i]);
break;
Modified: lucene/java/trunk/src/java/org/apache/lucene/search/FieldSortedHitQueue.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/FieldSortedHitQueue.java?rev=617745&r1=617744&r2=617745&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/FieldSortedHitQueue.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/FieldSortedHitQueue.java Fri Feb 1 19:06:08 2008
@@ -196,6 +196,12 @@
case SortField.DOUBLE:
comparator = comparatorDouble(reader, fieldname);
break;
+ case SortField.SHORT:
+ comparator = comparatorShort(reader, fieldname);
+ break;
+ case SortField.BYTE:
+ comparator = comparatorByte(reader, fieldname);
+ break;
case SortField.STRING:
if (locale != null) comparator = comparatorStringLocale (reader, fieldname, locale);
else comparator = comparatorString (reader, fieldname);
@@ -209,6 +215,68 @@
return comparator;
}
};
+
+ /**
+ * Returns a comparator for sorting hits according to a field containing bytes.
+ * @param reader Index to use.
+ * @param fieldname Fieldable containg integer values.
+ * @return Comparator for sorting hits.
+ * @throws IOException If an error occurs reading the index.
+ */
+ static ScoreDocComparator comparatorByte(final IndexReader reader, final String fieldname)
+ throws IOException {
+ final String field = fieldname.intern();
+ final byte[] fieldOrder = FieldCache.DEFAULT.getBytes(reader, field);
+ return new ScoreDocComparator() {
+
+ public final int compare (final ScoreDoc i, final ScoreDoc j) {
+ final int fi = fieldOrder[i.doc];
+ final int fj = fieldOrder[j.doc];
+ if (fi < fj) return -1;
+ if (fi > fj) return 1;
+ return 0;
+ }
+
+ public Comparable sortValue (final ScoreDoc i) {
+ return new Byte(fieldOrder[i.doc]);
+ }
+
+ public int sortType() {
+ return SortField.INT;
+ }
+ };
+ }
+
+ /**
+ * Returns a comparator for sorting hits according to a field containing shorts.
+ * @param reader Index to use.
+ * @param fieldname Fieldable containg integer values.
+ * @return Comparator for sorting hits.
+ * @throws IOException If an error occurs reading the index.
+ */
+ static ScoreDocComparator comparatorShort(final IndexReader reader, final String fieldname)
+ throws IOException {
+ final String field = fieldname.intern();
+ final short[] fieldOrder = FieldCache.DEFAULT.getShorts(reader, field);
+ return new ScoreDocComparator() {
+
+ public final int compare (final ScoreDoc i, final ScoreDoc j) {
+ final int fi = fieldOrder[i.doc];
+ final int fj = fieldOrder[j.doc];
+ if (fi < fj) return -1;
+ if (fi > fj) return 1;
+ return 0;
+ }
+
+ public Comparable sortValue (final ScoreDoc i) {
+ return new Short(fieldOrder[i.doc]);
+ }
+
+ public int sortType() {
+ return SortField.SHORT;
+ }
+ };
+ }
/**
* Returns a comparator for sorting hits according to a field containing integers.
Modified: lucene/java/trunk/src/java/org/apache/lucene/search/SortField.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/search/SortField.java?rev=617745&r1=617744&r2=617745&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/search/SortField.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/search/SortField.java Fri Feb 1 19:06:08 2008
@@ -68,9 +68,20 @@
* lower values are at the front. */
public static final int DOUBLE = 7;
+ /**
+ * Sort using term values as encoded Shorts. Sort values are shorts and lower values are at the front
+ */
+ public static final int SHORT = 8;
+
+
/** Sort using a custom Comparator. Sort values are any Comparable and
* sorting is done according to natural order. */
public static final int CUSTOM = 9;
+ /**
+ * Sort using term values as encoded bytes. Sort values are bytes and lower values are at the front
+ */
+ public static final int BYTE = 10;
+
// IMPLEMENTATION NOTE: the FieldCache.STRING_INDEX is in the same "namespace"
// as the above static int values. Any new values must not have the same value
Modified: lucene/java/trunk/src/test/org/apache/lucene/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/search/TestSort.java?rev=617745&r1=617744&r2=617745&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/search/TestSort.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/search/TestSort.java Fri Feb 1 19:06:08 2008
@@ -98,22 +98,22 @@
// the string field to sort by string
// the i18n field includes accented characters for testing locale-specific sorting
private String[][] data = new String[][] {
- // tracer contents int float string custom i18n long double
- { "A", "x a", "5", "4f", "c", "A-3", "p\u00EAche", "10", "-4.0"},//A
- { "B", "y a", "5", "3.4028235E38", "i", "B-10", "HAT", "1000000000", "40.0"},//B
- { "C", "x a b c", "2147483647", "1.0", "j", "A-2", "p\u00E9ch\u00E9", "99999999", "40.00002343"},//C
- { "D", "y a b c", "-1", "0.0f", "a", "C-0", "HUT", String.valueOf(Long.MAX_VALUE), String.valueOf(Double.MIN_VALUE)},//D
- { "E", "x a b c d", "5", "2f", "h", "B-8", "peach", String.valueOf(Long.MIN_VALUE), String.valueOf(Double.MAX_VALUE)},//E
- { "F", "y a b c d", "2", "3.14159f", "g", "B-1", "H\u00C5T", "-44", "343.034435444"},//F
- { "G", "x a b c d", "3", "-1.0", "f", "C-100", "sin", "323254543543", "4.043544"},//G
- { "H", "y a b c d", "0", "1.4E-45", "e", "C-88", "H\u00D8T", "1023423423005","4.043545"},//H
- { "I", "x a b c d e f", "-2147483648", "1.0e+0", "d", "A-10", "s\u00EDn", "332422459999", "4.043546"},//I
- { "J", "y a b c d e f", "4", ".5", "b", "C-7", "HOT", "34334543543", "4.0000220343"},//J
- { "W", "g", "1", null, null, null, null, null, null},
- { "X", "g", "1", "0.1", null, null, null, null, null},
- { "Y", "g", "1", "0.2", null, null, null, null, null},
- { "Z", "f g", null, null, null, null, null, null, null}
- };
+ // tracer contents int float string custom i18n long double, 'short', byte
+ { "A", "x a", "5", "4f", "c", "A-3", "p\u00EAche", "10", "-4.0", "3", "126"},//A, x
+ { "B", "y a", "5", "3.4028235E38", "i", "B-10", "HAT", "1000000000", "40.0", "24", "1"},//B, y
+ { "C", "x a b c", "2147483647", "1.0", "j", "A-2", "p\u00E9ch\u00E9", "99999999", "40.00002343", "125", "15"},//C, x
+ { "D", "y a b c", "-1", "0.0f", "a", "C-0", "HUT", String.valueOf(Long.MAX_VALUE), String.valueOf(Double.MIN_VALUE), String.valueOf(Short.MIN_VALUE), String.valueOf(Byte.MIN_VALUE)},//D, y
+ { "E", "x a b c d", "5", "2f", "h", "B-8", "peach", String.valueOf(Long.MIN_VALUE), String.valueOf(Double.MAX_VALUE), String.valueOf(Short.MAX_VALUE), String.valueOf(Byte.MAX_VALUE)},//E,x
+ { "F", "y a b c d", "2", "3.14159f", "g", "B-1", "H\u00C5T", "-44", "343.034435444", "-3", "0"},//F,y
+ { "G", "x a b c d", "3", "-1.0", "f", "C-100", "sin", "323254543543", "4.043544", "5", "100"},//G,x
+ { "H", "y a b c d", "0", "1.4E-45", "e", "C-88", "H\u00D8T", "1023423423005","4.043545", "10", "-50"},//H,y
+ { "I", "x a b c d e f", "-2147483648", "1.0e+0", "d", "A-10", "s\u00EDn", "332422459999", "4.043546", "-340", "51"},//I,x
+ { "J", "y a b c d e f", "4", ".5", "b", "C-7", "HOT", "34334543543", "4.0000220343", "300", "2"},//J,y
+ { "W", "g", "1", null, null, null, null, null, null, null, null},
+ { "X", "g", "1", "0.1", null, null, null, null, null, null, null},
+ { "Y", "g", "1", "0.2", null, null, null, null, null, null, null},
+ { "Z", "f g", null, null, null, null, null, null, null, null, null}
+ };
// create an index of all the documents, or just the x, or just the y documents
private Searcher getIndex (boolean even, boolean odd)
@@ -132,6 +132,8 @@
if (data[i][6] != null) doc.add (new Field ("i18n", data[i][6], Field.Store.NO, Field.Index.UN_TOKENIZED));
if (data[i][7] != null) doc.add (new Field ("long", data[i][7], Field.Store.NO, Field.Index.UN_TOKENIZED));
if (data[i][8] != null) doc.add (new Field ("double", data[i][8], Field.Store.NO, Field.Index.UN_TOKENIZED));
+ if (data[i][8] != null) doc.add (new Field ("short", data[i][9], Field.Store.NO, Field.Index.UN_TOKENIZED));
+ if (data[i][8] != null) doc.add (new Field ("byte", data[i][10], Field.Store.NO, Field.Index.UN_TOKENIZED));
doc.setBoost(2); // produce some scores above 1.0
writer.addDocument (doc);
}
@@ -202,6 +204,14 @@
sort.setSort (new SortField[] { new SortField ("double", SortField.DOUBLE), SortField.FIELD_DOC });
assertMatches (full, queryX, sort, "AGICE");
assertMatches (full, queryY, sort, "DJHBF");
+
+ sort.setSort (new SortField[] { new SortField ("byte", SortField.BYTE), SortField.FIELD_DOC });
+ assertMatches (full, queryX, sort, "CIGAE");
+ assertMatches (full, queryY, sort, "DHFBJ");
+
+ sort.setSort (new SortField[] { new SortField ("short", SortField.SHORT), SortField.FIELD_DOC });
+ assertMatches (full, queryX, sort, "IAGCE");
+ assertMatches (full, queryY, sort, "DFHBJ");
sort.setSort (new SortField[] { new SortField ("string", SortField.STRING), SortField.FIELD_DOC });
assertMatches (full, queryX, sort, "AIGEC");