This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new b4949fbfc2b [To dev/1.3] Pipe: disable multiple path and path
exclusion (#17051)
b4949fbfc2b is described below
commit b4949fbfc2bc2e5f1478a4ef77ca09c15f16e76d
Author: VGalaxies <[email protected]>
AuthorDate: Wed Jan 21 10:42:24 2026 +0800
[To dev/1.3] Pipe: disable multiple path and path exclusion (#17051)
---
.../it/autocreate/IoTDBPipePatternFormatIT.java | 13 +++++++++++++
.../iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java | 3 +++
.../db/pipe/source/IoTDBDataRegionSourceTest.java | 2 ++
.../datastructure/pattern/IoTDBPipePattern.java | 5 +++++
.../pipe/datastructure/pattern/PipePattern.java | 22 ++++++++++++++++++++++
.../datastructure/pattern/PrefixPipePattern.java | 5 +++++
.../pattern/UnionIoTDBPipePattern.java | 5 +++++
.../datastructure/pattern/UnionPipePattern.java | 5 +++++
.../pattern/WithExclusionIoTDBPipePattern.java | 5 +++++
.../pattern/WithExclusionPipePattern.java | 5 +++++
10 files changed, 70 insertions(+)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/autocreate/IoTDBPipePatternFormatIT.java
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/autocreate/IoTDBPipePatternFormatIT.java
index c0df05b3ba1..f53ed12cbef 100644
---
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/autocreate/IoTDBPipePatternFormatIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/autocreate/IoTDBPipePatternFormatIT.java
@@ -29,6 +29,7 @@ import
org.apache.iotdb.itbase.category.MultiClusterIT2AutoCreateSchema;
import org.apache.iotdb.rpc.TSStatusCode;
import org.junit.Assert;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -250,6 +251,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultiplePrefixPatternHistoricalData() throws Exception {
// Define extractor attributes
final Map<String, String> extractorAttributes = new HashMap<>();
@@ -279,6 +281,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultiplePrefixPatternRealtimeData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.pattern", "root.db.d1.s,
root.db2.d1.s");
@@ -304,6 +307,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultipleIoTDBPatternHistoricalData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.**, root.db2.d1.*");
@@ -331,6 +335,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultipleIoTDBPatternRealtimeData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.**, root.db2.d1.*");
@@ -358,6 +363,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultipleHybridPatternHistoricalData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.d1.*");
@@ -384,6 +390,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testMultipleHybridPatternRealtimeData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.d1.*");
@@ -410,6 +417,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testPrefixPatternWithExclusionHistoricalData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
// Inclusion: Match everything under root.db.d1 and root.db.d2
@@ -440,6 +448,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testPrefixPatternWithExclusionRealtimeData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.pattern", "root.db.d1, root.db.d2");
@@ -466,6 +475,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testIoTDBPatternWithExclusionHistoricalData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
// Inclusion: Match everything under root.db
@@ -498,6 +508,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testIoTDBPatternWithExclusionRealtimeData() throws Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.**");
@@ -525,6 +536,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testHybridPatternWithHybridExclusionHistoricalData() throws
Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
// Inclusion: Match root.db.** (IoTDB) AND root.db2.d1 (Prefix)
@@ -559,6 +571,7 @@ public class IoTDBPipePatternFormatIT extends
AbstractPipeDualAutoIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testHybridPatternWithHybridExclusionRealtimeData() throws
Exception {
final Map<String, String> extractorAttributes = new HashMap<>();
extractorAttributes.put("extractor.path", "root.db.**");
diff --git
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java
index f0c5c900f95..1385829578f 100644
---
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java
@@ -29,6 +29,7 @@ import
org.apache.iotdb.itbase.category.MultiClusterIT2ManualCreateSchema;
import org.apache.iotdb.rpc.TSStatusCode;
import org.junit.Assert;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -100,6 +101,7 @@ public class IoTDBPipeInclusionIT extends
AbstractPipeDualManualIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testPureSchemaInclusionWithMultiplePattern() throws Exception {
final DataNodeWrapper receiverDataNode = receiverEnv.getDataNodeWrapper(0);
@@ -170,6 +172,7 @@ public class IoTDBPipeInclusionIT extends
AbstractPipeDualManualIT {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testPureSchemaInclusionWithExclusionPattern() throws Exception {
final DataNodeWrapper receiverDataNode = receiverEnv.getDataNodeWrapper(0);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/IoTDBDataRegionSourceTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/IoTDBDataRegionSourceTest.java
index fd1853fca1b..feca8d54fed 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/IoTDBDataRegionSourceTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/source/IoTDBDataRegionSourceTest.java
@@ -25,6 +25,7 @@ import
org.apache.iotdb.pipe.api.customizer.parameter.PipeParameterValidator;
import org.apache.iotdb.pipe.api.customizer.parameter.PipeParameters;
import org.junit.Assert;
+import org.junit.Ignore;
import org.junit.Test;
import java.util.HashMap;
@@ -53,6 +54,7 @@ public class IoTDBDataRegionSourceTest {
}
@Test
+ @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
public void testIoTDBDataRegionExtractorWithPattern() {
Assert.assertEquals(
IllegalArgumentException.class,
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBPipePattern.java
index 052141c53e3..ff88f9521f0 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBPipePattern.java
@@ -66,6 +66,11 @@ public class IoTDBPipePattern extends
IoTDBPipePatternOperations {
return Objects.isNull(pattern) ||
this.pattern.equals(this.getDefaultPattern());
}
+ @Override
+ public boolean isSingle() {
+ return true;
+ }
+
@Override
public boolean isLegal() {
if (!pattern.startsWith("root")) {
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PipePattern.java
index f060123e794..24973ab7bfa 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PipePattern.java
@@ -57,6 +57,8 @@ public abstract class PipePattern {
public abstract boolean isRoot();
+ public abstract boolean isSingle();
+
/** Check if this pattern is legal. Different pattern type may have
different rules. */
public abstract boolean isLegal();
@@ -124,6 +126,22 @@ public abstract class PipePattern {
*/
public static PipePattern parsePipePatternFromSourceParameters(
final PipeParameters sourceParameters) {
+ final PipePattern pipePattern =
parsePipePatternFromSourceParametersInternal(sourceParameters);
+ if (!pipePattern.isSingle()) {
+ final String msg =
+ String.format(
+ "Pipe: The provided pattern should be single now. Inclusion: %s,
Exclusion: %s",
+ sourceParameters.getStringByKeys(EXTRACTOR_PATTERN_KEY,
SOURCE_PATTERN_KEY),
+ sourceParameters.getStringByKeys(
+ EXTRACTOR_PATTERN_EXCLUSION_KEY,
SOURCE_PATTERN_EXCLUSION_KEY));
+ LOGGER.warn(msg);
+ throw new PipeException(msg);
+ }
+ return pipePattern;
+ }
+
+ public static PipePattern parsePipePatternFromSourceParametersInternal(
+ final PipeParameters sourceParameters) {
// 1. Define the default inclusion pattern (matches all, "root.**")
// This is used if no inclusion patterns are specified.
final PipePattern defaultInclusionPattern =
@@ -355,6 +373,10 @@ public abstract class PipePattern {
* UnionPipePattern.
*/
private static PipePattern buildUnionPattern(final List<PipePattern>
patterns) {
+ if (patterns.size() == 1) {
+ return patterns.get(0);
+ }
+
// Check if all instances in the list are of type IoTDBPipePattern
boolean allIoTDB = true;
for (final PipePattern p : patterns) {
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixPipePattern.java
index 8caa52cc424..85af46656a1 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixPipePattern.java
@@ -56,6 +56,11 @@ public class PrefixPipePattern extends PipePattern {
return Objects.isNull(pattern) ||
this.pattern.equals(this.getDefaultPattern());
}
+ @Override
+ public boolean isSingle() {
+ return true;
+ }
+
@Override
public boolean isLegal() {
if (!pattern.startsWith("root")) {
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBPipePattern.java
index 3445861d782..5d331d07b03 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBPipePattern.java
@@ -57,6 +57,11 @@ public class UnionIoTDBPipePattern extends
IoTDBPipePatternOperations {
return patterns.stream().anyMatch(PipePattern::isRoot);
}
+ @Override
+ public boolean isSingle() {
+ return false;
+ }
+
@Override
public boolean isLegal() {
return patterns.stream().allMatch(PipePattern::isLegal);
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionPipePattern.java
index 52a3d9fbe54..3e497804551 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionPipePattern.java
@@ -47,6 +47,11 @@ public class UnionPipePattern extends PipePattern {
return patterns.stream().anyMatch(PipePattern::isRoot);
}
+ @Override
+ public boolean isSingle() {
+ return false;
+ }
+
@Override
public boolean isLegal() {
return patterns.stream().allMatch(PipePattern::isLegal);
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBPipePattern.java
index d45eb078015..51ee704e178 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBPipePattern.java
@@ -64,6 +64,11 @@ public class WithExclusionIoTDBPipePattern extends
IoTDBPipePatternOperations {
return false;
}
+ @Override
+ public boolean isSingle() {
+ return false;
+ }
+
@Override
public boolean isLegal() {
return inclusionPattern.isLegal() && exclusionPattern.isLegal();
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionPipePattern.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionPipePattern.java
index 4a05c6f7de0..b2e914347e6 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionPipePattern.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionPipePattern.java
@@ -59,6 +59,11 @@ public class WithExclusionPipePattern extends PipePattern {
return false;
}
+ @Override
+ public boolean isSingle() {
+ return false;
+ }
+
@Override
public boolean isLegal() {
return inclusionPattern.isLegal() && exclusionPattern.isLegal();