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; @@ -439,13 +436,14 @@ parent.termsIndex = FieldCache.DEFAULT.getTermsIndex(reader, parent.field); final PackedInts.Reader docToOrd = parent.termsIndex.getDocToOrd(); PerSegmentComparator perSegComp; + final Object arr = docToOrd.getNativeArray(); - 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); + 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); } else { 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,9 @@ DocIterator iter = docs.iterator(); PackedInts.Reader ordReader = si.getDocToOrd(); - if (ordReader instanceof Direct32) { - int[] ords = ((Direct32)ordReader).getArray(); + final Object arr = ordReader.getNativeArray(); + if (arr instanceof int[]) { + int[] ords = (int[]) arr; if (prefix==null) { while (iter.hasNext()) { counts[ords[iter.nextDoc()]]++; @@ -463,8 +461,8 @@ if (arrIdx>=0 && arrIdx=0 && arrIdx=0 && arrIdx=0 && arrIdx= currentMaxValue) { int bpv = getBitsPerValue(); Index: lucene/src/java/org/apache/lucene/util/packed/Direct16.java =================================================================== --- lucene/src/java/org/apache/lucene/util/packed/Direct16.java (revision 1180859) +++ lucene/src/java/org/apache/lucene/util/packed/Direct16.java (working copy) @@ -28,7 +28,7 @@ * @lucene.internal */ -public class Direct16 extends PackedInts.ReaderImpl +class Direct16 extends PackedInts.ReaderImpl implements PackedInts.Mutable { private short[] values; private static final int BITS_PER_VALUE = 16; @@ -68,10 +68,6 @@ this.values = values; } - public short[] getArray() { - return values; - } - public long get(final int index) { return 0xFFFFL & values[index]; } @@ -88,4 +84,9 @@ public void clear() { Arrays.fill(values, (short)0); } + + @Override + public Object getNativeArray() { + return values; + } } Index: lucene/src/java/org/apache/lucene/util/packed/Direct8.java =================================================================== --- lucene/src/java/org/apache/lucene/util/packed/Direct8.java (revision 1180859) +++ lucene/src/java/org/apache/lucene/util/packed/Direct8.java (working copy) @@ -28,7 +28,7 @@ * @lucene.internal */ -public class Direct8 extends PackedInts.ReaderImpl +class Direct8 extends PackedInts.ReaderImpl implements PackedInts.Mutable { private byte[] values; private static final int BITS_PER_VALUE = 8; @@ -69,10 +69,6 @@ this.values = values; } - public byte[] getArray() { - return values; - } - public long get(final int index) { return 0xFFL & values[index]; } @@ -88,4 +84,9 @@ public void clear() { Arrays.fill(values, (byte)0); } + + @Override + public Object getNativeArray() { + return values; + } } Index: lucene/src/java/org/apache/lucene/util/packed/Direct64.java =================================================================== --- lucene/src/java/org/apache/lucene/util/packed/Direct64.java (revision 1180859) +++ lucene/src/java/org/apache/lucene/util/packed/Direct64.java (working copy) @@ -28,7 +28,7 @@ * @lucene.internal */ -public class Direct64 extends PackedInts.ReaderImpl +class Direct64 extends PackedInts.ReaderImpl implements PackedInts.Mutable { private long[] values; private static final int BITS_PER_VALUE = 64; @@ -48,10 +48,6 @@ this.values = values; } - public long[] getArray() { - return values; - } - /** * Creates an array backed by the given values. *

@@ -80,4 +76,9 @@ public void clear() { Arrays.fill(values, 0L); } + + @Override + public long[] getNativeArray() { + return values; + } } 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,17 @@ * @return the number of values. */ int size(); + + /** + * Exert: 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 getNativeArray(); } /** @@ -137,6 +148,10 @@ public long getMaxValue() { // Convenience method return maxValue(bitsPerValue); } + + public Object getNativeArray() { + return null; + } } /** A write-once Writer.