You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2023/05/23 02:21:09 UTC
[iotdb] branch rel/1.1 updated: [IoTDB-5861] Use Compartor instead of Comparator in last query sort
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/1.1 by this push:
new d3963e06df7 [IoTDB-5861] Use Compartor<Binary> instead of Comparator<String> in last query sort
d3963e06df7 is described below
commit d3963e06df77e84c03eb22b62bc6ee76c38be325
Author: Liao Lanyu <14...@qq.com>
AuthorDate: Tue May 23 10:21:03 2023 +0800
[IoTDB-5861] Use Compartor<Binary> instead of Comparator<String> in last query sort
---
.../iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java | 17 ++++++++++++++++-
.../org/apache/iotdb/commons/path/AlignedPath.java | 15 ++++++++++++---
.../apache/iotdb/db/metadata/utils/MetaUtils.java | 3 ++-
.../java/org/apache/iotdb/tsfile/utils/Binary.java | 20 +++++++++++++-------
4 files changed, 43 insertions(+), 12 deletions(-)
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
index 40e8adf8a06..88afd996edf 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
@@ -74,7 +74,10 @@ public class IoTDBLastQueryLastCacheIT {
"insert into root.ln_1.tb_6141(time,CO2_DOUBLE) aligned values(1679365910000,12.0);",
"insert into root.ln_1.tb_6141(time,`waterNH4-N_DOUBLE`) aligned values(1679365910000,12.0);",
"insert into root.ln_1.tb_6141(time,`waterNH4-N_DOUBLE`) aligned values(1679365910000,12.0);",
- "insert into root.ln_1.tb_6141(time,`switch_BOOLEAN`) aligned values(1675995566000,false);"
+ "insert into root.ln_1.tb_6141(time,`switch_BOOLEAN`) aligned values(1675995566000,false);",
+ "create aligned timeseries root.sg(风机退出_BOOLEAN BOOLEAN encoding=RLE,`NH4-N_DOUBLE` DOUBLE encoding=GORILLA,膜产水状态_BOOLEAN BOOLEAN encoding=RLE,11_TEXT TEXT encoding=PLAIN,产水间歇运行时间设置_DOUBLE DOUBLE encoding=GORILLA,文本_TEXT TEXT encoding=PLAIN, 风机投入_BOOLEAN BOOLEAN encoding=RLE,枚举_INT32 INT32 encoding=RLE,出水TP_DOUBLE DOUBLE encoding=GORILLA,水管流速_DOUBLE DOUBLE encoding=GORILLA,CO2_DOUBLE DOUBLE encoding=GORILLA,`开关量-运行_BOOLEAN` BOOLEAN encoding=RLE,code_DOUBLE DOUBLE encoding=GORILLA);",
+ "insert into root.sg(time,code_DOUBLE) aligned values(1679477545000,2.0);",
+ "insert into root.sg(time,`NH4-N_DOUBLE`) aligned values(1679365910000,12.0);"
};
@BeforeClass
@@ -142,4 +145,16 @@ public class IoTDBLastQueryLastCacheIT {
resultSetEqualTest(
"select last * from root.ln_1.tb_6141 order by timeseries desc;", expectedHeader, retArray);
}
+
+ @Test
+ public void testLastQuery1() {
+ String[] expectedHeader =
+ new String[] {TIMESTAMP_STR, TIMESEIRES_STR, VALUE_STR, DATA_TYPE_STR};
+ String[] retArray =
+ new String[] {
+ "1679365910000,root.sg.`NH4-N_DOUBLE`,12.0,DOUBLE,",
+ "1679477545000,root.sg.code_DOUBLE,2.0,DOUBLE,",
+ };
+ resultSetEqualTest("select last * from root.sg;", expectedHeader, retArray);
+ }
}
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java b/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
index 63c7dd37458..2933ba80236 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.utils.Binary;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
@@ -113,9 +114,17 @@ public class AlignedPath extends PartialPath {
schemaList = new ArrayList<>();
}
- public void sortMeasurement(Comparator<String> comparator) {
- measurementList.sort(comparator);
- schemaList.sort(Comparator.comparing(IMeasurementSchema::getMeasurementId, comparator));
+ /**
+ * This method is used by last query. Comparator<Binary> and Comparator<String> behaves
+ * differently and that is why we use Comparator<Binary> here.
+ *
+ * @param comparator
+ */
+ public void sortMeasurement(Comparator<Binary> comparator) {
+ measurementList.sort(Comparator.comparing(Binary::new, comparator));
+ schemaList.sort(
+ Comparator.comparing(
+ iMeasurementSchema -> new Binary(iMeasurementSchema.getMeasurementId()), comparator));
}
@Override
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
index f6442f2ec6a..38ffd397588 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.AggregationDescriptor
import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.OrderByParameter;
import org.apache.iotdb.db.mpp.plan.statement.component.Ordering;
import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.utils.Binary;
import org.apache.iotdb.tsfile.utils.Pair;
import java.util.ArrayList;
@@ -125,7 +126,7 @@ public class MetaUtils {
? Comparator.naturalOrder()
: Comparator.reverseOrder());
// sort the measurements of AlignedPath
- Comparator<String> comparator =
+ Comparator<Binary> comparator =
orderByParameter.getSortItemList().get(0).getOrdering() == Ordering.ASC
? Comparator.naturalOrder()
: Comparator.reverseOrder();
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Binary.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Binary.java
index 0411e4063d6..8696ea95be9 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Binary.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/Binary.java
@@ -57,15 +57,21 @@ public class Binary implements Comparable<Binary>, Serializable {
}
}
- int i = 0;
- while (i < getLength() && i < other.getLength()) {
- if (this.values[i] == other.values[i]) {
- i++;
- continue;
+ // copied from StringLatin1.compareT0
+ int len1 = getLength();
+ int len2 = other.getLength();
+ int lim = Math.min(len1, len2);
+ for (int k = 0; k < lim; k++) {
+ if (this.values[k] != other.values[k]) {
+ return getChar(values, k) - getChar(other.values, k);
}
- return this.values[i] - other.values[i];
}
- return getLength() - other.getLength();
+ return len1 - len2;
+ }
+
+ // avoid overflow
+ private char getChar(byte[] val, int index) {
+ return (char) (val[index] & 0xff);
}
@Override