This is an automated email from the ASF dual-hosted git repository. liugddx pushed a commit to branch dev in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push: new 5bd7f4841b [Improve][Api] Supports simultaneous config of conditions and optional options (#7788) 5bd7f4841b is described below commit 5bd7f4841b469b21946bc8c5397130021e232c49 Author: corgy-w <73771213+corg...@users.noreply.github.com> AuthorDate: Tue Oct 8 21:20:32 2024 +0800 [Improve][Api] Supports simultaneous config of conditions and optional options (#7788) --- .../api/configuration/util/OptionRule.java | 28 ++++++++++++++++++---- .../api/configuration/util/OptionRuleTest.java | 27 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java b/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java index 684620245c..0d700bdbc1 100644 --- a/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java +++ b/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java @@ -165,7 +165,7 @@ public class OptionRule { @NonNull Option<?>... requiredOptions) { verifyConditionalExists(conditionalOption); - if (expectValues.size() == 0) { + if (expectValues.isEmpty()) { throw new OptionValidationException( String.format( "conditional option '%s' must have expect values .", @@ -187,7 +187,7 @@ public class OptionRule { RequiredOption.ConditionalRequiredOptions option = RequiredOption.ConditionalRequiredOptions.of( expression, new ArrayList<>(Arrays.asList(requiredOptions))); - verifyRequiredOptionDuplicate(option); + verifyRequiredOptionDuplicate(option, true); this.requiredOptions.add(option); return this; } @@ -204,7 +204,7 @@ public class OptionRule { RequiredOption.ConditionalRequiredOptions.of( expression, new ArrayList<>(Arrays.asList(requiredOptions))); - verifyRequiredOptionDuplicate(conditionalRequiredOption); + verifyRequiredOptionDuplicate(conditionalRequiredOption, true); this.requiredOptions.add(conditionalRequiredOption); return this; } @@ -242,12 +242,30 @@ public class OptionRule { } private void verifyRequiredOptionDuplicate(@NonNull RequiredOption requiredOption) { + verifyRequiredOptionDuplicate(requiredOption, false); + } + + /** + * Verifies if there are duplicate options within the required options. + * + * @param requiredOption The required option to be verified + * @param ignoreVerifyDuplicateOptions Whether to ignore duplicate option verification If + * the value is true, the existing items in OptionOptions are ignored Currently, it + * applies only to conditional + * @throws OptionValidationException If duplicate options are found + */ + private void verifyRequiredOptionDuplicate( + @NonNull RequiredOption requiredOption, + @NonNull Boolean ignoreVerifyDuplicateOptions) { requiredOption .getOptions() .forEach( option -> { - verifyDuplicateWithOptionOptions( - option, requiredOption.getClass().getSimpleName()); + if (!ignoreVerifyDuplicateOptions) { + // Check if required option that duplicate with option options + verifyDuplicateWithOptionOptions( + option, requiredOption.getClass().getSimpleName()); + } requiredOptions.forEach( ro -> { if (ro diff --git a/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/util/OptionRuleTest.java b/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/util/OptionRuleTest.java index 65c86d0f88..cde6058209 100644 --- a/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/util/OptionRuleTest.java +++ b/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/util/OptionRuleTest.java @@ -31,6 +31,7 @@ import java.util.List; import static org.apache.seatunnel.api.configuration.OptionTest.TEST_MODE; import static org.apache.seatunnel.api.configuration.OptionTest.TEST_NUM; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -155,6 +156,32 @@ public class OptionRuleTest { assertEquals( "ErrorCode:[API-02], ErrorDescription:[Option item validate failed] - ConditionalRequiredOptions 'option.timestamp' duplicate in ConditionalRequiredOptions options.", assertThrows(OptionValidationException.class, executable).getMessage()); + + // Test conditional only does not conflict with optional options + // Test option TEST_TIMESTAMP + executable = + () -> { + OptionRule.builder() + .optional(TEST_NUM, TEST_MODE, TEST_TIMESTAMP) + .exclusive(TEST_TOPIC_PATTERN, TEST_TOPIC) + .required(TEST_PORTS) + .conditional(TEST_MODE, OptionTest.TestMode.TIMESTAMP, TEST_TIMESTAMP) + .conditional(TEST_MODE, OptionTest.TestMode.LATEST, TEST_TIMESTAMP) + .build(); + }; + assertDoesNotThrow(executable); + executable = + () -> { + OptionRule.builder() + .optional(TEST_NUM, TEST_MODE) + .exclusive(TEST_TOPIC_PATTERN, TEST_TOPIC, TEST_TIMESTAMP) + .required(TEST_PORTS) + .conditional(TEST_MODE, OptionTest.TestMode.TIMESTAMP, TEST_TIMESTAMP) + .build(); + }; + assertEquals( + "ErrorCode:[API-02], ErrorDescription:[Option item validate failed] - ConditionalRequiredOptions 'option.timestamp' duplicate in ExclusiveRequiredOptions options.", + assertThrows(OptionValidationException.class, executable).getMessage()); } @Test