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 c0df05b3ba1a9..f53ed12cbef99 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.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 @@ private void testPipeWithMultiplePatterns( } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultiplePrefixPatternHistoricalData() throws Exception { // Define extractor attributes final Map extractorAttributes = new HashMap<>(); @@ -279,6 +281,7 @@ public void testMultiplePrefixPatternHistoricalData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultiplePrefixPatternRealtimeData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.pattern", "root.db.d1.s, root.db2.d1.s"); @@ -304,6 +307,7 @@ public void testMultiplePrefixPatternRealtimeData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultipleIoTDBPatternHistoricalData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.path", "root.db.**, root.db2.d1.*"); @@ -331,6 +335,7 @@ public void testMultipleIoTDBPatternHistoricalData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultipleIoTDBPatternRealtimeData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.path", "root.db.**, root.db2.d1.*"); @@ -358,6 +363,7 @@ public void testMultipleIoTDBPatternRealtimeData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultipleHybridPatternHistoricalData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.path", "root.db.d1.*"); @@ -384,6 +390,7 @@ public void testMultipleHybridPatternHistoricalData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testMultipleHybridPatternRealtimeData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.path", "root.db.d1.*"); @@ -410,6 +417,7 @@ public void testMultipleHybridPatternRealtimeData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testPrefixPatternWithExclusionHistoricalData() throws Exception { final Map extractorAttributes = new HashMap<>(); // Inclusion: Match everything under root.db.d1 and root.db.d2 @@ -440,6 +448,7 @@ public void testPrefixPatternWithExclusionHistoricalData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testPrefixPatternWithExclusionRealtimeData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.pattern", "root.db.d1, root.db.d2"); @@ -466,6 +475,7 @@ public void testPrefixPatternWithExclusionRealtimeData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testIoTDBPatternWithExclusionHistoricalData() throws Exception { final Map extractorAttributes = new HashMap<>(); // Inclusion: Match everything under root.db @@ -498,6 +508,7 @@ public void testIoTDBPatternWithExclusionHistoricalData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testIoTDBPatternWithExclusionRealtimeData() throws Exception { final Map extractorAttributes = new HashMap<>(); extractorAttributes.put("extractor.path", "root.db.**"); @@ -525,6 +536,7 @@ public void testIoTDBPatternWithExclusionRealtimeData() throws Exception { } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testHybridPatternWithHybridExclusionHistoricalData() throws Exception { final Map extractorAttributes = new HashMap<>(); // Inclusion: Match root.db.** (IoTDB) AND root.db2.d1 (Prefix) @@ -559,6 +571,7 @@ public void testHybridPatternWithHybridExclusionHistoricalData() throws Exceptio } @Test + @Ignore("Disabled: multi/exclusion tree patterns are blocked in this branch") public void testHybridPatternWithHybridExclusionRealtimeData() throws Exception { final Map 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 f0c5c900f9524..1385829578fdf 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.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 void testPureSchemaInclusion() throws Exception { } @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 void testPureSchemaInclusionWithMultiplePattern() throws Exception { } @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 fd1853fca1b74..feca8d54fed11 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.PipeParameters; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import java.util.HashMap; @@ -53,6 +54,7 @@ public void testIoTDBDataRegionExtractor() { } @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 052141c53e3c3..ff88f9521f074 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 boolean isRoot() { 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 f060123e7943e..24973ab7bfa21 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 static List applyIndexesOnList( */ 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 @@ private static List parseMultiplePatterns( * UnionPipePattern. */ private static PipePattern buildUnionPattern(final List 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 8caa52cc42481..85af46656a181 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 boolean isRoot() { 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 3445861d782df..5d331d07b03f8 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 boolean isRoot() { 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 52a3d9fbe54cb..3e4978045518e 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 boolean isRoot() { 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 d45eb078015ee..51ee704e178f5 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 boolean isRoot() { 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 4a05c6f7de0a6..b2e914347e6e7 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 boolean isRoot() { return false; } + @Override + public boolean isSingle() { + return false; + } + @Override public boolean isLegal() { return inclusionPattern.isLegal() && exclusionPattern.isLegal();