{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/ntangle/latest.json",
  "title": "NTangle - https://github.com/Avanade/ntangle",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/Avanade/NTangle/main/schemas/ntangle.json",
    "sourceSha256": "059a3f2ba701a64099e8d049ff479770133bedf3da9d24a2fd53103662a0f954",
    "fileMatch": [
      "ntangle.yaml",
      "ntangle.yml",
      "ntangle.json",
      "ntangle.jsn"
    ],
    "parsers": [
      "json",
      "yaml"
    ]
  },
  "allOf": [
    {
      "$ref": "#/$defs/Root"
    }
  ],
  "$defs": {
    "Root": {
      "type": "object",
      "title": "The `Root` object (database-driven)",
      "description": "The `RootConfig` object defines the global properties that are used to drive the underlying database-driven CDC-oriented code-generation.",
      "properties": {
        "schema": {
          "type": "string",
          "title": "The default `Schema` name where the existing tables are defined within the database.",
          "description": "This is used as the default `Schema` for all child objects. Defaults to `dbo` (literal)."
        },
        "cdcSchema": {
          "type": "string",
          "title": "The schema name for the _ntangle_ generated `CDC`-related database artefacts.",
          "description": "Defaults to `NTangle` (literal)."
        },
        "cdcSchemaCreate": {
          "type": "boolean",
          "title": "Indicates whether to create the `CdcSchema` within the database.",
          "description": "Defaults to `false`."
        },
        "versionTrackingTable": {
          "type": "string",
          "title": "The table name for the `Cdc`-VersionTracking.",
          "description": "Defaults to `VersionTracking` (literal)."
        },
        "cdcEnable": {
          "type": "boolean",
          "title": "Indicates whether to enable `Cdc` within the database for the tables that participate.",
          "description": "Defaults to `false`. This option can be overridden for each underlying table referenced."
        },
        "identifierMapping": {
          "type": "boolean",
          "title": "Indicates whether to include the generation of the generic `CDC`-IdentifierMapping database capabilities.",
          "description": "Where set to `true` each underlying `Table` and corresponding `Join` must set `IdentifierMapping` explicitly."
        },
        "identifierMappingType": {
          "type": "string",
          "title": "The type for the identifier mapping value.",
          "description": "Defaults to `String`.",
          "enum": [
            "String",
            "Int",
            "Long",
            "Guid"
          ]
        },
        "identifierMappingTable": {
          "type": "string",
          "title": "The table name for the `Cdc`-IdentifierMapping.",
          "description": "Defaults to `IdentifierMapping` (literal)."
        },
        "identifierMappingStoredProcedure": {
          "type": "string",
          "title": "The stored procedure name for the `Cdc`-IdentifierMapping create.",
          "description": "Defaults to `spIdentifierMappingCreate` (literal)."
        },
        "isDeletedColumn": {
          "type": "string",
          "title": "The column name for the `IsDeleted` (logical delete) capability (if any).",
          "description": "Defaults to `IsDeleted`."
        },
        "autoDotNetRename": {
          "type": "string",
          "title": "The option to automatically rename the SQL Tables and Columns for use in .NET.",
          "description": "Defaults to `SnakeKebabToPascalCase` which will remove any underscores or hyphens separating each word and capitalize the first character of each; e.g. `internal-customer_id` would be renamed as `InternalCustomerId`. The `PascalCase` option will capatilize the first character only.",
          "enum": [
            "None",
            "PascalCase",
            "SnakeKebabToPascalCase"
          ]
        },
        "excludeColumnsFromETag": {
          "type": "array",
          "title": "The default list of `Column` names that should be excluded from the generated ETag (used for the likes of duplicate send tracking)",
          "items": {
            "type": "string"
          }
        },
        "jsonSerializer": {
          "type": "string",
          "title": "The JSON Serializer to use for JSON property attribution.",
          "description": "Defaults to `SystemText`.",
          "enum": [
            "SystemText",
            "Newtonsoft"
          ]
        },
        "service": {
          "type": "string",
          "title": "The type of service that manages the underlying orchestrator.",
          "description": "Defaults to `None`. A `HostedService` is an `IHostedService` implementation enabling long-running execution; whereas, `Service` is intended for self-managed execution.",
          "enum": [
            "None",
            "HostedService",
            "Service"
          ]
        },
        "eventSubjectRoot": {
          "type": "string",
          "title": "The root for the event name by prepending to all event subject names via CDC.",
          "description": "Used to enable the sending of messages to the likes of EventHubs, Service Broker, Kafka, etc."
        },
        "eventSubjectFormat": {
          "type": "string",
          "title": "The default formatting for the Subject when an Event is published via CDC.",
          "description": "Defaults to `NameOnly`.",
          "enum": [
            "NameOnly",
            "NameAndKey",
            "NameAndTableKey"
          ]
        },
        "eventActionFormat": {
          "type": "string",
          "title": "The formatting for the Action when an Event is published via CDC.",
          "description": "Defaults to `None` (no formatting required, i.e. as-is).",
          "enum": [
            "None",
            "PastTense"
          ]
        },
        "eventSourceKind": {
          "type": "string",
          "title": "The URI kind for the event source URIs for CDC.",
          "description": "Defaults to `Relative` (being a relative path).",
          "enum": [
            "None",
            "Absolute",
            "Relative",
            "RelativeOrAbsolute"
          ]
        },
        "eventSourceRoot": {
          "type": "string",
          "title": "The URI root for the event source by prepending to all event source URIs for CDC.",
          "description": "The event source is only updated where an `EventSourceKind` is not `None`."
        },
        "eventSourceFormat": {
          "type": "string",
          "title": "The default formatting for the Source when an Event is published via CDC.",
          "description": "Defaults to `NameAndTableKey` (being the child `Cdc.ModelName` appended with the corresponding table key).",
          "enum": [
            "NameOnly",
            "NameAndKey",
            "NameAndTableKey"
          ]
        },
        "eventTypeRoot": {
          "type": "string",
          "title": "The root for the event type by prepending to all event type names via CDC.",
          "description": "Used to enable the sending of messages to the likes of EventHubs, Service Broker, Kafka, etc. Defaults to `EventSubjectRoot`."
        },
        "outbox": {
          "type": "boolean",
          "title": "Indicates whether to generate the event outbox SQL and .NET artefacts.",
          "description": "Defaults to `false`."
        },
        "outboxSchema": {
          "type": "string",
          "title": "The schema name of the event outbox table.",
          "description": "Defaults to `Outbox` (literal)."
        },
        "outboxSchemaCreate": {
          "type": "boolean",
          "title": "Indicates whether to create the `OutboxSchema` within the database.",
          "description": "Defaults to `false`."
        },
        "outboxTable": {
          "type": "string",
          "title": "The name of the event outbox table.",
          "description": "Defaults to `EventOutbox` (literal)."
        },
        "outboxEnqueueStoredProcedure": {
          "type": "string",
          "title": "The stored procedure name for the event outbox enqueue.",
          "description": "Defaults to `spEventOutboxEnqueue` (literal)."
        },
        "outboxDequeueStoredProcedure": {
          "type": "string",
          "title": "The stored procedure name for the event outbox dequeue.",
          "description": "Defaults to `spEventOutboxDequeue` (literal)."
        },
        "pathBase": {
          "type": "string",
          "title": "The base path (directory) prefix for the Database-related artefacts; other `Path*` properties append to this value when they are not specifically overridden.",
          "description": "Defaults to `AppName` (runtime parameter). For example `Avanade.Application`."
        },
        "pathDatabase": {
          "type": "string",
          "title": "The root path (directory) for the Database-related artefacts.",
          "description": "Defaults to `PathBase` + `.Database` (literal). For example `Avanade.Application.Database`."
        },
        "pathDatabaseSchema": {
          "type": "string",
          "title": "The path (directory) for the Schema Database-related artefacts.",
          "description": "Defaults to `PathDatabase` + `/Schema` (literal). For example `Avanade.Application.Database/Schema`."
        },
        "pathDatabaseMigrations": {
          "type": "string",
          "title": "The path (directory) for the Schema Database-related artefacts.",
          "description": "Defaults to `PathDatabase` + `/Migrations` (literal). For example `Avanade.Application.Database/Migrations`."
        },
        "pathDotNetPublisher": {
          "type": "string",
          "title": "The path (directory) for the CDC-related (.NET) artefacts.",
          "description": "Defaults to `PathBase` + `.Publisher` (literal). For example `Avanade.Application.Publisher`."
        },
        "pathSidecarDatabase": {
          "type": "string",
          "title": "The path (directory) for the Schema Database-related artefacts.",
          "description": "Defaults to `PathBase` + `.SidecarDb` (literal). For example `Avanade.Application.SidecarDb`."
        },
        "pathSidecarDatabaseSchema": {
          "type": "string",
          "title": "The path (directory) for the Schema Database-related artefacts.",
          "description": "Defaults to `PathSidecarDatabase` + `/Schema` (literal). For example `Avanade.Application.SidecarDb/Schema`."
        },
        "pathSidecarDatabaseMigrations": {
          "type": "string",
          "title": "The path (directory) for the Schema Database-related artefacts.",
          "description": "Defaults to `PathSidecarDatabase` + `/Migrations` (literal). For example `Avanade.Application.SidecarDb/Migrations`."
        },
        "namespaceBase": {
          "type": "string",
          "title": "The base Namespace (root) for the .NET artefacts.",
          "description": "Defaults to `AppName` (runtime parameter). For example `Avanade.Application`."
        },
        "namespacePublisher": {
          "type": "string",
          "title": "The Namespace (root) for the CDC-related Publisher .NET artefacts.",
          "description": "Defaults to `NamespaceBase` + `.Publisher` (literal). For example `Avanade.Application.Publisher`."
        },
        "namespaceOutbox": {
          "type": "string",
          "title": "The Namespace (root) for the Outbox-related Publisher .NET artefacts.",
          "description": "Defaults to `NamespacePublisher`."
        },
        "tables": {
          "type": "array",
          "title": "The corresponding `Table` collection.",
          "description": "A `Table` object provides the primary database table configuration for Change Data Capture (CDC), including multiple child table joins to form a composite entity.",
          "items": {
            "$ref": "#/$defs/Table"
          }
        }
      }
    },
    "Table": {
      "type": "object",
      "title": "'Table' object (database-driven)",
      "description": "The `Table` object enables the definition of the primary table, one-or-more child tables and their respective join relationships, to enable Change Data Capture (CDC) event publishing. The `IncludeColumns` and `ExcludeColumns` provide a shorthand to include or exclude selected columns; with the `AliasColumns` providing a means to rename where required.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The name of the primary table."
        },
        "schema": {
          "type": "string",
          "title": "The default schema name used where not otherwise explicitly specified.",
          "description": "Defaults to `Root.Schema`."
        },
        "table": {
          "type": "string",
          "title": "The name of the primary table.",
          "description": "Defaults to `Name`. This is used to specify the actual underlying database table name (required where the `Name` has been changed to enable uniqueness)."
        },
        "alias": {
          "type": "string",
          "title": "The table alias name (must be unique).",
          "description": "Will automatically default where not specified; for example a table named `Person` will default to `p`."
        },
        "includeColumns": {
          "type": "array",
          "title": "The list of `Column` names to be included in the underlying generated output.",
          "description": "Where not specified this indicates that all `Columns` are to be included.",
          "items": {
            "type": "string"
          }
        },
        "excludeColumns": {
          "type": "array",
          "title": "The list of `Column` names to be excluded from the underlying generated output.",
          "description": "Where not specified this indicates no `Columns` are to be excluded.",
          "items": {
            "type": "string"
          }
        },
        "aliasColumns": {
          "type": "array",
          "title": "The list of `Column` and `Alias` pairs (split by a `^` lookup character) to enable column aliasing/renaming.",
          "description": "Each alias value should be formatted as `Column` + `^` + `Alias`; e.g. `PCODE^ProductCode`.",
          "items": {
            "type": "string"
          }
        },
        "executeStoredProcedure": {
          "type": "string",
          "title": "The `CDC` _execute_ batch stored procedure name.",
          "description": "Defaults to `sp` (literal) + `Name` + `BatchExecute` (literal); e.g. `spNameBatchExecute`."
        },
        "completeStoredProcedure": {
          "type": "string",
          "title": "The `CDC` _complete_ batch stored procedure name.",
          "description": "Defaults to `sp` (literal) + `Name` + `BatchComplete` (literal); e.g. `spNameBatchComplete`."
        },
        "resetStoredProcedure": {
          "type": "string",
          "title": "The `CDC` _reset_ batch stored procedure name.",
          "description": "Defaults to `sp` (literal) + `Name` + `BatchReset` (literal); e.g. `spNameBatchReset`."
        },
        "trackingStoredProcedure": {
          "type": "string",
          "title": "The `CDC` _tracking_ (Sidecar only) batch stored procedure name.",
          "description": "Defaults to `sp` (literal) + `Name` + `BatchTracking` (literal); e.g. `spNameBatchTracking`."
        },
        "cdcSchema": {
          "type": "string",
          "title": "The schema name for the generated `CDC`-related database artefacts.",
          "description": "Defaults to `Root.CdcSchema`."
        },
        "batchTrackingTable": {
          "type": "string",
          "title": "The corresponding `CDC` Batch tracking table name.",
          "description": "Defaults to `Name` + `BatchTracking` (literal)."
        },
        "cdcEnable": {
          "type": "boolean",
          "title": "Indicates whether to enable `Cdc` within the database for the tables that participate.",
          "description": "Defaults to `false`. This option can be overridden for each underlying table referenced."
        },
        "model": {
          "type": "string",
          "title": "The .NET model name.",
          "description": "Defaults to `Name`."
        },
        "orchestratorCtorParams": {
          "type": "array",
          "title": "The list of additional (non-default) Dependency Injection (DI) parameters for the generated CDC `Orchestrator` constructor.",
          "description": "Each constructor parameter should be formatted as `Type` + `^` + `Name`; e.g. `IConfiguration^Config`. Where the `Name` portion is not specified it will be inferred.",
          "items": {
            "type": "string"
          }
        },
        "database": {
          "type": "string",
          "title": "The .NET database `IDatabase` Type name used in the constructor for Dependency Injection (DI).",
          "description": "Defaults to `IDatabase`."
        },
        "includeColumnsOnDelete": {
          "type": "array",
          "title": "The list of `Column` names that should be included (in addition to the primary key) for a logical delete.",
          "description": "Where a column is not specified in this list its corresponding .NET property will be automatically cleared by the `CdcDataOrchestrator` as the data is technically considered as non-existing.",
          "items": {
            "type": "string"
          }
        },
        "service": {
          "type": "string",
          "title": "The type of service that manages the underlying orchestrator.",
          "description": "Defaults to `Root.Service`. A `HostedService` is an `IHostedService` implementation enabling long-running execution; whereas, `Service` is intended for self-managed execution.",
          "enum": [
            "None",
            "HostedService",
            "Service"
          ]
        },
        "excludeColumnsFromETag": {
          "type": "array",
          "title": "The list of `Column` names that should be excluded from the generated ETag (used for the likes of duplicate send tracking).",
          "description": "Defaults to `Root.CdcExcludeColumnsFromETag`.",
          "items": {
            "type": "string"
          }
        },
        "tenantIdColumns": {
          "type": "array",
          "title": "The list of `Column` names that represent the tenant identifier.",
          "items": {
            "type": "string"
          }
        },
        "partitionKey": {
          "type": "string",
          "title": "The partition key.",
          "description": "A partition key can be specified using either `PartitionKey` or `PartitionKeyColumns`."
        },
        "partitionKeyColumns": {
          "type": "array",
          "title": "The list of `Column` names that represent the partition key.",
          "description": "A partition key can be specified using either `PartitionKey` or `PartitionKeyColumns`.",
          "items": {
            "type": "string"
          }
        },
        "eventSource": {
          "type": "string",
          "title": "The Event Source.",
          "description": "Defaults to `Schema` + `/` (literal) + `Name` (as lowercase). Note: when used in code-generation the `Root.EventSourceRoot` will be prepended where specified."
        },
        "eventSourceFormat": {
          "type": "string",
          "title": "The default formatting for the Source when an Event is published.",
          "description": "Defaults to `Root.EventSourceFormat`.",
          "enum": [
            "NameOnly",
            "NameAndKey",
            "NameAndTableKey"
          ]
        },
        "eventSubject": {
          "type": "string",
          "title": "The Event Subject.",
          "description": "Defaults to `ModelName`. Note: when used in code-generation the `Root.EventSubjectRoot` will be prepended where specified."
        },
        "eventSubjectFormat": {
          "type": "string",
          "title": "The default formatting for the Subject when an Event is published.",
          "description": "Defaults to `Root.EventSubjectFormat`.",
          "enum": [
            "NameOnly",
            "NameAndKey",
            "NameAndTableKey"
          ]
        },
        "eventType": {
          "type": "string",
          "title": "The Event Type.",
          "description": "Defaults to `ModelName`. Note: when used in code-generation the `Root.EventTypeRoot` will be prepended where specified."
        },
        "identifierMapping": {
          "type": "boolean",
          "title": "Indicates whether to perform Identifier Mapping (mapping to `GlobalId`) for the primary key.",
          "description": "This indicates whether to create a new `GlobalId` property on the _entity_ to house the global mapping identifier to be the reference outside of the specific database realm as a replacement to the existing primary key column(s)."
        },
        "identifierName": {
          "type": "string",
          "title": "The JSON name for the `GlobalId` property where `IdentifierMapping` is `true`. Defaults to `globalId`.",
          "description": "This indicates whether to create a new `GlobalId` property on the _entity_ to house the global mapping identifier to be the reference outside of the specific database realm as a replacement to the existing primary key column(s)."
        },
        "isDeletedColumn": {
          "type": "string",
          "title": "The column name for the `IsDeleted` (logical delete) capability (if any).",
          "description": "Defaults to `Root.ColumnIsDeleted`."
        },
        "joins": {
          "type": "array",
          "title": "The corresponding `Join` collection.",
          "description": "A `Join` object provides the configuration for a table join.",
          "items": {
            "$ref": "#/$defs/Join"
          }
        },
        "where": {
          "type": "array",
          "title": "The corresponding `Where` collection.",
          "description": "A `Where` object provides the configuration for a table where clause.",
          "items": {
            "$ref": "#/$defs/Where"
          }
        },
        "mappings": {
          "type": "array",
          "title": "The corresponding `TableMapping` collection.",
          "items": {
            "$ref": "#/$defs/TableMapping"
          }
        }
      },
      "required": [
        "name"
      ]
    },
    "Join": {
      "type": "object",
      "title": "'Join' object (database-driven)",
      "description": "The `Join` object defines a join to another (or same) table within the logical CDC entity.  The `IncludeColumns` and `ExcludeColumns` provide a shorthand to include or exclude selected columns; with the `AliasColumns` providing a means to rename where required.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The unique name.",
          "description": "A unique name is required where the same `Table` is referenced more than once within a logical CDC entity. However, generally, this will represent the unique name of the table within the database."
        },
        "schema": {
          "type": "string",
          "title": "The schema name of the table to join.",
          "description": "Defaults to `Cdc.Schema`; i.e. same schema."
        },
        "table": {
          "type": "string",
          "title": "The name of the table to join.",
          "description": "Defaults to `Name`. This is used to specify the actual underlying database table name (required where the `Name` has been changed to enable uniqueness)."
        },
        "alias": {
          "type": "string",
          "title": "The `Schema` and `Table` alias name.",
          "description": "Will automatically default where not specified."
        },
        "type": {
          "type": "string",
          "title": "The SQL join type.",
          "description": "Defaults to `Cdc`. The `Cdc` value indicates this is a related secondary table (within a logical CDC entity) that also has Change Data Capture turned on and equally needs to be monitored for changes.",
          "enum": [
            "Cdc",
            "Inner",
            "Left",
            "Right",
            "Full"
          ]
        },
        "joinTo": {
          "type": "string",
          "title": "The name of the table to join to (must be previously specified).",
          "description": "Defaults to parent `Table.Name`."
        },
        "joinCardinality": {
          "type": "string",
          "title": "The join cardinality being whether there is a One-to-Many or One-to-One relationship.",
          "description": "Defaults to `OneToMany`. This represents the Parent (`JoinTo`) to child (_this_) relationship.",
          "enum": [
            "OneToMany",
            "OneToOne"
          ]
        },
        "cdcEnable": {
          "type": "boolean",
          "title": "Indicates whether to enable `Cdc` within the database for the tables that participate.",
          "description": "Defaults to `false`. This option can be overridden for each underlying table referenced."
        },
        "querySizeMultiplier": {
          "type": "number",
          "title": "The query size multiplier for the CDC-Join.",
          "description": "Defaults to `1.0`. This is applied to the execute stored procedure `@MaxQuerySize` parameter to allow tailoring on the join query (`TOP`) sizes to optimize selection. Must be greater than zero and less than or equal to 100."
        },
        "includeColumns": {
          "type": "array",
          "title": "The list of `Column` names to be included in the underlying generated output.",
          "description": "Where not specified this indicates that all `Columns` are to be included.",
          "items": {
            "type": "string"
          }
        },
        "excludeColumns": {
          "type": "array",
          "title": "The list of `Column` names to be excluded from the underlying generated output.",
          "description": "Where not specified this indicates no `Columns` are to be excluded.",
          "items": {
            "type": "string"
          }
        },
        "aliasColumns": {
          "type": "array",
          "title": "The list of `Column` and `Alias` pairs (split by a `^` lookup character) to enable column renaming.",
          "description": "Each alias value should be formatted as `Column` + `^` + `Alias`; e.g. `PCODE^ProductCode`",
          "items": {
            "type": "string"
          }
        },
        "model": {
          "type": "string",
          "title": "The .NET model name.",
          "description": "Defaults to `Name`."
        },
        "property": {
          "type": "string",
          "title": "The .NET property name.",
          "description": "Defaults to `Model` where `JoinCardinality` is `OneToOne`; otherwise, it will be the `Model` pluralized."
        },
        "includeColumnsOnDelete": {
          "type": "array",
          "title": "The list of `Column` names that should be included (in addition to the primary key) for a logical delete.",
          "description": "Where a column is not specified in this list its corresponding .NET property will be automatically cleared by the `CdcDataOrchestrator` as the data is technically considered as non-existing.",
          "items": {
            "type": "string"
          }
        },
        "excludeColumnsFromETag": {
          "type": "array",
          "title": "The list of `Column` names that should be excluded from the generated ETag (used for the likes of duplicate send tracking).",
          "description": "Defaults to `CodeGeneration.CdcExcludeColumnsFromETag`.",
          "items": {
            "type": "string"
          }
        },
        "identifierMapping": {
          "type": "boolean",
          "title": "Indicates whether to perform Identifier Mapping (mapping to `GlobalId`) for the primary key.",
          "description": "This indicates whether to create a new `GlobalId` property on the _entity_ to house the global mapping identifier to be the reference outside of the specific database realm as a replacement to the existing primary key column(s)."
        },
        "identifierName": {
          "type": "string",
          "title": "The JSON name for the `GlobalId` property where `IdentifierMapping` is `true`. Defaults to `globalId`.",
          "description": "This indicates whether to create a new `GlobalId` property on the _entity_ to house the global mapping identifier to be the reference outside of the specific database realm as a replacement to the existing primary key column(s)."
        },
        "on": {
          "type": "array",
          "title": "The corresponding `JoinOn` collection.",
          "items": {
            "$ref": "#/$defs/JoinOn"
          }
        },
        "mappings": {
          "type": "array",
          "title": "The corresponding `JoinMapping` collection.",
          "items": {
            "$ref": "#/$defs/JoinMapping"
          }
        }
      },
      "required": [
        "name"
      ]
    },
    "JoinOn": {
      "type": "object",
      "title": "'JoinOn' object (database-driven)",
      "description": "The `JoinOn` object defines the join on characteristics for a `Join` object.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The name of the join column (from the `Join` table)."
        },
        "toColumn": {
          "type": "string",
          "title": "The name of the join to column.",
          "description": "Defaults to `Name`; i.e. assumes same name."
        },
        "toStatement": {
          "type": "string",
          "title": "The SQL statement for the join on bypassing the corresponding `ToColumn` specification."
        }
      },
      "required": [
        "name"
      ]
    },
    "JoinMapping": {
      "type": "object",
      "title": "'JoinMapping' object (database-driven)",
      "description": "The `JoinMapping` object defines one or more related table identifier mappings.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The name of of the existing column that requires identifier mapping."
        },
        "schema": {
          "type": "string",
          "title": "The schema name of the related table.",
          "description": "Defaults to the owning (parent) table schema."
        },
        "table": {
          "type": "string",
          "title": "The name of the related table."
        }
      },
      "required": [
        "name",
        "table"
      ]
    },
    "Where": {
      "type": "object",
      "title": "'Where' object (database-driven)",
      "description": "This should only be used where the column value is largely immutable; otherwise, unintended side-effects may occur. _NTangle_ uses the condition explictily and does not attempt to handle value change to infer creation or deletion of data as a result of the underlying change; as such, this should be used cautiously. Note that the `where` is applied when querying the `cdc.fn_cdc_get_all_changes_...` function, not the underlying table itself.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The column name.",
          "description": "The column name."
        },
        "nullable": {
          "type": "string",
          "title": "The where nullability clause operator",
          "description": "This enables statements such as `WHERE (COL IS NULL)` or `WHERE (COL IS NULL OR COL = VALUE)` (where .",
          "enum": [
            "ISNULL",
            "ISNOTNULL"
          ]
        },
        "operator": {
          "type": "string",
          "title": "The where clause equality operator",
          "description": "Defaults to `EQ` where `Value` is specified.",
          "enum": [
            "EQ",
            "NE",
            "LT",
            "LE",
            "GT",
            "GE",
            "LIKE"
          ]
        },
        "value": {
          "type": "string",
          "title": "The comparison value",
          "description": "This must be valid formatted/escaped SQL."
        }
      },
      "required": [
        "name"
      ]
    },
    "TableMapping": {
      "type": "object",
      "title": "'TableMapping' object (database-driven)",
      "description": "The `TableMapping` object defines one or more related table identifier mappings.",
      "properties": {
        "name": {
          "type": "string",
          "title": "The name of of the existing column that requires identifier mapping."
        },
        "schema": {
          "type": "string",
          "title": "The schema name of the related table.",
          "description": "Defaults to the owning (parent) table schema."
        },
        "table": {
          "type": "string",
          "title": "The name of the related table."
        }
      },
      "required": [
        "name",
        "table"
      ]
    }
  }
}
