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 <[email protected]>
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