apache/seatunnel

[Umbrella][Improve] Migrate Connector/Transform Validation to Declarative OptionRule — Claim & Tracking

Open

#11,007 opened on Jun 4, 2026

View on GitHub
 (3 comments) (0 reactions) (0 assignees)Java (6,897 stars) (1,432 forks)batch import
good first issuehelp wanted

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:

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

  1. Pick a connector/transform: Choose one from the lists above.
  2. Claim the task: Comment on this issue (for example: I would like to work on connector-kafka or I would like to work on FilterRowKind).
  3. Implement:
    • Migrate declarative-eligible validation rules from imperative if/throw to optionRule() + 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))
  4. Reference:
    • Framework scope and audit baseline: #10976
    • Declarative framework implementation: #10977
  5. 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.

Contributor guide