You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2013/01/16 14:25:13 UTC
svn commit: r1433926 - in /lucene/dev/trunk/lucene/facet/src:
java/org/apache/lucene/util/encoding/
test/org/apache/lucene/facet/index/params/
test/org/apache/lucene/util/encoding/
Author: shaie
Date: Wed Jan 16 13:25:13 2013
New Revision: 1433926
URL: http://svn.apache.org/viewvc?rev=1433926&view=rev
Log:
LUCENE-4620: inline encoding/decoding
Removed:
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8.java
lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/Vint8Test.java
Modified:
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/ChunksIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoderFilter.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SortingIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/UniqueValuesIntEncoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntDecoder.java
lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntEncoder.java
lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/index/params/CategoryListParamsTest.java
lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/EncodingTest.java
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/ChunksIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/ChunksIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/ChunksIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/ChunksIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -49,20 +49,20 @@ import org.apache.lucene.util.IntsRef;
* @lucene.experimental
*/
public abstract class ChunksIntEncoder extends IntEncoder {
-
+
/** Holds the values which must be encoded, outside the indicator. */
protected final IntsRef encodeQueue;
-
+
/** Represents bits flag byte. */
protected int indicator = 0;
-
+
/** Counts the current ordinal of the encoded value. */
protected byte ordinal = 0;
-
+
protected ChunksIntEncoder(int chunkSize) {
encodeQueue = new IntsRef(chunkSize);
}
-
+
/**
* Encodes the values of the current chunk. First it writes the indicator, and
* then it encodes the values outside the indicator.
@@ -76,17 +76,40 @@ public abstract class ChunksIntEncoder e
buf.bytes[buf.length++] = ((byte) indicator);
for (int i = 0; i < encodeQueue.length; i++) {
- VInt8.encode(encodeQueue.ints[i], buf);
+ // it is better if the encoding is inlined like so, and not e.g.
+ // in a utility method
+ int value = encodeQueue.ints[i];
+ if ((value & ~0x7F) == 0) {
+ buf.bytes[buf.length] = (byte) value;
+ buf.length++;
+ } else if ((value & ~0x3FFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 1] = (byte) (value & 0x7F);
+ buf.length += 2;
+ } else if ((value & ~0x1FFFFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 2] = (byte) (value & 0x7F);
+ buf.length += 3;
+ } else if ((value & ~0xFFFFFFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0xFE00000) >> 21));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 2] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 3] = (byte) (value & 0x7F);
+ buf.length += 4;
+ } else {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0xF0000000) >> 28));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0xFE00000) >> 21));
+ buf.bytes[buf.length + 2] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 3] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 4] = (byte) (value & 0x7F);
+ buf.length += 5;
+ }
}
- reset();
- }
-
- @Override
- protected void reset() {
ordinal = 0;
indicator = 0;
encodeQueue.length = 0;
}
-
+
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntDecoder.java Wed Jan 16 13:25:13 2013
@@ -26,7 +26,7 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class DGapIntDecoder extends IntDecoder {
+public final class DGapIntDecoder extends IntDecoder {
private final IntDecoder decoder;
@@ -35,13 +35,8 @@ public class DGapIntDecoder extends IntD
}
@Override
- protected void reset() {
- decoder.reset();
- }
-
- @Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- decoder.doDecode(buf, values, upto);
+ public void decode(BytesRef buf, IntsRef values) {
+ decoder.decode(buf, values);
int prev = 0;
for (int i = 0; i < values.length; i++) {
values.ints[i] += prev;
@@ -51,7 +46,7 @@ public class DGapIntDecoder extends IntD
@Override
public String toString() {
- return "DGap (" + decoder.toString() + ")";
+ return "DGap(" + decoder.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/DGapIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -35,7 +35,7 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class DGapIntEncoder extends IntEncoderFilter {
+public final class DGapIntEncoder extends IntEncoderFilter {
/** Initializes with the given encoder. */
public DGapIntEncoder(IntEncoder encoder) {
@@ -43,14 +43,15 @@ public class DGapIntEncoder extends IntE
}
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
int prev = 0;
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
int tmp = values.ints[i];
values.ints[i] -= prev;
prev = tmp;
}
- encoder.doEncode(values, buf, upto);
+ encoder.encode(values, buf);
}
@Override
@@ -60,7 +61,7 @@ public class DGapIntEncoder extends IntE
@Override
public String toString() {
- return "DGap (" + encoder.toString() + ")";
+ return "DGap(" + encoder.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntDecoder.java Wed Jan 16 13:25:13 2013
@@ -45,10 +45,13 @@ public class EightFlagsIntDecoder extend
}
@Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- while (buf.offset < upto) {
+ public void decode(BytesRef buf, IntsRef values) {
+ values.offset = values.length = 0;
+ int upto = buf.offset + buf.length;
+ int offset = buf.offset;
+ while (offset < upto) {
// read indicator
- int indicator = buf.bytes[buf.offset++] & 0xFF;
+ int indicator = buf.bytes[offset++] & 0xFF;
int ordinal = 0;
int capacityNeeded = values.length + 8;
@@ -59,11 +62,21 @@ public class EightFlagsIntDecoder extend
// process indicator, until we read 8 values, or end-of-buffer
while (ordinal != 8) {
if (DECODE_TABLE[indicator][ordinal++] == 0) {
- if (buf.offset == upto) { // end of buffer
+ if (offset == upto) { // end of buffer
return;
}
- // decode the value from the stream.
- values.ints[values.length++] = VInt8.decode(buf) + 2;
+ // it is better if the decoding is inlined like so, and not e.g.
+ // in a utility method
+ int value = 0;
+ while (true) {
+ byte b = buf.bytes[offset++];
+ if (b >= 0) {
+ values.ints[values.length++] = ((value << 7) | b) + 2;
+ break;
+ } else {
+ value = (value << 7) | (b & 0x7F);
+ }
+ }
} else {
values.ints[values.length++] = 1;
}
@@ -73,7 +86,7 @@ public class EightFlagsIntDecoder extend
@Override
public String toString() {
- return "EightFlags (VInt8)";
+ return "EightFlags(VInt8)";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/EightFlagsIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -59,7 +59,9 @@ public class EightFlagsIntEncoder extend
}
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
+ buf.offset = buf.length = 0;
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
int value = values.ints[i];
if (value == 1) {
@@ -88,7 +90,7 @@ public class EightFlagsIntEncoder extend
@Override
public String toString() {
- return "EightFlags (VInt)";
+ return "EightFlags(VInt)";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntDecoder.java Wed Jan 16 13:25:13 2013
@@ -45,10 +45,13 @@ public class FourFlagsIntDecoder extends
}
@Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- while (buf.offset < upto) {
+ public void decode(BytesRef buf, IntsRef values) {
+ values.offset = values.length = 0;
+ int upto = buf.offset + buf.length;
+ int offset = buf.offset;
+ while (offset < upto) {
// read indicator
- int indicator = buf.bytes[buf.offset++] & 0xFF;
+ int indicator = buf.bytes[offset++] & 0xFF;
int ordinal = 0;
int capacityNeeded = values.length + 4;
@@ -59,11 +62,21 @@ public class FourFlagsIntDecoder extends
while (ordinal != 4) {
byte decodeVal = DECODE_TABLE[indicator][ordinal++];
if (decodeVal == 0) {
- if (buf.offset == upto) { // end of buffer
+ if (offset == upto) { // end of buffer
return;
}
- // decode the value from the stream.
- values.ints[values.length++] = VInt8.decode(buf) + 4;
+ // it is better if the decoding is inlined like so, and not e.g.
+ // in a utility method
+ int value = 0;
+ while (true) {
+ byte b = buf.bytes[offset++];
+ if (b >= 0) {
+ values.ints[values.length++] = ((value << 7) | b) + 4;
+ break;
+ } else {
+ value = (value << 7) | (b & 0x7F);
+ }
+ }
} else {
values.ints[values.length++] = decodeVal;
}
@@ -73,7 +86,7 @@ public class FourFlagsIntDecoder extends
@Override
public String toString() {
- return "FourFlags (VInt8)";
+ return "FourFlags(VInt8)";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/FourFlagsIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -65,7 +65,9 @@ public class FourFlagsIntEncoder extends
}
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
+ buf.offset = buf.length = 0;
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
int value = values.ints[i];
if (value <= 3) {
@@ -94,7 +96,7 @@ public class FourFlagsIntEncoder extends
@Override
public String toString() {
- return "FourFlags (VInt)";
+ return "FourFlags(VInt)";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntDecoder.java Wed Jan 16 13:25:13 2013
@@ -28,43 +28,9 @@ import org.apache.lucene.util.IntsRef;
public abstract class IntDecoder {
/**
- * Performs the actual decoding. Values should be read from
- * {@link BytesRef#offset} up to {@code upto}. Also, {@code values} offset and
- * length are set to 0 and the encoder is expected to update
- * {@link IntsRef#length}, but not {@link IntsRef#offset}.
- *
- * <p>
- * <b>NOTE:</b> it is ok to use the buffer's offset as the current position in
- * the buffer (and modify it), it will be reset by
- * {@link #decode(BytesRef, IntsRef)}.
- */
- protected abstract void doDecode(BytesRef buf, IntsRef values, int upto);
-
- /**
- * Called before {@link #doDecode(BytesRef, IntsRef, int)} so that decoders
- * can reset their state.
- */
- protected void reset() {
- // do nothing by default
- }
-
- /**
* Decodes the values from the buffer into the given {@link IntsRef}. Note
* that {@code values.offset} and {@code values.length} are set to 0.
*/
- public final void decode(BytesRef buf, IntsRef values) {
- values.offset = values.length = 0; // must do that because we cannot grow() them otherwise
-
- // some decoders may use the buffer's offset as a position index, so save
- // current offset.
- int bufOffset = buf.offset;
-
- reset();
- doDecode(buf, values, buf.offset + buf.length);
- assert values.offset == 0 : "offset should not have been modified by the decoder.";
-
- // fix offset
- buf.offset = bufOffset;
- }
+ public abstract void decode(BytesRef buf, IntsRef values);
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoder.java Wed Jan 16 13:25:13 2013
@@ -32,31 +32,10 @@ public abstract class IntEncoder {
public IntEncoder() {}
/**
- * Performs the actual encoding. Values should be read from
- * {@link IntsRef#offset} up to {@code upto}. Also, it is guaranteed that
- * {@code buf's} offset and length are set to 0 and the encoder is expected to
- * update {@link BytesRef#length}, but not {@link BytesRef#offset}.
- */
- protected abstract void doEncode(IntsRef values, BytesRef buf, int upto);
-
- /**
- * Called before {@link #doEncode(IntsRef, BytesRef, int)} so that encoders
- * can reset their state.
- */
- protected void reset() {
- // do nothing by default
- }
-
- /**
* Encodes the values to the given buffer. Note that the buffer's offset and
* length are set to 0.
*/
- public final void encode(IntsRef values, BytesRef buf) {
- buf.offset = buf.length = 0;
- reset();
- doEncode(values, buf, values.offset + values.length);
- assert buf.offset == 0 : "offset should not have been modified by the encoder.";
- }
+ public abstract void encode(IntsRef values, BytesRef buf);
/**
* Returns an {@link IntDecoder} which can decode the values that were encoded
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoderFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoderFilter.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoderFilter.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/IntEncoderFilter.java Wed Jan 16 13:25:13 2013
@@ -31,9 +31,4 @@ public abstract class IntEncoderFilter e
this.encoder = encoder;
}
- @Override
- public void reset() {
- encoder.reset();
- }
-
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntDecoder.java Wed Jan 16 13:25:13 2013
@@ -42,14 +42,10 @@ public class NOnesIntDecoder extends Fou
}
@Override
- protected void reset() {
+ public void decode(BytesRef buf, IntsRef values) {
+ values.offset = values.length = 0;
internalBuffer.length = 0;
- super.reset();
- }
-
- @Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- super.doDecode(buf, internalBuffer, upto);
+ super.decode(buf, internalBuffer);
if (values.ints.length < internalBuffer.length) {
// need space for internalBuffer.length to internalBuffer.length*N,
// grow mildly at first
@@ -84,7 +80,7 @@ public class NOnesIntDecoder extends Fou
@Override
public String toString() {
- return "NOnes (" + n + ") (" + super.toString() + ")";
+ return "NOnes(" + n + ") (" + super.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/NOnesIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -65,19 +65,15 @@ public class NOnesIntEncoder extends Fou
}
@Override
- protected void reset() {
+ public void encode(IntsRef values, BytesRef buf) {
internalBuffer.length = 0;
- super.reset();
- }
-
- @Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
// make sure the internal buffer is large enough
if (values.length > internalBuffer.ints.length) {
internalBuffer.grow(values.length);
}
int onesCounter = 0;
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
int value = values.ints[i];
if (value == 1) {
@@ -102,7 +98,7 @@ public class NOnesIntEncoder extends Fou
--onesCounter;
internalBuffer.ints[internalBuffer.length++] = 1;
}
- super.doEncode(internalBuffer, buf, internalBuffer.length);
+ super.encode(internalBuffer, buf);
}
@Override
@@ -112,7 +108,7 @@ public class NOnesIntEncoder extends Fou
@Override
public String toString() {
- return "NOnes (" + n + ") (" + super.toString() + ")";
+ return "NOnes(" + n + ") (" + super.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntDecoder.java Wed Jan 16 13:25:13 2013
@@ -1,7 +1,9 @@
package org.apache.lucene.util.encoding;
+import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IntsRef;
+import org.apache.lucene.util.RamUsageEstimator;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -25,19 +27,24 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class SimpleIntDecoder extends IntDecoder {
+public final class SimpleIntDecoder extends IntDecoder {
@Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- while (buf.offset < upto) {
- if (values.length == values.ints.length) {
- values.grow(values.length + 10); // grow by few items, however not too many
- }
+ public void decode(BytesRef buf, IntsRef values) {
+ values.offset = values.length = 0;
+ int numValues = buf.length / 4; // every value is 4 bytes
+ if (values.ints.length < numValues) { // offset and length are 0
+ values.ints = new int[ArrayUtil.oversize(numValues, RamUsageEstimator.NUM_BYTES_INT)];
+ }
+
+ int offset = buf.offset;
+ int upto = buf.offset + buf.length;
+ while (offset < upto) {
values.ints[values.length++] =
- ((buf.bytes[buf.offset++] & 0xFF) << 24) |
- ((buf.bytes[buf.offset++] & 0xFF) << 16) |
- ((buf.bytes[buf.offset++] & 0xFF) << 8) |
- (buf.bytes[buf.offset++] & 0xFF);
+ ((buf.bytes[offset++] & 0xFF) << 24) |
+ ((buf.bytes[offset++] & 0xFF) << 16) |
+ ((buf.bytes[offset++] & 0xFF) << 8) |
+ (buf.bytes[offset++] & 0xFF);
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SimpleIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -25,16 +25,18 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class SimpleIntEncoder extends IntEncoder {
+public final class SimpleIntEncoder extends IntEncoder {
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
+ buf.offset = buf.length = 0;
// ensure there's enough room in the buffer
int bytesNeeded = values.length * 4;
if (buf.bytes.length < bytesNeeded) {
buf.grow(bytesNeeded);
}
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
int value = values.ints[i];
buf.bytes[buf.length++] = (byte) (value >>> 24);
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SortingIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SortingIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SortingIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/SortingIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -28,7 +28,7 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class SortingIntEncoder extends IntEncoderFilter {
+public final class SortingIntEncoder extends IntEncoderFilter {
/** Initializes with the given encoder. */
public SortingIntEncoder(IntEncoder encoder) {
@@ -36,9 +36,9 @@ public class SortingIntEncoder extends I
}
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
- Arrays.sort(values.ints, values.offset, upto);
- encoder.doEncode(values, buf, upto);
+ public void encode(IntsRef values, BytesRef buf) {
+ Arrays.sort(values.ints, values.offset, values.offset + values.length);
+ encoder.encode(values, buf);
}
@Override
@@ -48,7 +48,7 @@ public class SortingIntEncoder extends I
@Override
public String toString() {
- return "Sorting (" + encoder.toString() + ")";
+ return "Sorting(" + encoder.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/UniqueValuesIntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/UniqueValuesIntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/UniqueValuesIntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/UniqueValuesIntEncoder.java Wed Jan 16 13:25:13 2013
@@ -36,9 +36,10 @@ public final class UniqueValuesIntEncode
}
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
int prev = values.ints[values.offset];
int idx = values.offset + 1;
+ int upto = values.offset + values.length;
for (int i = idx; i < upto; i++) {
if (values.ints[i] != prev) {
values.ints[idx++] = values.ints[i];
@@ -46,7 +47,7 @@ public final class UniqueValuesIntEncode
}
}
values.length = idx - values.offset;
- encoder.doEncode(values, buf, idx);
+ encoder.encode(values, buf);
}
@Override
@@ -56,7 +57,7 @@ public final class UniqueValuesIntEncode
@Override
public String toString() {
- return "Unique (" + encoder.toString() + ")";
+ return "Unique(" + encoder.toString() + ")";
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntDecoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntDecoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntDecoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntDecoder.java Wed Jan 16 13:25:13 2013
@@ -1,7 +1,9 @@
package org.apache.lucene.util.encoding;
+import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IntsRef;
+import org.apache.lucene.util.RamUsageEstimator;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -25,15 +27,32 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class VInt8IntDecoder extends IntDecoder {
+public final class VInt8IntDecoder extends IntDecoder {
@Override
- protected void doDecode(BytesRef buf, IntsRef values, int upto) {
- while (buf.offset < upto) {
- if (values.length == values.ints.length) {
- values.grow(values.length + 10); // grow by few items, however not too many
+ public void decode(BytesRef buf, IntsRef values) {
+ values.offset = values.length = 0;
+
+ // grow the buffer up front, even if by a large number of values (buf.length)
+ // that saves the need to check inside the loop for every decoded value if
+ // the buffer needs to grow.
+ if (values.ints.length < buf.length) {
+ values.ints = new int[ArrayUtil.oversize(buf.length, RamUsageEstimator.NUM_BYTES_INT)];
+ }
+
+ // it is better if the decoding is inlined like so, and not e.g.
+ // in a utility method
+ int upto = buf.offset + buf.length;
+ int value = 0;
+ int offset = buf.offset;
+ while (offset < upto) {
+ byte b = buf.bytes[offset++];
+ if (b >= 0) {
+ values.ints[values.length++] = (value << 7) | b;
+ value = 0;
+ } else {
+ value = (value << 7) | (b & 0x7F);
}
- values.ints[values.length++] = VInt8.decode(buf);
}
}
Modified: lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntEncoder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntEncoder.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntEncoder.java (original)
+++ lucene/dev/trunk/lucene/facet/src/java/org/apache/lucene/util/encoding/VInt8IntEncoder.java Wed Jan 16 13:25:13 2013
@@ -47,17 +47,47 @@ import org.apache.lucene.util.IntsRef;
*
* @lucene.experimental
*/
-public class VInt8IntEncoder extends IntEncoder {
+public final class VInt8IntEncoder extends IntEncoder {
@Override
- protected void doEncode(IntsRef values, BytesRef buf, int upto) {
+ public void encode(IntsRef values, BytesRef buf) {
+ buf.offset = buf.length = 0;
int maxBytesNeeded = 5 * values.length; // at most 5 bytes per VInt
if (buf.bytes.length < maxBytesNeeded) {
buf.grow(maxBytesNeeded);
}
+ int upto = values.offset + values.length;
for (int i = values.offset; i < upto; i++) {
- VInt8.encode(values.ints[i], buf);
+ // it is better if the encoding is inlined like so, and not e.g.
+ // in a utility method
+ int value = values.ints[i];
+ if ((value & ~0x7F) == 0) {
+ buf.bytes[buf.length] = (byte) value;
+ buf.length++;
+ } else if ((value & ~0x3FFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 1] = (byte) (value & 0x7F);
+ buf.length += 2;
+ } else if ((value & ~0x1FFFFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 2] = (byte) (value & 0x7F);
+ buf.length += 3;
+ } else if ((value & ~0xFFFFFFF) == 0) {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0xFE00000) >> 21));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 2] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 3] = (byte) (value & 0x7F);
+ buf.length += 4;
+ } else {
+ buf.bytes[buf.length] = (byte) (0x80 | ((value & 0xF0000000) >> 28));
+ buf.bytes[buf.length + 1] = (byte) (0x80 | ((value & 0xFE00000) >> 21));
+ buf.bytes[buf.length + 2] = (byte) (0x80 | ((value & 0x1FC000) >> 14));
+ buf.bytes[buf.length + 3] = (byte) (0x80 | ((value & 0x3F80) >> 7));
+ buf.bytes[buf.length + 4] = (byte) (value & 0x7F);
+ buf.length += 5;
+ }
}
}
Modified: lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/index/params/CategoryListParamsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/index/params/CategoryListParamsTest.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/index/params/CategoryListParamsTest.java (original)
+++ lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/index/params/CategoryListParamsTest.java Wed Jan 16 13:25:13 2013
@@ -1,6 +1,12 @@
package org.apache.lucene.facet.index.params;
import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.encoding.DGapIntEncoder;
+import org.apache.lucene.util.encoding.IntDecoder;
+import org.apache.lucene.util.encoding.IntEncoder;
+import org.apache.lucene.util.encoding.SortingIntEncoder;
+import org.apache.lucene.util.encoding.UniqueValuesIntEncoder;
+import org.apache.lucene.util.encoding.VInt8IntEncoder;
import org.junit.Test;
/*
@@ -26,8 +32,10 @@ public class CategoryListParamsTest exte
public void testDefaultSettings() {
CategoryListParams clp = new CategoryListParams();
assertEquals("wrong default field", "$facets", clp.field);
- assertEquals("unexpected default encoder", "Sorting (Unique (DGap (VInt8)))", clp.createEncoder().toString());
- assertEquals("unexpected default decoder", "DGap (VInt8)", clp.createEncoder().createMatchingDecoder().toString());
+ IntEncoder encoder = new SortingIntEncoder(new UniqueValuesIntEncoder(new DGapIntEncoder(new VInt8IntEncoder())));
+ IntDecoder decoder = encoder.createMatchingDecoder();
+ assertEquals("unexpected default encoder", encoder.toString(), clp.createEncoder().toString());
+ assertEquals("unexpected default decoder", decoder.toString(), clp.createEncoder().createMatchingDecoder().toString());
}
/**
Modified: lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/EncodingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/EncodingTest.java?rev=1433926&r1=1433925&r2=1433926&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/EncodingTest.java (original)
+++ lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/util/encoding/EncodingTest.java Wed Jan 16 13:25:13 2013
@@ -64,9 +64,12 @@ public class EncodingTest extends Lucene
BytesRef bytes = new BytesRef(100); // some initial capacity - encoders should grow the byte[]
IntsRef values = new IntsRef(100); // some initial capacity - decoders should grow the int[]
- encoding(encoder, data, bytes);
- decoding(bytes, values, encoder.createMatchingDecoder());
- assertTrue(expected.intsEquals(values));
+ for (int i = 0; i < 2; i++) {
+ // run 2 iterations to catch encoders/decoders which don't reset properly
+ encoding(encoder, data, bytes);
+ decoding(bytes, values, encoder.createMatchingDecoder());
+ assertTrue(expected.intsEquals(values));
+ }
}
private static void encoding(IntEncoder encoder, IntsRef data, BytesRef bytes) throws IOException {