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) {