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();

Reply via email to