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

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


The following commit(s) were added to refs/heads/TableModelIngestion2 by this 
push:
     new ada3e96bad1 Refactor toDeviceId in PartialPath
ada3e96bad1 is described below

commit ada3e96bad1b659b873979c72b91b132f11c2e1e
Author: Tian Jiang <[email protected]>
AuthorDate: Tue Jul 23 15:41:10 2024 +0800

    Refactor toDeviceId in PartialPath
---
 .../org/apache/iotdb/commons/path/AlignedPath.java |  20 ----
 .../apache/iotdb/commons/path/MeasurementPath.java |   8 ++
 .../org/apache/iotdb/commons/path/PartialPath.java |  44 ++++++--
 .../apache/iotdb/commons/path/PartialPathTest.java | 116 +++++++++++++++++++++
 4 files changed, 158 insertions(+), 30 deletions(-)

diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
index 77143227041..6bb03881fa6 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/AlignedPath.java
@@ -23,7 +23,6 @@ import 
org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.utils.PathUtils;
 
 import org.apache.tsfile.common.conf.TSFileConfig;
-import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
@@ -152,25 +151,6 @@ public class AlignedPath extends PartialPath {
     return new PartialPath(Arrays.copyOf(nodes, nodes.length));
   }
 
-  @Override
-  public IDeviceID getIDeviceID() {
-    if (device != null) {
-      return device;
-    } else {
-      if (nodes.length == 1) {
-        device = Factory.DEFAULT_FACTORY.create("");
-        return device;
-      }
-      StringBuilder s = new StringBuilder(nodes[0]);
-      for (int i = 1; i < nodes.length; i++) {
-        s.append(TsFileConstant.PATH_SEPARATOR);
-        s.append(nodes[i]);
-      }
-      device = Factory.DEFAULT_FACTORY.create(s.toString());
-    }
-    return device;
-  }
-
   @Override
   public String getMeasurement() {
     throw new UnsupportedOperationException("AlignedPath doesn't have 
measurement name!");
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
index feda6ac27bc..7ab8dc714aa 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
@@ -39,6 +39,7 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.rmi.UnexpectedException;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -311,6 +312,13 @@ public class MeasurementPath extends PartialPath {
     return new String(bytes, StandardCharsets.ISO_8859_1);
   }
 
+  @Override
+  protected IDeviceID toDeviceID(String[] nodes) {
+    // remove measurement
+    nodes = Arrays.copyOfRange(nodes, 0, nodes.length - 1);
+    return super.toDeviceID(nodes);
+  }
+
   public static MeasurementPath parseDataFromString(String 
measurementPathData) {
     return (MeasurementPath)
         PathDeserializeUtil.deserialize(
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
index d68d4bb7c88..f4bdc48f510 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PartialPath.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.utils.TestOnly;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.Validate;
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -48,6 +49,7 @@ import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD;
+import static org.apache.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR;
 
 /**
  * A prefix path, suffix path or fullPath generated from SQL. Usually used in 
the IoTDB server
@@ -763,16 +765,7 @@ public class PartialPath extends Path implements 
Comparable<Path>, Cloneable {
     if (device != null) {
       return device;
     } else {
-      if (nodes.length == 1) {
-        device = Factory.DEFAULT_FACTORY.create("");
-        return device;
-      }
-      StringBuilder s = new StringBuilder(nodes[0]);
-      for (int i = 1; i < nodes.length - 1; i++) {
-        s.append(TsFileConstant.PATH_SEPARATOR);
-        s.append(nodes[i]);
-      }
-      device = Factory.DEFAULT_FACTORY.create(s.toString());
+      device = toDeviceID(nodes);
     }
     return device;
   }
@@ -1014,4 +1007,35 @@ public class PartialPath extends Path implements 
Comparable<Path>, Cloneable {
     // each char takes 2B in Java
     return string == null ? 0 : 32 + 2 * string.length();
   }
+
+  protected IDeviceID toDeviceID(String[] nodes) {
+    String tableName;
+    int segmentCnt = nodes.length;
+    // assuming DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3
+    String[] segments;
+    if (segmentCnt == 1) {
+      // "root" -> {"root"}
+      segments = nodes;
+    } else if (segmentCnt < TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME + 
1) {
+      // "root.a" -> {"root", "a"}
+      // "root.a.b" -> {"root.a", "b"}
+      tableName = String.join(PATH_SEPARATOR, Arrays.copyOfRange(nodes, 0, 
segmentCnt - 1));
+      segments = new String[2];
+      segments[0] = tableName;
+      segments[1] = nodes[segmentCnt - 1];
+    } else {
+      // "root.a.b.c" -> {"root.a.b", "c"}
+      // "root.a.b.c.d" -> {"root.a.b", "c", "d"}
+      tableName =
+          String.join(
+              PATH_SEPARATOR,
+              Arrays.copyOfRange(nodes, 0, 
TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME));
+      int newSegmentCnt = nodes.length - 
TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME + 1;
+      segments = new String[newSegmentCnt];
+      segments[0] = tableName;
+      System.arraycopy(
+          nodes, TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME, segments, 1, 
newSegmentCnt - 1);
+    }
+    return Factory.DEFAULT_FACTORY.create(segments);
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/path/PartialPathTest.java
 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/path/PartialPathTest.java
index a2a437d988a..120cdabd5dc 100644
--- 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/path/PartialPathTest.java
+++ 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/path/PartialPathTest.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.commons.path;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 
+import org.apache.tsfile.file.metadata.IDeviceID;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -29,6 +30,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 public class PartialPathTest {
@@ -752,6 +754,120 @@ public class PartialPathTest {
         });
   }
 
+  @Test
+  public void testToDeviceId() {
+    PartialPath partialPath = new PartialPath(new String[] {"root"});
+    IDeviceID deviceID = partialPath.getIDeviceID();
+    assertEquals(1, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new PartialPath(new String[] {"root", "a"});
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("a", deviceID.segment(1));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new PartialPath(new String[] {"root", "a", "b"});
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a", deviceID.segment(0));
+    assertEquals("b", deviceID.segment(1));
+    assertEquals("root.a", deviceID.getTableName());
+
+    partialPath = new PartialPath(new String[] {"root", "a", "b", "c"});
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("root.a.b", deviceID.getTableName());
+
+    partialPath = new PartialPath(new String[] {"root", "a", "b", "c", "d"});
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(3, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("d", deviceID.segment(2));
+    assertEquals("root.a.b", deviceID.getTableName());
+  }
+
+  @Test
+  public void testAlignedToDeviceId() throws IllegalPathException {
+    PartialPath partialPath = new AlignedPath("root", 
Collections.singletonList("s1"));
+    IDeviceID deviceID = partialPath.getIDeviceID();
+    assertEquals(1, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new AlignedPath("root.a", Collections.singletonList("s1"));
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("a", deviceID.segment(1));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new AlignedPath("root.a.b", Collections.singletonList("s1"));
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a", deviceID.segment(0));
+    assertEquals("b", deviceID.segment(1));
+    assertEquals("root.a", deviceID.getTableName());
+
+    partialPath = new AlignedPath("root.a.b.c", 
Collections.singletonList("s1"));
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("root.a.b", deviceID.getTableName());
+
+    partialPath = new AlignedPath("root.a.b.c.d", 
Collections.singletonList("s1"));
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(3, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("d", deviceID.segment(2));
+    assertEquals("root.a.b", deviceID.getTableName());
+  }
+
+  @Test
+  public void testMeasurementPathToDeviceId() throws IllegalPathException {
+    PartialPath partialPath = new MeasurementPath("root.s1");
+    IDeviceID deviceID = partialPath.getIDeviceID();
+    assertEquals(1, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new MeasurementPath("root.a.s1");
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root", deviceID.segment(0));
+    assertEquals("a", deviceID.segment(1));
+    assertEquals("root", deviceID.getTableName());
+
+    partialPath = new MeasurementPath("root.a.b.s1");
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a", deviceID.segment(0));
+    assertEquals("b", deviceID.segment(1));
+    assertEquals("root.a", deviceID.getTableName());
+
+    partialPath = new MeasurementPath("root.a.b.c.s1");
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(2, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("root.a.b", deviceID.getTableName());
+
+    partialPath = new MeasurementPath("root.a.b.c.d.s1");
+    deviceID = partialPath.getIDeviceID();
+    assertEquals(3, deviceID.segmentNum());
+    assertEquals("root.a.b", deviceID.segment(0));
+    assertEquals("c", deviceID.segment(1));
+    assertEquals("d", deviceID.segment(2));
+    assertEquals("root.a.b", deviceID.getTableName());
+  }
+
   private void checkIntersect(PartialPath pattern, PartialPath prefix, 
Set<PartialPath> expected) {
     List<PartialPath> actual = pattern.intersectWithPrefixPattern(prefix);
     for (PartialPath path : actual) {

Reply via email to