Index: solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java
===================================================================
--- solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java (revision 1180735)
+++ solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java (working copy)
@@ -24,9 +24,6 @@
import org.apache.lucene.search.FieldComparatorSource;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.UnicodeUtil;
-import org.apache.lucene.util.packed.Direct16;
-import org.apache.lucene.util.packed.Direct32;
-import org.apache.lucene.util.packed.Direct8;
import org.apache.lucene.util.packed.PackedInts;
import java.io.IOException;
@@ -438,15 +435,19 @@
public static FieldComparator createComparator(IndexReader reader, TermOrdValComparator_SML parent) throws IOException {
parent.termsIndex = FieldCache.DEFAULT.getTermsIndex(reader, parent.field);
final PackedInts.Reader docToOrd = parent.termsIndex.getDocToOrd();
- PerSegmentComparator perSegComp;
+ PerSegmentComparator perSegComp = null;
+ if (docToOrd.hasArray()) {
+ final Object arr = docToOrd.getArray();
+ if (arr instanceof byte[]) {
+ perSegComp = new ByteOrdComparator((byte[]) arr, parent);
+ } else if (arr instanceof short[]) {
+ perSegComp = new ShortOrdComparator((short[]) arr, parent);
+ } else if (arr instanceof int[]) {
+ perSegComp = new IntOrdComparator((int[]) arr, parent);
+ }
+ }
- if (docToOrd instanceof Direct8) {
- perSegComp = new ByteOrdComparator(((Direct8) docToOrd).getArray(), parent);
- } else if (docToOrd instanceof Direct16) {
- perSegComp = new ShortOrdComparator(((Direct16) docToOrd).getArray(), parent);
- } else if (docToOrd instanceof Direct32) {
- perSegComp = new IntOrdComparator(((Direct32) docToOrd).getArray(), parent);
- } else {
+ if (perSegComp == null) {
perSegComp = new AnyOrdComparator(docToOrd, parent);
}
Index: solr/core/src/java/org/apache/solr/request/SimpleFacets.java
===================================================================
--- solr/core/src/java/org/apache/solr/request/SimpleFacets.java (revision 1180735)
+++ solr/core/src/java/org/apache/solr/request/SimpleFacets.java (working copy)
@@ -22,9 +22,6 @@
import org.apache.lucene.search.*;
import org.apache.lucene.search.grouping.AbstractAllGroupHeadsCollector;
import org.apache.lucene.util.*;
-import org.apache.lucene.util.packed.Direct16;
-import org.apache.lucene.util.packed.Direct32;
-import org.apache.lucene.util.packed.Direct8;
import org.apache.lucene.util.packed.PackedInts;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
@@ -450,8 +447,15 @@
DocIterator iter = docs.iterator();
PackedInts.Reader ordReader = si.getDocToOrd();
- if (ordReader instanceof Direct32) {
- int[] ords = ((Direct32)ordReader).getArray();
+ final Object arr;
+ if (ordReader.hasArray()) {
+ arr = ordReader.getArray();
+ } else {
+ arr = null;
+ }
+
+ if (arr instanceof int[]) {
+ int[] ords = (int[]) arr;
if (prefix==null) {
while (iter.hasNext()) {
counts[ords[iter.nextDoc()]]++;
@@ -463,8 +467,8 @@
if (arrIdx>=0 && arrIdx
@@ -80,4 +76,14 @@ public void clear() { Arrays.fill(values, 0L); } + + @Override + public long[] getArray() { + return values; + } + + @Override + public boolean hasArray() { + return true; + } } Index: lucene/src/java/org/apache/lucene/util/packed/PackedInts.java =================================================================== --- lucene/src/java/org/apache/lucene/util/packed/PackedInts.java (revision 1180859) +++ lucene/src/java/org/apache/lucene/util/packed/PackedInts.java (working copy) @@ -65,6 +65,25 @@ * @return the number of values. */ int size(); + + /** + * Expert: if the bit-width of this reader matches one of + * java's native types, returns the underlying array + * (ie, byte[], short[], int[], long[]); else, returns + * null. Note that when accessing the array you must + * upgrade the type (bitwise AND with all ones), to + * interpret the full value as unsigned. Ie, + * bytes[idx]&0xFF, shorts[idx]&0xFFFF, etc. + */ + Object getArray(); + + /** + * Returns true if this implementation is backed by a + * native java array. + * + * @see #getArray + */ + boolean hasArray(); } /** @@ -137,6 +156,14 @@ public long getMaxValue() { // Convenience method return maxValue(bitsPerValue); } + + public Object getArray() { + return null; + } + + public boolean hasArray() { + return false; + } } /** A write-once Writer.