[Umbrella][Improve] Migrate Connector/Transform Validation to Declarative OptionRule — Claim & Tracking
#11,007 opened on Jun 4, 2026
Description
We need community help to migrate connector and transform validation from imperative if/throw checks to declarative optionRule() + Conditions.*.
If the Issue column shows an existing issue number, please claim in that issue.
If the Issue column shows This issue, please comment here to claim it.
Prerequisites / Framework Status
Phase 1 (framework) has been completed:
- Design and scope audit: https://github.com/apache/seatunnel/issues/10976
- Framework implementation: https://github.com/apache/seatunnel/pull/10977
This umbrella issue is for Phase 2 migration and tracking only.
Migration Guide
A. Numeric range
Use declarative constraints for rules like port > 0, batchSize >= 0.
import static org.apache.seatunnel.api.configuration.util.Conditions.greaterThan;
OptionRule.builder()
.required(PORT, greaterThan(PORT, 0))
.build();
B1. Required cross-field comparison
Use when both fields are mandatory and have relation constraints.
import static org.apache.seatunnel.api.configuration.util.Conditions.lessThanField;
OptionRule.builder()
.required(START_TIMESTAMP, END_TIMESTAMP, lessThanField(START_TIMESTAMP, END_TIMESTAMP))
.build();
B2. Optional cross-field comparison
Use when fields are not mandatory, but must satisfy relation when present.
import static org.apache.seatunnel.api.configuration.util.Conditions.lessOrEqualField;
OptionRule.builder()
.optional(MIN_VALUE, MAX_VALUE, lessOrEqualField(MIN_VALUE, MAX_VALUE))
.build();
Do not accidentally convert optional semantics into required semantics.
C. Conditional value check
Use when a trigger option enables another constraint.
import static org.apache.seatunnel.api.configuration.util.Conditions.greaterThan;
OptionRule.builder()
.conditional(
IGNORE_NO_LEADER_PARTITION,
true,
greaterThan(PARTITION_DISCOVERY_INTERVAL_MILLIS, 0))
.build();
D. Keep runtime checks for out-of-scope cases
Do not migrate these into declarative rules:
- external system/state validation (DB/metastore/network reachability)
- complex parser/semantic validation (SQL parsing, advanced regex semantics)
- runtime context checks (current time, execution topology state)
Connectors Open for Claim
| Type | Connector | Contributer | Status | PR |
|---|---|---|---|---|
| Source | connector-cdc | @nzw921rx | Ongoing | |
| Source | connector-edge-socket | Todo | ||
| Source | connector-fake | @Ayushkale11 | Ongoing | |
| Source | connector-google-sheets | Todo | ||
| Source | connector-openmldb | Todo | ||
| Source | connector-web3j | Todo | ||
| Sink | connector-activemq | Todo | ||
| Sink | connector-aerospike | Todo | ||
| Sink | connector-assert | Todo | ||
| Sink | connector-bigquery | Todo | ||
| Sink | connector-console | Todo | ||
| Sink | connector-datahub | Todo | ||
| Sink | connector-dingtalk | Todo | ||
| Sink | connector-druid | Todo | ||
| Sink | connector-email | Todo | ||
| Sink | connector-fluss | Todo | ||
| Sink | connector-google-firestore | Todo | ||
| Sink | connector-hugegraph | Todo | ||
| Sink | connector-hudi | Todo | ||
| Sink | connector-lance | Todo | ||
| Sink | connector-mqtt | Todo | ||
| Sink | connector-s3-redshift | Todo | ||
| Sink | connector-selectdb-cloud | Todo | ||
| Sink | connector-sensorsdata | Todo | ||
| Sink | connector-sentry | Todo | ||
| Sink | connector-slack | Todo | ||
| Both | connector-amazondynamodb | Todo | ||
| Both | connector-amazonsqs | Todo | ||
| Both | connector-cassandra | Todo | ||
| Both | connector-clickhouse | Todo | ||
| Both | connector-databend | Todo | ||
| Both | connector-doris | Todo | ||
| Both | connector-easysearch | Todo | ||
| Both | connector-elasticsearch | Todo | ||
| Both | connector-file | Todo | ||
| Both | connector-graphql | Todo | ||
| Both | connector-hbase | Todo | ||
| Both | connector-hive | Todo | ||
| Both | connector-http | Todo | ||
| Both | connector-iceberg | Todo | ||
| Both | connector-influxdb | Todo | ||
| Both | connector-iotdb | Todo | ||
| Both | connector-iotdb-v2 | Todo | ||
| Both | connector-jdbc | Todo | ||
| Both | connector-kafka | Todo | ||
| Both | connector-kudu | Todo | ||
| Both | connector-maxcompute | Todo | ||
| Both | connector-milvus | Todo | ||
| Both | connector-mongodb | Todo | ||
| Both | connector-neo4j | Todo | ||
| Both | connector-paimon | Todo | ||
| Both | connector-prometheus | Todo | ||
| Both | connector-pulsar | Todo | ||
| Both | connector-qdrant | Todo | ||
| Both | connector-rabbitmq | Todo | ||
| Both | connector-redis | Todo | ||
| Both | connector-rocketmq | Todo | ||
| Both | connector-sls | Todo | ||
| Both | connector-socket | Todo | ||
| Both | connector-starrocks | Todo | ||
| Both | connector-tablestore | Todo | ||
| Both | connector-tdengine | Todo | ||
| Both | connector-typesense | Todo |
Transforms Open for Claim
| Type | Transform | Contributer | Status | PR |
|---|---|---|---|---|
| Transform | CopyField | Todo | ||
| Transform | DataValidator | Todo | ||
| Transform | DynamicCompile | Todo | ||
| Transform | FieldEncrypt | Todo | ||
| Transform | FieldMapper | Todo | ||
| Transform | FieldRename | Todo | ||
| Transform | FilterField | Todo | ||
| Transform | FilterRowKind | Todo | ||
| Transform | JsonPath | Todo | ||
| Transform | Metadata | Todo | ||
| Transform | RegexExtract | Todo | ||
| Transform | Replace | Todo | ||
| Transform | RowKindExtractor | Todo | ||
| Transform | Split | Todo | ||
| Transform | SQL | Todo | ||
| Transform | TableFilter | Todo | ||
| Transform | TableMerge | Todo | ||
| Transform | TableRename | Todo | ||
| Transform | DefineSinkType | Todo |
Note
connector-common is a shared base module, not a standalone connector plugin, so it is excluded from claim rows.
How to Contribute
- Pick a connector/transform: Choose one from the lists above.
- Claim the task: Comment on this issue (for example:
I would like to work on connector-kafkaorI would like to work on FilterRowKind). - Implement:
- Migrate declarative-eligible validation rules from imperative
if/throwtooptionRule()+Conditions.*. - Keep runtime-only validation in runtime code paths (
*Config.java, sink/source initialization) when it depends on external state or execution context. - Distinguish cross-field semantics explicitly:
- required cross-field:
required(A, B, lessThanField(A, B)) - optional cross-field:
optional(A, B, lessOrEqualField(A, B))
- required cross-field:
- Migrate declarative-eligible validation rules from imperative
- Reference:
- Submit PR: Open a Pull Request against
dev, and link it back to this issue.
Thank you for your contribution. Please leave a message if you'd like to implement the declarative validation migration for any connector or transform.
Code of Conduct
I agree to follow this project's Code of Conduct.