{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "source": {
            "type": "object",
            "description": "**Data Source** is used to access metadata and read the changed data from external systems. \nA Data Source can read data from multiple tables simultaneously.",
            "properties": {
                "type": {
                    "type": "string",
                    "description": "The type of the source, such as mysql."
                },
                "name": {
                    "type": "string",
                    "description": "The name of the source, which is user-defined (a default value provided)."
                }
            },
            "additionalProperties": true,
            "required": ["type"]
        },
        "sink": {
            "type": "object",
            "description": "**Data Sink** is used to apply schema changes and write change data to external systems.\nA Data Sink can write to multiple tables simultaneously.",
            "properties": {
                "type": {
                    "type": "string",
                    "description": "The type of the sink, such as doris or starrocks."
                },
                "name": {
                    "type": "string",
                    "description": "The name of the sink, which is user-defined (a default value provided)."
                }
            },
            "additionalProperties": true,
            "required": ["type"]
        },
        "pipeline": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "The name of the pipeline, which will be submitted to the Flink cluster as the job name.",
                    "default": "Flink CDC Pipeline Job"
                },
                "schema.change.behavior": {
                    "type": "string",
                    "description": "Behavior for handling schema change events.",
                    "enum": ["EVOLVE", "TRY_EVOLVE", "IGNORE", "LENIENT", "EXCEPTION"],
                    "default": "LENIENT"
                },
                "local-time-zone": {
                    "type": "string",
                    "description": "The local time zone defines current session time zone id."
                }
            }
        },
        "route": {
            "type": "array",
            "description": "**Route** specifies the rule of matching a list of source-table and mapping to sink-table. The most typical scenario is the merge of sub-databases and sub-tables, routing multiple upstream source tables to the same sink table.",
            "items": {
                "type": "object",
                "properties": {
                    "source-table": {
                        "type": "string",
                        "description": "Source table id, supports regular expressions."
                    },
                    "sink-table": {
                        "type": "string",
                        "description": "Sink table id, supports regular expressions."
                    },
                    "replace-symbol": {
                        "type": "string",
                        "description": "Special symbol in sink-table for pattern replacing, will be replaced by original table name."
                    },
                    "description": {
                        "type": "string",
                        "description": "Routing rule description(a default value provided)."
                    }
                },
                "required": ["source-table", "sink-table"]
            }
        },
        "transform": {
            "type": "array",
            "description": "**Transform** module helps users delete and expand data columns based on the data columns in the table.\nWhat’s more, it also helps users filter some unnecessary data during the synchronization process.",
            "items": {
                "type": "object",
                "properties": {
                    "source-table": {
                        "type": "string",
                        "description": "Source table id, supports regular expressions."
                    },
                    "projection": {
                        "type": "string",
                        "description": "Projection rule, supports syntax similar to the select clause in SQL."
                    },
                    "filter": {
                        "type": "string",
                        "description": "Filter rule, supports syntax similar to the where clause in SQL."
                    },
                    "primary-keys": {
                        "type": "string",
                        "description": "Sink table primary keys, separated by commas."
                    },
                    "partition-keys": {
                        "type": "string",
                        "description": "Sink table partition keys, separated by commas."
                    },
                    "table-options": {
                        "type": "string",
                        "description": "Used to the configure table creation statement when automatically creating tables."
                    },
                    "description": {
                        "type": "string",
                        "description": "Transform rule description."
                    }
                },
                "required": ["source-table"]
            }
        }
    },
    "required": ["source", "sink"]
}
