export interface EnumValue {
    name: string;
    value: number;
}
export interface EnumDefinition {
    kind: "Enum";
    name: string;
    values: Array<EnumValue>;
}
export interface MessageFieldDefinition {
    name: string;
    type: string;
    index: number;
    isArray?: true;
    import?: string;
    deprecated?: true;
}
export interface DatastoreFilterTemplate {
    fieldName: string;
    operator: string;
}
export interface DatastoreOrdering {
    fieldName: string;
    descending: boolean;
}
export interface DatastoreQueryTemplate {
    name: string;
    filters?: Array<DatastoreFilterTemplate>;
    orderings?: Array<DatastoreOrdering>;
}
export interface DatastoreDefinition {
    output: string;
    key: string;
    queries?: Array<DatastoreQueryTemplate>;
}
export interface MessageDefinition {
    kind: "Message";
    name: string;
    fields: Array<MessageFieldDefinition>;
}
export interface ServiceDefinition {
    kind: "Service";
    name: string;
    path: string;
}
export interface KeyValueParamDefinition {
    key: string;
    type: string;
    import?: string;
}
export interface RemoteCallDefinition {
    name: string;
    path: string;
    body: string;
    importBody?: string;
    authKey?: string;
    metadata?: KeyValueParamDefinition;
    response: string;
    importResponse?: string;
}
export interface RemoteCallsGroupDefinition {
    kind: "RemoteCallsGroup";
    name: string;
    service: string;
    importService?: string;
    calls: Array<RemoteCallDefinition>;
    outputClient: string;
    outputHandler: string;
}
export interface SpannerTableColumnType {
    type: string;
    import?: string;
    isArray?: true;
    nullable?: true;
}
export interface SpannerTableColumnDefinition extends SpannerTableColumnType {
    name: string;
}
export interface SpannerTableColumnGroupDefinition {
    name: string;
    columns: Array<string>;
}
export interface SpannerTableSearchColumnDefinition {
    name: string;
    columnRefs: Array<string>;
}
export interface SpannerIndexColumnDefinition {
    name: string;
    desc: boolean;
}
export interface SpannerTablePrimaryKeyDefinition {
    name: string;
    desc: boolean;
}
export interface SpannerTableInterleaveDefinition {
    parentTable: string;
    cascadeOnDelete?: true;
}
export interface SpannerIndexDefinition {
    name: string;
    columns: Array<string | SpannerIndexColumnDefinition>;
    unique?: true;
    nullFiltered?: true;
}
export interface SpannerSearchIndexOrderByDefinition {
    name: string;
    desc: boolean;
}
export interface SpannerSearchIndexDefinition {
    name: string;
    columns: Array<string>;
    partitionByColumns?: Array<string>;
    orderByColumns?: Array<string | SpannerSearchIndexOrderByDefinition>;
}
export interface SpannerTableDefinition {
    kind: "Table";
    name: string;
    columns: Array<SpannerTableColumnDefinition>;
    columnGroups?: Array<SpannerTableColumnGroupDefinition>;
    searchColumns?: Array<SpannerTableSearchColumnDefinition>;
    primaryKeys: Array<string | SpannerTablePrimaryKeyDefinition>;
    interleave?: SpannerTableInterleaveDefinition;
    indexes?: Array<SpannerIndexDefinition>;
    searchIndexes?: Array<SpannerSearchIndexDefinition>;
    insert?: string;
    delete?: string;
    get?: string;
    update?: string;
}
export interface SpannerTaskTableDefinition {
    kind: "TaskTable";
    name: string;
    columns: Array<SpannerTableColumnDefinition>;
    retryCountColumn: string;
    executionTimeColumn: string;
    createdTimeColumn: string;
    primaryKeys: Array<string | SpannerTablePrimaryKeyDefinition>;
    executionTimeIndex: string;
    insert: string;
    delete: string;
    get: string;
    listPendingTasks: string;
    getMetadata: string;
    updateMetadata: string;
}
export interface SpannerJoinOnLeaf {
    lColumn: string;
    lTable: string;
    op: ">" | "<" | ">=" | "<=" | "!=" | "=";
    rColumn: string;
}
export interface SpannerJoinOnConcat {
    op: "AND" | "OR";
    exprs: Array<SpannerJoinOnConcat | SpannerJoinOnLeaf>;
}
export interface SpannerJoin {
    type: "INNER" | "CROSS" | "FULL" | "LEFT" | "RIGHT";
    with: string;
    as?: string;
    on?: SpannerJoinOnConcat | SpannerJoinOnLeaf;
}
export interface SpannerWhereLeaf {
    lColumn: string;
    lTable?: string;
    func?: "SCORE";
    op: ">" | "<" | ">=" | "<=" | "!=" | "=" | "IS NULL" | "IS NOT NULL" | "SEARCH";
}
export interface SpannerWhereConcat {
    op: "AND" | "OR";
    exprs: Array<SpannerWhereConcat | SpannerWhereLeaf>;
}
export interface SpannerOrderByExpr {
    column: string;
    table?: string;
    func?: "SCORE";
    desc?: true;
}
export interface SpannerGetColumnExpr {
    column?: string;
    func?: "SCORE";
    all?: true;
    columnGroup?: string;
    table?: string;
}
export interface SpannerSelectDefinition {
    name: string;
    from: string;
    as?: string;
    join?: Array<SpannerJoin>;
    where?: SpannerWhereConcat | SpannerWhereLeaf;
    orderBy?: Array<string | SpannerOrderByExpr>;
    withLimit?: boolean;
    get: Array<string | SpannerGetColumnExpr>;
}
export interface SpannerInsertDefinition {
    name: string;
    table: string;
    set: Array<string>;
}
export interface SpannerUpdateDefinition {
    name: string;
    table: string;
    set: Array<string>;
    where: SpannerWhereConcat | SpannerWhereLeaf;
}
export interface SpannerDeleteDefinition {
    name: string;
    table: string;
    where: SpannerWhereConcat | SpannerWhereLeaf;
}
export interface SpannerDatabaseDefinition {
    kind: "SpannerDatabase";
    name: string;
    tables?: Array<SpannerTableDefinition | SpannerTaskTableDefinition>;
    selects?: Array<SpannerSelectDefinition>;
    inserts?: Array<SpannerInsertDefinition>;
    updates?: Array<SpannerUpdateDefinition>;
    deletes?: Array<SpannerDeleteDefinition>;
    outputDdl: string;
    outputSql: string;
}
export type Definition = EnumDefinition | MessageDefinition | ServiceDefinition | RemoteCallsGroupDefinition | SpannerDatabaseDefinition;
