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