This is an automated email from the ASF dual-hosted git repository.
leirui pushed a commit to branch research/M4-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/research/M4-visualization by
this push:
new abdf5f1863 add
abdf5f1863 is described below
commit abdf5f1863feb940fb9c59f5b1c4ccc08d4eef0f
Author: Lei Rui <[email protected]>
AuthorDate: Tue Oct 11 12:52:18 2022 +0800
add
---
.../iotdb/session/MyBasicOperationTest4.java | 131 +++++++++++----------
.../session/MyRealDataTest1_WriteAndQuery.java | 2 +-
.../encoding/decoder/DeltaBinaryDecoder.java | 86 +++++---------
.../encoding/encoder/DeltaBinaryEncoder.java | 87 +++++++++++++-
.../iotdb/tsfile/read/reader/page/PageReader.java | 3 +-
5 files changed, 182 insertions(+), 127 deletions(-)
diff --git
a/session/src/test/java/org/apache/iotdb/session/MyBasicOperationTest4.java
b/session/src/test/java/org/apache/iotdb/session/MyBasicOperationTest4.java
index c41a1bc5ff..e55853a600 100644
--- a/session/src/test/java/org/apache/iotdb/session/MyBasicOperationTest4.java
+++ b/session/src/test/java/org/apache/iotdb/session/MyBasicOperationTest4.java
@@ -1,10 +1,11 @@
package org.apache.iotdb.session;
-import java.text.DecimalFormat;
-import java.util.Random;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.junit.Assert;
+import java.text.DecimalFormat;
+import java.util.Random;
+
public class MyBasicOperationTest4 {
public static void main(String[] args) {
@@ -24,58 +25,58 @@ public class MyBasicOperationTest4 {
int packWidth = 10;
// test op1
-// System.out.println("op1");
-// long[] op1_v1 = new long[repeat];
-// long[] op1_v2 = new long[repeat];
-// long start = System.nanoTime();
-// for (int i = 0; i < repeat; i++) {
-// int mask = 0b10000000;
-// long v1 = 0;
-// long v2 = 0;
-// for (int k = 0; k < 8; k++) {
-// if (k < splitPos) {
-// v1 = v1 | (buf[i] & mask);
-// mask = mask >> 1;
-// } else {
-// v2 = v2 | (buf[i] & mask);
-// mask = mask >> 1;
-// }
-// }
-// op1_v1[i] = v1 >> 5;
-// op1_v2[i] = v2 << (packWidth - (8 - splitPos));
-// }
-// long elapsedTime = System.nanoTime() - start;
-// op1.addValue(elapsedTime / 1000.0);
+ // System.out.println("op1");
+ // long[] op1_v1 = new long[repeat];
+ // long[] op1_v2 = new long[repeat];
+ // long start = System.nanoTime();
+ // for (int i = 0; i < repeat; i++) {
+ // int mask = 0b10000000;
+ // long v1 = 0;
+ // long v2 = 0;
+ // for (int k = 0; k < 8; k++) {
+ // if (k < splitPos) {
+ // v1 = v1 | (buf[i] & mask);
+ // mask = mask >> 1;
+ // } else {
+ // v2 = v2 | (buf[i] & mask);
+ // mask = mask >> 1;
+ // }
+ // }
+ // op1_v1[i] = v1 >> 5;
+ // op1_v2[i] = v2 << (packWidth - (8 - splitPos));
+ // }
+ // long elapsedTime = System.nanoTime() - start;
+ // op1.addValue(elapsedTime / 1000.0);
-// System.out.println("op1");
-// long[] op1_v1 = new long[repeat];
-// long[] op1_v2 = new long[repeat];
-// long start = System.nanoTime();
-// for (int i = 0; i < repeat; i++) {
-// long v1 = 0;
-// long v2 = 0;
-// char[] v = Long.toBinaryString(buf[i] & 0xff).toCharArray();
-//// System.out.println(v);
-// for (int k = 8 - v.length; k < 8; k++) {
-// if (k < splitPos) {
-// v1 = v1 << 1;
-// v1 = v1 + Character.getNumericValue(v[k - 8 + v.length]);
-// } else {
-// v2 = v2 << 1;
-// v2 = v2 + Character.getNumericValue(v[k - 8 + v.length]);
-// }
-// }
-// op1_v1[i] = v1;
-// op1_v2[i] = v2 << (packWidth - (8 - splitPos));
-//// System.out.println(op1_v1[i]);
-//// System.out.println(op1_v2[i]);
-// }
-// long elapsedTime = System.nanoTime() - start;
-// op1.addValue(elapsedTime / 1000.0);
+ // System.out.println("op1");
+ // long[] op1_v1 = new long[repeat];
+ // long[] op1_v2 = new long[repeat];
+ // long start = System.nanoTime();
+ // for (int i = 0; i < repeat; i++) {
+ // long v1 = 0;
+ // long v2 = 0;
+ // char[] v = Long.toBinaryString(buf[i] & 0xff).toCharArray();
+ //// System.out.println(v);
+ // for (int k = 8 - v.length; k < 8; k++) {
+ // if (k < splitPos) {
+ // v1 = v1 << 1;
+ // v1 = v1 + Character.getNumericValue(v[k - 8 + v.length]);
+ // } else {
+ // v2 = v2 << 1;
+ // v2 = v2 + Character.getNumericValue(v[k - 8 + v.length]);
+ // }
+ // }
+ // op1_v1[i] = v1;
+ // op1_v2[i] = v2 << (packWidth - (8 - splitPos));
+ //// System.out.println(op1_v1[i]);
+ //// System.out.println(op1_v2[i]);
+ // }
+ // long elapsedTime = System.nanoTime() - start;
+ // op1.addValue(elapsedTime / 1000.0);
System.out.println("op1");
-// long[] op1_v1 = new long[repeat];
-// long[] op1_v2 = new long[repeat];
+ // long[] op1_v1 = new long[repeat];
+ // long[] op1_v2 = new long[repeat];
long sum1 = 0;
long start = System.nanoTime();
for (int i = 0; i < repeat; i++) {
@@ -91,10 +92,10 @@ public class MyBasicOperationTest4 {
v2 = v2 + (b << (7 - k));
}
}
-// op1_v1[i] = v1;
-// op1_v2[i] = v2 << (packWidth - (8 - splitPos));
-// System.out.println(op1_v1[i]);
-// System.out.println(op1_v2[i]);
+ // op1_v1[i] = v1;
+ // op1_v2[i] = v2 << (packWidth - (8 - splitPos));
+ // System.out.println(op1_v1[i]);
+ // System.out.println(op1_v2[i]);
sum1 += v1;
sum1 += v2 << (packWidth - (8 - splitPos));
}
@@ -103,28 +104,28 @@ public class MyBasicOperationTest4 {
// test op2
System.out.println("op2");
-// long[] op2_v1 = new long[repeat];
-// long[] op2_v2 = new long[repeat];
+ // long[] op2_v1 = new long[repeat];
+ // long[] op2_v2 = new long[repeat];
long sum2 = 0;
start = System.nanoTime();
for (int i = 0; i < repeat; i++) {
byte data = buf[i];
long v1 = 0;
long v2 = 0;
-// op2_v1[i] = v1 | ((data & mask1) >> 5);
-// op2_v2[i] = v2 | ((data & mask2) << (packWidth - (8 - splitPos)));
-// System.out.println(op2_v1[i]);
-// System.out.println(op2_v2[i]);
+ // op2_v1[i] = v1 | ((data & mask1) >> 5);
+ // op2_v2[i] = v2 | ((data & mask2) << (packWidth - (8 -
splitPos)));
+ // System.out.println(op2_v1[i]);
+ // System.out.println(op2_v2[i]);
sum2 += v1 | ((data & mask1) >> 5);
sum2 += v2 | ((data & mask2) << (packWidth - (8 - splitPos)));
}
elapsedTime = System.nanoTime() - start;
op2.addValue(elapsedTime / 1000.0);
-// for (int i = 0; i < repeat; i++) {
-// Assert.assertEquals(op1_v1[i], op2_v1[i]);
-// Assert.assertEquals(op1_v2[i], op2_v2[i]);
-// }
+ // for (int i = 0; i < repeat; i++) {
+ // Assert.assertEquals(op1_v1[i], op2_v1[i]);
+ // Assert.assertEquals(op1_v2[i], op2_v2[i]);
+ // }
Assert.assertEquals(sum1, sum2);
printStat(op1, "op1-iterateBits");
diff --git
a/session/src/test/java/org/apache/iotdb/session/MyRealDataTest1_WriteAndQuery.java
b/session/src/test/java/org/apache/iotdb/session/MyRealDataTest1_WriteAndQuery.java
index 60335adcfc..5e35237174 100644
---
a/session/src/test/java/org/apache/iotdb/session/MyRealDataTest1_WriteAndQuery.java
+++
b/session/src/test/java/org/apache/iotdb/session/MyRealDataTest1_WriteAndQuery.java
@@ -178,7 +178,7 @@ public class MyRealDataTest1_WriteAndQuery {
private static long range = total_time_length;
private static boolean enableRegularityTimeDecode = true;
private static long regularTimeInterval = 1000L;
- private static String approach = "mac"; // 选择查询执行算法: 1: MAC, 2: MOC, 3: CPV
+ private static String approach = "cpv"; // 选择查询执行算法: 1: MAC, 2: MOC, 3: CPV
// private static String device = "root.sg1";
// private static String measurement = "RcvTime";
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/DeltaBinaryDecoder.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/DeltaBinaryDecoder.java
index ace85f5311..2e740e09d6 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/DeltaBinaryDecoder.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/DeltaBinaryDecoder.java
@@ -220,21 +220,24 @@ public abstract class DeltaBinaryDecoder extends Decoder {
readIntTotalCount = packNum;
nextReadIndex = 0;
- encodingLength = ceil(packNum * packWidth);
- deltaBuf = new byte[encodingLength];
- buffer.get(deltaBuf);
- allocateDataArray();
-
if (enableRegularityTimeDecode) {
long newRegularDelta = regularTimeInterval - minDeltaBase;
if (packWidth == 0) {
// [CASE 1]
+ encodingLength = ceil(packNum * packWidth);
+ deltaBuf = new byte[encodingLength];
+ buffer.get(deltaBuf);
+ allocateDataArray();
for (int i = 0; i < packNum; i++) {
data[i] = previous + minDeltaBase; // v=0
previous = data[i];
}
} else if (newRegularDelta < 0 || newRegularDelta >= Math.pow(2,
packWidth)) {
// [CASE 2] no need to compare equality cause impossible
+ encodingLength = ceil(packNum * packWidth);
+ deltaBuf = new byte[encodingLength];
+ buffer.get(deltaBuf);
+ allocateDataArray();
for (int i = 0; i < packNum; i++) {
long v = BytesUtils.bytesToLong(deltaBuf, packWidth * i,
packWidth);
data[i] = previous + minDeltaBase + v;
@@ -242,7 +245,14 @@ public abstract class DeltaBinaryDecoder extends Decoder {
}
} else {
// [CASE 3]
- // preprocess to get fallWithinMasks and regularBytes
+ // read regularBytes and deltaBuf
+ byte[][] regularBytes = readRegularBytes(buffer);
+ encodingLength = ceil(packNum * packWidth);
+ deltaBuf = new byte[encodingLength];
+ buffer.get(deltaBuf);
+ allocateDataArray();
+
+ // get fallWithinMasks
int[] fallWithinMasks = null;
if (packWidth >= 8) {
fallWithinMasks = null;
@@ -255,54 +265,6 @@ public abstract class DeltaBinaryDecoder extends Decoder {
} catch (Exception ignored) {
}
}
- byte[][] regularBytes;
- if (allRegularBytes.containsKey(new Pair<>(newRegularDelta,
packWidth))) {
- regularBytes = allRegularBytes.get(new Pair<>(newRegularDelta,
packWidth));
- } else { // TODO consider if the following steps can be accelerated
by using bytes instead
- // of bitwise get and set
- regularBytes = new byte[8][]; // 8 relative positions.
relativePos->bytes
- for (int i = 0; i < 8; i++) {
- // i is the starting position in the byte from high to low bits
-
- int endPos = i + packWidth - 1; // starting from 0
- int byteNum = endPos / 8 + 1;
- byte[] byteArray = new byte[byteNum];
- if (newRegularDelta != 0) {
- // put bit-packed newRegularDelta starting at position i,
- // and pad the front and back with newRegularDeltas.
- // Otherwise if newRegularDelta=0, just leave byteArray as
initial zeros
-
- // 1. deal with padding the first byte
- for (int x = i - 1; x >= 0; x--) {
- // y is the position in the bit-packed newRegularDelta,
0->packWidth-1 from low to
- // high bits
- int y = (i - x - 1) % packWidth;
- // get the bit indicated by y pos
- int value = BytesUtils.getLongN(newRegularDelta, y);
- // put the bit indicated by y pos into regularBytes
- // setByte pos is from high to low starting from 0,
corresponding to x
- byteArray[0] = BytesUtils.setByteN(byteArray[0], x, value);
- }
-
- // 2. deal with putting newRegularDeltas
- BytesUtils.longToBytes(newRegularDelta, byteArray, i,
packWidth);
-
- // 3. deal with padding the last byte
- for (int x = endPos + 1; x < byteNum * 8; x++) {
- // y is the position in the bit-packed newRegularDelta,
0->packWidth-1 from low to
- // high bits
- int y = packWidth - 1 - (x - endPos - 1) % packWidth;
- // get the bit indicated by y pos
- int value = BytesUtils.getLongN(newRegularDelta, y);
- // put the bit indicated by y pos into regularBytes
- // setByte pos is from high to low starting from 0,
corresponding to x
- byteArray[byteNum - 1] =
BytesUtils.setByteN(byteArray[byteNum - 1], x, value);
- }
- }
- regularBytes[i] = byteArray;
- }
- allRegularBytes.put(new Pair<>(newRegularDelta, packWidth),
regularBytes);
- }
// Begin decoding each number in this pack
for (int i = 0; i < packNum; i++) {
@@ -341,6 +303,10 @@ public abstract class DeltaBinaryDecoder extends Decoder {
}
}
} else { // without regularity-aware decoding
+ encodingLength = ceil(packNum * packWidth);
+ deltaBuf = new byte[encodingLength];
+ buffer.get(deltaBuf);
+ allocateDataArray();
readPack();
}
@@ -369,6 +335,18 @@ public abstract class DeltaBinaryDecoder extends Decoder {
firstValue = ReadWriteIOUtils.readLong(buffer);
}
+ private byte[][] readRegularBytes(ByteBuffer buffer) {
+ byte[][] regularBytes = new byte[8][];
+ for (int i = 0; i < 8; i++) {
+ int byteArrayLength = ReadWriteIOUtils.readInt(buffer);
+ regularBytes[i] = new byte[byteArrayLength];
+ for (int j = 0; j < byteArrayLength; j++) {
+ regularBytes[i][j] = ReadWriteIOUtils.readByte(buffer);
+ }
+ }
+ return regularBytes;
+ }
+
@Override
protected void allocateDataArray() {
data = new long[packNum];
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/DeltaBinaryEncoder.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/DeltaBinaryEncoder.java
index f2d60704c6..4efe7244e2 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/DeltaBinaryEncoder.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/DeltaBinaryEncoder.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.tsfile.encoding.encoder;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.utils.BytesUtils;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -65,6 +66,8 @@ public abstract class DeltaBinaryEncoder extends Encoder {
blockSize = size;
}
+ protected abstract void writeHeaderToBytes() throws IOException;
+
protected abstract void writeHeader() throws IOException;
protected abstract void writeValueToBytes(int i);
@@ -84,12 +87,6 @@ public abstract class DeltaBinaryEncoder extends Encoder {
out.write(encodingBlockBuffer, 0, encodingLength);
}
- private void writeHeaderToBytes() throws IOException {
- ReadWriteIOUtils.write(writeIndex, out);
- ReadWriteIOUtils.write(writeWidth, out);
- writeHeader();
- }
-
private void flushBlockBuffer(ByteArrayOutputStream out) throws IOException {
if (writeIndex == -1) {
return;
@@ -147,6 +144,13 @@ public abstract class DeltaBinaryEncoder extends Encoder {
reset();
}
+ @Override
+ protected void writeHeaderToBytes() throws IOException {
+ ReadWriteIOUtils.write(writeIndex, out);
+ ReadWriteIOUtils.write(writeWidth, out);
+ writeHeader();
+ }
+
@Override
protected int calculateBitWidthsForDeltaBlockBuffer() {
int width = 0;
@@ -263,6 +267,77 @@ public abstract class DeltaBinaryEncoder extends Encoder {
deltaBlockBuffer[writeIndex++] = delta;
}
+ @Override
+ protected void writeHeaderToBytes() throws IOException {
+ ReadWriteIOUtils.write(writeIndex, out);
+ ReadWriteIOUtils.write(writeWidth, out);
+ writeHeader();
+ // TODO write (relativePos->bytes) for regular new delta
+ if
(TSFileDescriptor.getInstance().getConfig().isEnableRegularityTimeDecode()) {
+ long newRegularDelta =
+
TSFileDescriptor.getInstance().getConfig().getRegularTimeInterval() -
minDeltaBase;
+ if (writeWidth > 0 && 0 <= newRegularDelta && newRegularDelta <
Math.pow(2, writeWidth)) {
+
+ // byte[][] regularBytes = new byte[8][]; // 8 relative
positions.
+ // relativePos->bytes
+ for (int i = 0; i < 8; i++) {
+ // i is the starting position in the byte from high to low bits
+
+ int endPos = i + writeWidth - 1; // starting from 0
+ int byteNum = endPos / 8 + 1;
+ byte[] byteArray = new byte[byteNum];
+ if (newRegularDelta != 0) {
+ // put bit-packed newRegularDelta starting at position i,
+ // and pad the front and back with newRegularDeltas.
+ // Otherwise if newRegularDelta=0, just leave byteArray as
initial zeros
+
+ // 1. deal with padding the first byte
+ for (int x = i - 1; x >= 0; x--) {
+ // y is the position in the bit-packed newRegularDelta,
0->packWidth-1 from low to
+ // high bits
+ int y = (i - x - 1) % writeWidth;
+ // get the bit indicated by y pos
+ int value = BytesUtils.getLongN(newRegularDelta, y);
+ // put the bit indicated by y pos into regularBytes
+ // setByte pos is from high to low starting from 0,
corresponding to x
+ byteArray[0] = BytesUtils.setByteN(byteArray[0], x, value);
+ }
+
+ // 2. deal with putting newRegularDeltas
+ BytesUtils.longToBytes(newRegularDelta, byteArray, i,
writeWidth);
+
+ // 3. deal with padding the last byte
+ for (int x = endPos + 1; x < byteNum * 8; x++) {
+ // y is the position in the bit-packed newRegularDelta,
0->packWidth-1 from low to
+ // high bits
+ int y = writeWidth - 1 - (x - endPos - 1) % writeWidth;
+ // get the bit indicated by y pos
+ int value = BytesUtils.getLongN(newRegularDelta, y);
+ // put the bit indicated by y pos into regularBytes
+ // setByte pos is from high to low starting from 0,
corresponding to x
+ byteArray[byteNum - 1] = BytesUtils.setByteN(byteArray[byteNum
- 1], x, value);
+ }
+ }
+ // regularBytes[i] = byteArray;
+ int num = byteArray.length;
+ ReadWriteIOUtils.write(num, out);
+ for (int j = 0; j < num; j++) {
+ ReadWriteIOUtils.write(byteArray[j], out);
+ }
+ }
+ // // TODO write out
+ // for (int i = 0; i < 8; i++) {
+ // byte[] byteArray = regularBytes[i];
+ // int num = byteArray.length;
+ // ReadWriteIOUtils.write(num, out);
+ // for (int j = 0; j < num; j++) {
+ // ReadWriteIOUtils.write(byteArray[j], out);
+ // }
+ // }
+ }
+ }
+ }
+
@Override
protected void reset() {
firstValue = 0L;
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
index 870994f939..98a8763e18 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/PageReader.java
@@ -277,7 +277,8 @@ public class PageReader implements IPageReader {
switch (dataType) {
case BOOLEAN:
boolean aBoolean = valueDecoder.readBoolean(valueBuffer);
- if (!isDeleted(timestamp) && (filter == null ||
filter.satisfy(timestamp, aBoolean))) { // TODO:remove
+ if (!isDeleted(timestamp)
+ && (filter == null || filter.satisfy(timestamp, aBoolean))) { //
TODO:remove
pageData.putBoolean(timestamp, aBoolean);
}
break;