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

jiangtian 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 1befb1b4fe5 Pipe: disable multiple path and path exclusion (#17038)
1befb1b4fe5 is described below

commit 1befb1b4fe50d25fd07a2287e1cd52ae36e4064c
Author: VGalaxies <[email protected]>
AuthorDate: Wed Jan 21 10:42:06 2026 +0800

    Pipe: disable multiple path and path exclusion (#17038)
    
    * setup
    
    * cont
---
 .../treemodel/auto/basic/IoTDBTreePatternFormatIT.java | 13 +++++++++++++
 .../it/dual/treemodel/manual/IoTDBPipeInclusionIT.java |  3 +++
 .../iotdb/db/pipe/pattern/TreePatternPruningTest.java  |  2 ++
 .../db/pipe/source/IoTDBDataRegionSourceTest.java      |  2 ++
 .../pipe/datastructure/pattern/IoTDBTreePattern.java   |  5 +++++
 .../pipe/datastructure/pattern/PrefixTreePattern.java  |  5 +++++
 .../pipe/datastructure/pattern/TreePattern.java        | 18 ++++++++++++++++++
 .../datastructure/pattern/UnionIoTDBTreePattern.java   |  5 +++++
 .../pipe/datastructure/pattern/UnionTreePattern.java   |  5 +++++
 .../pattern/WithExclusionIoTDBTreePattern.java         |  5 +++++
 .../pattern/WithExclusionTreePattern.java              |  5 +++++
 11 files changed, 68 insertions(+)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBTreePatternFormatIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBTreePatternFormatIT.java
index 7a671a5ffdf..b61a13693dc 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBTreePatternFormatIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBTreePatternFormatIT.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
@@ -270,6 +271,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultiplePrefixPatternHistoricalData() throws Exception {
     // Define source attributes
     final Map<String, String> sourceAttributes = new HashMap<>();
@@ -300,6 +302,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultiplePrefixPatternRealtimeData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.pattern", "root.db.d1.s, root.db2.d1.s");
@@ -326,6 +329,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultipleIoTDBPatternHistoricalData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.**, root.db2.d1.*");
@@ -354,6 +358,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultipleIoTDBPatternRealtimeData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.**, root.db2.d1.*");
@@ -382,6 +387,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultipleHybridPatternHistoricalData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.d1.*");
@@ -409,6 +415,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testMultipleHybridPatternRealtimeData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.d1.*");
@@ -436,6 +443,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testPrefixPatternWithExclusionHistoricalData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     // Inclusion: Match everything under root.db.d1 and root.db.d2
@@ -467,6 +475,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testPrefixPatternWithExclusionRealtimeData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.pattern", "root.db.d1, root.db.d2");
@@ -494,6 +503,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testIoTDBPatternWithExclusionHistoricalData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     // Inclusion: Match everything under root.db
@@ -527,6 +537,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testIoTDBPatternWithExclusionRealtimeData() throws Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.**");
@@ -555,6 +566,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testHybridPatternWithHybridExclusionHistoricalData() throws 
Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     // Inclusion: Match root.db.** (IoTDB) AND root.db2.d1 (Prefix)
@@ -590,6 +602,7 @@ public class IoTDBTreePatternFormatIT extends 
AbstractPipeDualTreeModelAutoIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testHybridPatternWithHybridExclusionRealtimeData() throws 
Exception {
     final Map<String, String> sourceAttributes = new HashMap<>();
     sourceAttributes.put("source.path", "root.db.**");
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeInclusionIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeInclusionIT.java
index 95755a372f3..5bc4f468062 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeInclusionIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/manual/IoTDBPipeInclusionIT.java
@@ -29,6 +29,7 @@ import 
org.apache.iotdb.itbase.category.MultiClusterIT2DualTreeManual;
 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;
@@ -113,6 +114,7 @@ public class IoTDBPipeInclusionIT extends 
AbstractPipeDualTreeModelManualIT {
   }
 
   @Test
+  @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
   public void testPureSchemaInclusionWithMultiplePattern() throws Exception {
     final DataNodeWrapper receiverDataNode = receiverEnv.getDataNodeWrapper(0);
 
@@ -185,6 +187,7 @@ public class IoTDBPipeInclusionIT extends 
AbstractPipeDualTreeModelManualIT {
   }
 
   @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/pattern/TreePatternPruningTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/pattern/TreePatternPruningTest.java
index 23b6c334b5c..62868f0492e 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/pattern/TreePatternPruningTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/pattern/TreePatternPruningTest.java
@@ -28,10 +28,12 @@ import 
org.apache.iotdb.pipe.api.customizer.parameter.PipeParameters;
 import org.apache.iotdb.pipe.api.exception.PipeException;
 
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.HashMap;
 
+@Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch")
 public class TreePatternPruningTest {
 
   @Test
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/IoTDBTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBTreePattern.java
index 2becc993968..8447f5b3258 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/IoTDBTreePattern.java
@@ -106,6 +106,11 @@ public class IoTDBTreePattern extends 
IoTDBTreePatternOperations {
     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/PrefixTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixTreePattern.java
index 73d50393fb6..19f7f815de2 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/PrefixTreePattern.java
@@ -62,6 +62,11 @@ public class PrefixTreePattern extends TreePattern {
     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/TreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/TreePattern.java
index c35ba5c81fc..9a9360a0abf 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/TreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/TreePattern.java
@@ -74,6 +74,8 @@ public abstract class TreePattern {
 
   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();
 
@@ -141,6 +143,22 @@ public abstract class TreePattern {
    */
   public static TreePattern parsePipePatternFromSourceParameters(
       final PipeParameters sourceParameters) {
+    final TreePattern treePattern = 
parsePipePatternFromSourceParametersInternal(sourceParameters);
+    if (!treePattern.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 treePattern;
+  }
+
+  public static TreePattern parsePipePatternFromSourceParametersInternal(
+      final PipeParameters sourceParameters) {
     final boolean isTreeModelDataAllowedToBeCaptured =
         isTreeModelDataAllowToBeCaptured(sourceParameters);
 
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBTreePattern.java
index 379232ad253..f0c1a50c20a 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionIoTDBTreePattern.java
@@ -73,6 +73,11 @@ public class UnionIoTDBTreePattern extends 
IoTDBTreePatternOperations {
     return patterns.stream().anyMatch(TreePattern::isRoot);
   }
 
+  @Override
+  public boolean isSingle() {
+    return false;
+  }
+
   @Override
   public boolean isLegal() {
     return patterns.stream().allMatch(TreePattern::isLegal);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionTreePattern.java
index 161dfc46f33..bf360c7c072 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/UnionTreePattern.java
@@ -51,6 +51,11 @@ public class UnionTreePattern extends TreePattern {
     return patterns.stream().anyMatch(TreePattern::isRoot);
   }
 
+  @Override
+  public boolean isSingle() {
+    return false;
+  }
+
   @Override
   public boolean isLegal() {
     return patterns.stream().allMatch(TreePattern::isLegal);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBTreePattern.java
index 67750760339..9fdbec4b2da 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionIoTDBTreePattern.java
@@ -72,6 +72,11 @@ public class WithExclusionIoTDBTreePattern extends 
IoTDBTreePatternOperations {
     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/WithExclusionTreePattern.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionTreePattern.java
index eb255ed8392..ea3114cebdb 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionTreePattern.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/pattern/WithExclusionTreePattern.java
@@ -62,6 +62,11 @@ public class WithExclusionTreePattern extends TreePattern {
     return false;
   }
 
+  @Override
+  public boolean isSingle() {
+    return false;
+  }
+
   @Override
   public boolean isLegal() {
     return inclusionPattern.isLegal() && exclusionPattern.isLegal();

Reply via email to