This is an automated email from the ASF dual-hosted git repository.

hui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new d1f2897bdfe [IoTDB-5861] Use Compartor<Binary> instead of 
Comparator<String> in last query sort (#9865)
d1f2897bdfe is described below

commit d1f2897bdfe3bce915c1e68fdf43a445e55aac85
Author: Liao Lanyu <[email protected]>
AuthorDate: Sat May 20 15:36:31 2023 +0800

    [IoTDB-5861] Use Compartor<Binary> instead of Comparator<String> in last 
query sort (#9865)
---
 .../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 92c87c4741b..18f58bdb30a 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

Reply via email to