All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.partiql.lang.domains.PartiqlLogical.generated.kt Maven / Gradle / Ivy

There is a newer version: 1.0.0-perf.1
Show newest version

/**
 * This code was generated by the PartiQL I.R. Generator.
 * Do not modify this file.  
 */
@file:Suppress("unused", "MemberVisibilityCanBePrivate", "FunctionName",
"CanBePrimaryConstructorProperty", "UNNECESSARY_SAFE_CALL",
"USELESS_ELVIS", "RemoveRedundantQualifierName", "LocalVariableName")

package org.partiql.lang.domains

import com.amazon.ionelement.api.*
import org.partiql.pig.runtime.*


class PartiqlLogical private constructor() {
    /////////////////////////////////////////////////////////////////////////////
    // Builder
    /////////////////////////////////////////////////////////////////////////////
    companion object {
        @JvmStatic
        fun BUILDER() : Builder = PartiqlLogicalBuilder
    
        fun  build(block: Builder.() -> T) =
            PartiqlLogicalBuilder.block()
    
        fun transform(element: AnyElement): PartiqlLogicalNode =
            transform(element.asSexp())
    
        fun transform(element: SexpElement): PartiqlLogicalNode =
            IonElementTransformer().transform(element)
    }
    
    interface Builder {
        fun newMetaContainer() = emptyMetaContainer()
    
        // Tuples 
        /**
         * Creates an instance of [PartiqlLogical.TimeValue].
         */
        fun timeValue(
            hour: Long,
            minute: Long,
            second: Long,
            nano: Long,
            precision: Long,
            withTimeZone: Boolean,
            tzMinutes: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.TimeValue =
            PartiqlLogical.TimeValue(
                hour = hour.asPrimitive(),
                minute = minute.asPrimitive(),
                second = second.asPrimitive(),
                nano = nano.asPrimitive(),
                precision = precision.asPrimitive(),
                withTimeZone = withTimeZone.asPrimitive(),
                tzMinutes = tzMinutes?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.TimeValue].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun timeValue_(
            hour: org.partiql.pig.runtime.LongPrimitive,
            minute: org.partiql.pig.runtime.LongPrimitive,
            second: org.partiql.pig.runtime.LongPrimitive,
            nano: org.partiql.pig.runtime.LongPrimitive,
            precision: org.partiql.pig.runtime.LongPrimitive,
            withTimeZone: org.partiql.pig.runtime.BoolPrimitive,
            tzMinutes: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.TimeValue =
            PartiqlLogical.TimeValue(
                hour = hour,
                minute = minute,
                second = second,
                nano = nano,
                precision = precision,
                withTimeZone = withTimeZone,
                tzMinutes = tzMinutes,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchQuantifier].
         */
        fun graphMatchQuantifier(
            lower: Long,
            upper: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchQuantifier =
            PartiqlLogical.GraphMatchQuantifier(
                lower = lower.asPrimitive(),
                upper = upper?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchQuantifier].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun graphMatchQuantifier_(
            lower: org.partiql.pig.runtime.LongPrimitive,
            upper: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchQuantifier =
            PartiqlLogical.GraphMatchQuantifier(
                lower = lower,
                upper = upper,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPattern].
         */
        fun graphMatchPattern(
            restrictor: GraphMatchRestrictor? = null,
            prefilter: Expr? = null,
            variable: String? = null,
            quantifier: GraphMatchQuantifier? = null,
            parts: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPattern =
            PartiqlLogical.GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                quantifier = quantifier,
                parts = parts,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPattern].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun graphMatchPattern_(
            restrictor: GraphMatchRestrictor? = null,
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            quantifier: GraphMatchQuantifier? = null,
            parts: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPattern =
            PartiqlLogical.GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable,
                quantifier = quantifier,
                parts = parts,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPattern].
         */
        fun graphMatchPattern(
            restrictor: GraphMatchRestrictor? = null,
            prefilter: Expr? = null,
            variable: String? = null,
            quantifier: GraphMatchQuantifier? = null,
            parts0: GraphMatchPatternPart,
            vararg parts: GraphMatchPatternPart,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPattern =
            PartiqlLogical.GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                quantifier = quantifier,
                parts = listOf(parts0) + parts.toList(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPattern].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun graphMatchPattern_(
            restrictor: GraphMatchRestrictor? = null,
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            quantifier: GraphMatchQuantifier? = null,
            parts0: GraphMatchPatternPart,
            vararg parts: GraphMatchPatternPart,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPattern =
            PartiqlLogical.GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable,
                quantifier = quantifier,
                parts = listOf(parts0) + parts.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GpmlPattern].
         */
        fun gpmlPattern(
            selector: GraphMatchSelector? = null,
            patterns: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GpmlPattern =
            PartiqlLogical.GpmlPattern(
                selector = selector,
                patterns = patterns,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GpmlPattern].
         */
        fun gpmlPattern(
            selector: GraphMatchSelector? = null,
            patterns0: GraphMatchPattern,
            vararg patterns: GraphMatchPattern,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GpmlPattern =
            PartiqlLogical.GpmlPattern(
                selector = selector,
                patterns = listOf(patterns0) + patterns.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.ExprPair].
         */
        fun exprPair(
            first: Expr,
            second: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ExprPair =
            PartiqlLogical.ExprPair(
                first = first,
                second = second,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.ExprPairList].
         */
        fun exprPairList(
            pairs: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ExprPairList =
            PartiqlLogical.ExprPairList(
                pairs = pairs,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.ExprPairList].
         */
        fun exprPairList(
            vararg pairs: ExprPair,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ExprPairList =
            PartiqlLogical.ExprPairList(
                pairs = pairs.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.SortSpec].
         */
        fun sortSpec(
            expr: Expr,
            orderingSpec: OrderingSpec? = null,
            nullsSpec: NullsSpec? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.SortSpec =
            PartiqlLogical.SortSpec(
                expr = expr,
                orderingSpec = orderingSpec,
                nullsSpec = nullsSpec,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Over].
         */
        fun over(
            partitionBy: WindowPartitionList? = null,
            orderBy: WindowSortSpecList? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Over =
            PartiqlLogical.Over(
                partitionBy = partitionBy,
                orderBy = orderBy,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.WindowPartitionList].
         */
        fun windowPartitionList(
            exprs: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowPartitionList =
            PartiqlLogical.WindowPartitionList(
                exprs = exprs,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.WindowPartitionList].
         */
        fun windowPartitionList(
            exprs0: Expr,
            vararg exprs: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowPartitionList =
            PartiqlLogical.WindowPartitionList(
                exprs = listOf(exprs0) + exprs.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.WindowSortSpecList].
         */
        fun windowSortSpecList(
            sortSpecs: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowSortSpecList =
            PartiqlLogical.WindowSortSpecList(
                sortSpecs = sortSpecs,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.WindowSortSpecList].
         */
        fun windowSortSpecList(
            sortSpecs0: SortSpec,
            vararg sortSpecs: SortSpec,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowSortSpecList =
            PartiqlLogical.WindowSortSpecList(
                sortSpecs = listOf(sortSpecs0) + sortSpecs.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Identifier].
         */
        fun identifier(
            name: String,
            case: CaseSensitivity,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Identifier =
            PartiqlLogical.Identifier(
                name = name.asPrimitive(),
                case = case,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Identifier].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun identifier_(
            name: org.partiql.pig.runtime.SymbolPrimitive,
            case: CaseSensitivity,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Identifier =
            PartiqlLogical.Identifier(
                name = name,
                case = case,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Plan].
         */
        fun plan(
            stmt: Statement,
            version: String,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Plan =
            PartiqlLogical.Plan(
                stmt = stmt,
                version = version.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Plan].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun plan_(
            stmt: Statement,
            version: org.partiql.pig.runtime.SymbolPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Plan =
            PartiqlLogical.Plan(
                stmt = stmt,
                version = version,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.LetBinding].
         */
        fun letBinding(
            value: Expr,
            decl: VarDecl,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.LetBinding =
            PartiqlLogical.LetBinding(
                value = value,
                decl = decl,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GroupKey].
         */
        fun groupKey(
            expr: Expr,
            asVar: VarDecl,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GroupKey =
            PartiqlLogical.GroupKey(
                expr = expr,
                asVar = asVar,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GroupKeyList].
         */
        fun groupKeyList(
            keys: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GroupKeyList =
            PartiqlLogical.GroupKeyList(
                keys = keys,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GroupKeyList].
         */
        fun groupKeyList(
            keys0: GroupKey,
            vararg keys: GroupKey,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GroupKeyList =
            PartiqlLogical.GroupKeyList(
                keys = listOf(keys0) + keys.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.AggregateFunction].
         */
        fun aggregateFunction(
            quantifier: SetQuantifier,
            name: String,
            arg: Expr,
            asVar: VarDecl,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.AggregateFunction =
            PartiqlLogical.AggregateFunction(
                quantifier = quantifier,
                name = name.asPrimitive(),
                arg = arg,
                asVar = asVar,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.AggregateFunction].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun aggregateFunction_(
            quantifier: SetQuantifier,
            name: org.partiql.pig.runtime.SymbolPrimitive,
            arg: Expr,
            asVar: VarDecl,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.AggregateFunction =
            PartiqlLogical.AggregateFunction(
                quantifier = quantifier,
                name = name,
                arg = arg,
                asVar = asVar,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.AggregateFunctionList].
         */
        fun aggregateFunctionList(
            functions: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.AggregateFunctionList =
            PartiqlLogical.AggregateFunctionList(
                functions = functions,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.AggregateFunctionList].
         */
        fun aggregateFunctionList(
            functions0: AggregateFunction,
            vararg functions: AggregateFunction,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.AggregateFunctionList =
            PartiqlLogical.AggregateFunctionList(
                functions = listOf(functions0) + functions.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.WindowExpression].
         */
        fun windowExpression(
            decl: VarDecl,
            funcName: String,
            args: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowExpression =
            PartiqlLogical.WindowExpression(
                decl = decl,
                funcName = funcName.asPrimitive(),
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.WindowExpression].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun windowExpression_(
            decl: VarDecl,
            funcName: org.partiql.pig.runtime.SymbolPrimitive,
            args: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowExpression =
            PartiqlLogical.WindowExpression(
                decl = decl,
                funcName = funcName,
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.WindowExpression].
         */
        fun windowExpression(
            decl: VarDecl,
            funcName: String,
            args0: Expr,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowExpression =
            PartiqlLogical.WindowExpression(
                decl = decl,
                funcName = funcName?.asPrimitive(),
                args = listOf(args0) + args.toList(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.WindowExpression].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun windowExpression_(
            decl: VarDecl,
            funcName: org.partiql.pig.runtime.SymbolPrimitive,
            args0: Expr,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.WindowExpression =
            PartiqlLogical.WindowExpression(
                decl = decl,
                funcName = funcName,
                args = listOf(args0) + args.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.VarDecl].
         */
        fun varDecl(
            name: String,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.VarDecl =
            PartiqlLogical.VarDecl(
                name = name.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.VarDecl].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun varDecl_(
            name: org.partiql.pig.runtime.SymbolPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.VarDecl =
            PartiqlLogical.VarDecl(
                name = name,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: ExplainTarget 
        /**
         * Creates an instance of [PartiqlLogical.ExplainTarget.Domain].
         */
        fun domain(
            statement: Statement,
            type: String? = null,
            format: String? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ExplainTarget.Domain =
            PartiqlLogical.ExplainTarget.Domain(
                statement = statement,
                type = type?.asPrimitive(),
                format = format?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.ExplainTarget.Domain].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun domain_(
            statement: Statement,
            type: org.partiql.pig.runtime.SymbolPrimitive? = null,
            format: org.partiql.pig.runtime.SymbolPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ExplainTarget.Domain =
            PartiqlLogical.ExplainTarget.Domain(
                statement = statement,
                type = type,
                format = format,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: PathStep 
        /**
         * Creates an instance of [PartiqlLogical.PathStep.PathExpr].
         */
        fun pathExpr(
            index: Expr,
            case: CaseSensitivity,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.PathStep.PathExpr =
            PartiqlLogical.PathStep.PathExpr(
                index = index,
                case = case,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.PathStep.PathWildcard].
         */
        fun pathWildcard(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.PathStep.PathWildcard =
            PartiqlLogical.PathStep.PathWildcard(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.PathStep.PathUnpivot].
         */
        fun pathUnpivot(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.PathStep.PathUnpivot =
            PartiqlLogical.PathStep.PathUnpivot(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: JoinType 
        /**
         * Creates an instance of [PartiqlLogical.JoinType.Inner].
         */
        fun inner(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.JoinType.Inner =
            PartiqlLogical.JoinType.Inner(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.JoinType.Left].
         */
        fun left(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.JoinType.Left =
            PartiqlLogical.JoinType.Left(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.JoinType.Right].
         */
        fun right(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.JoinType.Right =
            PartiqlLogical.JoinType.Right(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.JoinType.Full].
         */
        fun full(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.JoinType.Full =
            PartiqlLogical.JoinType.Full(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: GraphMatchDirection 
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeLeft].
         */
        fun edgeLeft(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeLeft =
            PartiqlLogical.GraphMatchDirection.EdgeLeft(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeUndirected].
         */
        fun edgeUndirected(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeUndirected =
            PartiqlLogical.GraphMatchDirection.EdgeUndirected(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeRight].
         */
        fun edgeRight(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeRight =
            PartiqlLogical.GraphMatchDirection.EdgeRight(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected].
         */
        fun edgeLeftOrUndirected(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected =
            PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight].
         */
        fun edgeUndirectedOrRight(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight =
            PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight].
         */
        fun edgeLeftOrRight(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight =
            PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight].
         */
        fun edgeLeftOrUndirectedOrRight(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight =
            PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: GraphMatchPatternPart 
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Node].
         */
        fun node(
            prefilter: Expr? = null,
            variable: String? = null,
            label: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Node =
            PartiqlLogical.GraphMatchPatternPart.Node(
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                label = label.map { it.asPrimitive() },
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Node].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun node_(
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            label: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Node =
            PartiqlLogical.GraphMatchPatternPart.Node(
                prefilter = prefilter,
                variable = variable,
                label = label,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Node].
         */
        fun node(
            prefilter: Expr? = null,
            variable: String? = null,
            vararg label: String,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Node =
            PartiqlLogical.GraphMatchPatternPart.Node(
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                label = label.map { it.asPrimitive() },
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Node].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun node_(
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            vararg label: org.partiql.pig.runtime.SymbolPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Node =
            PartiqlLogical.GraphMatchPatternPart.Node(
                prefilter = prefilter,
                variable = variable,
                label = label.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Edge].
         */
        fun edge(
            direction: GraphMatchDirection,
            quantifier: GraphMatchQuantifier? = null,
            prefilter: Expr? = null,
            variable: String? = null,
            label: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Edge =
            PartiqlLogical.GraphMatchPatternPart.Edge(
                direction = direction,
                quantifier = quantifier,
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                label = label.map { it.asPrimitive() },
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Edge].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun edge_(
            direction: GraphMatchDirection,
            quantifier: GraphMatchQuantifier? = null,
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            label: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Edge =
            PartiqlLogical.GraphMatchPatternPart.Edge(
                direction = direction,
                quantifier = quantifier,
                prefilter = prefilter,
                variable = variable,
                label = label,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Edge].
         */
        fun edge(
            direction: GraphMatchDirection,
            quantifier: GraphMatchQuantifier? = null,
            prefilter: Expr? = null,
            variable: String? = null,
            vararg label: String,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Edge =
            PartiqlLogical.GraphMatchPatternPart.Edge(
                direction = direction,
                quantifier = quantifier,
                prefilter = prefilter,
                variable = variable?.asPrimitive(),
                label = label.map { it.asPrimitive() },
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Edge].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun edge_(
            direction: GraphMatchDirection,
            quantifier: GraphMatchQuantifier? = null,
            prefilter: Expr? = null,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = null,
            vararg label: org.partiql.pig.runtime.SymbolPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Edge =
            PartiqlLogical.GraphMatchPatternPart.Edge(
                direction = direction,
                quantifier = quantifier,
                prefilter = prefilter,
                variable = variable,
                label = label.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchPatternPart.Pattern].
         */
        fun pattern(
            pattern: GraphMatchPattern,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchPatternPart.Pattern =
            PartiqlLogical.GraphMatchPatternPart.Pattern(
                pattern = pattern,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: GraphMatchRestrictor 
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchRestrictor.RestrictorTrail].
         */
        fun restrictorTrail(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchRestrictor.RestrictorTrail =
            PartiqlLogical.GraphMatchRestrictor.RestrictorTrail(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic].
         */
        fun restrictorAcyclic(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic =
            PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchRestrictor.RestrictorSimple].
         */
        fun restrictorSimple(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchRestrictor.RestrictorSimple =
            PartiqlLogical.GraphMatchRestrictor.RestrictorSimple(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: GraphMatchSelector 
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorAnyShortest].
         */
        fun selectorAnyShortest(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorAnyShortest =
            PartiqlLogical.GraphMatchSelector.SelectorAnyShortest(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorAllShortest].
         */
        fun selectorAllShortest(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorAllShortest =
            PartiqlLogical.GraphMatchSelector.SelectorAllShortest(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorAny].
         */
        fun selectorAny(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorAny =
            PartiqlLogical.GraphMatchSelector.SelectorAny(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorAnyK].
         */
        fun selectorAnyK(
            k: Long,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorAnyK =
            PartiqlLogical.GraphMatchSelector.SelectorAnyK(
                k = k.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorAnyK].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun selectorAnyK_(
            k: org.partiql.pig.runtime.LongPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorAnyK =
            PartiqlLogical.GraphMatchSelector.SelectorAnyK(
                k = k,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorShortestK].
         */
        fun selectorShortestK(
            k: Long,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorShortestK =
            PartiqlLogical.GraphMatchSelector.SelectorShortestK(
                k = k.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorShortestK].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun selectorShortestK_(
            k: org.partiql.pig.runtime.LongPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorShortestK =
            PartiqlLogical.GraphMatchSelector.SelectorShortestK(
                k = k,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup].
         */
        fun selectorShortestKGroup(
            k: Long,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup =
            PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup(
                k = k.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun selectorShortestKGroup_(
            k: org.partiql.pig.runtime.LongPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup =
            PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup(
                k = k,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: GroupingStrategy 
        /**
         * Creates an instance of [PartiqlLogical.GroupingStrategy.GroupFull].
         */
        fun groupFull(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GroupingStrategy.GroupFull =
            PartiqlLogical.GroupingStrategy.GroupFull(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.GroupingStrategy.GroupPartial].
         */
        fun groupPartial(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.GroupingStrategy.GroupPartial =
            PartiqlLogical.GroupingStrategy.GroupPartial(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: OrderingSpec 
        /**
         * Creates an instance of [PartiqlLogical.OrderingSpec.Asc].
         */
        fun asc(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.OrderingSpec.Asc =
            PartiqlLogical.OrderingSpec.Asc(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.OrderingSpec.Desc].
         */
        fun desc(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.OrderingSpec.Desc =
            PartiqlLogical.OrderingSpec.Desc(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: NullsSpec 
        /**
         * Creates an instance of [PartiqlLogical.NullsSpec.NullsFirst].
         */
        fun nullsFirst(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.NullsSpec.NullsFirst =
            PartiqlLogical.NullsSpec.NullsFirst(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.NullsSpec.NullsLast].
         */
        fun nullsLast(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.NullsSpec.NullsLast =
            PartiqlLogical.NullsSpec.NullsLast(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: CaseSensitivity 
        /**
         * Creates an instance of [PartiqlLogical.CaseSensitivity.CaseSensitive].
         */
        fun caseSensitive(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.CaseSensitivity.CaseSensitive =
            PartiqlLogical.CaseSensitivity.CaseSensitive(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.CaseSensitivity.CaseInsensitive].
         */
        fun caseInsensitive(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.CaseSensitivity.CaseInsensitive =
            PartiqlLogical.CaseSensitivity.CaseInsensitive(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: ScopeQualifier 
        /**
         * Creates an instance of [PartiqlLogical.ScopeQualifier.Unqualified].
         */
        fun unqualified(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ScopeQualifier.Unqualified =
            PartiqlLogical.ScopeQualifier.Unqualified(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.ScopeQualifier.LocalsFirst].
         */
        fun localsFirst(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.ScopeQualifier.LocalsFirst =
            PartiqlLogical.ScopeQualifier.LocalsFirst(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: SetQuantifier 
        /**
         * Creates an instance of [PartiqlLogical.SetQuantifier.All].
         */
        fun all(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.SetQuantifier.All =
            PartiqlLogical.SetQuantifier.All(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.SetQuantifier.Distinct].
         */
        fun distinct(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.SetQuantifier.Distinct =
            PartiqlLogical.SetQuantifier.Distinct(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: BagOpType 
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.Union].
         */
        fun union(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.Union =
            PartiqlLogical.BagOpType.Union(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.Intersect].
         */
        fun intersect(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.Intersect =
            PartiqlLogical.BagOpType.Intersect(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.Except].
         */
        fun except(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.Except =
            PartiqlLogical.BagOpType.Except(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.OuterUnion].
         */
        fun outerUnion(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.OuterUnion =
            PartiqlLogical.BagOpType.OuterUnion(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.OuterIntersect].
         */
        fun outerIntersect(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.OuterIntersect =
            PartiqlLogical.BagOpType.OuterIntersect(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.BagOpType.OuterExcept].
         */
        fun outerExcept(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.BagOpType.OuterExcept =
            PartiqlLogical.BagOpType.OuterExcept(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: OnConflictValue 
        /**
         * Creates an instance of [PartiqlLogical.OnConflictValue.Excluded].
         */
        fun excluded(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.OnConflictValue.Excluded =
            PartiqlLogical.OnConflictValue.Excluded(
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: Type 
        /**
         * Creates an instance of [PartiqlLogical.Type.NullType].
         */
        fun nullType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.NullType =
            PartiqlLogical.Type.NullType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.BooleanType].
         */
        fun booleanType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.BooleanType =
            PartiqlLogical.Type.BooleanType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.SmallintType].
         */
        fun smallintType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.SmallintType =
            PartiqlLogical.Type.SmallintType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.Integer4Type].
         */
        fun integer4Type(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.Integer4Type =
            PartiqlLogical.Type.Integer4Type(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.Integer8Type].
         */
        fun integer8Type(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.Integer8Type =
            PartiqlLogical.Type.Integer8Type(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.IntegerType].
         */
        fun integerType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.IntegerType =
            PartiqlLogical.Type.IntegerType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.FloatType].
         */
        fun floatType(
            precision: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.FloatType =
            PartiqlLogical.Type.FloatType(
                precision = precision?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.FloatType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun floatType_(
            precision: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.FloatType =
            PartiqlLogical.Type.FloatType(
                precision = precision,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.RealType].
         */
        fun realType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.RealType =
            PartiqlLogical.Type.RealType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.DoublePrecisionType].
         */
        fun doublePrecisionType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.DoublePrecisionType =
            PartiqlLogical.Type.DoublePrecisionType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.DecimalType].
         */
        fun decimalType(
            precision: Long? = null,
            scale: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.DecimalType =
            PartiqlLogical.Type.DecimalType(
                precision = precision?.asPrimitive(),
                scale = scale?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.DecimalType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun decimalType_(
            precision: org.partiql.pig.runtime.LongPrimitive? = null,
            scale: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.DecimalType =
            PartiqlLogical.Type.DecimalType(
                precision = precision,
                scale = scale,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.NumericType].
         */
        fun numericType(
            precision: Long? = null,
            scale: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.NumericType =
            PartiqlLogical.Type.NumericType(
                precision = precision?.asPrimitive(),
                scale = scale?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.NumericType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun numericType_(
            precision: org.partiql.pig.runtime.LongPrimitive? = null,
            scale: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.NumericType =
            PartiqlLogical.Type.NumericType(
                precision = precision,
                scale = scale,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TimestampType].
         */
        fun timestampType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TimestampType =
            PartiqlLogical.Type.TimestampType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CharacterType].
         */
        fun characterType(
            length: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CharacterType =
            PartiqlLogical.Type.CharacterType(
                length = length?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CharacterType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun characterType_(
            length: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CharacterType =
            PartiqlLogical.Type.CharacterType(
                length = length,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CharacterVaryingType].
         */
        fun characterVaryingType(
            length: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CharacterVaryingType =
            PartiqlLogical.Type.CharacterVaryingType(
                length = length?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CharacterVaryingType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun characterVaryingType_(
            length: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CharacterVaryingType =
            PartiqlLogical.Type.CharacterVaryingType(
                length = length,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.MissingType].
         */
        fun missingType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.MissingType =
            PartiqlLogical.Type.MissingType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.StringType].
         */
        fun stringType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.StringType =
            PartiqlLogical.Type.StringType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.SymbolType].
         */
        fun symbolType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.SymbolType =
            PartiqlLogical.Type.SymbolType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.BlobType].
         */
        fun blobType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.BlobType =
            PartiqlLogical.Type.BlobType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.ClobType].
         */
        fun clobType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.ClobType =
            PartiqlLogical.Type.ClobType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.DateType].
         */
        fun dateType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.DateType =
            PartiqlLogical.Type.DateType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TimeType].
         */
        fun timeType(
            precision: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TimeType =
            PartiqlLogical.Type.TimeType(
                precision = precision?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TimeType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun timeType_(
            precision: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TimeType =
            PartiqlLogical.Type.TimeType(
                precision = precision,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TimeWithTimeZoneType].
         */
        fun timeWithTimeZoneType(
            precision: Long? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TimeWithTimeZoneType =
            PartiqlLogical.Type.TimeWithTimeZoneType(
                precision = precision?.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TimeWithTimeZoneType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun timeWithTimeZoneType_(
            precision: org.partiql.pig.runtime.LongPrimitive? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TimeWithTimeZoneType =
            PartiqlLogical.Type.TimeWithTimeZoneType(
                precision = precision,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.StructType].
         */
        fun structType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.StructType =
            PartiqlLogical.Type.StructType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.TupleType].
         */
        fun tupleType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.TupleType =
            PartiqlLogical.Type.TupleType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.ListType].
         */
        fun listType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.ListType =
            PartiqlLogical.Type.ListType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.SexpType].
         */
        fun sexpType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.SexpType =
            PartiqlLogical.Type.SexpType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.BagType].
         */
        fun bagType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.BagType =
            PartiqlLogical.Type.BagType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.AnyType].
         */
        fun anyType(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.AnyType =
            PartiqlLogical.Type.AnyType(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CustomType].
         */
        fun customType(
            name: String,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CustomType =
            PartiqlLogical.Type.CustomType(
                name = name.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Type.CustomType].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun customType_(
            name: org.partiql.pig.runtime.SymbolPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Type.CustomType =
            PartiqlLogical.Type.CustomType(
                name = name,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: Expr 
        /**
         * Creates an instance of [PartiqlLogical.Expr.Missing].
         */
        fun missing(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Missing =
            PartiqlLogical.Expr.Missing(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Lit].
         */
        fun lit(
            value: com.amazon.ionelement.api.IonElement,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Lit =
            PartiqlLogical.Expr.Lit(
                value = value.asAnyElement(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Id].
         */
        fun id(
            name: String,
            case: CaseSensitivity,
            qualifier: ScopeQualifier,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Id =
            PartiqlLogical.Expr.Id(
                name = name.asPrimitive(),
                case = case,
                qualifier = qualifier,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Id].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun id_(
            name: org.partiql.pig.runtime.SymbolPrimitive,
            case: CaseSensitivity,
            qualifier: ScopeQualifier,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Id =
            PartiqlLogical.Expr.Id(
                name = name,
                case = case,
                qualifier = qualifier,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Parameter].
         */
        fun parameter(
            index: Long,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Parameter =
            PartiqlLogical.Expr.Parameter(
                index = index.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Parameter].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun parameter_(
            index: org.partiql.pig.runtime.LongPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Parameter =
            PartiqlLogical.Expr.Parameter(
                index = index,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Not].
         */
        fun not(
            expr: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Not =
            PartiqlLogical.Expr.Not(
                expr = expr,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Pos].
         */
        fun pos(
            expr: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Pos =
            PartiqlLogical.Expr.Pos(
                expr = expr,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Neg].
         */
        fun neg(
            expr: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Neg =
            PartiqlLogical.Expr.Neg(
                expr = expr,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Plus].
         */
        fun plus(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Plus =
            PartiqlLogical.Expr.Plus(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Plus].
         */
        fun plus(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Plus =
            PartiqlLogical.Expr.Plus(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Minus].
         */
        fun minus(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Minus =
            PartiqlLogical.Expr.Minus(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Minus].
         */
        fun minus(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Minus =
            PartiqlLogical.Expr.Minus(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Times].
         */
        fun times(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Times =
            PartiqlLogical.Expr.Times(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Times].
         */
        fun times(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Times =
            PartiqlLogical.Expr.Times(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Divide].
         */
        fun divide(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Divide =
            PartiqlLogical.Expr.Divide(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Divide].
         */
        fun divide(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Divide =
            PartiqlLogical.Expr.Divide(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Modulo].
         */
        fun modulo(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Modulo =
            PartiqlLogical.Expr.Modulo(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Modulo].
         */
        fun modulo(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Modulo =
            PartiqlLogical.Expr.Modulo(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Concat].
         */
        fun concat(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Concat =
            PartiqlLogical.Expr.Concat(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Concat].
         */
        fun concat(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Concat =
            PartiqlLogical.Expr.Concat(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.And].
         */
        fun and(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.And =
            PartiqlLogical.Expr.And(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.And].
         */
        fun and(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.And =
            PartiqlLogical.Expr.And(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Or].
         */
        fun or(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Or =
            PartiqlLogical.Expr.Or(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Or].
         */
        fun or(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Or =
            PartiqlLogical.Expr.Or(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Eq].
         */
        fun eq(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Eq =
            PartiqlLogical.Expr.Eq(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Eq].
         */
        fun eq(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Eq =
            PartiqlLogical.Expr.Eq(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Ne].
         */
        fun ne(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Ne =
            PartiqlLogical.Expr.Ne(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Ne].
         */
        fun ne(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Ne =
            PartiqlLogical.Expr.Ne(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Gt].
         */
        fun gt(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Gt =
            PartiqlLogical.Expr.Gt(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Gt].
         */
        fun gt(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Gt =
            PartiqlLogical.Expr.Gt(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Gte].
         */
        fun gte(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Gte =
            PartiqlLogical.Expr.Gte(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Gte].
         */
        fun gte(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Gte =
            PartiqlLogical.Expr.Gte(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Lt].
         */
        fun lt(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Lt =
            PartiqlLogical.Expr.Lt(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Lt].
         */
        fun lt(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Lt =
            PartiqlLogical.Expr.Lt(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Lte].
         */
        fun lte(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Lte =
            PartiqlLogical.Expr.Lte(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Lte].
         */
        fun lte(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Lte =
            PartiqlLogical.Expr.Lte(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Like].
         */
        fun like(
            value: Expr,
            pattern: Expr,
            escape: Expr? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Like =
            PartiqlLogical.Expr.Like(
                value = value,
                pattern = pattern,
                escape = escape,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Between].
         */
        fun between(
            value: Expr,
            from: Expr,
            to: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Between =
            PartiqlLogical.Expr.Between(
                value = value,
                from = from,
                to = to,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.InCollection].
         */
        fun inCollection(
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.InCollection =
            PartiqlLogical.Expr.InCollection(
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.InCollection].
         */
        fun inCollection(
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.InCollection =
            PartiqlLogical.Expr.InCollection(
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.IsType].
         */
        fun isType(
            value: Expr,
            type: Type,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.IsType =
            PartiqlLogical.Expr.IsType(
                value = value,
                type = type,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.SimpleCase].
         */
        fun simpleCase(
            expr: Expr,
            cases: ExprPairList,
            default: Expr? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.SimpleCase =
            PartiqlLogical.Expr.SimpleCase(
                expr = expr,
                cases = cases,
                default = default,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.SearchedCase].
         */
        fun searchedCase(
            cases: ExprPairList,
            default: Expr? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.SearchedCase =
            PartiqlLogical.Expr.SearchedCase(
                cases = cases,
                default = default,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Bag].
         */
        fun bag(
            values: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Bag =
            PartiqlLogical.Expr.Bag(
                values = values,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Bag].
         */
        fun bag(
            vararg values: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Bag =
            PartiqlLogical.Expr.Bag(
                values = values.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.List].
         */
        fun list(
            values: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.List =
            PartiqlLogical.Expr.List(
                values = values,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.List].
         */
        fun list(
            vararg values: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.List =
            PartiqlLogical.Expr.List(
                values = values.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Sexp].
         */
        fun sexp(
            values: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Sexp =
            PartiqlLogical.Expr.Sexp(
                values = values,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Sexp].
         */
        fun sexp(
            vararg values: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Sexp =
            PartiqlLogical.Expr.Sexp(
                values = values.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Date].
         */
        fun date(
            year: Long,
            month: Long,
            day: Long,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Date =
            PartiqlLogical.Expr.Date(
                year = year.asPrimitive(),
                month = month.asPrimitive(),
                day = day.asPrimitive(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Date].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun date_(
            year: org.partiql.pig.runtime.LongPrimitive,
            month: org.partiql.pig.runtime.LongPrimitive,
            day: org.partiql.pig.runtime.LongPrimitive,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Date =
            PartiqlLogical.Expr.Date(
                year = year,
                month = month,
                day = day,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.LitTime].
         */
        fun litTime(
            value: TimeValue,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.LitTime =
            PartiqlLogical.Expr.LitTime(
                value = value,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.BagOp].
         */
        fun bagOp(
            op: BagOpType,
            quantifier: SetQuantifier,
            operands: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.BagOp =
            PartiqlLogical.Expr.BagOp(
                op = op,
                quantifier = quantifier,
                operands = operands,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.BagOp].
         */
        fun bagOp(
            op: BagOpType,
            quantifier: SetQuantifier,
            operands0: Expr,
            operands1: Expr,
            vararg operands: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.BagOp =
            PartiqlLogical.Expr.BagOp(
                op = op,
                quantifier = quantifier,
                operands = listOf(operands0, operands1) + operands.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.GraphMatch].
         */
        fun graphMatch(
            expr: Expr,
            gpmlPattern: GpmlPattern,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.GraphMatch =
            PartiqlLogical.Expr.GraphMatch(
                expr = expr,
                gpmlPattern = gpmlPattern,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Path].
         */
        fun path(
            root: Expr,
            steps: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Path =
            PartiqlLogical.Expr.Path(
                root = root,
                steps = steps,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Path].
         */
        fun path(
            root: Expr,
            steps0: PathStep,
            vararg steps: PathStep,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Path =
            PartiqlLogical.Expr.Path(
                root = root,
                steps = listOf(steps0) + steps.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Call].
         */
        fun call(
            funcName: String,
            args: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Call =
            PartiqlLogical.Expr.Call(
                funcName = funcName.asPrimitive(),
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Call].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun call_(
            funcName: org.partiql.pig.runtime.SymbolPrimitive,
            args: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Call =
            PartiqlLogical.Expr.Call(
                funcName = funcName,
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Call].
         */
        fun call(
            funcName: String,
            args0: Expr,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Call =
            PartiqlLogical.Expr.Call(
                funcName = funcName?.asPrimitive(),
                args = listOf(args0) + args.toList(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Call].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun call_(
            funcName: org.partiql.pig.runtime.SymbolPrimitive,
            args0: Expr,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Call =
            PartiqlLogical.Expr.Call(
                funcName = funcName,
                args = listOf(args0) + args.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Cast].
         */
        fun cast(
            value: Expr,
            asType: Type,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Cast =
            PartiqlLogical.Expr.Cast(
                value = value,
                asType = asType,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.CanCast].
         */
        fun canCast(
            value: Expr,
            asType: Type,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.CanCast =
            PartiqlLogical.Expr.CanCast(
                value = value,
                asType = asType,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.CanLosslessCast].
         */
        fun canLosslessCast(
            value: Expr,
            asType: Type,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.CanLosslessCast =
            PartiqlLogical.Expr.CanLosslessCast(
                value = value,
                asType = asType,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.NullIf].
         */
        fun nullIf(
            expr1: Expr,
            expr2: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.NullIf =
            PartiqlLogical.Expr.NullIf(
                expr1 = expr1,
                expr2 = expr2,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Coalesce].
         */
        fun coalesce(
            args: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Coalesce =
            PartiqlLogical.Expr.Coalesce(
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Coalesce].
         */
        fun coalesce(
            args0: Expr,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Coalesce =
            PartiqlLogical.Expr.Coalesce(
                args = listOf(args0) + args.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.BindingsToValues].
         */
        fun bindingsToValues(
            exp: Expr,
            query: Bexpr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.BindingsToValues =
            PartiqlLogical.Expr.BindingsToValues(
                exp = exp,
                query = query,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Struct].
         */
        fun struct(
            parts: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Struct =
            PartiqlLogical.Expr.Struct(
                parts = parts,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Struct].
         */
        fun struct(
            parts0: StructPart,
            vararg parts: StructPart,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Struct =
            PartiqlLogical.Expr.Struct(
                parts = listOf(parts0) + parts.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Expr.Pivot].
         */
        fun pivot(
            input: Bexpr,
            key: Expr,
            value: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Expr.Pivot =
            PartiqlLogical.Expr.Pivot(
                input = input,
                key = key,
                value = value,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: Statement 
        /**
         * Creates an instance of [PartiqlLogical.Statement.Query].
         */
        fun query(
            expr: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Query =
            PartiqlLogical.Statement.Query(
                expr = expr,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Exec].
         */
        fun exec(
            procedureName: String,
            args: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Exec =
            PartiqlLogical.Statement.Exec(
                procedureName = procedureName.asPrimitive(),
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Exec].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun exec_(
            procedureName: org.partiql.pig.runtime.SymbolPrimitive,
            args: kotlin.collections.List = emptyList(),
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Exec =
            PartiqlLogical.Statement.Exec(
                procedureName = procedureName,
                args = args,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Exec].
         */
        fun exec(
            procedureName: String,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Exec =
            PartiqlLogical.Statement.Exec(
                procedureName = procedureName?.asPrimitive(),
                args = args.toList(),
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Exec].
         *
         * Use this variant when metas must be passed to primitive child elements.
         *
         * (The "_" suffix is needed to work-around conflicts due to type erasure and ambiguities with null arguments.)
         */
        fun exec_(
            procedureName: org.partiql.pig.runtime.SymbolPrimitive,
            vararg args: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Exec =
            PartiqlLogical.Statement.Exec(
                procedureName = procedureName,
                args = args.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Explain].
         */
        fun explain(
            target: ExplainTarget,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Explain =
            PartiqlLogical.Statement.Explain(
                target = target,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Statement.Dml].
         */
        fun dml(
            target: Identifier,
            operation: DmlOperation,
            rows: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Statement.Dml =
            PartiqlLogical.Statement.Dml(
                target = target,
                operation = operation,
                rows = rows,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: StructPart 
        /**
         * Creates an instance of [PartiqlLogical.StructPart.StructFields].
         */
        fun structFields(
            partExpr: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.StructPart.StructFields =
            PartiqlLogical.StructPart.StructFields(
                partExpr = partExpr,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.StructPart.StructField].
         */
        fun structField(
            fieldName: Expr,
            value: Expr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.StructPart.StructField =
            PartiqlLogical.StructPart.StructField(
                fieldName = fieldName,
                value = value,
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: Bexpr 
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Scan].
         */
        fun scan(
            expr: Expr,
            asDecl: VarDecl,
            atDecl: VarDecl? = null,
            byDecl: VarDecl? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Scan =
            PartiqlLogical.Bexpr.Scan(
                expr = expr,
                asDecl = asDecl,
                atDecl = atDecl,
                byDecl = byDecl,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Unpivot].
         */
        fun unpivot(
            expr: Expr,
            asDecl: VarDecl,
            atDecl: VarDecl? = null,
            byDecl: VarDecl? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Unpivot =
            PartiqlLogical.Bexpr.Unpivot(
                expr = expr,
                asDecl = asDecl,
                atDecl = atDecl,
                byDecl = byDecl,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Filter].
         */
        fun filter(
            predicate: Expr,
            source: Bexpr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Filter =
            PartiqlLogical.Bexpr.Filter(
                predicate = predicate,
                source = source,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Aggregate].
         */
        fun aggregate(
            source: Bexpr,
            strategy: GroupingStrategy,
            groupList: GroupKeyList,
            functionList: AggregateFunctionList,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Aggregate =
            PartiqlLogical.Bexpr.Aggregate(
                source = source,
                strategy = strategy,
                groupList = groupList,
                functionList = functionList,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Join].
         */
        fun join(
            joinType: JoinType,
            left: Bexpr,
            right: Bexpr,
            predicate: Expr? = null,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Join =
            PartiqlLogical.Bexpr.Join(
                joinType = joinType,
                left = left,
                right = right,
                predicate = predicate,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Window].
         */
        fun window(
            source: Bexpr,
            windowSpecification: Over,
            windowExpressionList: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Window =
            PartiqlLogical.Bexpr.Window(
                source = source,
                windowSpecification = windowSpecification,
                windowExpressionList = windowExpressionList,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Window].
         */
        fun window(
            source: Bexpr,
            windowSpecification: Over,
            windowExpressionList0: WindowExpression,
            vararg windowExpressionList: WindowExpression,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Window =
            PartiqlLogical.Bexpr.Window(
                source = source,
                windowSpecification = windowSpecification,
                windowExpressionList = listOf(windowExpressionList0) + windowExpressionList.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Sort].
         */
        fun sort(
            source: Bexpr,
            sortSpecs: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Sort =
            PartiqlLogical.Bexpr.Sort(
                source = source,
                sortSpecs = sortSpecs,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Sort].
         */
        fun sort(
            source: Bexpr,
            sortSpecs0: SortSpec,
            vararg sortSpecs: SortSpec,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Sort =
            PartiqlLogical.Bexpr.Sort(
                source = source,
                sortSpecs = listOf(sortSpecs0) + sortSpecs.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Offset].
         */
        fun offset(
            rowCount: Expr,
            source: Bexpr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Offset =
            PartiqlLogical.Bexpr.Offset(
                rowCount = rowCount,
                source = source,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Limit].
         */
        fun limit(
            rowCount: Expr,
            source: Bexpr,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Limit =
            PartiqlLogical.Bexpr.Limit(
                rowCount = rowCount,
                source = source,
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Let].
         */
        fun let(
            source: Bexpr,
            bindings: kotlin.collections.List,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Let =
            PartiqlLogical.Bexpr.Let(
                source = source,
                bindings = bindings,
                metas = newMetaContainer() + metas
            )
        
        /**
         * Creates an instance of [PartiqlLogical.Bexpr.Let].
         */
        fun let(
            source: Bexpr,
            bindings0: LetBinding,
            vararg bindings: LetBinding,
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.Bexpr.Let =
            PartiqlLogical.Bexpr.Let(
                source = source,
                bindings = listOf(bindings0) + bindings.toList(),
                metas = newMetaContainer() + metas
            )
        
        
        // Variants for Sum: DmlOperation 
        /**
         * Creates an instance of [PartiqlLogical.DmlOperation.DmlInsert].
         */
        fun dmlInsert(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.DmlOperation.DmlInsert =
            PartiqlLogical.DmlOperation.DmlInsert(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.DmlOperation.DmlDelete].
         */
        fun dmlDelete(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.DmlOperation.DmlDelete =
            PartiqlLogical.DmlOperation.DmlDelete(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.DmlOperation.DmlReplace].
         */
        fun dmlReplace(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.DmlOperation.DmlReplace =
            PartiqlLogical.DmlOperation.DmlReplace(
                metas = newMetaContainer() + metas
            )
        
        
        /**
         * Creates an instance of [PartiqlLogical.DmlOperation.DmlUpdate].
         */
        fun dmlUpdate(
            metas: MetaContainer = emptyMetaContainer()
        ): PartiqlLogical.DmlOperation.DmlUpdate =
            PartiqlLogical.DmlOperation.DmlUpdate(
                metas = newMetaContainer() + metas
            )
    }
    
    /** Default implementation of [Builder] that uses all default method implementations. */
    private object PartiqlLogicalBuilder : Builder
    
    /** Base class for all PartiqlLogical types. */
    abstract class PartiqlLogicalNode : DomainNode {
        abstract override fun copy(metas: MetaContainer): PartiqlLogicalNode
        override fun toString() = toIonElement().toString()
        abstract override fun withMeta(metaKey: String, metaValue: Any): PartiqlLogicalNode
        abstract override fun toIonElement(): SexpElement
    }
    
    
    /////////////////////////////////////////////////////////////////////////////
    // Tuple Types
    /////////////////////////////////////////////////////////////////////////////
    class TimeValue(
        val hour: org.partiql.pig.runtime.LongPrimitive,
        val minute: org.partiql.pig.runtime.LongPrimitive,
        val second: org.partiql.pig.runtime.LongPrimitive,
        val nano: org.partiql.pig.runtime.LongPrimitive,
        val precision: org.partiql.pig.runtime.LongPrimitive,
        val withTimeZone: org.partiql.pig.runtime.BoolPrimitive,
        val tzMinutes: org.partiql.pig.runtime.LongPrimitive?,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): TimeValue =
            TimeValue(
                hour = hour,
                minute = minute,
                second = second,
                nano = nano,
                precision = precision,
                withTimeZone = withTimeZone,
                tzMinutes = tzMinutes,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): TimeValue =
            TimeValue(
                hour = hour,
                minute = minute,
                second = second,
                nano = nano,
                precision = precision,
                withTimeZone = withTimeZone,
                tzMinutes = tzMinutes,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("time_value"),
                hour.toIonElement(),
                minute.toIonElement(),
                second.toIonElement(),
                nano.toIonElement(),
                precision.toIonElement(),
                withTimeZone.toIonElement(),
                tzMinutes?.toIonElement() ?: ionNull(),
                metas = metas)
            return elements
        }
    
        fun copy(
            hour: org.partiql.pig.runtime.LongPrimitive = this.hour,
            minute: org.partiql.pig.runtime.LongPrimitive = this.minute,
            second: org.partiql.pig.runtime.LongPrimitive = this.second,
            nano: org.partiql.pig.runtime.LongPrimitive = this.nano,
            precision: org.partiql.pig.runtime.LongPrimitive = this.precision,
            withTimeZone: org.partiql.pig.runtime.BoolPrimitive = this.withTimeZone,
            tzMinutes: org.partiql.pig.runtime.LongPrimitive? = this.tzMinutes,
            metas: MetaContainer = this.metas
        ) =
            TimeValue(
                hour,
                minute,
                second,
                nano,
                precision,
                withTimeZone,
                tzMinutes,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != TimeValue::class.java) return false
    
            other as TimeValue
            if (hour != other.hour) return false
            if (minute != other.minute) return false
            if (second != other.second) return false
            if (nano != other.nano) return false
            if (precision != other.precision) return false
            if (withTimeZone != other.withTimeZone) return false
            if (tzMinutes != other.tzMinutes) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = hour.hashCode()
            hc = 31 * hc + minute.hashCode()
            hc = 31 * hc + second.hashCode()
            hc = 31 * hc + nano.hashCode()
            hc = 31 * hc + precision.hashCode()
            hc = 31 * hc + withTimeZone.hashCode()
            hc = 31 * hc + tzMinutes.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class GraphMatchQuantifier(
        val lower: org.partiql.pig.runtime.LongPrimitive,
        val upper: org.partiql.pig.runtime.LongPrimitive?,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): GraphMatchQuantifier =
            GraphMatchQuantifier(
                lower = lower,
                upper = upper,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): GraphMatchQuantifier =
            GraphMatchQuantifier(
                lower = lower,
                upper = upper,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("graph_match_quantifier"),
                lower.toIonElement(),
                upper?.toIonElement() ?: ionNull(),
                metas = metas)
            return elements
        }
    
        fun copy(
            lower: org.partiql.pig.runtime.LongPrimitive = this.lower,
            upper: org.partiql.pig.runtime.LongPrimitive? = this.upper,
            metas: MetaContainer = this.metas
        ) =
            GraphMatchQuantifier(
                lower,
                upper,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != GraphMatchQuantifier::class.java) return false
    
            other as GraphMatchQuantifier
            if (lower != other.lower) return false
            if (upper != other.upper) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = lower.hashCode()
            hc = 31 * hc + upper.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class GraphMatchPattern(
        val restrictor: GraphMatchRestrictor?,
        val prefilter: Expr?,
        val variable: org.partiql.pig.runtime.SymbolPrimitive?,
        val quantifier: GraphMatchQuantifier?,
        val parts: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): GraphMatchPattern =
            GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable,
                quantifier = quantifier,
                parts = parts,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): GraphMatchPattern =
            GraphMatchPattern(
                restrictor = restrictor,
                prefilter = prefilter,
                variable = variable,
                quantifier = quantifier,
                parts = parts,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("graph_match_pattern"),
                restrictor?.toIonElement() ?: ionNull(),
                prefilter?.toIonElement() ?: ionNull(),
                variable?.toIonElement() ?: ionNull(),
                quantifier?.toIonElement() ?: ionNull(),
                *parts.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            restrictor: GraphMatchRestrictor? = this.restrictor,
            prefilter: Expr? = this.prefilter,
            variable: org.partiql.pig.runtime.SymbolPrimitive? = this.variable,
            quantifier: GraphMatchQuantifier? = this.quantifier,
            parts: kotlin.collections.List = this.parts,
            metas: MetaContainer = this.metas
        ) =
            GraphMatchPattern(
                restrictor,
                prefilter,
                variable,
                quantifier,
                parts,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != GraphMatchPattern::class.java) return false
    
            other as GraphMatchPattern
            if (restrictor != other.restrictor) return false
            if (prefilter != other.prefilter) return false
            if (variable != other.variable) return false
            if (quantifier != other.quantifier) return false
            if (parts != other.parts) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = restrictor.hashCode()
            hc = 31 * hc + prefilter.hashCode()
            hc = 31 * hc + variable.hashCode()
            hc = 31 * hc + quantifier.hashCode()
            hc = 31 * hc + parts.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class GpmlPattern(
        val selector: GraphMatchSelector?,
        val patterns: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): GpmlPattern =
            GpmlPattern(
                selector = selector,
                patterns = patterns,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): GpmlPattern =
            GpmlPattern(
                selector = selector,
                patterns = patterns,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("gpml_pattern"),
                selector?.toIonElement() ?: ionNull(),
                *patterns.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            selector: GraphMatchSelector? = this.selector,
            patterns: kotlin.collections.List = this.patterns,
            metas: MetaContainer = this.metas
        ) =
            GpmlPattern(
                selector,
                patterns,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != GpmlPattern::class.java) return false
    
            other as GpmlPattern
            if (selector != other.selector) return false
            if (patterns != other.patterns) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = selector.hashCode()
            hc = 31 * hc + patterns.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class ExprPair(
        val first: Expr,
        val second: Expr,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): ExprPair =
            ExprPair(
                first = first,
                second = second,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): ExprPair =
            ExprPair(
                first = first,
                second = second,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("expr_pair"),
                first.toIonElement(),
                second.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            first: Expr = this.first,
            second: Expr = this.second,
            metas: MetaContainer = this.metas
        ) =
            ExprPair(
                first,
                second,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != ExprPair::class.java) return false
    
            other as ExprPair
            if (first != other.first) return false
            if (second != other.second) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = first.hashCode()
            hc = 31 * hc + second.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class ExprPairList(
        val pairs: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): ExprPairList =
            ExprPairList(
                pairs = pairs,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): ExprPairList =
            ExprPairList(
                pairs = pairs,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("expr_pair_list"),
                *pairs.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            pairs: kotlin.collections.List = this.pairs,
            metas: MetaContainer = this.metas
        ) =
            ExprPairList(
                pairs,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != ExprPairList::class.java) return false
    
            other as ExprPairList
            if (pairs != other.pairs) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = pairs.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class SortSpec(
        val expr: Expr,
        val orderingSpec: OrderingSpec?,
        val nullsSpec: NullsSpec?,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): SortSpec =
            SortSpec(
                expr = expr,
                orderingSpec = orderingSpec,
                nullsSpec = nullsSpec,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): SortSpec =
            SortSpec(
                expr = expr,
                orderingSpec = orderingSpec,
                nullsSpec = nullsSpec,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("sort_spec"),
                expr.toIonElement(),
                orderingSpec?.toIonElement() ?: ionNull(),
                nullsSpec?.toIonElement() ?: ionNull(),
                metas = metas)
            return elements
        }
    
        fun copy(
            expr: Expr = this.expr,
            orderingSpec: OrderingSpec? = this.orderingSpec,
            nullsSpec: NullsSpec? = this.nullsSpec,
            metas: MetaContainer = this.metas
        ) =
            SortSpec(
                expr,
                orderingSpec,
                nullsSpec,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != SortSpec::class.java) return false
    
            other as SortSpec
            if (expr != other.expr) return false
            if (orderingSpec != other.orderingSpec) return false
            if (nullsSpec != other.nullsSpec) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = expr.hashCode()
            hc = 31 * hc + orderingSpec.hashCode()
            hc = 31 * hc + nullsSpec.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class Over(
        val partitionBy: WindowPartitionList?,
        val orderBy: WindowSortSpecList?,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): Over =
            Over(
                partitionBy = partitionBy,
                orderBy = orderBy,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): Over =
            Over(
                partitionBy = partitionBy,
                orderBy = orderBy,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("over"),
                partitionBy?.toIonElement() ?: ionNull(),
                orderBy?.toIonElement() ?: ionNull(),
                metas = metas)
            return elements
        }
    
        fun copy(
            partitionBy: WindowPartitionList? = this.partitionBy,
            orderBy: WindowSortSpecList? = this.orderBy,
            metas: MetaContainer = this.metas
        ) =
            Over(
                partitionBy,
                orderBy,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != Over::class.java) return false
    
            other as Over
            if (partitionBy != other.partitionBy) return false
            if (orderBy != other.orderBy) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = partitionBy.hashCode()
            hc = 31 * hc + orderBy.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class WindowPartitionList(
        val exprs: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): WindowPartitionList =
            WindowPartitionList(
                exprs = exprs,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): WindowPartitionList =
            WindowPartitionList(
                exprs = exprs,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("window_partition_list"),
                *exprs.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            exprs: kotlin.collections.List = this.exprs,
            metas: MetaContainer = this.metas
        ) =
            WindowPartitionList(
                exprs,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != WindowPartitionList::class.java) return false
    
            other as WindowPartitionList
            if (exprs != other.exprs) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = exprs.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class WindowSortSpecList(
        val sortSpecs: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): WindowSortSpecList =
            WindowSortSpecList(
                sortSpecs = sortSpecs,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): WindowSortSpecList =
            WindowSortSpecList(
                sortSpecs = sortSpecs,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("window_sort_spec_list"),
                *sortSpecs.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            sortSpecs: kotlin.collections.List = this.sortSpecs,
            metas: MetaContainer = this.metas
        ) =
            WindowSortSpecList(
                sortSpecs,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != WindowSortSpecList::class.java) return false
    
            other as WindowSortSpecList
            if (sortSpecs != other.sortSpecs) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = sortSpecs.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class Identifier(
        val name: org.partiql.pig.runtime.SymbolPrimitive,
        val case: CaseSensitivity,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): Identifier =
            Identifier(
                name = name,
                case = case,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): Identifier =
            Identifier(
                name = name,
                case = case,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("identifier"),
                name.toIonElement(),
                case.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            name: org.partiql.pig.runtime.SymbolPrimitive = this.name,
            case: CaseSensitivity = this.case,
            metas: MetaContainer = this.metas
        ) =
            Identifier(
                name,
                case,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != Identifier::class.java) return false
    
            other as Identifier
            if (name != other.name) return false
            if (case != other.case) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = name.hashCode()
            hc = 31 * hc + case.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class Plan(
        val stmt: Statement,
        val version: org.partiql.pig.runtime.SymbolPrimitive,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): Plan =
            Plan(
                stmt = stmt,
                version = version,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): Plan =
            Plan(
                stmt = stmt,
                version = version,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = listOfNotNull(
                ionSymbol("plan"),
                stmt?.let { ionSexpOf(ionSymbol("stmt"), it.toIonElement()) },
                version?.let { ionSexpOf(ionSymbol("version"), it.toIonElement()) }
            )
    
            return ionSexpOf(elements, metas = metas)
        }
    
        fun copy(
            stmt: Statement = this.stmt,
            version: org.partiql.pig.runtime.SymbolPrimitive = this.version,
            metas: MetaContainer = this.metas
        ) =
            Plan(
                stmt,
                version,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != Plan::class.java) return false
    
            other as Plan
            if (stmt != other.stmt) return false
            if (version != other.version) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = stmt.hashCode()
            hc = 31 * hc + version.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class LetBinding(
        val value: Expr,
        val decl: VarDecl,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): LetBinding =
            LetBinding(
                value = value,
                decl = decl,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): LetBinding =
            LetBinding(
                value = value,
                decl = decl,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("let_binding"),
                value.toIonElement(),
                decl.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            value: Expr = this.value,
            decl: VarDecl = this.decl,
            metas: MetaContainer = this.metas
        ) =
            LetBinding(
                value,
                decl,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != LetBinding::class.java) return false
    
            other as LetBinding
            if (value != other.value) return false
            if (decl != other.decl) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = value.hashCode()
            hc = 31 * hc + decl.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class GroupKey(
        val expr: Expr,
        val asVar: VarDecl,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): GroupKey =
            GroupKey(
                expr = expr,
                asVar = asVar,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): GroupKey =
            GroupKey(
                expr = expr,
                asVar = asVar,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("group_key"),
                expr.toIonElement(),
                asVar.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            expr: Expr = this.expr,
            asVar: VarDecl = this.asVar,
            metas: MetaContainer = this.metas
        ) =
            GroupKey(
                expr,
                asVar,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != GroupKey::class.java) return false
    
            other as GroupKey
            if (expr != other.expr) return false
            if (asVar != other.asVar) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = expr.hashCode()
            hc = 31 * hc + asVar.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class GroupKeyList(
        val keys: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): GroupKeyList =
            GroupKeyList(
                keys = keys,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): GroupKeyList =
            GroupKeyList(
                keys = keys,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("group_key_list"),
                *keys.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            keys: kotlin.collections.List = this.keys,
            metas: MetaContainer = this.metas
        ) =
            GroupKeyList(
                keys,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != GroupKeyList::class.java) return false
    
            other as GroupKeyList
            if (keys != other.keys) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = keys.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class AggregateFunction(
        val quantifier: SetQuantifier,
        val name: org.partiql.pig.runtime.SymbolPrimitive,
        val arg: Expr,
        val asVar: VarDecl,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): AggregateFunction =
            AggregateFunction(
                quantifier = quantifier,
                name = name,
                arg = arg,
                asVar = asVar,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): AggregateFunction =
            AggregateFunction(
                quantifier = quantifier,
                name = name,
                arg = arg,
                asVar = asVar,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("aggregate_function"),
                quantifier.toIonElement(),
                name.toIonElement(),
                arg.toIonElement(),
                asVar.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            quantifier: SetQuantifier = this.quantifier,
            name: org.partiql.pig.runtime.SymbolPrimitive = this.name,
            arg: Expr = this.arg,
            asVar: VarDecl = this.asVar,
            metas: MetaContainer = this.metas
        ) =
            AggregateFunction(
                quantifier,
                name,
                arg,
                asVar,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != AggregateFunction::class.java) return false
    
            other as AggregateFunction
            if (quantifier != other.quantifier) return false
            if (name != other.name) return false
            if (arg != other.arg) return false
            if (asVar != other.asVar) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = quantifier.hashCode()
            hc = 31 * hc + name.hashCode()
            hc = 31 * hc + arg.hashCode()
            hc = 31 * hc + asVar.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class AggregateFunctionList(
        val functions: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): AggregateFunctionList =
            AggregateFunctionList(
                functions = functions,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): AggregateFunctionList =
            AggregateFunctionList(
                functions = functions,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("aggregate_function_list"),
                *functions.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            functions: kotlin.collections.List = this.functions,
            metas: MetaContainer = this.metas
        ) =
            AggregateFunctionList(
                functions,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != AggregateFunctionList::class.java) return false
    
            other as AggregateFunctionList
            if (functions != other.functions) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = functions.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class WindowExpression(
        val decl: VarDecl,
        val funcName: org.partiql.pig.runtime.SymbolPrimitive,
        val args: kotlin.collections.List,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): WindowExpression =
            WindowExpression(
                decl = decl,
                funcName = funcName,
                args = args,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): WindowExpression =
            WindowExpression(
                decl = decl,
                funcName = funcName,
                args = args,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("window_expression"),
                decl.toIonElement(),
                funcName.toIonElement(),
                *args.map { it.toIonElement() }.toTypedArray(),
                metas = metas)
            return elements
        }
    
        fun copy(
            decl: VarDecl = this.decl,
            funcName: org.partiql.pig.runtime.SymbolPrimitive = this.funcName,
            args: kotlin.collections.List = this.args,
            metas: MetaContainer = this.metas
        ) =
            WindowExpression(
                decl,
                funcName,
                args,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != WindowExpression::class.java) return false
    
            other as WindowExpression
            if (decl != other.decl) return false
            if (funcName != other.funcName) return false
            if (args != other.args) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = decl.hashCode()
            hc = 31 * hc + funcName.hashCode()
            hc = 31 * hc + args.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    class VarDecl(
        val name: org.partiql.pig.runtime.SymbolPrimitive,
        override val metas: MetaContainer = emptyMetaContainer()
    ): PartiqlLogicalNode() {
    
        override fun copy(metas: MetaContainer): VarDecl =
            VarDecl(
                name = name,
                metas = metas)
    
        override fun withMeta(metaKey: String, metaValue: Any): VarDecl =
            VarDecl(
                name = name,
                metas = metas + metaContainerOf(metaKey to metaValue))
    
        override fun toIonElement(): SexpElement {
            val elements = ionSexpOf(
                ionSymbol("var_decl"),
                name.toIonElement(),
                metas = metas)
            return elements
        }
    
        fun copy(
            name: org.partiql.pig.runtime.SymbolPrimitive = this.name,
            metas: MetaContainer = this.metas
        ) =
            VarDecl(
                name,
                metas)
    
        override fun equals(other: Any?): Boolean {
            if (other == null) return false
            if (this === other) return true
            if (other.javaClass != VarDecl::class.java) return false
    
            other as VarDecl
            if (name != other.name) return false
            return true
        }
    
        private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
            var hc = name.hashCode()
            hc
        }
    
        override fun hashCode(): Int = myHashCode
    }
    
    
    /////////////////////////////////////////////////////////////////////////////
    // Sum Types
    /////////////////////////////////////////////////////////////////////////////
    
    sealed class ExplainTarget(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): ExplainTarget =
            when (this) {
                is Domain -> copy(metas = metas)
            }
    
        class Domain(
            val statement: Statement,
            val type: org.partiql.pig.runtime.SymbolPrimitive?,
            val format: org.partiql.pig.runtime.SymbolPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): ExplainTarget() {
        
            override fun copy(metas: MetaContainer): Domain =
                Domain(
                    statement = statement,
                    type = type,
                    format = format,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Domain =
                Domain(
                    statement = statement,
                    type = type,
                    format = format,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("domain"),
                    statement.toIonElement(),
                    type?.toIonElement() ?: ionNull(),
                    format?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                statement: Statement = this.statement,
                type: org.partiql.pig.runtime.SymbolPrimitive? = this.type,
                format: org.partiql.pig.runtime.SymbolPrimitive? = this.format,
                metas: MetaContainer = this.metas
            ) =
                Domain(
                    statement,
                    type,
                    format,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Domain::class.java) return false
        
                other as Domain
                if (statement != other.statement) return false
                if (type != other.type) return false
                if (format != other.format) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = statement.hashCode()
                hc = 31 * hc + type.hashCode()
                hc = 31 * hc + format.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.ExplainTarget] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.ExplainTarget): T = when(node) {
                is PartiqlLogical.ExplainTarget.Domain -> convertDomain(node)
            }
    
            fun convertDomain(node: PartiqlLogical.ExplainTarget.Domain): T
        }
    }
    
    sealed class PathStep(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): PathStep =
            when (this) {
                is PathExpr -> copy(metas = metas)
                is PathWildcard -> copy(metas = metas)
                is PathUnpivot -> copy(metas = metas)
            }
    
        class PathExpr(
            val index: Expr,
            val case: CaseSensitivity,
            override val metas: MetaContainer = emptyMetaContainer()
        ): PathStep() {
        
            override fun copy(metas: MetaContainer): PathExpr =
                PathExpr(
                    index = index,
                    case = case,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): PathExpr =
                PathExpr(
                    index = index,
                    case = case,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("path_expr"),
                    index.toIonElement(),
                    case.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                index: Expr = this.index,
                case: CaseSensitivity = this.case,
                metas: MetaContainer = this.metas
            ) =
                PathExpr(
                    index,
                    case,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != PathExpr::class.java) return false
        
                other as PathExpr
                if (index != other.index) return false
                if (case != other.case) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = index.hashCode()
                hc = 31 * hc + case.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class PathWildcard(
            override val metas: MetaContainer = emptyMetaContainer()
        ): PathStep() {
        
            override fun copy(metas: MetaContainer): PathWildcard =
                PathWildcard(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): PathWildcard =
                PathWildcard(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("path_wildcard"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != PathWildcard::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 2001
        }
    
        class PathUnpivot(
            override val metas: MetaContainer = emptyMetaContainer()
        ): PathStep() {
        
            override fun copy(metas: MetaContainer): PathUnpivot =
                PathUnpivot(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): PathUnpivot =
                PathUnpivot(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("path_unpivot"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != PathUnpivot::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 2002
        }
    
        /** Converts instances of [PartiqlLogical.PathStep] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.PathStep): T = when(node) {
                is PartiqlLogical.PathStep.PathExpr -> convertPathExpr(node)
                is PartiqlLogical.PathStep.PathWildcard -> convertPathWildcard(node)
                is PartiqlLogical.PathStep.PathUnpivot -> convertPathUnpivot(node)
            }
    
            fun convertPathExpr(node: PartiqlLogical.PathStep.PathExpr): T
            fun convertPathWildcard(node: PartiqlLogical.PathStep.PathWildcard): T
            fun convertPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot): T
        }
    }
    
    sealed class JoinType(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): JoinType =
            when (this) {
                is Inner -> copy(metas = metas)
                is Left -> copy(metas = metas)
                is Right -> copy(metas = metas)
                is Full -> copy(metas = metas)
            }
    
        class Inner(
            override val metas: MetaContainer = emptyMetaContainer()
        ): JoinType() {
        
            override fun copy(metas: MetaContainer): Inner =
                Inner(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Inner =
                Inner(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("inner"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Inner::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 3000
        }
    
        class Left(
            override val metas: MetaContainer = emptyMetaContainer()
        ): JoinType() {
        
            override fun copy(metas: MetaContainer): Left =
                Left(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Left =
                Left(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("left"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Left::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 3001
        }
    
        class Right(
            override val metas: MetaContainer = emptyMetaContainer()
        ): JoinType() {
        
            override fun copy(metas: MetaContainer): Right =
                Right(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Right =
                Right(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("right"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Right::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 3002
        }
    
        class Full(
            override val metas: MetaContainer = emptyMetaContainer()
        ): JoinType() {
        
            override fun copy(metas: MetaContainer): Full =
                Full(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Full =
                Full(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("full"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Full::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 3003
        }
    
        /** Converts instances of [PartiqlLogical.JoinType] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.JoinType): T = when(node) {
                is PartiqlLogical.JoinType.Inner -> convertInner(node)
                is PartiqlLogical.JoinType.Left -> convertLeft(node)
                is PartiqlLogical.JoinType.Right -> convertRight(node)
                is PartiqlLogical.JoinType.Full -> convertFull(node)
            }
    
            fun convertInner(node: PartiqlLogical.JoinType.Inner): T
            fun convertLeft(node: PartiqlLogical.JoinType.Left): T
            fun convertRight(node: PartiqlLogical.JoinType.Right): T
            fun convertFull(node: PartiqlLogical.JoinType.Full): T
        }
    }
    
    sealed class GraphMatchDirection(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): GraphMatchDirection =
            when (this) {
                is EdgeLeft -> copy(metas = metas)
                is EdgeUndirected -> copy(metas = metas)
                is EdgeRight -> copy(metas = metas)
                is EdgeLeftOrUndirected -> copy(metas = metas)
                is EdgeUndirectedOrRight -> copy(metas = metas)
                is EdgeLeftOrRight -> copy(metas = metas)
                is EdgeLeftOrUndirectedOrRight -> copy(metas = metas)
            }
    
        class EdgeLeft(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeLeft =
                EdgeLeft(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeLeft =
                EdgeLeft(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_left"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeLeft::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4000
        }
    
        class EdgeUndirected(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeUndirected =
                EdgeUndirected(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeUndirected =
                EdgeUndirected(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_undirected"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeUndirected::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4001
        }
    
        class EdgeRight(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeRight =
                EdgeRight(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeRight =
                EdgeRight(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_right"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeRight::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4002
        }
    
        class EdgeLeftOrUndirected(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeLeftOrUndirected =
                EdgeLeftOrUndirected(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeLeftOrUndirected =
                EdgeLeftOrUndirected(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_left_or_undirected"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeLeftOrUndirected::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4003
        }
    
        class EdgeUndirectedOrRight(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeUndirectedOrRight =
                EdgeUndirectedOrRight(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeUndirectedOrRight =
                EdgeUndirectedOrRight(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_undirected_or_right"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeUndirectedOrRight::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4004
        }
    
        class EdgeLeftOrRight(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeLeftOrRight =
                EdgeLeftOrRight(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeLeftOrRight =
                EdgeLeftOrRight(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_left_or_right"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeLeftOrRight::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4005
        }
    
        class EdgeLeftOrUndirectedOrRight(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchDirection() {
        
            override fun copy(metas: MetaContainer): EdgeLeftOrUndirectedOrRight =
                EdgeLeftOrUndirectedOrRight(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): EdgeLeftOrUndirectedOrRight =
                EdgeLeftOrUndirectedOrRight(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge_left_or_undirected_or_right"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != EdgeLeftOrUndirectedOrRight::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 4006
        }
    
        /** Converts instances of [PartiqlLogical.GraphMatchDirection] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.GraphMatchDirection): T = when(node) {
                is PartiqlLogical.GraphMatchDirection.EdgeLeft -> convertEdgeLeft(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirected -> convertEdgeUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeRight -> convertEdgeRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected -> convertEdgeLeftOrUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight -> convertEdgeUndirectedOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight -> convertEdgeLeftOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight -> convertEdgeLeftOrUndirectedOrRight(node)
            }
    
            fun convertEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft): T
            fun convertEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected): T
            fun convertEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight): T
            fun convertEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected): T
            fun convertEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight): T
            fun convertEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight): T
            fun convertEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight): T
        }
    }
    
    sealed class GraphMatchPatternPart(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): GraphMatchPatternPart =
            when (this) {
                is Node -> copy(metas = metas)
                is Edge -> copy(metas = metas)
                is Pattern -> copy(metas = metas)
            }
    
        class Node(
            val prefilter: Expr?,
            val variable: org.partiql.pig.runtime.SymbolPrimitive?,
            val label: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchPatternPart() {
        
            override fun copy(metas: MetaContainer): Node =
                Node(
                    prefilter = prefilter,
                    variable = variable,
                    label = label,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Node =
                Node(
                    prefilter = prefilter,
                    variable = variable,
                    label = label,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("node"),
                    prefilter?.toIonElement() ?: ionNull(),
                    variable?.toIonElement() ?: ionNull(),
                    *label.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                prefilter: Expr? = this.prefilter,
                variable: org.partiql.pig.runtime.SymbolPrimitive? = this.variable,
                label: kotlin.collections.List = this.label,
                metas: MetaContainer = this.metas
            ) =
                Node(
                    prefilter,
                    variable,
                    label,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Node::class.java) return false
        
                other as Node
                if (prefilter != other.prefilter) return false
                if (variable != other.variable) return false
                if (label != other.label) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = prefilter.hashCode()
                hc = 31 * hc + variable.hashCode()
                hc = 31 * hc + label.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Edge(
            val direction: GraphMatchDirection,
            val quantifier: GraphMatchQuantifier?,
            val prefilter: Expr?,
            val variable: org.partiql.pig.runtime.SymbolPrimitive?,
            val label: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchPatternPart() {
        
            override fun copy(metas: MetaContainer): Edge =
                Edge(
                    direction = direction,
                    quantifier = quantifier,
                    prefilter = prefilter,
                    variable = variable,
                    label = label,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Edge =
                Edge(
                    direction = direction,
                    quantifier = quantifier,
                    prefilter = prefilter,
                    variable = variable,
                    label = label,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("edge"),
                    direction.toIonElement(),
                    quantifier?.toIonElement() ?: ionNull(),
                    prefilter?.toIonElement() ?: ionNull(),
                    variable?.toIonElement() ?: ionNull(),
                    *label.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                direction: GraphMatchDirection = this.direction,
                quantifier: GraphMatchQuantifier? = this.quantifier,
                prefilter: Expr? = this.prefilter,
                variable: org.partiql.pig.runtime.SymbolPrimitive? = this.variable,
                label: kotlin.collections.List = this.label,
                metas: MetaContainer = this.metas
            ) =
                Edge(
                    direction,
                    quantifier,
                    prefilter,
                    variable,
                    label,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Edge::class.java) return false
        
                other as Edge
                if (direction != other.direction) return false
                if (quantifier != other.quantifier) return false
                if (prefilter != other.prefilter) return false
                if (variable != other.variable) return false
                if (label != other.label) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = direction.hashCode()
                hc = 31 * hc + quantifier.hashCode()
                hc = 31 * hc + prefilter.hashCode()
                hc = 31 * hc + variable.hashCode()
                hc = 31 * hc + label.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Pattern(
            val pattern: GraphMatchPattern,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchPatternPart() {
        
            override fun copy(metas: MetaContainer): Pattern =
                Pattern(
                    pattern = pattern,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Pattern =
                Pattern(
                    pattern = pattern,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("pattern"),
                    pattern.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                pattern: GraphMatchPattern = this.pattern,
                metas: MetaContainer = this.metas
            ) =
                Pattern(
                    pattern,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Pattern::class.java) return false
        
                other as Pattern
                if (pattern != other.pattern) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = pattern.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.GraphMatchPatternPart] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.GraphMatchPatternPart): T = when(node) {
                is PartiqlLogical.GraphMatchPatternPart.Node -> convertNode(node)
                is PartiqlLogical.GraphMatchPatternPart.Edge -> convertEdge(node)
                is PartiqlLogical.GraphMatchPatternPart.Pattern -> convertPattern(node)
            }
    
            fun convertNode(node: PartiqlLogical.GraphMatchPatternPart.Node): T
            fun convertEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge): T
            fun convertPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern): T
        }
    }
    
    sealed class GraphMatchRestrictor(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): GraphMatchRestrictor =
            when (this) {
                is RestrictorTrail -> copy(metas = metas)
                is RestrictorAcyclic -> copy(metas = metas)
                is RestrictorSimple -> copy(metas = metas)
            }
    
        class RestrictorTrail(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchRestrictor() {
        
            override fun copy(metas: MetaContainer): RestrictorTrail =
                RestrictorTrail(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): RestrictorTrail =
                RestrictorTrail(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("restrictor_trail"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != RestrictorTrail::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 6000
        }
    
        class RestrictorAcyclic(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchRestrictor() {
        
            override fun copy(metas: MetaContainer): RestrictorAcyclic =
                RestrictorAcyclic(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): RestrictorAcyclic =
                RestrictorAcyclic(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("restrictor_acyclic"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != RestrictorAcyclic::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 6001
        }
    
        class RestrictorSimple(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchRestrictor() {
        
            override fun copy(metas: MetaContainer): RestrictorSimple =
                RestrictorSimple(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): RestrictorSimple =
                RestrictorSimple(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("restrictor_simple"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != RestrictorSimple::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 6002
        }
    
        /** Converts instances of [PartiqlLogical.GraphMatchRestrictor] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.GraphMatchRestrictor): T = when(node) {
                is PartiqlLogical.GraphMatchRestrictor.RestrictorTrail -> convertRestrictorTrail(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic -> convertRestrictorAcyclic(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorSimple -> convertRestrictorSimple(node)
            }
    
            fun convertRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail): T
            fun convertRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic): T
            fun convertRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple): T
        }
    }
    
    sealed class GraphMatchSelector(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): GraphMatchSelector =
            when (this) {
                is SelectorAnyShortest -> copy(metas = metas)
                is SelectorAllShortest -> copy(metas = metas)
                is SelectorAny -> copy(metas = metas)
                is SelectorAnyK -> copy(metas = metas)
                is SelectorShortestK -> copy(metas = metas)
                is SelectorShortestKGroup -> copy(metas = metas)
            }
    
        class SelectorAnyShortest(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorAnyShortest =
                SelectorAnyShortest(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorAnyShortest =
                SelectorAnyShortest(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_any_shortest"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorAnyShortest::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 7000
        }
    
        class SelectorAllShortest(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorAllShortest =
                SelectorAllShortest(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorAllShortest =
                SelectorAllShortest(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_all_shortest"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorAllShortest::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 7001
        }
    
        class SelectorAny(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorAny =
                SelectorAny(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorAny =
                SelectorAny(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_any"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorAny::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 7002
        }
    
        class SelectorAnyK(
            val k: org.partiql.pig.runtime.LongPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorAnyK =
                SelectorAnyK(
                    k = k,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorAnyK =
                SelectorAnyK(
                    k = k,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_any_k"),
                    k.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                k: org.partiql.pig.runtime.LongPrimitive = this.k,
                metas: MetaContainer = this.metas
            ) =
                SelectorAnyK(
                    k,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorAnyK::class.java) return false
        
                other as SelectorAnyK
                if (k != other.k) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = k.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class SelectorShortestK(
            val k: org.partiql.pig.runtime.LongPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorShortestK =
                SelectorShortestK(
                    k = k,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorShortestK =
                SelectorShortestK(
                    k = k,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_shortest_k"),
                    k.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                k: org.partiql.pig.runtime.LongPrimitive = this.k,
                metas: MetaContainer = this.metas
            ) =
                SelectorShortestK(
                    k,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorShortestK::class.java) return false
        
                other as SelectorShortestK
                if (k != other.k) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = k.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class SelectorShortestKGroup(
            val k: org.partiql.pig.runtime.LongPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): GraphMatchSelector() {
        
            override fun copy(metas: MetaContainer): SelectorShortestKGroup =
                SelectorShortestKGroup(
                    k = k,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SelectorShortestKGroup =
                SelectorShortestKGroup(
                    k = k,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("selector_shortest_k_group"),
                    k.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                k: org.partiql.pig.runtime.LongPrimitive = this.k,
                metas: MetaContainer = this.metas
            ) =
                SelectorShortestKGroup(
                    k,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SelectorShortestKGroup::class.java) return false
        
                other as SelectorShortestKGroup
                if (k != other.k) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = k.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.GraphMatchSelector] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.GraphMatchSelector): T = when(node) {
                is PartiqlLogical.GraphMatchSelector.SelectorAnyShortest -> convertSelectorAnyShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAllShortest -> convertSelectorAllShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAny -> convertSelectorAny(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAnyK -> convertSelectorAnyK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestK -> convertSelectorShortestK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup -> convertSelectorShortestKGroup(node)
            }
    
            fun convertSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest): T
            fun convertSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest): T
            fun convertSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny): T
            fun convertSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK): T
            fun convertSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK): T
            fun convertSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup): T
        }
    }
    
    sealed class GroupingStrategy(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): GroupingStrategy =
            when (this) {
                is GroupFull -> copy(metas = metas)
                is GroupPartial -> copy(metas = metas)
            }
    
        class GroupFull(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GroupingStrategy() {
        
            override fun copy(metas: MetaContainer): GroupFull =
                GroupFull(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): GroupFull =
                GroupFull(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("group_full"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != GroupFull::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 8000
        }
    
        class GroupPartial(
            override val metas: MetaContainer = emptyMetaContainer()
        ): GroupingStrategy() {
        
            override fun copy(metas: MetaContainer): GroupPartial =
                GroupPartial(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): GroupPartial =
                GroupPartial(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("group_partial"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != GroupPartial::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 8001
        }
    
        /** Converts instances of [PartiqlLogical.GroupingStrategy] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.GroupingStrategy): T = when(node) {
                is PartiqlLogical.GroupingStrategy.GroupFull -> convertGroupFull(node)
                is PartiqlLogical.GroupingStrategy.GroupPartial -> convertGroupPartial(node)
            }
    
            fun convertGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull): T
            fun convertGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial): T
        }
    }
    
    sealed class OrderingSpec(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): OrderingSpec =
            when (this) {
                is Asc -> copy(metas = metas)
                is Desc -> copy(metas = metas)
            }
    
        class Asc(
            override val metas: MetaContainer = emptyMetaContainer()
        ): OrderingSpec() {
        
            override fun copy(metas: MetaContainer): Asc =
                Asc(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Asc =
                Asc(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("asc"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Asc::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 9000
        }
    
        class Desc(
            override val metas: MetaContainer = emptyMetaContainer()
        ): OrderingSpec() {
        
            override fun copy(metas: MetaContainer): Desc =
                Desc(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Desc =
                Desc(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("desc"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Desc::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 9001
        }
    
        /** Converts instances of [PartiqlLogical.OrderingSpec] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.OrderingSpec): T = when(node) {
                is PartiqlLogical.OrderingSpec.Asc -> convertAsc(node)
                is PartiqlLogical.OrderingSpec.Desc -> convertDesc(node)
            }
    
            fun convertAsc(node: PartiqlLogical.OrderingSpec.Asc): T
            fun convertDesc(node: PartiqlLogical.OrderingSpec.Desc): T
        }
    }
    
    sealed class NullsSpec(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): NullsSpec =
            when (this) {
                is NullsFirst -> copy(metas = metas)
                is NullsLast -> copy(metas = metas)
            }
    
        class NullsFirst(
            override val metas: MetaContainer = emptyMetaContainer()
        ): NullsSpec() {
        
            override fun copy(metas: MetaContainer): NullsFirst =
                NullsFirst(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): NullsFirst =
                NullsFirst(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("nulls_first"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != NullsFirst::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 10000
        }
    
        class NullsLast(
            override val metas: MetaContainer = emptyMetaContainer()
        ): NullsSpec() {
        
            override fun copy(metas: MetaContainer): NullsLast =
                NullsLast(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): NullsLast =
                NullsLast(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("nulls_last"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != NullsLast::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 10001
        }
    
        /** Converts instances of [PartiqlLogical.NullsSpec] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.NullsSpec): T = when(node) {
                is PartiqlLogical.NullsSpec.NullsFirst -> convertNullsFirst(node)
                is PartiqlLogical.NullsSpec.NullsLast -> convertNullsLast(node)
            }
    
            fun convertNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst): T
            fun convertNullsLast(node: PartiqlLogical.NullsSpec.NullsLast): T
        }
    }
    
    sealed class CaseSensitivity(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): CaseSensitivity =
            when (this) {
                is CaseSensitive -> copy(metas = metas)
                is CaseInsensitive -> copy(metas = metas)
            }
    
        class CaseSensitive(
            override val metas: MetaContainer = emptyMetaContainer()
        ): CaseSensitivity() {
        
            override fun copy(metas: MetaContainer): CaseSensitive =
                CaseSensitive(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CaseSensitive =
                CaseSensitive(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("case_sensitive"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CaseSensitive::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 11000
        }
    
        class CaseInsensitive(
            override val metas: MetaContainer = emptyMetaContainer()
        ): CaseSensitivity() {
        
            override fun copy(metas: MetaContainer): CaseInsensitive =
                CaseInsensitive(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CaseInsensitive =
                CaseInsensitive(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("case_insensitive"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CaseInsensitive::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 11001
        }
    
        /** Converts instances of [PartiqlLogical.CaseSensitivity] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.CaseSensitivity): T = when(node) {
                is PartiqlLogical.CaseSensitivity.CaseSensitive -> convertCaseSensitive(node)
                is PartiqlLogical.CaseSensitivity.CaseInsensitive -> convertCaseInsensitive(node)
            }
    
            fun convertCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive): T
            fun convertCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive): T
        }
    }
    
    sealed class ScopeQualifier(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): ScopeQualifier =
            when (this) {
                is Unqualified -> copy(metas = metas)
                is LocalsFirst -> copy(metas = metas)
            }
    
        class Unqualified(
            override val metas: MetaContainer = emptyMetaContainer()
        ): ScopeQualifier() {
        
            override fun copy(metas: MetaContainer): Unqualified =
                Unqualified(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Unqualified =
                Unqualified(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("unqualified"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Unqualified::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 12000
        }
    
        class LocalsFirst(
            override val metas: MetaContainer = emptyMetaContainer()
        ): ScopeQualifier() {
        
            override fun copy(metas: MetaContainer): LocalsFirst =
                LocalsFirst(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): LocalsFirst =
                LocalsFirst(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("locals_first"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != LocalsFirst::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 12001
        }
    
        /** Converts instances of [PartiqlLogical.ScopeQualifier] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.ScopeQualifier): T = when(node) {
                is PartiqlLogical.ScopeQualifier.Unqualified -> convertUnqualified(node)
                is PartiqlLogical.ScopeQualifier.LocalsFirst -> convertLocalsFirst(node)
            }
    
            fun convertUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified): T
            fun convertLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst): T
        }
    }
    
    sealed class SetQuantifier(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): SetQuantifier =
            when (this) {
                is All -> copy(metas = metas)
                is Distinct -> copy(metas = metas)
            }
    
        class All(
            override val metas: MetaContainer = emptyMetaContainer()
        ): SetQuantifier() {
        
            override fun copy(metas: MetaContainer): All =
                All(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): All =
                All(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("all"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != All::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 13000
        }
    
        class Distinct(
            override val metas: MetaContainer = emptyMetaContainer()
        ): SetQuantifier() {
        
            override fun copy(metas: MetaContainer): Distinct =
                Distinct(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Distinct =
                Distinct(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("distinct"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Distinct::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 13001
        }
    
        /** Converts instances of [PartiqlLogical.SetQuantifier] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.SetQuantifier): T = when(node) {
                is PartiqlLogical.SetQuantifier.All -> convertAll(node)
                is PartiqlLogical.SetQuantifier.Distinct -> convertDistinct(node)
            }
    
            fun convertAll(node: PartiqlLogical.SetQuantifier.All): T
            fun convertDistinct(node: PartiqlLogical.SetQuantifier.Distinct): T
        }
    }
    
    sealed class BagOpType(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): BagOpType =
            when (this) {
                is Union -> copy(metas = metas)
                is Intersect -> copy(metas = metas)
                is Except -> copy(metas = metas)
                is OuterUnion -> copy(metas = metas)
                is OuterIntersect -> copy(metas = metas)
                is OuterExcept -> copy(metas = metas)
            }
    
        class Union(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): Union =
                Union(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Union =
                Union(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("union"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Union::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14000
        }
    
        class Intersect(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): Intersect =
                Intersect(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Intersect =
                Intersect(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("intersect"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Intersect::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14001
        }
    
        class Except(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): Except =
                Except(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Except =
                Except(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("except"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Except::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14002
        }
    
        class OuterUnion(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): OuterUnion =
                OuterUnion(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): OuterUnion =
                OuterUnion(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("outer_union"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != OuterUnion::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14003
        }
    
        class OuterIntersect(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): OuterIntersect =
                OuterIntersect(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): OuterIntersect =
                OuterIntersect(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("outer_intersect"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != OuterIntersect::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14004
        }
    
        class OuterExcept(
            override val metas: MetaContainer = emptyMetaContainer()
        ): BagOpType() {
        
            override fun copy(metas: MetaContainer): OuterExcept =
                OuterExcept(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): OuterExcept =
                OuterExcept(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("outer_except"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != OuterExcept::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 14005
        }
    
        /** Converts instances of [PartiqlLogical.BagOpType] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.BagOpType): T = when(node) {
                is PartiqlLogical.BagOpType.Union -> convertUnion(node)
                is PartiqlLogical.BagOpType.Intersect -> convertIntersect(node)
                is PartiqlLogical.BagOpType.Except -> convertExcept(node)
                is PartiqlLogical.BagOpType.OuterUnion -> convertOuterUnion(node)
                is PartiqlLogical.BagOpType.OuterIntersect -> convertOuterIntersect(node)
                is PartiqlLogical.BagOpType.OuterExcept -> convertOuterExcept(node)
            }
    
            fun convertUnion(node: PartiqlLogical.BagOpType.Union): T
            fun convertIntersect(node: PartiqlLogical.BagOpType.Intersect): T
            fun convertExcept(node: PartiqlLogical.BagOpType.Except): T
            fun convertOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion): T
            fun convertOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect): T
            fun convertOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept): T
        }
    }
    
    sealed class OnConflictValue(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): OnConflictValue =
            when (this) {
                is Excluded -> copy(metas = metas)
            }
    
        class Excluded(
            override val metas: MetaContainer = emptyMetaContainer()
        ): OnConflictValue() {
        
            override fun copy(metas: MetaContainer): Excluded =
                Excluded(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Excluded =
                Excluded(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("excluded"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Excluded::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 15000
        }
    
        /** Converts instances of [PartiqlLogical.OnConflictValue] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.OnConflictValue): T = when(node) {
                is PartiqlLogical.OnConflictValue.Excluded -> convertExcluded(node)
            }
    
            fun convertExcluded(node: PartiqlLogical.OnConflictValue.Excluded): T
        }
    }
    
    sealed class Type(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): Type =
            when (this) {
                is NullType -> copy(metas = metas)
                is BooleanType -> copy(metas = metas)
                is SmallintType -> copy(metas = metas)
                is Integer4Type -> copy(metas = metas)
                is Integer8Type -> copy(metas = metas)
                is IntegerType -> copy(metas = metas)
                is FloatType -> copy(metas = metas)
                is RealType -> copy(metas = metas)
                is DoublePrecisionType -> copy(metas = metas)
                is DecimalType -> copy(metas = metas)
                is NumericType -> copy(metas = metas)
                is TimestampType -> copy(metas = metas)
                is CharacterType -> copy(metas = metas)
                is CharacterVaryingType -> copy(metas = metas)
                is MissingType -> copy(metas = metas)
                is StringType -> copy(metas = metas)
                is SymbolType -> copy(metas = metas)
                is BlobType -> copy(metas = metas)
                is ClobType -> copy(metas = metas)
                is DateType -> copy(metas = metas)
                is TimeType -> copy(metas = metas)
                is TimeWithTimeZoneType -> copy(metas = metas)
                is StructType -> copy(metas = metas)
                is TupleType -> copy(metas = metas)
                is ListType -> copy(metas = metas)
                is SexpType -> copy(metas = metas)
                is BagType -> copy(metas = metas)
                is AnyType -> copy(metas = metas)
                is CustomType -> copy(metas = metas)
            }
    
        class NullType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): NullType =
                NullType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): NullType =
                NullType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("null_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != NullType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16000
        }
    
        class BooleanType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): BooleanType =
                BooleanType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): BooleanType =
                BooleanType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("boolean_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != BooleanType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16001
        }
    
        class SmallintType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): SmallintType =
                SmallintType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SmallintType =
                SmallintType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("smallint_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SmallintType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16002
        }
    
        class Integer4Type(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): Integer4Type =
                Integer4Type(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Integer4Type =
                Integer4Type(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("integer4_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Integer4Type::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16003
        }
    
        class Integer8Type(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): Integer8Type =
                Integer8Type(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Integer8Type =
                Integer8Type(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("integer8_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Integer8Type::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16004
        }
    
        class IntegerType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): IntegerType =
                IntegerType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): IntegerType =
                IntegerType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("integer_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != IntegerType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16005
        }
    
        class FloatType(
            val precision: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): FloatType =
                FloatType(
                    precision = precision,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): FloatType =
                FloatType(
                    precision = precision,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("float_type"),
                    precision?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                precision: org.partiql.pig.runtime.LongPrimitive? = this.precision,
                metas: MetaContainer = this.metas
            ) =
                FloatType(
                    precision,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != FloatType::class.java) return false
        
                other as FloatType
                if (precision != other.precision) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = precision.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class RealType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): RealType =
                RealType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): RealType =
                RealType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("real_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != RealType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16007
        }
    
        class DoublePrecisionType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): DoublePrecisionType =
                DoublePrecisionType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DoublePrecisionType =
                DoublePrecisionType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("double_precision_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DoublePrecisionType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16008
        }
    
        class DecimalType(
            val precision: org.partiql.pig.runtime.LongPrimitive?,
            val scale: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): DecimalType =
                DecimalType(
                    precision = precision,
                    scale = scale,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DecimalType =
                DecimalType(
                    precision = precision,
                    scale = scale,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("decimal_type"),
                    precision?.toIonElement() ?: ionNull(),
                    scale?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                precision: org.partiql.pig.runtime.LongPrimitive? = this.precision,
                scale: org.partiql.pig.runtime.LongPrimitive? = this.scale,
                metas: MetaContainer = this.metas
            ) =
                DecimalType(
                    precision,
                    scale,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DecimalType::class.java) return false
        
                other as DecimalType
                if (precision != other.precision) return false
                if (scale != other.scale) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = precision.hashCode()
                hc = 31 * hc + scale.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class NumericType(
            val precision: org.partiql.pig.runtime.LongPrimitive?,
            val scale: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): NumericType =
                NumericType(
                    precision = precision,
                    scale = scale,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): NumericType =
                NumericType(
                    precision = precision,
                    scale = scale,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("numeric_type"),
                    precision?.toIonElement() ?: ionNull(),
                    scale?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                precision: org.partiql.pig.runtime.LongPrimitive? = this.precision,
                scale: org.partiql.pig.runtime.LongPrimitive? = this.scale,
                metas: MetaContainer = this.metas
            ) =
                NumericType(
                    precision,
                    scale,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != NumericType::class.java) return false
        
                other as NumericType
                if (precision != other.precision) return false
                if (scale != other.scale) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = precision.hashCode()
                hc = 31 * hc + scale.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class TimestampType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): TimestampType =
                TimestampType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): TimestampType =
                TimestampType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("timestamp_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != TimestampType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16011
        }
    
        class CharacterType(
            val length: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): CharacterType =
                CharacterType(
                    length = length,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CharacterType =
                CharacterType(
                    length = length,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("character_type"),
                    length?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                length: org.partiql.pig.runtime.LongPrimitive? = this.length,
                metas: MetaContainer = this.metas
            ) =
                CharacterType(
                    length,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CharacterType::class.java) return false
        
                other as CharacterType
                if (length != other.length) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = length.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class CharacterVaryingType(
            val length: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): CharacterVaryingType =
                CharacterVaryingType(
                    length = length,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CharacterVaryingType =
                CharacterVaryingType(
                    length = length,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("character_varying_type"),
                    length?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                length: org.partiql.pig.runtime.LongPrimitive? = this.length,
                metas: MetaContainer = this.metas
            ) =
                CharacterVaryingType(
                    length,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CharacterVaryingType::class.java) return false
        
                other as CharacterVaryingType
                if (length != other.length) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = length.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class MissingType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): MissingType =
                MissingType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): MissingType =
                MissingType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("missing_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != MissingType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16014
        }
    
        class StringType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): StringType =
                StringType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): StringType =
                StringType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("string_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != StringType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16015
        }
    
        class SymbolType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): SymbolType =
                SymbolType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SymbolType =
                SymbolType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("symbol_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SymbolType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16016
        }
    
        class BlobType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): BlobType =
                BlobType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): BlobType =
                BlobType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("blob_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != BlobType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16017
        }
    
        class ClobType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): ClobType =
                ClobType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): ClobType =
                ClobType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("clob_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != ClobType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16018
        }
    
        class DateType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): DateType =
                DateType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DateType =
                DateType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("date_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DateType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16019
        }
    
        class TimeType(
            val precision: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): TimeType =
                TimeType(
                    precision = precision,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): TimeType =
                TimeType(
                    precision = precision,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("time_type"),
                    precision?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                precision: org.partiql.pig.runtime.LongPrimitive? = this.precision,
                metas: MetaContainer = this.metas
            ) =
                TimeType(
                    precision,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != TimeType::class.java) return false
        
                other as TimeType
                if (precision != other.precision) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = precision.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class TimeWithTimeZoneType(
            val precision: org.partiql.pig.runtime.LongPrimitive?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): TimeWithTimeZoneType =
                TimeWithTimeZoneType(
                    precision = precision,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): TimeWithTimeZoneType =
                TimeWithTimeZoneType(
                    precision = precision,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("time_with_time_zone_type"),
                    precision?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                precision: org.partiql.pig.runtime.LongPrimitive? = this.precision,
                metas: MetaContainer = this.metas
            ) =
                TimeWithTimeZoneType(
                    precision,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != TimeWithTimeZoneType::class.java) return false
        
                other as TimeWithTimeZoneType
                if (precision != other.precision) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = precision.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class StructType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): StructType =
                StructType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): StructType =
                StructType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("struct_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != StructType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16022
        }
    
        class TupleType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): TupleType =
                TupleType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): TupleType =
                TupleType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("tuple_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != TupleType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16023
        }
    
        class ListType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): ListType =
                ListType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): ListType =
                ListType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("list_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != ListType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16024
        }
    
        class SexpType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): SexpType =
                SexpType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SexpType =
                SexpType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("sexp_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SexpType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16025
        }
    
        class BagType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): BagType =
                BagType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): BagType =
                BagType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("bag_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != BagType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16026
        }
    
        class AnyType(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): AnyType =
                AnyType(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): AnyType =
                AnyType(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("any_type"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != AnyType::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 16027
        }
    
        class CustomType(
            val name: org.partiql.pig.runtime.SymbolPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Type() {
        
            override fun copy(metas: MetaContainer): CustomType =
                CustomType(
                    name = name,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CustomType =
                CustomType(
                    name = name,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("custom_type"),
                    name.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                name: org.partiql.pig.runtime.SymbolPrimitive = this.name,
                metas: MetaContainer = this.metas
            ) =
                CustomType(
                    name,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CustomType::class.java) return false
        
                other as CustomType
                if (name != other.name) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = name.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.Type] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.Type): T = when(node) {
                is PartiqlLogical.Type.NullType -> convertNullType(node)
                is PartiqlLogical.Type.BooleanType -> convertBooleanType(node)
                is PartiqlLogical.Type.SmallintType -> convertSmallintType(node)
                is PartiqlLogical.Type.Integer4Type -> convertInteger4Type(node)
                is PartiqlLogical.Type.Integer8Type -> convertInteger8Type(node)
                is PartiqlLogical.Type.IntegerType -> convertIntegerType(node)
                is PartiqlLogical.Type.FloatType -> convertFloatType(node)
                is PartiqlLogical.Type.RealType -> convertRealType(node)
                is PartiqlLogical.Type.DoublePrecisionType -> convertDoublePrecisionType(node)
                is PartiqlLogical.Type.DecimalType -> convertDecimalType(node)
                is PartiqlLogical.Type.NumericType -> convertNumericType(node)
                is PartiqlLogical.Type.TimestampType -> convertTimestampType(node)
                is PartiqlLogical.Type.CharacterType -> convertCharacterType(node)
                is PartiqlLogical.Type.CharacterVaryingType -> convertCharacterVaryingType(node)
                is PartiqlLogical.Type.MissingType -> convertMissingType(node)
                is PartiqlLogical.Type.StringType -> convertStringType(node)
                is PartiqlLogical.Type.SymbolType -> convertSymbolType(node)
                is PartiqlLogical.Type.BlobType -> convertBlobType(node)
                is PartiqlLogical.Type.ClobType -> convertClobType(node)
                is PartiqlLogical.Type.DateType -> convertDateType(node)
                is PartiqlLogical.Type.TimeType -> convertTimeType(node)
                is PartiqlLogical.Type.TimeWithTimeZoneType -> convertTimeWithTimeZoneType(node)
                is PartiqlLogical.Type.StructType -> convertStructType(node)
                is PartiqlLogical.Type.TupleType -> convertTupleType(node)
                is PartiqlLogical.Type.ListType -> convertListType(node)
                is PartiqlLogical.Type.SexpType -> convertSexpType(node)
                is PartiqlLogical.Type.BagType -> convertBagType(node)
                is PartiqlLogical.Type.AnyType -> convertAnyType(node)
                is PartiqlLogical.Type.CustomType -> convertCustomType(node)
            }
    
            fun convertNullType(node: PartiqlLogical.Type.NullType): T
            fun convertBooleanType(node: PartiqlLogical.Type.BooleanType): T
            fun convertSmallintType(node: PartiqlLogical.Type.SmallintType): T
            fun convertInteger4Type(node: PartiqlLogical.Type.Integer4Type): T
            fun convertInteger8Type(node: PartiqlLogical.Type.Integer8Type): T
            fun convertIntegerType(node: PartiqlLogical.Type.IntegerType): T
            fun convertFloatType(node: PartiqlLogical.Type.FloatType): T
            fun convertRealType(node: PartiqlLogical.Type.RealType): T
            fun convertDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType): T
            fun convertDecimalType(node: PartiqlLogical.Type.DecimalType): T
            fun convertNumericType(node: PartiqlLogical.Type.NumericType): T
            fun convertTimestampType(node: PartiqlLogical.Type.TimestampType): T
            fun convertCharacterType(node: PartiqlLogical.Type.CharacterType): T
            fun convertCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType): T
            fun convertMissingType(node: PartiqlLogical.Type.MissingType): T
            fun convertStringType(node: PartiqlLogical.Type.StringType): T
            fun convertSymbolType(node: PartiqlLogical.Type.SymbolType): T
            fun convertBlobType(node: PartiqlLogical.Type.BlobType): T
            fun convertClobType(node: PartiqlLogical.Type.ClobType): T
            fun convertDateType(node: PartiqlLogical.Type.DateType): T
            fun convertTimeType(node: PartiqlLogical.Type.TimeType): T
            fun convertTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType): T
            fun convertStructType(node: PartiqlLogical.Type.StructType): T
            fun convertTupleType(node: PartiqlLogical.Type.TupleType): T
            fun convertListType(node: PartiqlLogical.Type.ListType): T
            fun convertSexpType(node: PartiqlLogical.Type.SexpType): T
            fun convertBagType(node: PartiqlLogical.Type.BagType): T
            fun convertAnyType(node: PartiqlLogical.Type.AnyType): T
            fun convertCustomType(node: PartiqlLogical.Type.CustomType): T
        }
    }
    
    sealed class Expr(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): Expr =
            when (this) {
                is Missing -> copy(metas = metas)
                is Lit -> copy(metas = metas)
                is Id -> copy(metas = metas)
                is Parameter -> copy(metas = metas)
                is Not -> copy(metas = metas)
                is Pos -> copy(metas = metas)
                is Neg -> copy(metas = metas)
                is Plus -> copy(metas = metas)
                is Minus -> copy(metas = metas)
                is Times -> copy(metas = metas)
                is Divide -> copy(metas = metas)
                is Modulo -> copy(metas = metas)
                is Concat -> copy(metas = metas)
                is And -> copy(metas = metas)
                is Or -> copy(metas = metas)
                is Eq -> copy(metas = metas)
                is Ne -> copy(metas = metas)
                is Gt -> copy(metas = metas)
                is Gte -> copy(metas = metas)
                is Lt -> copy(metas = metas)
                is Lte -> copy(metas = metas)
                is Like -> copy(metas = metas)
                is Between -> copy(metas = metas)
                is InCollection -> copy(metas = metas)
                is IsType -> copy(metas = metas)
                is SimpleCase -> copy(metas = metas)
                is SearchedCase -> copy(metas = metas)
                is Bag -> copy(metas = metas)
                is List -> copy(metas = metas)
                is Sexp -> copy(metas = metas)
                is Date -> copy(metas = metas)
                is LitTime -> copy(metas = metas)
                is BagOp -> copy(metas = metas)
                is GraphMatch -> copy(metas = metas)
                is Path -> copy(metas = metas)
                is Call -> copy(metas = metas)
                is Cast -> copy(metas = metas)
                is CanCast -> copy(metas = metas)
                is CanLosslessCast -> copy(metas = metas)
                is NullIf -> copy(metas = metas)
                is Coalesce -> copy(metas = metas)
                is BindingsToValues -> copy(metas = metas)
                is Struct -> copy(metas = metas)
                is Pivot -> copy(metas = metas)
            }
    
        class Missing(
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Missing =
                Missing(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Missing =
                Missing(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("missing"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Missing::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 17000
        }
    
        class Lit(
            val value: com.amazon.ionelement.api.AnyElement,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Lit =
                Lit(
                    value = value,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Lit =
                Lit(
                    value = value,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("lit"),
                    value.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: com.amazon.ionelement.api.AnyElement = this.value,
                metas: MetaContainer = this.metas
            ) =
                Lit(
                    value,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Lit::class.java) return false
        
                other as Lit
                if (value != other.value) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Id(
            val name: org.partiql.pig.runtime.SymbolPrimitive,
            val case: CaseSensitivity,
            val qualifier: ScopeQualifier,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Id =
                Id(
                    name = name,
                    case = case,
                    qualifier = qualifier,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Id =
                Id(
                    name = name,
                    case = case,
                    qualifier = qualifier,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("id"),
                    name.toIonElement(),
                    case.toIonElement(),
                    qualifier.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                name: org.partiql.pig.runtime.SymbolPrimitive = this.name,
                case: CaseSensitivity = this.case,
                qualifier: ScopeQualifier = this.qualifier,
                metas: MetaContainer = this.metas
            ) =
                Id(
                    name,
                    case,
                    qualifier,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Id::class.java) return false
        
                other as Id
                if (name != other.name) return false
                if (case != other.case) return false
                if (qualifier != other.qualifier) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = name.hashCode()
                hc = 31 * hc + case.hashCode()
                hc = 31 * hc + qualifier.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Parameter(
            val index: org.partiql.pig.runtime.LongPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Parameter =
                Parameter(
                    index = index,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Parameter =
                Parameter(
                    index = index,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("parameter"),
                    index.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                index: org.partiql.pig.runtime.LongPrimitive = this.index,
                metas: MetaContainer = this.metas
            ) =
                Parameter(
                    index,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Parameter::class.java) return false
        
                other as Parameter
                if (index != other.index) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = index.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Not(
            val expr: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Not =
                Not(
                    expr = expr,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Not =
                Not(
                    expr = expr,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("not"),
                    expr.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                metas: MetaContainer = this.metas
            ) =
                Not(
                    expr,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Not::class.java) return false
        
                other as Not
                if (expr != other.expr) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Pos(
            val expr: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Pos =
                Pos(
                    expr = expr,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Pos =
                Pos(
                    expr = expr,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("pos"),
                    expr.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                metas: MetaContainer = this.metas
            ) =
                Pos(
                    expr,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Pos::class.java) return false
        
                other as Pos
                if (expr != other.expr) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Neg(
            val expr: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Neg =
                Neg(
                    expr = expr,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Neg =
                Neg(
                    expr = expr,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("neg"),
                    expr.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                metas: MetaContainer = this.metas
            ) =
                Neg(
                    expr,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Neg::class.java) return false
        
                other as Neg
                if (expr != other.expr) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Plus(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Plus =
                Plus(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Plus =
                Plus(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("plus"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Plus(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Plus::class.java) return false
        
                other as Plus
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Minus(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Minus =
                Minus(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Minus =
                Minus(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("minus"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Minus(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Minus::class.java) return false
        
                other as Minus
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Times(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Times =
                Times(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Times =
                Times(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("times"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Times(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Times::class.java) return false
        
                other as Times
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Divide(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Divide =
                Divide(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Divide =
                Divide(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("divide"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Divide(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Divide::class.java) return false
        
                other as Divide
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Modulo(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Modulo =
                Modulo(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Modulo =
                Modulo(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("modulo"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Modulo(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Modulo::class.java) return false
        
                other as Modulo
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Concat(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Concat =
                Concat(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Concat =
                Concat(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("concat"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Concat(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Concat::class.java) return false
        
                other as Concat
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class And(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): And =
                And(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): And =
                And(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("and"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                And(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != And::class.java) return false
        
                other as And
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Or(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Or =
                Or(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Or =
                Or(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("or"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Or(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Or::class.java) return false
        
                other as Or
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Eq(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Eq =
                Eq(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Eq =
                Eq(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("eq"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Eq(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Eq::class.java) return false
        
                other as Eq
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Ne(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Ne =
                Ne(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Ne =
                Ne(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("ne"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Ne(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Ne::class.java) return false
        
                other as Ne
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Gt(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Gt =
                Gt(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Gt =
                Gt(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("gt"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Gt(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Gt::class.java) return false
        
                other as Gt
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Gte(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Gte =
                Gte(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Gte =
                Gte(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("gte"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Gte(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Gte::class.java) return false
        
                other as Gte
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Lt(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Lt =
                Lt(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Lt =
                Lt(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("lt"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Lt(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Lt::class.java) return false
        
                other as Lt
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Lte(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Lte =
                Lte(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Lte =
                Lte(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("lte"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                Lte(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Lte::class.java) return false
        
                other as Lte
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Like(
            val value: Expr,
            val pattern: Expr,
            val escape: Expr?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Like =
                Like(
                    value = value,
                    pattern = pattern,
                    escape = escape,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Like =
                Like(
                    value = value,
                    pattern = pattern,
                    escape = escape,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("like"),
                    value.toIonElement(),
                    pattern.toIonElement(),
                    escape?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                pattern: Expr = this.pattern,
                escape: Expr? = this.escape,
                metas: MetaContainer = this.metas
            ) =
                Like(
                    value,
                    pattern,
                    escape,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Like::class.java) return false
        
                other as Like
                if (value != other.value) return false
                if (pattern != other.pattern) return false
                if (escape != other.escape) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + pattern.hashCode()
                hc = 31 * hc + escape.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Between(
            val value: Expr,
            val from: Expr,
            val to: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Between =
                Between(
                    value = value,
                    from = from,
                    to = to,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Between =
                Between(
                    value = value,
                    from = from,
                    to = to,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("between"),
                    value.toIonElement(),
                    from.toIonElement(),
                    to.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                from: Expr = this.from,
                to: Expr = this.to,
                metas: MetaContainer = this.metas
            ) =
                Between(
                    value,
                    from,
                    to,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Between::class.java) return false
        
                other as Between
                if (value != other.value) return false
                if (from != other.from) return false
                if (to != other.to) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + from.hashCode()
                hc = 31 * hc + to.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class InCollection(
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): InCollection =
                InCollection(
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): InCollection =
                InCollection(
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("in_collection"),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                InCollection(
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != InCollection::class.java) return false
        
                other as InCollection
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class IsType(
            val value: Expr,
            val type: Type,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): IsType =
                IsType(
                    value = value,
                    type = type,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): IsType =
                IsType(
                    value = value,
                    type = type,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("is_type"),
                    value.toIonElement(),
                    type.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                type: Type = this.type,
                metas: MetaContainer = this.metas
            ) =
                IsType(
                    value,
                    type,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != IsType::class.java) return false
        
                other as IsType
                if (value != other.value) return false
                if (type != other.type) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + type.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class SimpleCase(
            val expr: Expr,
            val cases: ExprPairList,
            val default: Expr?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): SimpleCase =
                SimpleCase(
                    expr = expr,
                    cases = cases,
                    default = default,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SimpleCase =
                SimpleCase(
                    expr = expr,
                    cases = cases,
                    default = default,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("simple_case"),
                    expr.toIonElement(),
                    cases.toIonElement(),
                    default?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                cases: ExprPairList = this.cases,
                default: Expr? = this.default,
                metas: MetaContainer = this.metas
            ) =
                SimpleCase(
                    expr,
                    cases,
                    default,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SimpleCase::class.java) return false
        
                other as SimpleCase
                if (expr != other.expr) return false
                if (cases != other.cases) return false
                if (default != other.default) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc = 31 * hc + cases.hashCode()
                hc = 31 * hc + default.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class SearchedCase(
            val cases: ExprPairList,
            val default: Expr?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): SearchedCase =
                SearchedCase(
                    cases = cases,
                    default = default,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): SearchedCase =
                SearchedCase(
                    cases = cases,
                    default = default,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("searched_case"),
                    cases.toIonElement(),
                    default?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                cases: ExprPairList = this.cases,
                default: Expr? = this.default,
                metas: MetaContainer = this.metas
            ) =
                SearchedCase(
                    cases,
                    default,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != SearchedCase::class.java) return false
        
                other as SearchedCase
                if (cases != other.cases) return false
                if (default != other.default) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = cases.hashCode()
                hc = 31 * hc + default.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Bag(
            val values: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Bag =
                Bag(
                    values = values,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Bag =
                Bag(
                    values = values,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("bag"),
                    *values.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                values: kotlin.collections.List = this.values,
                metas: MetaContainer = this.metas
            ) =
                Bag(
                    values,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Bag::class.java) return false
        
                other as Bag
                if (values != other.values) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = values.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class List(
            val values: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): List =
                List(
                    values = values,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): List =
                List(
                    values = values,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("list"),
                    *values.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                values: kotlin.collections.List = this.values,
                metas: MetaContainer = this.metas
            ) =
                List(
                    values,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != List::class.java) return false
        
                other as List
                if (values != other.values) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = values.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Sexp(
            val values: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Sexp =
                Sexp(
                    values = values,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Sexp =
                Sexp(
                    values = values,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("sexp"),
                    *values.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                values: kotlin.collections.List = this.values,
                metas: MetaContainer = this.metas
            ) =
                Sexp(
                    values,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Sexp::class.java) return false
        
                other as Sexp
                if (values != other.values) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = values.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Date(
            val year: org.partiql.pig.runtime.LongPrimitive,
            val month: org.partiql.pig.runtime.LongPrimitive,
            val day: org.partiql.pig.runtime.LongPrimitive,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Date =
                Date(
                    year = year,
                    month = month,
                    day = day,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Date =
                Date(
                    year = year,
                    month = month,
                    day = day,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("date"),
                    year.toIonElement(),
                    month.toIonElement(),
                    day.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                year: org.partiql.pig.runtime.LongPrimitive = this.year,
                month: org.partiql.pig.runtime.LongPrimitive = this.month,
                day: org.partiql.pig.runtime.LongPrimitive = this.day,
                metas: MetaContainer = this.metas
            ) =
                Date(
                    year,
                    month,
                    day,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Date::class.java) return false
        
                other as Date
                if (year != other.year) return false
                if (month != other.month) return false
                if (day != other.day) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = year.hashCode()
                hc = 31 * hc + month.hashCode()
                hc = 31 * hc + day.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class LitTime(
            val value: TimeValue,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): LitTime =
                LitTime(
                    value = value,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): LitTime =
                LitTime(
                    value = value,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("lit_time"),
                    value.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: TimeValue = this.value,
                metas: MetaContainer = this.metas
            ) =
                LitTime(
                    value,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != LitTime::class.java) return false
        
                other as LitTime
                if (value != other.value) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class BagOp(
            val op: BagOpType,
            val quantifier: SetQuantifier,
            val operands: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): BagOp =
                BagOp(
                    op = op,
                    quantifier = quantifier,
                    operands = operands,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): BagOp =
                BagOp(
                    op = op,
                    quantifier = quantifier,
                    operands = operands,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("bag_op"),
                    op.toIonElement(),
                    quantifier.toIonElement(),
                    *operands.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                op: BagOpType = this.op,
                quantifier: SetQuantifier = this.quantifier,
                operands: kotlin.collections.List = this.operands,
                metas: MetaContainer = this.metas
            ) =
                BagOp(
                    op,
                    quantifier,
                    operands,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != BagOp::class.java) return false
        
                other as BagOp
                if (op != other.op) return false
                if (quantifier != other.quantifier) return false
                if (operands != other.operands) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = op.hashCode()
                hc = 31 * hc + quantifier.hashCode()
                hc = 31 * hc + operands.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class GraphMatch(
            val expr: Expr,
            val gpmlPattern: GpmlPattern,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): GraphMatch =
                GraphMatch(
                    expr = expr,
                    gpmlPattern = gpmlPattern,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): GraphMatch =
                GraphMatch(
                    expr = expr,
                    gpmlPattern = gpmlPattern,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("graph_match"),
                    expr.toIonElement(),
                    gpmlPattern.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                gpmlPattern: GpmlPattern = this.gpmlPattern,
                metas: MetaContainer = this.metas
            ) =
                GraphMatch(
                    expr,
                    gpmlPattern,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != GraphMatch::class.java) return false
        
                other as GraphMatch
                if (expr != other.expr) return false
                if (gpmlPattern != other.gpmlPattern) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc = 31 * hc + gpmlPattern.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Path(
            val root: Expr,
            val steps: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Path =
                Path(
                    root = root,
                    steps = steps,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Path =
                Path(
                    root = root,
                    steps = steps,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("path"),
                    root.toIonElement(),
                    *steps.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                root: Expr = this.root,
                steps: kotlin.collections.List = this.steps,
                metas: MetaContainer = this.metas
            ) =
                Path(
                    root,
                    steps,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Path::class.java) return false
        
                other as Path
                if (root != other.root) return false
                if (steps != other.steps) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = root.hashCode()
                hc = 31 * hc + steps.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Call(
            val funcName: org.partiql.pig.runtime.SymbolPrimitive,
            val args: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Call =
                Call(
                    funcName = funcName,
                    args = args,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Call =
                Call(
                    funcName = funcName,
                    args = args,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("call"),
                    funcName.toIonElement(),
                    *args.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                funcName: org.partiql.pig.runtime.SymbolPrimitive = this.funcName,
                args: kotlin.collections.List = this.args,
                metas: MetaContainer = this.metas
            ) =
                Call(
                    funcName,
                    args,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Call::class.java) return false
        
                other as Call
                if (funcName != other.funcName) return false
                if (args != other.args) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = funcName.hashCode()
                hc = 31 * hc + args.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Cast(
            val value: Expr,
            val asType: Type,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Cast =
                Cast(
                    value = value,
                    asType = asType,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Cast =
                Cast(
                    value = value,
                    asType = asType,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("cast"),
                    value.toIonElement(),
                    asType.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                asType: Type = this.asType,
                metas: MetaContainer = this.metas
            ) =
                Cast(
                    value,
                    asType,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Cast::class.java) return false
        
                other as Cast
                if (value != other.value) return false
                if (asType != other.asType) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + asType.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class CanCast(
            val value: Expr,
            val asType: Type,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): CanCast =
                CanCast(
                    value = value,
                    asType = asType,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CanCast =
                CanCast(
                    value = value,
                    asType = asType,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("can_cast"),
                    value.toIonElement(),
                    asType.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                asType: Type = this.asType,
                metas: MetaContainer = this.metas
            ) =
                CanCast(
                    value,
                    asType,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CanCast::class.java) return false
        
                other as CanCast
                if (value != other.value) return false
                if (asType != other.asType) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + asType.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class CanLosslessCast(
            val value: Expr,
            val asType: Type,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): CanLosslessCast =
                CanLosslessCast(
                    value = value,
                    asType = asType,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): CanLosslessCast =
                CanLosslessCast(
                    value = value,
                    asType = asType,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("can_lossless_cast"),
                    value.toIonElement(),
                    asType.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                value: Expr = this.value,
                asType: Type = this.asType,
                metas: MetaContainer = this.metas
            ) =
                CanLosslessCast(
                    value,
                    asType,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != CanLosslessCast::class.java) return false
        
                other as CanLosslessCast
                if (value != other.value) return false
                if (asType != other.asType) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = value.hashCode()
                hc = 31 * hc + asType.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class NullIf(
            val expr1: Expr,
            val expr2: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): NullIf =
                NullIf(
                    expr1 = expr1,
                    expr2 = expr2,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): NullIf =
                NullIf(
                    expr1 = expr1,
                    expr2 = expr2,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("null_if"),
                    expr1.toIonElement(),
                    expr2.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr1: Expr = this.expr1,
                expr2: Expr = this.expr2,
                metas: MetaContainer = this.metas
            ) =
                NullIf(
                    expr1,
                    expr2,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != NullIf::class.java) return false
        
                other as NullIf
                if (expr1 != other.expr1) return false
                if (expr2 != other.expr2) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr1.hashCode()
                hc = 31 * hc + expr2.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Coalesce(
            val args: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Coalesce =
                Coalesce(
                    args = args,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Coalesce =
                Coalesce(
                    args = args,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("coalesce"),
                    *args.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                args: kotlin.collections.List = this.args,
                metas: MetaContainer = this.metas
            ) =
                Coalesce(
                    args,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Coalesce::class.java) return false
        
                other as Coalesce
                if (args != other.args) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = args.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class BindingsToValues(
            val exp: Expr,
            val query: Bexpr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): BindingsToValues =
                BindingsToValues(
                    exp = exp,
                    query = query,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): BindingsToValues =
                BindingsToValues(
                    exp = exp,
                    query = query,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("bindings_to_values"),
                    exp.toIonElement(),
                    query.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                exp: Expr = this.exp,
                query: Bexpr = this.query,
                metas: MetaContainer = this.metas
            ) =
                BindingsToValues(
                    exp,
                    query,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != BindingsToValues::class.java) return false
        
                other as BindingsToValues
                if (exp != other.exp) return false
                if (query != other.query) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = exp.hashCode()
                hc = 31 * hc + query.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Struct(
            val parts: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Struct =
                Struct(
                    parts = parts,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Struct =
                Struct(
                    parts = parts,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("struct"),
                    *parts.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                parts: kotlin.collections.List = this.parts,
                metas: MetaContainer = this.metas
            ) =
                Struct(
                    parts,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Struct::class.java) return false
        
                other as Struct
                if (parts != other.parts) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = parts.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Pivot(
            val input: Bexpr,
            val key: Expr,
            val value: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Expr() {
        
            override fun copy(metas: MetaContainer): Pivot =
                Pivot(
                    input = input,
                    key = key,
                    value = value,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Pivot =
                Pivot(
                    input = input,
                    key = key,
                    value = value,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("pivot"),
                    input.toIonElement(),
                    key.toIonElement(),
                    value.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                input: Bexpr = this.input,
                key: Expr = this.key,
                value: Expr = this.value,
                metas: MetaContainer = this.metas
            ) =
                Pivot(
                    input,
                    key,
                    value,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Pivot::class.java) return false
        
                other as Pivot
                if (input != other.input) return false
                if (key != other.key) return false
                if (value != other.value) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = input.hashCode()
                hc = 31 * hc + key.hashCode()
                hc = 31 * hc + value.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.Expr] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.Expr): T = when(node) {
                is PartiqlLogical.Expr.Missing -> convertMissing(node)
                is PartiqlLogical.Expr.Lit -> convertLit(node)
                is PartiqlLogical.Expr.Id -> convertId(node)
                is PartiqlLogical.Expr.Parameter -> convertParameter(node)
                is PartiqlLogical.Expr.Not -> convertNot(node)
                is PartiqlLogical.Expr.Pos -> convertPos(node)
                is PartiqlLogical.Expr.Neg -> convertNeg(node)
                is PartiqlLogical.Expr.Plus -> convertPlus(node)
                is PartiqlLogical.Expr.Minus -> convertMinus(node)
                is PartiqlLogical.Expr.Times -> convertTimes(node)
                is PartiqlLogical.Expr.Divide -> convertDivide(node)
                is PartiqlLogical.Expr.Modulo -> convertModulo(node)
                is PartiqlLogical.Expr.Concat -> convertConcat(node)
                is PartiqlLogical.Expr.And -> convertAnd(node)
                is PartiqlLogical.Expr.Or -> convertOr(node)
                is PartiqlLogical.Expr.Eq -> convertEq(node)
                is PartiqlLogical.Expr.Ne -> convertNe(node)
                is PartiqlLogical.Expr.Gt -> convertGt(node)
                is PartiqlLogical.Expr.Gte -> convertGte(node)
                is PartiqlLogical.Expr.Lt -> convertLt(node)
                is PartiqlLogical.Expr.Lte -> convertLte(node)
                is PartiqlLogical.Expr.Like -> convertLike(node)
                is PartiqlLogical.Expr.Between -> convertBetween(node)
                is PartiqlLogical.Expr.InCollection -> convertInCollection(node)
                is PartiqlLogical.Expr.IsType -> convertIsType(node)
                is PartiqlLogical.Expr.SimpleCase -> convertSimpleCase(node)
                is PartiqlLogical.Expr.SearchedCase -> convertSearchedCase(node)
                is PartiqlLogical.Expr.Bag -> convertBag(node)
                is PartiqlLogical.Expr.List -> convertList(node)
                is PartiqlLogical.Expr.Sexp -> convertSexp(node)
                is PartiqlLogical.Expr.Date -> convertDate(node)
                is PartiqlLogical.Expr.LitTime -> convertLitTime(node)
                is PartiqlLogical.Expr.BagOp -> convertBagOp(node)
                is PartiqlLogical.Expr.GraphMatch -> convertGraphMatch(node)
                is PartiqlLogical.Expr.Path -> convertPath(node)
                is PartiqlLogical.Expr.Call -> convertCall(node)
                is PartiqlLogical.Expr.Cast -> convertCast(node)
                is PartiqlLogical.Expr.CanCast -> convertCanCast(node)
                is PartiqlLogical.Expr.CanLosslessCast -> convertCanLosslessCast(node)
                is PartiqlLogical.Expr.NullIf -> convertNullIf(node)
                is PartiqlLogical.Expr.Coalesce -> convertCoalesce(node)
                is PartiqlLogical.Expr.BindingsToValues -> convertBindingsToValues(node)
                is PartiqlLogical.Expr.Struct -> convertStruct(node)
                is PartiqlLogical.Expr.Pivot -> convertPivot(node)
            }
    
            fun convertMissing(node: PartiqlLogical.Expr.Missing): T
            fun convertLit(node: PartiqlLogical.Expr.Lit): T
            fun convertId(node: PartiqlLogical.Expr.Id): T
            fun convertParameter(node: PartiqlLogical.Expr.Parameter): T
            fun convertNot(node: PartiqlLogical.Expr.Not): T
            fun convertPos(node: PartiqlLogical.Expr.Pos): T
            fun convertNeg(node: PartiqlLogical.Expr.Neg): T
            fun convertPlus(node: PartiqlLogical.Expr.Plus): T
            fun convertMinus(node: PartiqlLogical.Expr.Minus): T
            fun convertTimes(node: PartiqlLogical.Expr.Times): T
            fun convertDivide(node: PartiqlLogical.Expr.Divide): T
            fun convertModulo(node: PartiqlLogical.Expr.Modulo): T
            fun convertConcat(node: PartiqlLogical.Expr.Concat): T
            fun convertAnd(node: PartiqlLogical.Expr.And): T
            fun convertOr(node: PartiqlLogical.Expr.Or): T
            fun convertEq(node: PartiqlLogical.Expr.Eq): T
            fun convertNe(node: PartiqlLogical.Expr.Ne): T
            fun convertGt(node: PartiqlLogical.Expr.Gt): T
            fun convertGte(node: PartiqlLogical.Expr.Gte): T
            fun convertLt(node: PartiqlLogical.Expr.Lt): T
            fun convertLte(node: PartiqlLogical.Expr.Lte): T
            fun convertLike(node: PartiqlLogical.Expr.Like): T
            fun convertBetween(node: PartiqlLogical.Expr.Between): T
            fun convertInCollection(node: PartiqlLogical.Expr.InCollection): T
            fun convertIsType(node: PartiqlLogical.Expr.IsType): T
            fun convertSimpleCase(node: PartiqlLogical.Expr.SimpleCase): T
            fun convertSearchedCase(node: PartiqlLogical.Expr.SearchedCase): T
            fun convertBag(node: PartiqlLogical.Expr.Bag): T
            fun convertList(node: PartiqlLogical.Expr.List): T
            fun convertSexp(node: PartiqlLogical.Expr.Sexp): T
            fun convertDate(node: PartiqlLogical.Expr.Date): T
            fun convertLitTime(node: PartiqlLogical.Expr.LitTime): T
            fun convertBagOp(node: PartiqlLogical.Expr.BagOp): T
            fun convertGraphMatch(node: PartiqlLogical.Expr.GraphMatch): T
            fun convertPath(node: PartiqlLogical.Expr.Path): T
            fun convertCall(node: PartiqlLogical.Expr.Call): T
            fun convertCast(node: PartiqlLogical.Expr.Cast): T
            fun convertCanCast(node: PartiqlLogical.Expr.CanCast): T
            fun convertCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast): T
            fun convertNullIf(node: PartiqlLogical.Expr.NullIf): T
            fun convertCoalesce(node: PartiqlLogical.Expr.Coalesce): T
            fun convertBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues): T
            fun convertStruct(node: PartiqlLogical.Expr.Struct): T
            fun convertPivot(node: PartiqlLogical.Expr.Pivot): T
        }
    }
    
    sealed class Statement(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): Statement =
            when (this) {
                is Query -> copy(metas = metas)
                is Exec -> copy(metas = metas)
                is Explain -> copy(metas = metas)
                is Dml -> copy(metas = metas)
            }
    
        class Query(
            val expr: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Statement() {
        
            override fun copy(metas: MetaContainer): Query =
                Query(
                    expr = expr,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Query =
                Query(
                    expr = expr,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("query"),
                    expr.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                metas: MetaContainer = this.metas
            ) =
                Query(
                    expr,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Query::class.java) return false
        
                other as Query
                if (expr != other.expr) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Exec(
            val procedureName: org.partiql.pig.runtime.SymbolPrimitive,
            val args: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Statement() {
        
            override fun copy(metas: MetaContainer): Exec =
                Exec(
                    procedureName = procedureName,
                    args = args,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Exec =
                Exec(
                    procedureName = procedureName,
                    args = args,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("exec"),
                    procedureName.toIonElement(),
                    *args.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                procedureName: org.partiql.pig.runtime.SymbolPrimitive = this.procedureName,
                args: kotlin.collections.List = this.args,
                metas: MetaContainer = this.metas
            ) =
                Exec(
                    procedureName,
                    args,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Exec::class.java) return false
        
                other as Exec
                if (procedureName != other.procedureName) return false
                if (args != other.args) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = procedureName.hashCode()
                hc = 31 * hc + args.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Explain(
            val target: ExplainTarget,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Statement() {
        
            override fun copy(metas: MetaContainer): Explain =
                Explain(
                    target = target,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Explain =
                Explain(
                    target = target,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("explain"),
                    target.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                target: ExplainTarget = this.target,
                metas: MetaContainer = this.metas
            ) =
                Explain(
                    target,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Explain::class.java) return false
        
                other as Explain
                if (target != other.target) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = target.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Dml(
            val target: Identifier,
            val operation: DmlOperation,
            val rows: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Statement() {
        
            override fun copy(metas: MetaContainer): Dml =
                Dml(
                    target = target,
                    operation = operation,
                    rows = rows,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Dml =
                Dml(
                    target = target,
                    operation = operation,
                    rows = rows,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("dml"),
                    target.toIonElement(),
                    operation.toIonElement(),
                    rows.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                target: Identifier = this.target,
                operation: DmlOperation = this.operation,
                rows: Expr = this.rows,
                metas: MetaContainer = this.metas
            ) =
                Dml(
                    target,
                    operation,
                    rows,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Dml::class.java) return false
        
                other as Dml
                if (target != other.target) return false
                if (operation != other.operation) return false
                if (rows != other.rows) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = target.hashCode()
                hc = 31 * hc + operation.hashCode()
                hc = 31 * hc + rows.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.Statement] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.Statement): T = when(node) {
                is PartiqlLogical.Statement.Query -> convertQuery(node)
                is PartiqlLogical.Statement.Exec -> convertExec(node)
                is PartiqlLogical.Statement.Explain -> convertExplain(node)
                is PartiqlLogical.Statement.Dml -> convertDml(node)
            }
    
            fun convertQuery(node: PartiqlLogical.Statement.Query): T
            fun convertExec(node: PartiqlLogical.Statement.Exec): T
            fun convertExplain(node: PartiqlLogical.Statement.Explain): T
            fun convertDml(node: PartiqlLogical.Statement.Dml): T
        }
    }
    
    sealed class StructPart(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): StructPart =
            when (this) {
                is StructFields -> copy(metas = metas)
                is StructField -> copy(metas = metas)
            }
    
        class StructFields(
            val partExpr: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): StructPart() {
        
            override fun copy(metas: MetaContainer): StructFields =
                StructFields(
                    partExpr = partExpr,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): StructFields =
                StructFields(
                    partExpr = partExpr,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("struct_fields"),
                    partExpr.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                partExpr: Expr = this.partExpr,
                metas: MetaContainer = this.metas
            ) =
                StructFields(
                    partExpr,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != StructFields::class.java) return false
        
                other as StructFields
                if (partExpr != other.partExpr) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = partExpr.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class StructField(
            val fieldName: Expr,
            val value: Expr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): StructPart() {
        
            override fun copy(metas: MetaContainer): StructField =
                StructField(
                    fieldName = fieldName,
                    value = value,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): StructField =
                StructField(
                    fieldName = fieldName,
                    value = value,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("struct_field"),
                    fieldName.toIonElement(),
                    value.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                fieldName: Expr = this.fieldName,
                value: Expr = this.value,
                metas: MetaContainer = this.metas
            ) =
                StructField(
                    fieldName,
                    value,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != StructField::class.java) return false
        
                other as StructField
                if (fieldName != other.fieldName) return false
                if (value != other.value) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = fieldName.hashCode()
                hc = 31 * hc + value.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.StructPart] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.StructPart): T = when(node) {
                is PartiqlLogical.StructPart.StructFields -> convertStructFields(node)
                is PartiqlLogical.StructPart.StructField -> convertStructField(node)
            }
    
            fun convertStructFields(node: PartiqlLogical.StructPart.StructFields): T
            fun convertStructField(node: PartiqlLogical.StructPart.StructField): T
        }
    }
    
    sealed class Bexpr(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): Bexpr =
            when (this) {
                is Scan -> copy(metas = metas)
                is Unpivot -> copy(metas = metas)
                is Filter -> copy(metas = metas)
                is Aggregate -> copy(metas = metas)
                is Join -> copy(metas = metas)
                is Window -> copy(metas = metas)
                is Sort -> copy(metas = metas)
                is Offset -> copy(metas = metas)
                is Limit -> copy(metas = metas)
                is Let -> copy(metas = metas)
            }
    
        class Scan(
            val expr: Expr,
            val asDecl: VarDecl,
            val atDecl: VarDecl?,
            val byDecl: VarDecl?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Scan =
                Scan(
                    expr = expr,
                    asDecl = asDecl,
                    atDecl = atDecl,
                    byDecl = byDecl,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Scan =
                Scan(
                    expr = expr,
                    asDecl = asDecl,
                    atDecl = atDecl,
                    byDecl = byDecl,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("scan"),
                    expr.toIonElement(),
                    asDecl.toIonElement(),
                    atDecl?.toIonElement() ?: ionNull(),
                    byDecl?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                asDecl: VarDecl = this.asDecl,
                atDecl: VarDecl? = this.atDecl,
                byDecl: VarDecl? = this.byDecl,
                metas: MetaContainer = this.metas
            ) =
                Scan(
                    expr,
                    asDecl,
                    atDecl,
                    byDecl,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Scan::class.java) return false
        
                other as Scan
                if (expr != other.expr) return false
                if (asDecl != other.asDecl) return false
                if (atDecl != other.atDecl) return false
                if (byDecl != other.byDecl) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc = 31 * hc + asDecl.hashCode()
                hc = 31 * hc + atDecl.hashCode()
                hc = 31 * hc + byDecl.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Unpivot(
            val expr: Expr,
            val asDecl: VarDecl,
            val atDecl: VarDecl?,
            val byDecl: VarDecl?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Unpivot =
                Unpivot(
                    expr = expr,
                    asDecl = asDecl,
                    atDecl = atDecl,
                    byDecl = byDecl,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Unpivot =
                Unpivot(
                    expr = expr,
                    asDecl = asDecl,
                    atDecl = atDecl,
                    byDecl = byDecl,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("unpivot"),
                    expr.toIonElement(),
                    asDecl.toIonElement(),
                    atDecl?.toIonElement() ?: ionNull(),
                    byDecl?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                expr: Expr = this.expr,
                asDecl: VarDecl = this.asDecl,
                atDecl: VarDecl? = this.atDecl,
                byDecl: VarDecl? = this.byDecl,
                metas: MetaContainer = this.metas
            ) =
                Unpivot(
                    expr,
                    asDecl,
                    atDecl,
                    byDecl,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Unpivot::class.java) return false
        
                other as Unpivot
                if (expr != other.expr) return false
                if (asDecl != other.asDecl) return false
                if (atDecl != other.atDecl) return false
                if (byDecl != other.byDecl) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = expr.hashCode()
                hc = 31 * hc + asDecl.hashCode()
                hc = 31 * hc + atDecl.hashCode()
                hc = 31 * hc + byDecl.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Filter(
            val predicate: Expr,
            val source: Bexpr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Filter =
                Filter(
                    predicate = predicate,
                    source = source,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Filter =
                Filter(
                    predicate = predicate,
                    source = source,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("filter"),
                    predicate.toIonElement(),
                    source.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                predicate: Expr = this.predicate,
                source: Bexpr = this.source,
                metas: MetaContainer = this.metas
            ) =
                Filter(
                    predicate,
                    source,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Filter::class.java) return false
        
                other as Filter
                if (predicate != other.predicate) return false
                if (source != other.source) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = predicate.hashCode()
                hc = 31 * hc + source.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Aggregate(
            val source: Bexpr,
            val strategy: GroupingStrategy,
            val groupList: GroupKeyList,
            val functionList: AggregateFunctionList,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Aggregate =
                Aggregate(
                    source = source,
                    strategy = strategy,
                    groupList = groupList,
                    functionList = functionList,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Aggregate =
                Aggregate(
                    source = source,
                    strategy = strategy,
                    groupList = groupList,
                    functionList = functionList,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("aggregate"),
                    source.toIonElement(),
                    strategy.toIonElement(),
                    groupList.toIonElement(),
                    functionList.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                source: Bexpr = this.source,
                strategy: GroupingStrategy = this.strategy,
                groupList: GroupKeyList = this.groupList,
                functionList: AggregateFunctionList = this.functionList,
                metas: MetaContainer = this.metas
            ) =
                Aggregate(
                    source,
                    strategy,
                    groupList,
                    functionList,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Aggregate::class.java) return false
        
                other as Aggregate
                if (source != other.source) return false
                if (strategy != other.strategy) return false
                if (groupList != other.groupList) return false
                if (functionList != other.functionList) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = source.hashCode()
                hc = 31 * hc + strategy.hashCode()
                hc = 31 * hc + groupList.hashCode()
                hc = 31 * hc + functionList.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Join(
            val joinType: JoinType,
            val left: Bexpr,
            val right: Bexpr,
            val predicate: Expr?,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Join =
                Join(
                    joinType = joinType,
                    left = left,
                    right = right,
                    predicate = predicate,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Join =
                Join(
                    joinType = joinType,
                    left = left,
                    right = right,
                    predicate = predicate,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("join"),
                    joinType.toIonElement(),
                    left.toIonElement(),
                    right.toIonElement(),
                    predicate?.toIonElement() ?: ionNull(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                joinType: JoinType = this.joinType,
                left: Bexpr = this.left,
                right: Bexpr = this.right,
                predicate: Expr? = this.predicate,
                metas: MetaContainer = this.metas
            ) =
                Join(
                    joinType,
                    left,
                    right,
                    predicate,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Join::class.java) return false
        
                other as Join
                if (joinType != other.joinType) return false
                if (left != other.left) return false
                if (right != other.right) return false
                if (predicate != other.predicate) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = joinType.hashCode()
                hc = 31 * hc + left.hashCode()
                hc = 31 * hc + right.hashCode()
                hc = 31 * hc + predicate.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Window(
            val source: Bexpr,
            val windowSpecification: Over,
            val windowExpressionList: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Window =
                Window(
                    source = source,
                    windowSpecification = windowSpecification,
                    windowExpressionList = windowExpressionList,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Window =
                Window(
                    source = source,
                    windowSpecification = windowSpecification,
                    windowExpressionList = windowExpressionList,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("window"),
                    source.toIonElement(),
                    windowSpecification.toIonElement(),
                    *windowExpressionList.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                source: Bexpr = this.source,
                windowSpecification: Over = this.windowSpecification,
                windowExpressionList: kotlin.collections.List = this.windowExpressionList,
                metas: MetaContainer = this.metas
            ) =
                Window(
                    source,
                    windowSpecification,
                    windowExpressionList,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Window::class.java) return false
        
                other as Window
                if (source != other.source) return false
                if (windowSpecification != other.windowSpecification) return false
                if (windowExpressionList != other.windowExpressionList) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = source.hashCode()
                hc = 31 * hc + windowSpecification.hashCode()
                hc = 31 * hc + windowExpressionList.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Sort(
            val source: Bexpr,
            val sortSpecs: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Sort =
                Sort(
                    source = source,
                    sortSpecs = sortSpecs,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Sort =
                Sort(
                    source = source,
                    sortSpecs = sortSpecs,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("sort"),
                    source.toIonElement(),
                    *sortSpecs.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                source: Bexpr = this.source,
                sortSpecs: kotlin.collections.List = this.sortSpecs,
                metas: MetaContainer = this.metas
            ) =
                Sort(
                    source,
                    sortSpecs,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Sort::class.java) return false
        
                other as Sort
                if (source != other.source) return false
                if (sortSpecs != other.sortSpecs) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = source.hashCode()
                hc = 31 * hc + sortSpecs.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Offset(
            val rowCount: Expr,
            val source: Bexpr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Offset =
                Offset(
                    rowCount = rowCount,
                    source = source,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Offset =
                Offset(
                    rowCount = rowCount,
                    source = source,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("offset"),
                    rowCount.toIonElement(),
                    source.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                rowCount: Expr = this.rowCount,
                source: Bexpr = this.source,
                metas: MetaContainer = this.metas
            ) =
                Offset(
                    rowCount,
                    source,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Offset::class.java) return false
        
                other as Offset
                if (rowCount != other.rowCount) return false
                if (source != other.source) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = rowCount.hashCode()
                hc = 31 * hc + source.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Limit(
            val rowCount: Expr,
            val source: Bexpr,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Limit =
                Limit(
                    rowCount = rowCount,
                    source = source,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Limit =
                Limit(
                    rowCount = rowCount,
                    source = source,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("limit"),
                    rowCount.toIonElement(),
                    source.toIonElement(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                rowCount: Expr = this.rowCount,
                source: Bexpr = this.source,
                metas: MetaContainer = this.metas
            ) =
                Limit(
                    rowCount,
                    source,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Limit::class.java) return false
        
                other as Limit
                if (rowCount != other.rowCount) return false
                if (source != other.source) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = rowCount.hashCode()
                hc = 31 * hc + source.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        class Let(
            val source: Bexpr,
            val bindings: kotlin.collections.List,
            override val metas: MetaContainer = emptyMetaContainer()
        ): Bexpr() {
        
            override fun copy(metas: MetaContainer): Let =
                Let(
                    source = source,
                    bindings = bindings,
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): Let =
                Let(
                    source = source,
                    bindings = bindings,
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("let"),
                    source.toIonElement(),
                    *bindings.map { it.toIonElement() }.toTypedArray(),
                    metas = metas)
                return elements
            }
        
            fun copy(
                source: Bexpr = this.source,
                bindings: kotlin.collections.List = this.bindings,
                metas: MetaContainer = this.metas
            ) =
                Let(
                    source,
                    bindings,
                    metas)
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != Let::class.java) return false
        
                other as Let
                if (source != other.source) return false
                if (bindings != other.bindings) return false
                return true
            }
        
            private val myHashCode by lazy(LazyThreadSafetyMode.PUBLICATION) {
                var hc = source.hashCode()
                hc = 31 * hc + bindings.hashCode()
                hc
            }
        
            override fun hashCode(): Int = myHashCode
        }
    
        /** Converts instances of [PartiqlLogical.Bexpr] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.Bexpr): T = when(node) {
                is PartiqlLogical.Bexpr.Scan -> convertScan(node)
                is PartiqlLogical.Bexpr.Unpivot -> convertUnpivot(node)
                is PartiqlLogical.Bexpr.Filter -> convertFilter(node)
                is PartiqlLogical.Bexpr.Aggregate -> convertAggregate(node)
                is PartiqlLogical.Bexpr.Join -> convertJoin(node)
                is PartiqlLogical.Bexpr.Window -> convertWindow(node)
                is PartiqlLogical.Bexpr.Sort -> convertSort(node)
                is PartiqlLogical.Bexpr.Offset -> convertOffset(node)
                is PartiqlLogical.Bexpr.Limit -> convertLimit(node)
                is PartiqlLogical.Bexpr.Let -> convertLet(node)
            }
    
            fun convertScan(node: PartiqlLogical.Bexpr.Scan): T
            fun convertUnpivot(node: PartiqlLogical.Bexpr.Unpivot): T
            fun convertFilter(node: PartiqlLogical.Bexpr.Filter): T
            fun convertAggregate(node: PartiqlLogical.Bexpr.Aggregate): T
            fun convertJoin(node: PartiqlLogical.Bexpr.Join): T
            fun convertWindow(node: PartiqlLogical.Bexpr.Window): T
            fun convertSort(node: PartiqlLogical.Bexpr.Sort): T
            fun convertOffset(node: PartiqlLogical.Bexpr.Offset): T
            fun convertLimit(node: PartiqlLogical.Bexpr.Limit): T
            fun convertLet(node: PartiqlLogical.Bexpr.Let): T
        }
    }
    
    sealed class DmlOperation(override val metas: MetaContainer = emptyMetaContainer()) : PartiqlLogicalNode() {
        override fun copy(metas: MetaContainer): DmlOperation =
            when (this) {
                is DmlInsert -> copy(metas = metas)
                is DmlDelete -> copy(metas = metas)
                is DmlReplace -> copy(metas = metas)
                is DmlUpdate -> copy(metas = metas)
            }
    
        class DmlInsert(
            override val metas: MetaContainer = emptyMetaContainer()
        ): DmlOperation() {
        
            override fun copy(metas: MetaContainer): DmlInsert =
                DmlInsert(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DmlInsert =
                DmlInsert(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("dml_insert"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DmlInsert::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 21000
        }
    
        class DmlDelete(
            override val metas: MetaContainer = emptyMetaContainer()
        ): DmlOperation() {
        
            override fun copy(metas: MetaContainer): DmlDelete =
                DmlDelete(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DmlDelete =
                DmlDelete(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("dml_delete"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DmlDelete::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 21001
        }
    
        class DmlReplace(
            override val metas: MetaContainer = emptyMetaContainer()
        ): DmlOperation() {
        
            override fun copy(metas: MetaContainer): DmlReplace =
                DmlReplace(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DmlReplace =
                DmlReplace(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("dml_replace"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DmlReplace::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 21002
        }
    
        class DmlUpdate(
            override val metas: MetaContainer = emptyMetaContainer()
        ): DmlOperation() {
        
            override fun copy(metas: MetaContainer): DmlUpdate =
                DmlUpdate(
                    metas = metas)
        
            override fun withMeta(metaKey: String, metaValue: Any): DmlUpdate =
                DmlUpdate(
                    metas = metas + metaContainerOf(metaKey to metaValue))
        
            override fun toIonElement(): SexpElement {
                val elements = ionSexpOf(
                    ionSymbol("dml_update"),
                    metas = metas)
                return elements
            }
        
        
            override fun equals(other: Any?): Boolean {
                if (other == null) return false
                if (this === other) return true
                if (other.javaClass != DmlUpdate::class.java) return false
        
                return true
            }
        
            override fun hashCode(): Int = 21003
        }
    
        /** Converts instances of [PartiqlLogical.DmlOperation] to any [T]. */
        interface Converter {
            fun convert(node: PartiqlLogical.DmlOperation): T = when(node) {
                is PartiqlLogical.DmlOperation.DmlInsert -> convertDmlInsert(node)
                is PartiqlLogical.DmlOperation.DmlDelete -> convertDmlDelete(node)
                is PartiqlLogical.DmlOperation.DmlReplace -> convertDmlReplace(node)
                is PartiqlLogical.DmlOperation.DmlUpdate -> convertDmlUpdate(node)
            }
    
            fun convertDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert): T
            fun convertDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete): T
            fun convertDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace): T
            fun convertDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate): T
        }
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // IonElementTransformer
    /////////////////////////////////////////////////////////////////////////////
    
    
    private class IonElementTransformer : IonElementTransformerBase() {
    
        override fun innerTransform(sexp: SexpElement): PartiqlLogicalNode {
            return when(sexp.tag) {
                //////////////////////////////////////
                // Tuple Types
                //////////////////////////////////////
                "time_value" -> {
                    sexp.requireArityOrMalformed(IntRange(6, 7))
                    val hour = sexp.getRequired(0).toLongPrimitive()
                    val minute = sexp.getRequired(1).toLongPrimitive()
                    val second = sexp.getRequired(2).toLongPrimitive()
                    val nano = sexp.getRequired(3).toLongPrimitive()
                    val precision = sexp.getRequired(4).toLongPrimitive()
                    val withTimeZone = sexp.getRequired(5).toBoolPrimitive()
                    val tzMinutes = sexp.getOptional(6)?.toLongPrimitive()
                    PartiqlLogical.TimeValue(
                        hour,
                        minute,
                        second,
                        nano,
                        precision,
                        withTimeZone,
                        tzMinutes,
                        metas = sexp.metas)
                }
                "graph_match_quantifier" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2))
                    val lower = sexp.getRequired(0).toLongPrimitive()
                    val upper = sexp.getOptional(1)?.toLongPrimitive()
                    PartiqlLogical.GraphMatchQuantifier(
                        lower,
                        upper,
                        metas = sexp.metas)
                }
                "graph_match_pattern" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val restrictor = sexp.getOptional(0)?.transformExpect()
                    val prefilter = sexp.getOptional(1)?.transformExpect()
                    val variable = sexp.getOptional(2)?.toSymbolPrimitive()
                    val quantifier = sexp.getOptional(3)?.transformExpect()
                    val parts = sexp.values.drop(5).map { it.transformExpect() }
                    PartiqlLogical.GraphMatchPattern(
                        restrictor,
                        prefilter,
                        variable,
                        quantifier,
                        parts,
                        metas = sexp.metas)
                }
                "gpml_pattern" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val selector = sexp.getOptional(0)?.transformExpect()
                    val patterns = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.GpmlPattern(
                        selector,
                        patterns,
                        metas = sexp.metas)
                }
                "expr_pair" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val first = sexp.getRequired(0).transformExpect()
                    val second = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.ExprPair(
                        first,
                        second,
                        metas = sexp.metas)
                }
                "expr_pair_list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val pairs = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.ExprPairList(
                        pairs,
                        metas = sexp.metas)
                }
                "sort_spec" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 3))
                    val expr = sexp.getRequired(0).transformExpect()
                    val orderingSpec = sexp.getOptional(1)?.transformExpect()
                    val nullsSpec = sexp.getOptional(2)?.transformExpect()
                    PartiqlLogical.SortSpec(
                        expr,
                        orderingSpec,
                        nullsSpec,
                        metas = sexp.metas)
                }
                "over" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2))
                    val partitionBy = sexp.getOptional(0)?.transformExpect()
                    val orderBy = sexp.getOptional(1)?.transformExpect()
                    PartiqlLogical.Over(
                        partitionBy,
                        orderBy,
                        metas = sexp.metas)
                }
                "window_partition_list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val exprs = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.WindowPartitionList(
                        exprs,
                        metas = sexp.metas)
                }
                "window_sort_spec_list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val sortSpecs = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.WindowSortSpecList(
                        sortSpecs,
                        metas = sexp.metas)
                }
                "identifier" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val name = sexp.getRequired(0).toSymbolPrimitive()
                    val case = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Identifier(
                        name,
                        case,
                        metas = sexp.metas)
                }
                "plan" -> {
                    val ir = sexp.transformToIntermediateRecord()
            
                    val stmt = ir.processRequiredField("stmt") { it.transformExpect() }
                    val version = ir.processRequiredField("version") { it.toSymbolPrimitive() }
            
                    ir.malformedIfAnyUnprocessedFieldsRemain()
            
                    Plan(stmt, version, metas = sexp.metas)
                }
                "let_binding" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val value = sexp.getRequired(0).transformExpect()
                    val decl = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.LetBinding(
                        value,
                        decl,
                        metas = sexp.metas)
                }
                "group_key" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val expr = sexp.getRequired(0).transformExpect()
                    val asVar = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.GroupKey(
                        expr,
                        asVar,
                        metas = sexp.metas)
                }
                "group_key_list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val keys = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.GroupKeyList(
                        keys,
                        metas = sexp.metas)
                }
                "aggregate_function" -> {
                    sexp.requireArityOrMalformed(IntRange(4, 4))
                    val quantifier = sexp.getRequired(0).transformExpect()
                    val name = sexp.getRequired(1).toSymbolPrimitive()
                    val arg = sexp.getRequired(2).transformExpect()
                    val asVar = sexp.getRequired(3).transformExpect()
                    PartiqlLogical.AggregateFunction(
                        quantifier,
                        name,
                        arg,
                        asVar,
                        metas = sexp.metas)
                }
                "aggregate_function_list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val functions = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.AggregateFunctionList(
                        functions,
                        metas = sexp.metas)
                }
                "window_expression" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2147483647))
                    val decl = sexp.getRequired(0).transformExpect()
                    val funcName = sexp.getRequired(1).toSymbolPrimitive()
                    val args = sexp.values.drop(3).map { it.transformExpect() }
                    PartiqlLogical.WindowExpression(
                        decl,
                        funcName,
                        args,
                        metas = sexp.metas)
                }
                "var_decl" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val name = sexp.getRequired(0).toSymbolPrimitive()
                    PartiqlLogical.VarDecl(
                        name,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'ExplainTarget'
                //////////////////////////////////////
                "domain" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 3))
                    val statement = sexp.getRequired(0).transformExpect()
                    val type = sexp.getOptional(1)?.toSymbolPrimitive()
                    val format = sexp.getOptional(2)?.toSymbolPrimitive()
                    PartiqlLogical.ExplainTarget.Domain(
                        statement,
                        type,
                        format,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'PathStep'
                //////////////////////////////////////
                "path_expr" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val index = sexp.getRequired(0).transformExpect()
                    val case = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.PathStep.PathExpr(
                        index,
                        case,
                        metas = sexp.metas)
                }
                "path_wildcard" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.PathStep.PathWildcard(
                        metas = sexp.metas)
                }
                "path_unpivot" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.PathStep.PathUnpivot(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'JoinType'
                //////////////////////////////////////
                "inner" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.JoinType.Inner(
                        metas = sexp.metas)
                }
                "left" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.JoinType.Left(
                        metas = sexp.metas)
                }
                "right" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.JoinType.Right(
                        metas = sexp.metas)
                }
                "full" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.JoinType.Full(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'GraphMatchDirection'
                //////////////////////////////////////
                "edge_left" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeLeft(
                        metas = sexp.metas)
                }
                "edge_undirected" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeUndirected(
                        metas = sexp.metas)
                }
                "edge_right" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeRight(
                        metas = sexp.metas)
                }
                "edge_left_or_undirected" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected(
                        metas = sexp.metas)
                }
                "edge_undirected_or_right" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight(
                        metas = sexp.metas)
                }
                "edge_left_or_right" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight(
                        metas = sexp.metas)
                }
                "edge_left_or_undirected_or_right" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'GraphMatchPatternPart'
                //////////////////////////////////////
                "node" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val prefilter = sexp.getOptional(0)?.transformExpect()
                    val variable = sexp.getOptional(1)?.toSymbolPrimitive()
                    val label = sexp.values.drop(3).map { it.toSymbolPrimitive() }
                    PartiqlLogical.GraphMatchPatternPart.Node(
                        prefilter,
                        variable,
                        label,
                        metas = sexp.metas)
                }
                "edge" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val direction = sexp.getRequired(0).transformExpect()
                    val quantifier = sexp.getOptional(1)?.transformExpect()
                    val prefilter = sexp.getOptional(2)?.transformExpect()
                    val variable = sexp.getOptional(3)?.toSymbolPrimitive()
                    val label = sexp.values.drop(5).map { it.toSymbolPrimitive() }
                    PartiqlLogical.GraphMatchPatternPart.Edge(
                        direction,
                        quantifier,
                        prefilter,
                        variable,
                        label,
                        metas = sexp.metas)
                }
                "pattern" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val pattern = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.GraphMatchPatternPart.Pattern(
                        pattern,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'GraphMatchRestrictor'
                //////////////////////////////////////
                "restrictor_trail" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchRestrictor.RestrictorTrail(
                        metas = sexp.metas)
                }
                "restrictor_acyclic" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic(
                        metas = sexp.metas)
                }
                "restrictor_simple" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchRestrictor.RestrictorSimple(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'GraphMatchSelector'
                //////////////////////////////////////
                "selector_any_shortest" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchSelector.SelectorAnyShortest(
                        metas = sexp.metas)
                }
                "selector_all_shortest" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchSelector.SelectorAllShortest(
                        metas = sexp.metas)
                }
                "selector_any" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GraphMatchSelector.SelectorAny(
                        metas = sexp.metas)
                }
                "selector_any_k" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val k = sexp.getRequired(0).toLongPrimitive()
                    PartiqlLogical.GraphMatchSelector.SelectorAnyK(
                        k,
                        metas = sexp.metas)
                }
                "selector_shortest_k" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val k = sexp.getRequired(0).toLongPrimitive()
                    PartiqlLogical.GraphMatchSelector.SelectorShortestK(
                        k,
                        metas = sexp.metas)
                }
                "selector_shortest_k_group" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val k = sexp.getRequired(0).toLongPrimitive()
                    PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup(
                        k,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'GroupingStrategy'
                //////////////////////////////////////
                "group_full" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GroupingStrategy.GroupFull(
                        metas = sexp.metas)
                }
                "group_partial" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.GroupingStrategy.GroupPartial(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'OrderingSpec'
                //////////////////////////////////////
                "asc" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.OrderingSpec.Asc(
                        metas = sexp.metas)
                }
                "desc" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.OrderingSpec.Desc(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'NullsSpec'
                //////////////////////////////////////
                "nulls_first" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.NullsSpec.NullsFirst(
                        metas = sexp.metas)
                }
                "nulls_last" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.NullsSpec.NullsLast(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'CaseSensitivity'
                //////////////////////////////////////
                "case_sensitive" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.CaseSensitivity.CaseSensitive(
                        metas = sexp.metas)
                }
                "case_insensitive" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.CaseSensitivity.CaseInsensitive(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'ScopeQualifier'
                //////////////////////////////////////
                "unqualified" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.ScopeQualifier.Unqualified(
                        metas = sexp.metas)
                }
                "locals_first" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.ScopeQualifier.LocalsFirst(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'SetQuantifier'
                //////////////////////////////////////
                "all" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.SetQuantifier.All(
                        metas = sexp.metas)
                }
                "distinct" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.SetQuantifier.Distinct(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'BagOpType'
                //////////////////////////////////////
                "union" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.Union(
                        metas = sexp.metas)
                }
                "intersect" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.Intersect(
                        metas = sexp.metas)
                }
                "except" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.Except(
                        metas = sexp.metas)
                }
                "outer_union" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.OuterUnion(
                        metas = sexp.metas)
                }
                "outer_intersect" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.OuterIntersect(
                        metas = sexp.metas)
                }
                "outer_except" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.BagOpType.OuterExcept(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'OnConflictValue'
                //////////////////////////////////////
                "excluded" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.OnConflictValue.Excluded(
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'Type'
                //////////////////////////////////////
                "null_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.NullType(
                        metas = sexp.metas)
                }
                "boolean_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.BooleanType(
                        metas = sexp.metas)
                }
                "smallint_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.SmallintType(
                        metas = sexp.metas)
                }
                "integer4_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.Integer4Type(
                        metas = sexp.metas)
                }
                "integer8_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.Integer8Type(
                        metas = sexp.metas)
                }
                "integer_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.IntegerType(
                        metas = sexp.metas)
                }
                "float_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 1))
                    val precision = sexp.getOptional(0)?.toLongPrimitive()
                    PartiqlLogical.Type.FloatType(
                        precision,
                        metas = sexp.metas)
                }
                "real_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.RealType(
                        metas = sexp.metas)
                }
                "double_precision_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.DoublePrecisionType(
                        metas = sexp.metas)
                }
                "decimal_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2))
                    val precision = sexp.getOptional(0)?.toLongPrimitive()
                    val scale = sexp.getOptional(1)?.toLongPrimitive()
                    PartiqlLogical.Type.DecimalType(
                        precision,
                        scale,
                        metas = sexp.metas)
                }
                "numeric_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2))
                    val precision = sexp.getOptional(0)?.toLongPrimitive()
                    val scale = sexp.getOptional(1)?.toLongPrimitive()
                    PartiqlLogical.Type.NumericType(
                        precision,
                        scale,
                        metas = sexp.metas)
                }
                "timestamp_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.TimestampType(
                        metas = sexp.metas)
                }
                "character_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 1))
                    val length = sexp.getOptional(0)?.toLongPrimitive()
                    PartiqlLogical.Type.CharacterType(
                        length,
                        metas = sexp.metas)
                }
                "character_varying_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 1))
                    val length = sexp.getOptional(0)?.toLongPrimitive()
                    PartiqlLogical.Type.CharacterVaryingType(
                        length,
                        metas = sexp.metas)
                }
                "missing_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.MissingType(
                        metas = sexp.metas)
                }
                "string_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.StringType(
                        metas = sexp.metas)
                }
                "symbol_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.SymbolType(
                        metas = sexp.metas)
                }
                "blob_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.BlobType(
                        metas = sexp.metas)
                }
                "clob_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.ClobType(
                        metas = sexp.metas)
                }
                "date_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.DateType(
                        metas = sexp.metas)
                }
                "time_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 1))
                    val precision = sexp.getOptional(0)?.toLongPrimitive()
                    PartiqlLogical.Type.TimeType(
                        precision,
                        metas = sexp.metas)
                }
                "time_with_time_zone_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 1))
                    val precision = sexp.getOptional(0)?.toLongPrimitive()
                    PartiqlLogical.Type.TimeWithTimeZoneType(
                        precision,
                        metas = sexp.metas)
                }
                "struct_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.StructType(
                        metas = sexp.metas)
                }
                "tuple_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.TupleType(
                        metas = sexp.metas)
                }
                "list_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.ListType(
                        metas = sexp.metas)
                }
                "sexp_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.SexpType(
                        metas = sexp.metas)
                }
                "bag_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.BagType(
                        metas = sexp.metas)
                }
                "any_type" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Type.AnyType(
                        metas = sexp.metas)
                }
                "custom_type" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val name = sexp.getRequired(0).toSymbolPrimitive()
                    PartiqlLogical.Type.CustomType(
                        name,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'Expr'
                //////////////////////////////////////
                "missing" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.Expr.Missing(
                        metas = sexp.metas)
                }
                "lit" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val value = sexp.getRequiredIon(0)
                    PartiqlLogical.Expr.Lit(
                        value,
                        metas = sexp.metas)
                }
                "id" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 3))
                    val name = sexp.getRequired(0).toSymbolPrimitive()
                    val case = sexp.getRequired(1).transformExpect()
                    val qualifier = sexp.getRequired(2).transformExpect()
                    PartiqlLogical.Expr.Id(
                        name,
                        case,
                        qualifier,
                        metas = sexp.metas)
                }
                "parameter" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val index = sexp.getRequired(0).toLongPrimitive()
                    PartiqlLogical.Expr.Parameter(
                        index,
                        metas = sexp.metas)
                }
                "not" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val expr = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Expr.Not(
                        expr,
                        metas = sexp.metas)
                }
                "pos" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val expr = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Expr.Pos(
                        expr,
                        metas = sexp.metas)
                }
                "neg" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val expr = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Expr.Neg(
                        expr,
                        metas = sexp.metas)
                }
                "plus" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Plus(
                        operands,
                        metas = sexp.metas)
                }
                "minus" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Minus(
                        operands,
                        metas = sexp.metas)
                }
                "times" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Times(
                        operands,
                        metas = sexp.metas)
                }
                "divide" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Divide(
                        operands,
                        metas = sexp.metas)
                }
                "modulo" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Modulo(
                        operands,
                        metas = sexp.metas)
                }
                "concat" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Concat(
                        operands,
                        metas = sexp.metas)
                }
                "and" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.And(
                        operands,
                        metas = sexp.metas)
                }
                "or" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Or(
                        operands,
                        metas = sexp.metas)
                }
                "eq" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Eq(
                        operands,
                        metas = sexp.metas)
                }
                "ne" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Ne(
                        operands,
                        metas = sexp.metas)
                }
                "gt" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Gt(
                        operands,
                        metas = sexp.metas)
                }
                "gte" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Gte(
                        operands,
                        metas = sexp.metas)
                }
                "lt" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Lt(
                        operands,
                        metas = sexp.metas)
                }
                "lte" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Lte(
                        operands,
                        metas = sexp.metas)
                }
                "like" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 3))
                    val value = sexp.getRequired(0).transformExpect()
                    val pattern = sexp.getRequired(1).transformExpect()
                    val escape = sexp.getOptional(2)?.transformExpect()
                    PartiqlLogical.Expr.Like(
                        value,
                        pattern,
                        escape,
                        metas = sexp.metas)
                }
                "between" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 3))
                    val value = sexp.getRequired(0).transformExpect()
                    val from = sexp.getRequired(1).transformExpect()
                    val to = sexp.getRequired(2).transformExpect()
                    PartiqlLogical.Expr.Between(
                        value,
                        from,
                        to,
                        metas = sexp.metas)
                }
                "in_collection" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val operands = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.InCollection(
                        operands,
                        metas = sexp.metas)
                }
                "is_type" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val value = sexp.getRequired(0).transformExpect()
                    val type = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.IsType(
                        value,
                        type,
                        metas = sexp.metas)
                }
                "simple_case" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 3))
                    val expr = sexp.getRequired(0).transformExpect()
                    val cases = sexp.getRequired(1).transformExpect()
                    val default = sexp.getOptional(2)?.transformExpect()
                    PartiqlLogical.Expr.SimpleCase(
                        expr,
                        cases,
                        default,
                        metas = sexp.metas)
                }
                "searched_case" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2))
                    val cases = sexp.getRequired(0).transformExpect()
                    val default = sexp.getOptional(1)?.transformExpect()
                    PartiqlLogical.Expr.SearchedCase(
                        cases,
                        default,
                        metas = sexp.metas)
                }
                "bag" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val values = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Bag(
                        values,
                        metas = sexp.metas)
                }
                "list" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val values = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.List(
                        values,
                        metas = sexp.metas)
                }
                "sexp" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val values = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Sexp(
                        values,
                        metas = sexp.metas)
                }
                "date" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 3))
                    val year = sexp.getRequired(0).toLongPrimitive()
                    val month = sexp.getRequired(1).toLongPrimitive()
                    val day = sexp.getRequired(2).toLongPrimitive()
                    PartiqlLogical.Expr.Date(
                        year,
                        month,
                        day,
                        metas = sexp.metas)
                }
                "lit_time" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val value = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Expr.LitTime(
                        value,
                        metas = sexp.metas)
                }
                "bag_op" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2147483647))
                    val op = sexp.getRequired(0).transformExpect()
                    val quantifier = sexp.getRequired(1).transformExpect()
                    val operands = sexp.values.drop(3).map { it.transformExpect() }
                    PartiqlLogical.Expr.BagOp(
                        op,
                        quantifier,
                        operands,
                        metas = sexp.metas)
                }
                "graph_match" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val expr = sexp.getRequired(0).transformExpect()
                    val gpmlPattern = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.GraphMatch(
                        expr,
                        gpmlPattern,
                        metas = sexp.metas)
                }
                "path" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val root = sexp.getRequired(0).transformExpect()
                    val steps = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.Expr.Path(
                        root,
                        steps,
                        metas = sexp.metas)
                }
                "call" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val funcName = sexp.getRequired(0).toSymbolPrimitive()
                    val args = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.Expr.Call(
                        funcName,
                        args,
                        metas = sexp.metas)
                }
                "cast" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val value = sexp.getRequired(0).transformExpect()
                    val asType = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.Cast(
                        value,
                        asType,
                        metas = sexp.metas)
                }
                "can_cast" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val value = sexp.getRequired(0).transformExpect()
                    val asType = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.CanCast(
                        value,
                        asType,
                        metas = sexp.metas)
                }
                "can_lossless_cast" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val value = sexp.getRequired(0).transformExpect()
                    val asType = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.CanLosslessCast(
                        value,
                        asType,
                        metas = sexp.metas)
                }
                "null_if" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val expr1 = sexp.getRequired(0).transformExpect()
                    val expr2 = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.NullIf(
                        expr1,
                        expr2,
                        metas = sexp.metas)
                }
                "coalesce" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val args = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Coalesce(
                        args,
                        metas = sexp.metas)
                }
                "bindings_to_values" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val exp = sexp.getRequired(0).transformExpect()
                    val query = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Expr.BindingsToValues(
                        exp,
                        query,
                        metas = sexp.metas)
                }
                "struct" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 2147483647))
                    val parts = sexp.values.drop(1).map { it.transformExpect() }
                    PartiqlLogical.Expr.Struct(
                        parts,
                        metas = sexp.metas)
                }
                "pivot" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 3))
                    val input = sexp.getRequired(0).transformExpect()
                    val key = sexp.getRequired(1).transformExpect()
                    val value = sexp.getRequired(2).transformExpect()
                    PartiqlLogical.Expr.Pivot(
                        input,
                        key,
                        value,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'Statement'
                //////////////////////////////////////
                "query" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val expr = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Statement.Query(
                        expr,
                        metas = sexp.metas)
                }
                "exec" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val procedureName = sexp.getRequired(0).toSymbolPrimitive()
                    val args = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.Statement.Exec(
                        procedureName,
                        args,
                        metas = sexp.metas)
                }
                "explain" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val target = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.Statement.Explain(
                        target,
                        metas = sexp.metas)
                }
                "dml" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 3))
                    val target = sexp.getRequired(0).transformExpect()
                    val operation = sexp.getRequired(1).transformExpect()
                    val rows = sexp.getRequired(2).transformExpect()
                    PartiqlLogical.Statement.Dml(
                        target,
                        operation,
                        rows,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'StructPart'
                //////////////////////////////////////
                "struct_fields" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 1))
                    val partExpr = sexp.getRequired(0).transformExpect()
                    PartiqlLogical.StructPart.StructFields(
                        partExpr,
                        metas = sexp.metas)
                }
                "struct_field" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val fieldName = sexp.getRequired(0).transformExpect()
                    val value = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.StructPart.StructField(
                        fieldName,
                        value,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'Bexpr'
                //////////////////////////////////////
                "scan" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 4))
                    val expr = sexp.getRequired(0).transformExpect()
                    val asDecl = sexp.getRequired(1).transformExpect()
                    val atDecl = sexp.getOptional(2)?.transformExpect()
                    val byDecl = sexp.getOptional(3)?.transformExpect()
                    PartiqlLogical.Bexpr.Scan(
                        expr,
                        asDecl,
                        atDecl,
                        byDecl,
                        metas = sexp.metas)
                }
                "unpivot" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 4))
                    val expr = sexp.getRequired(0).transformExpect()
                    val asDecl = sexp.getRequired(1).transformExpect()
                    val atDecl = sexp.getOptional(2)?.transformExpect()
                    val byDecl = sexp.getOptional(3)?.transformExpect()
                    PartiqlLogical.Bexpr.Unpivot(
                        expr,
                        asDecl,
                        atDecl,
                        byDecl,
                        metas = sexp.metas)
                }
                "filter" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val predicate = sexp.getRequired(0).transformExpect()
                    val source = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Bexpr.Filter(
                        predicate,
                        source,
                        metas = sexp.metas)
                }
                "aggregate" -> {
                    sexp.requireArityOrMalformed(IntRange(4, 4))
                    val source = sexp.getRequired(0).transformExpect()
                    val strategy = sexp.getRequired(1).transformExpect()
                    val groupList = sexp.getRequired(2).transformExpect()
                    val functionList = sexp.getRequired(3).transformExpect()
                    PartiqlLogical.Bexpr.Aggregate(
                        source,
                        strategy,
                        groupList,
                        functionList,
                        metas = sexp.metas)
                }
                "join" -> {
                    sexp.requireArityOrMalformed(IntRange(3, 4))
                    val joinType = sexp.getRequired(0).transformExpect()
                    val left = sexp.getRequired(1).transformExpect()
                    val right = sexp.getRequired(2).transformExpect()
                    val predicate = sexp.getOptional(3)?.transformExpect()
                    PartiqlLogical.Bexpr.Join(
                        joinType,
                        left,
                        right,
                        predicate,
                        metas = sexp.metas)
                }
                "window" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2147483647))
                    val source = sexp.getRequired(0).transformExpect()
                    val windowSpecification = sexp.getRequired(1).transformExpect()
                    val windowExpressionList = sexp.values.drop(3).map { it.transformExpect() }
                    PartiqlLogical.Bexpr.Window(
                        source,
                        windowSpecification,
                        windowExpressionList,
                        metas = sexp.metas)
                }
                "sort" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val source = sexp.getRequired(0).transformExpect()
                    val sortSpecs = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.Bexpr.Sort(
                        source,
                        sortSpecs,
                        metas = sexp.metas)
                }
                "offset" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val rowCount = sexp.getRequired(0).transformExpect()
                    val source = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Bexpr.Offset(
                        rowCount,
                        source,
                        metas = sexp.metas)
                }
                "limit" -> {
                    sexp.requireArityOrMalformed(IntRange(2, 2))
                    val rowCount = sexp.getRequired(0).transformExpect()
                    val source = sexp.getRequired(1).transformExpect()
                    PartiqlLogical.Bexpr.Limit(
                        rowCount,
                        source,
                        metas = sexp.metas)
                }
                "let" -> {
                    sexp.requireArityOrMalformed(IntRange(1, 2147483647))
                    val source = sexp.getRequired(0).transformExpect()
                    val bindings = sexp.values.drop(2).map { it.transformExpect() }
                    PartiqlLogical.Bexpr.Let(
                        source,
                        bindings,
                        metas = sexp.metas)
                }
                //////////////////////////////////////
                // Variants for Sum Type 'DmlOperation'
                //////////////////////////////////////
                "dml_insert" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.DmlOperation.DmlInsert(
                        metas = sexp.metas)
                }
                "dml_delete" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.DmlOperation.DmlDelete(
                        metas = sexp.metas)
                }
                "dml_replace" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.DmlOperation.DmlReplace(
                        metas = sexp.metas)
                }
                "dml_update" -> {
                    sexp.requireArityOrMalformed(IntRange(0, 0))
                    PartiqlLogical.DmlOperation.DmlUpdate(
                        metas = sexp.metas)
                }
                else -> errMalformed(sexp.head.metas.location, "Unknown tag '${sexp.tag}' for domain 'partiql_logical'")
            }
        }
    }
    
    open class Visitor : DomainVisitorBase() {
        ////////////////////////////////////////////////////////////////////////////
        // Visit Functions
        ////////////////////////////////////////////////////////////////////////////
    
        //////////////////////////////////////
        // Tuple Types
        //////////////////////////////////////
        open fun visitTimeValue(node: PartiqlLogical.TimeValue) { }
        open fun visitGraphMatchQuantifier(node: PartiqlLogical.GraphMatchQuantifier) { }
        open fun visitGraphMatchPattern(node: PartiqlLogical.GraphMatchPattern) { }
        open fun visitGpmlPattern(node: PartiqlLogical.GpmlPattern) { }
        open fun visitExprPair(node: PartiqlLogical.ExprPair) { }
        open fun visitExprPairList(node: PartiqlLogical.ExprPairList) { }
        open fun visitSortSpec(node: PartiqlLogical.SortSpec) { }
        open fun visitOver(node: PartiqlLogical.Over) { }
        open fun visitWindowPartitionList(node: PartiqlLogical.WindowPartitionList) { }
        open fun visitWindowSortSpecList(node: PartiqlLogical.WindowSortSpecList) { }
        open fun visitIdentifier(node: PartiqlLogical.Identifier) { }
        open fun visitPlan(node: PartiqlLogical.Plan) { }
        open fun visitLetBinding(node: PartiqlLogical.LetBinding) { }
        open fun visitGroupKey(node: PartiqlLogical.GroupKey) { }
        open fun visitGroupKeyList(node: PartiqlLogical.GroupKeyList) { }
        open fun visitAggregateFunction(node: PartiqlLogical.AggregateFunction) { }
        open fun visitAggregateFunctionList(node: PartiqlLogical.AggregateFunctionList) { }
        open fun visitWindowExpression(node: PartiqlLogical.WindowExpression) { }
        open fun visitVarDecl(node: PartiqlLogical.VarDecl) { }
        //////////////////////////////////////
        // Sum Type: ExplainTarget
        //////////////////////////////////////
        protected open fun visitExplainTarget(node: PartiqlLogical.ExplainTarget) { }
        protected open fun visitExplainTargetDomain(node: PartiqlLogical.ExplainTarget.Domain) { }
        //////////////////////////////////////
        // Sum Type: PathStep
        //////////////////////////////////////
        protected open fun visitPathStep(node: PartiqlLogical.PathStep) { }
        protected open fun visitPathStepPathExpr(node: PartiqlLogical.PathStep.PathExpr) { }
        protected open fun visitPathStepPathWildcard(node: PartiqlLogical.PathStep.PathWildcard) { }
        protected open fun visitPathStepPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot) { }
        //////////////////////////////////////
        // Sum Type: JoinType
        //////////////////////////////////////
        protected open fun visitJoinType(node: PartiqlLogical.JoinType) { }
        protected open fun visitJoinTypeInner(node: PartiqlLogical.JoinType.Inner) { }
        protected open fun visitJoinTypeLeft(node: PartiqlLogical.JoinType.Left) { }
        protected open fun visitJoinTypeRight(node: PartiqlLogical.JoinType.Right) { }
        protected open fun visitJoinTypeFull(node: PartiqlLogical.JoinType.Full) { }
        //////////////////////////////////////
        // Sum Type: GraphMatchDirection
        //////////////////////////////////////
        protected open fun visitGraphMatchDirection(node: PartiqlLogical.GraphMatchDirection) { }
        protected open fun visitGraphMatchDirectionEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft) { }
        protected open fun visitGraphMatchDirectionEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected) { }
        protected open fun visitGraphMatchDirectionEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight) { }
        protected open fun visitGraphMatchDirectionEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected) { }
        protected open fun visitGraphMatchDirectionEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight) { }
        protected open fun visitGraphMatchDirectionEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight) { }
        protected open fun visitGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight) { }
        //////////////////////////////////////
        // Sum Type: GraphMatchPatternPart
        //////////////////////////////////////
        protected open fun visitGraphMatchPatternPart(node: PartiqlLogical.GraphMatchPatternPart) { }
        protected open fun visitGraphMatchPatternPartNode(node: PartiqlLogical.GraphMatchPatternPart.Node) { }
        protected open fun visitGraphMatchPatternPartEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge) { }
        protected open fun visitGraphMatchPatternPartPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern) { }
        //////////////////////////////////////
        // Sum Type: GraphMatchRestrictor
        //////////////////////////////////////
        protected open fun visitGraphMatchRestrictor(node: PartiqlLogical.GraphMatchRestrictor) { }
        protected open fun visitGraphMatchRestrictorRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail) { }
        protected open fun visitGraphMatchRestrictorRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic) { }
        protected open fun visitGraphMatchRestrictorRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple) { }
        //////////////////////////////////////
        // Sum Type: GraphMatchSelector
        //////////////////////////////////////
        protected open fun visitGraphMatchSelector(node: PartiqlLogical.GraphMatchSelector) { }
        protected open fun visitGraphMatchSelectorSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest) { }
        protected open fun visitGraphMatchSelectorSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest) { }
        protected open fun visitGraphMatchSelectorSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny) { }
        protected open fun visitGraphMatchSelectorSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK) { }
        protected open fun visitGraphMatchSelectorSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK) { }
        protected open fun visitGraphMatchSelectorSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup) { }
        //////////////////////////////////////
        // Sum Type: GroupingStrategy
        //////////////////////////////////////
        protected open fun visitGroupingStrategy(node: PartiqlLogical.GroupingStrategy) { }
        protected open fun visitGroupingStrategyGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull) { }
        protected open fun visitGroupingStrategyGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial) { }
        //////////////////////////////////////
        // Sum Type: OrderingSpec
        //////////////////////////////////////
        protected open fun visitOrderingSpec(node: PartiqlLogical.OrderingSpec) { }
        protected open fun visitOrderingSpecAsc(node: PartiqlLogical.OrderingSpec.Asc) { }
        protected open fun visitOrderingSpecDesc(node: PartiqlLogical.OrderingSpec.Desc) { }
        //////////////////////////////////////
        // Sum Type: NullsSpec
        //////////////////////////////////////
        protected open fun visitNullsSpec(node: PartiqlLogical.NullsSpec) { }
        protected open fun visitNullsSpecNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst) { }
        protected open fun visitNullsSpecNullsLast(node: PartiqlLogical.NullsSpec.NullsLast) { }
        //////////////////////////////////////
        // Sum Type: CaseSensitivity
        //////////////////////////////////////
        protected open fun visitCaseSensitivity(node: PartiqlLogical.CaseSensitivity) { }
        protected open fun visitCaseSensitivityCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive) { }
        protected open fun visitCaseSensitivityCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive) { }
        //////////////////////////////////////
        // Sum Type: ScopeQualifier
        //////////////////////////////////////
        protected open fun visitScopeQualifier(node: PartiqlLogical.ScopeQualifier) { }
        protected open fun visitScopeQualifierUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified) { }
        protected open fun visitScopeQualifierLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst) { }
        //////////////////////////////////////
        // Sum Type: SetQuantifier
        //////////////////////////////////////
        protected open fun visitSetQuantifier(node: PartiqlLogical.SetQuantifier) { }
        protected open fun visitSetQuantifierAll(node: PartiqlLogical.SetQuantifier.All) { }
        protected open fun visitSetQuantifierDistinct(node: PartiqlLogical.SetQuantifier.Distinct) { }
        //////////////////////////////////////
        // Sum Type: BagOpType
        //////////////////////////////////////
        protected open fun visitBagOpType(node: PartiqlLogical.BagOpType) { }
        protected open fun visitBagOpTypeUnion(node: PartiqlLogical.BagOpType.Union) { }
        protected open fun visitBagOpTypeIntersect(node: PartiqlLogical.BagOpType.Intersect) { }
        protected open fun visitBagOpTypeExcept(node: PartiqlLogical.BagOpType.Except) { }
        protected open fun visitBagOpTypeOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion) { }
        protected open fun visitBagOpTypeOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect) { }
        protected open fun visitBagOpTypeOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept) { }
        //////////////////////////////////////
        // Sum Type: OnConflictValue
        //////////////////////////////////////
        protected open fun visitOnConflictValue(node: PartiqlLogical.OnConflictValue) { }
        protected open fun visitOnConflictValueExcluded(node: PartiqlLogical.OnConflictValue.Excluded) { }
        //////////////////////////////////////
        // Sum Type: Type
        //////////////////////////////////////
        protected open fun visitType(node: PartiqlLogical.Type) { }
        protected open fun visitTypeNullType(node: PartiqlLogical.Type.NullType) { }
        protected open fun visitTypeBooleanType(node: PartiqlLogical.Type.BooleanType) { }
        protected open fun visitTypeSmallintType(node: PartiqlLogical.Type.SmallintType) { }
        protected open fun visitTypeInteger4Type(node: PartiqlLogical.Type.Integer4Type) { }
        protected open fun visitTypeInteger8Type(node: PartiqlLogical.Type.Integer8Type) { }
        protected open fun visitTypeIntegerType(node: PartiqlLogical.Type.IntegerType) { }
        protected open fun visitTypeFloatType(node: PartiqlLogical.Type.FloatType) { }
        protected open fun visitTypeRealType(node: PartiqlLogical.Type.RealType) { }
        protected open fun visitTypeDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType) { }
        protected open fun visitTypeDecimalType(node: PartiqlLogical.Type.DecimalType) { }
        protected open fun visitTypeNumericType(node: PartiqlLogical.Type.NumericType) { }
        protected open fun visitTypeTimestampType(node: PartiqlLogical.Type.TimestampType) { }
        protected open fun visitTypeCharacterType(node: PartiqlLogical.Type.CharacterType) { }
        protected open fun visitTypeCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType) { }
        protected open fun visitTypeMissingType(node: PartiqlLogical.Type.MissingType) { }
        protected open fun visitTypeStringType(node: PartiqlLogical.Type.StringType) { }
        protected open fun visitTypeSymbolType(node: PartiqlLogical.Type.SymbolType) { }
        protected open fun visitTypeBlobType(node: PartiqlLogical.Type.BlobType) { }
        protected open fun visitTypeClobType(node: PartiqlLogical.Type.ClobType) { }
        protected open fun visitTypeDateType(node: PartiqlLogical.Type.DateType) { }
        protected open fun visitTypeTimeType(node: PartiqlLogical.Type.TimeType) { }
        protected open fun visitTypeTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType) { }
        protected open fun visitTypeStructType(node: PartiqlLogical.Type.StructType) { }
        protected open fun visitTypeTupleType(node: PartiqlLogical.Type.TupleType) { }
        protected open fun visitTypeListType(node: PartiqlLogical.Type.ListType) { }
        protected open fun visitTypeSexpType(node: PartiqlLogical.Type.SexpType) { }
        protected open fun visitTypeBagType(node: PartiqlLogical.Type.BagType) { }
        protected open fun visitTypeAnyType(node: PartiqlLogical.Type.AnyType) { }
        protected open fun visitTypeCustomType(node: PartiqlLogical.Type.CustomType) { }
        //////////////////////////////////////
        // Sum Type: Expr
        //////////////////////////////////////
        protected open fun visitExpr(node: PartiqlLogical.Expr) { }
        protected open fun visitExprMissing(node: PartiqlLogical.Expr.Missing) { }
        protected open fun visitExprLit(node: PartiqlLogical.Expr.Lit) { }
        protected open fun visitExprId(node: PartiqlLogical.Expr.Id) { }
        protected open fun visitExprParameter(node: PartiqlLogical.Expr.Parameter) { }
        protected open fun visitExprNot(node: PartiqlLogical.Expr.Not) { }
        protected open fun visitExprPos(node: PartiqlLogical.Expr.Pos) { }
        protected open fun visitExprNeg(node: PartiqlLogical.Expr.Neg) { }
        protected open fun visitExprPlus(node: PartiqlLogical.Expr.Plus) { }
        protected open fun visitExprMinus(node: PartiqlLogical.Expr.Minus) { }
        protected open fun visitExprTimes(node: PartiqlLogical.Expr.Times) { }
        protected open fun visitExprDivide(node: PartiqlLogical.Expr.Divide) { }
        protected open fun visitExprModulo(node: PartiqlLogical.Expr.Modulo) { }
        protected open fun visitExprConcat(node: PartiqlLogical.Expr.Concat) { }
        protected open fun visitExprAnd(node: PartiqlLogical.Expr.And) { }
        protected open fun visitExprOr(node: PartiqlLogical.Expr.Or) { }
        protected open fun visitExprEq(node: PartiqlLogical.Expr.Eq) { }
        protected open fun visitExprNe(node: PartiqlLogical.Expr.Ne) { }
        protected open fun visitExprGt(node: PartiqlLogical.Expr.Gt) { }
        protected open fun visitExprGte(node: PartiqlLogical.Expr.Gte) { }
        protected open fun visitExprLt(node: PartiqlLogical.Expr.Lt) { }
        protected open fun visitExprLte(node: PartiqlLogical.Expr.Lte) { }
        protected open fun visitExprLike(node: PartiqlLogical.Expr.Like) { }
        protected open fun visitExprBetween(node: PartiqlLogical.Expr.Between) { }
        protected open fun visitExprInCollection(node: PartiqlLogical.Expr.InCollection) { }
        protected open fun visitExprIsType(node: PartiqlLogical.Expr.IsType) { }
        protected open fun visitExprSimpleCase(node: PartiqlLogical.Expr.SimpleCase) { }
        protected open fun visitExprSearchedCase(node: PartiqlLogical.Expr.SearchedCase) { }
        protected open fun visitExprBag(node: PartiqlLogical.Expr.Bag) { }
        protected open fun visitExprList(node: PartiqlLogical.Expr.List) { }
        protected open fun visitExprSexp(node: PartiqlLogical.Expr.Sexp) { }
        protected open fun visitExprDate(node: PartiqlLogical.Expr.Date) { }
        protected open fun visitExprLitTime(node: PartiqlLogical.Expr.LitTime) { }
        protected open fun visitExprBagOp(node: PartiqlLogical.Expr.BagOp) { }
        protected open fun visitExprGraphMatch(node: PartiqlLogical.Expr.GraphMatch) { }
        protected open fun visitExprPath(node: PartiqlLogical.Expr.Path) { }
        protected open fun visitExprCall(node: PartiqlLogical.Expr.Call) { }
        protected open fun visitExprCast(node: PartiqlLogical.Expr.Cast) { }
        protected open fun visitExprCanCast(node: PartiqlLogical.Expr.CanCast) { }
        protected open fun visitExprCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast) { }
        protected open fun visitExprNullIf(node: PartiqlLogical.Expr.NullIf) { }
        protected open fun visitExprCoalesce(node: PartiqlLogical.Expr.Coalesce) { }
        protected open fun visitExprBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues) { }
        protected open fun visitExprStruct(node: PartiqlLogical.Expr.Struct) { }
        protected open fun visitExprPivot(node: PartiqlLogical.Expr.Pivot) { }
        //////////////////////////////////////
        // Sum Type: Statement
        //////////////////////////////////////
        protected open fun visitStatement(node: PartiqlLogical.Statement) { }
        protected open fun visitStatementQuery(node: PartiqlLogical.Statement.Query) { }
        protected open fun visitStatementExec(node: PartiqlLogical.Statement.Exec) { }
        protected open fun visitStatementExplain(node: PartiqlLogical.Statement.Explain) { }
        protected open fun visitStatementDml(node: PartiqlLogical.Statement.Dml) { }
        //////////////////////////////////////
        // Sum Type: StructPart
        //////////////////////////////////////
        protected open fun visitStructPart(node: PartiqlLogical.StructPart) { }
        protected open fun visitStructPartStructFields(node: PartiqlLogical.StructPart.StructFields) { }
        protected open fun visitStructPartStructField(node: PartiqlLogical.StructPart.StructField) { }
        //////////////////////////////////////
        // Sum Type: Bexpr
        //////////////////////////////////////
        protected open fun visitBexpr(node: PartiqlLogical.Bexpr) { }
        protected open fun visitBexprScan(node: PartiqlLogical.Bexpr.Scan) { }
        protected open fun visitBexprUnpivot(node: PartiqlLogical.Bexpr.Unpivot) { }
        protected open fun visitBexprFilter(node: PartiqlLogical.Bexpr.Filter) { }
        protected open fun visitBexprAggregate(node: PartiqlLogical.Bexpr.Aggregate) { }
        protected open fun visitBexprJoin(node: PartiqlLogical.Bexpr.Join) { }
        protected open fun visitBexprWindow(node: PartiqlLogical.Bexpr.Window) { }
        protected open fun visitBexprSort(node: PartiqlLogical.Bexpr.Sort) { }
        protected open fun visitBexprOffset(node: PartiqlLogical.Bexpr.Offset) { }
        protected open fun visitBexprLimit(node: PartiqlLogical.Bexpr.Limit) { }
        protected open fun visitBexprLet(node: PartiqlLogical.Bexpr.Let) { }
        //////////////////////////////////////
        // Sum Type: DmlOperation
        //////////////////////////////////////
        protected open fun visitDmlOperation(node: PartiqlLogical.DmlOperation) { }
        protected open fun visitDmlOperationDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert) { }
        protected open fun visitDmlOperationDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete) { }
        protected open fun visitDmlOperationDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace) { }
        protected open fun visitDmlOperationDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate) { }
    
        ////////////////////////////////////////////////////////////////////////////
        // Walk Functions
        ////////////////////////////////////////////////////////////////////////////
    
        //////////////////////////////////////
        // Tuple Types
        //////////////////////////////////////
        open fun walkTimeValue(node: PartiqlLogical.TimeValue) {
            visitTimeValue(node)
            walkLongPrimitive(node.hour)
            walkLongPrimitive(node.minute)
            walkLongPrimitive(node.second)
            walkLongPrimitive(node.nano)
            walkLongPrimitive(node.precision)
            walkBoolPrimitive(node.withTimeZone)
            node.tzMinutes?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
    
        open fun walkGraphMatchQuantifier(node: PartiqlLogical.GraphMatchQuantifier) {
            visitGraphMatchQuantifier(node)
            walkLongPrimitive(node.lower)
            node.upper?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
    
        open fun walkGraphMatchPattern(node: PartiqlLogical.GraphMatchPattern) {
            visitGraphMatchPattern(node)
            node.restrictor?.let { walkGraphMatchRestrictor(it) }
            node.prefilter?.let { walkExpr(it) }
            node.variable?.let { walkSymbolPrimitive(it) }
            node.quantifier?.let { walkGraphMatchQuantifier(it) }
            node.parts.map { walkGraphMatchPatternPart(it) }
            walkMetas(node.metas)
        }
    
        open fun walkGpmlPattern(node: PartiqlLogical.GpmlPattern) {
            visitGpmlPattern(node)
            node.selector?.let { walkGraphMatchSelector(it) }
            node.patterns.map { walkGraphMatchPattern(it) }
            walkMetas(node.metas)
        }
    
        open fun walkExprPair(node: PartiqlLogical.ExprPair) {
            visitExprPair(node)
            walkExpr(node.first)
            walkExpr(node.second)
            walkMetas(node.metas)
        }
    
        open fun walkExprPairList(node: PartiqlLogical.ExprPairList) {
            visitExprPairList(node)
            node.pairs.map { walkExprPair(it) }
            walkMetas(node.metas)
        }
    
        open fun walkSortSpec(node: PartiqlLogical.SortSpec) {
            visitSortSpec(node)
            walkExpr(node.expr)
            node.orderingSpec?.let { walkOrderingSpec(it) }
            node.nullsSpec?.let { walkNullsSpec(it) }
            walkMetas(node.metas)
        }
    
        open fun walkOver(node: PartiqlLogical.Over) {
            visitOver(node)
            node.partitionBy?.let { walkWindowPartitionList(it) }
            node.orderBy?.let { walkWindowSortSpecList(it) }
            walkMetas(node.metas)
        }
    
        open fun walkWindowPartitionList(node: PartiqlLogical.WindowPartitionList) {
            visitWindowPartitionList(node)
            node.exprs.map { walkExpr(it) }
            walkMetas(node.metas)
        }
    
        open fun walkWindowSortSpecList(node: PartiqlLogical.WindowSortSpecList) {
            visitWindowSortSpecList(node)
            node.sortSpecs.map { walkSortSpec(it) }
            walkMetas(node.metas)
        }
    
        open fun walkIdentifier(node: PartiqlLogical.Identifier) {
            visitIdentifier(node)
            walkSymbolPrimitive(node.name)
            walkCaseSensitivity(node.case)
            walkMetas(node.metas)
        }
    
        open fun walkPlan(node: PartiqlLogical.Plan) {
            visitPlan(node)
            walkStatement(node.stmt)
            walkSymbolPrimitive(node.version)
            walkMetas(node.metas)
        }
    
        open fun walkLetBinding(node: PartiqlLogical.LetBinding) {
            visitLetBinding(node)
            walkExpr(node.value)
            walkVarDecl(node.decl)
            walkMetas(node.metas)
        }
    
        open fun walkGroupKey(node: PartiqlLogical.GroupKey) {
            visitGroupKey(node)
            walkExpr(node.expr)
            walkVarDecl(node.asVar)
            walkMetas(node.metas)
        }
    
        open fun walkGroupKeyList(node: PartiqlLogical.GroupKeyList) {
            visitGroupKeyList(node)
            node.keys.map { walkGroupKey(it) }
            walkMetas(node.metas)
        }
    
        open fun walkAggregateFunction(node: PartiqlLogical.AggregateFunction) {
            visitAggregateFunction(node)
            walkSetQuantifier(node.quantifier)
            walkSymbolPrimitive(node.name)
            walkExpr(node.arg)
            walkVarDecl(node.asVar)
            walkMetas(node.metas)
        }
    
        open fun walkAggregateFunctionList(node: PartiqlLogical.AggregateFunctionList) {
            visitAggregateFunctionList(node)
            node.functions.map { walkAggregateFunction(it) }
            walkMetas(node.metas)
        }
    
        open fun walkWindowExpression(node: PartiqlLogical.WindowExpression) {
            visitWindowExpression(node)
            walkVarDecl(node.decl)
            walkSymbolPrimitive(node.funcName)
            node.args.map { walkExpr(it) }
            walkMetas(node.metas)
        }
    
        open fun walkVarDecl(node: PartiqlLogical.VarDecl) {
            visitVarDecl(node)
            walkSymbolPrimitive(node.name)
            walkMetas(node.metas)
        }
    
        //////////////////////////////////////
        // Sum Type: ExplainTarget
        //////////////////////////////////////
        open fun walkExplainTarget(node: PartiqlLogical.ExplainTarget) {
            visitExplainTarget(node)
            when(node) {
                is PartiqlLogical.ExplainTarget.Domain -> walkExplainTargetDomain(node)
            }
        }
    
        open fun walkExplainTargetDomain(node: PartiqlLogical.ExplainTarget.Domain) {
            visitExplainTargetDomain(node)
            walkStatement(node.statement)
            node.type?.let { walkSymbolPrimitive(it) }
            node.format?.let { walkSymbolPrimitive(it) }
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: PathStep
        //////////////////////////////////////
        open fun walkPathStep(node: PartiqlLogical.PathStep) {
            visitPathStep(node)
            when(node) {
                is PartiqlLogical.PathStep.PathExpr -> walkPathStepPathExpr(node)
                is PartiqlLogical.PathStep.PathWildcard -> walkPathStepPathWildcard(node)
                is PartiqlLogical.PathStep.PathUnpivot -> walkPathStepPathUnpivot(node)
            }
        }
    
        open fun walkPathStepPathExpr(node: PartiqlLogical.PathStep.PathExpr) {
            visitPathStepPathExpr(node)
            walkExpr(node.index)
            walkCaseSensitivity(node.case)
            walkMetas(node.metas)
        }
        open fun walkPathStepPathWildcard(node: PartiqlLogical.PathStep.PathWildcard) {
            visitPathStepPathWildcard(node)
            walkMetas(node.metas)
        }
        open fun walkPathStepPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot) {
            visitPathStepPathUnpivot(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: JoinType
        //////////////////////////////////////
        open fun walkJoinType(node: PartiqlLogical.JoinType) {
            visitJoinType(node)
            when(node) {
                is PartiqlLogical.JoinType.Inner -> walkJoinTypeInner(node)
                is PartiqlLogical.JoinType.Left -> walkJoinTypeLeft(node)
                is PartiqlLogical.JoinType.Right -> walkJoinTypeRight(node)
                is PartiqlLogical.JoinType.Full -> walkJoinTypeFull(node)
            }
        }
    
        open fun walkJoinTypeInner(node: PartiqlLogical.JoinType.Inner) {
            visitJoinTypeInner(node)
            walkMetas(node.metas)
        }
        open fun walkJoinTypeLeft(node: PartiqlLogical.JoinType.Left) {
            visitJoinTypeLeft(node)
            walkMetas(node.metas)
        }
        open fun walkJoinTypeRight(node: PartiqlLogical.JoinType.Right) {
            visitJoinTypeRight(node)
            walkMetas(node.metas)
        }
        open fun walkJoinTypeFull(node: PartiqlLogical.JoinType.Full) {
            visitJoinTypeFull(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: GraphMatchDirection
        //////////////////////////////////////
        open fun walkGraphMatchDirection(node: PartiqlLogical.GraphMatchDirection) {
            visitGraphMatchDirection(node)
            when(node) {
                is PartiqlLogical.GraphMatchDirection.EdgeLeft -> walkGraphMatchDirectionEdgeLeft(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirected -> walkGraphMatchDirectionEdgeUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeRight -> walkGraphMatchDirectionEdgeRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected -> walkGraphMatchDirectionEdgeLeftOrUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight -> walkGraphMatchDirectionEdgeUndirectedOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight -> walkGraphMatchDirectionEdgeLeftOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight -> walkGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node)
            }
        }
    
        open fun walkGraphMatchDirectionEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft) {
            visitGraphMatchDirectionEdgeLeft(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected) {
            visitGraphMatchDirectionEdgeUndirected(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight) {
            visitGraphMatchDirectionEdgeRight(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected) {
            visitGraphMatchDirectionEdgeLeftOrUndirected(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight) {
            visitGraphMatchDirectionEdgeUndirectedOrRight(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight) {
            visitGraphMatchDirectionEdgeLeftOrRight(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight) {
            visitGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: GraphMatchPatternPart
        //////////////////////////////////////
        open fun walkGraphMatchPatternPart(node: PartiqlLogical.GraphMatchPatternPart) {
            visitGraphMatchPatternPart(node)
            when(node) {
                is PartiqlLogical.GraphMatchPatternPart.Node -> walkGraphMatchPatternPartNode(node)
                is PartiqlLogical.GraphMatchPatternPart.Edge -> walkGraphMatchPatternPartEdge(node)
                is PartiqlLogical.GraphMatchPatternPart.Pattern -> walkGraphMatchPatternPartPattern(node)
            }
        }
    
        open fun walkGraphMatchPatternPartNode(node: PartiqlLogical.GraphMatchPatternPart.Node) {
            visitGraphMatchPatternPartNode(node)
            node.prefilter?.let { walkExpr(it) }
            node.variable?.let { walkSymbolPrimitive(it) }
            node.label.map { walkSymbolPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkGraphMatchPatternPartEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge) {
            visitGraphMatchPatternPartEdge(node)
            walkGraphMatchDirection(node.direction)
            node.quantifier?.let { walkGraphMatchQuantifier(it) }
            node.prefilter?.let { walkExpr(it) }
            node.variable?.let { walkSymbolPrimitive(it) }
            node.label.map { walkSymbolPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkGraphMatchPatternPartPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern) {
            visitGraphMatchPatternPartPattern(node)
            walkGraphMatchPattern(node.pattern)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: GraphMatchRestrictor
        //////////////////////////////////////
        open fun walkGraphMatchRestrictor(node: PartiqlLogical.GraphMatchRestrictor) {
            visitGraphMatchRestrictor(node)
            when(node) {
                is PartiqlLogical.GraphMatchRestrictor.RestrictorTrail -> walkGraphMatchRestrictorRestrictorTrail(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic -> walkGraphMatchRestrictorRestrictorAcyclic(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorSimple -> walkGraphMatchRestrictorRestrictorSimple(node)
            }
        }
    
        open fun walkGraphMatchRestrictorRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail) {
            visitGraphMatchRestrictorRestrictorTrail(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchRestrictorRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic) {
            visitGraphMatchRestrictorRestrictorAcyclic(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchRestrictorRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple) {
            visitGraphMatchRestrictorRestrictorSimple(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: GraphMatchSelector
        //////////////////////////////////////
        open fun walkGraphMatchSelector(node: PartiqlLogical.GraphMatchSelector) {
            visitGraphMatchSelector(node)
            when(node) {
                is PartiqlLogical.GraphMatchSelector.SelectorAnyShortest -> walkGraphMatchSelectorSelectorAnyShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAllShortest -> walkGraphMatchSelectorSelectorAllShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAny -> walkGraphMatchSelectorSelectorAny(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAnyK -> walkGraphMatchSelectorSelectorAnyK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestK -> walkGraphMatchSelectorSelectorShortestK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup -> walkGraphMatchSelectorSelectorShortestKGroup(node)
            }
        }
    
        open fun walkGraphMatchSelectorSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest) {
            visitGraphMatchSelectorSelectorAnyShortest(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchSelectorSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest) {
            visitGraphMatchSelectorSelectorAllShortest(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchSelectorSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny) {
            visitGraphMatchSelectorSelectorAny(node)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchSelectorSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK) {
            visitGraphMatchSelectorSelectorAnyK(node)
            walkLongPrimitive(node.k)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchSelectorSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK) {
            visitGraphMatchSelectorSelectorShortestK(node)
            walkLongPrimitive(node.k)
            walkMetas(node.metas)
        }
        open fun walkGraphMatchSelectorSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup) {
            visitGraphMatchSelectorSelectorShortestKGroup(node)
            walkLongPrimitive(node.k)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: GroupingStrategy
        //////////////////////////////////////
        open fun walkGroupingStrategy(node: PartiqlLogical.GroupingStrategy) {
            visitGroupingStrategy(node)
            when(node) {
                is PartiqlLogical.GroupingStrategy.GroupFull -> walkGroupingStrategyGroupFull(node)
                is PartiqlLogical.GroupingStrategy.GroupPartial -> walkGroupingStrategyGroupPartial(node)
            }
        }
    
        open fun walkGroupingStrategyGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull) {
            visitGroupingStrategyGroupFull(node)
            walkMetas(node.metas)
        }
        open fun walkGroupingStrategyGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial) {
            visitGroupingStrategyGroupPartial(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: OrderingSpec
        //////////////////////////////////////
        open fun walkOrderingSpec(node: PartiqlLogical.OrderingSpec) {
            visitOrderingSpec(node)
            when(node) {
                is PartiqlLogical.OrderingSpec.Asc -> walkOrderingSpecAsc(node)
                is PartiqlLogical.OrderingSpec.Desc -> walkOrderingSpecDesc(node)
            }
        }
    
        open fun walkOrderingSpecAsc(node: PartiqlLogical.OrderingSpec.Asc) {
            visitOrderingSpecAsc(node)
            walkMetas(node.metas)
        }
        open fun walkOrderingSpecDesc(node: PartiqlLogical.OrderingSpec.Desc) {
            visitOrderingSpecDesc(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: NullsSpec
        //////////////////////////////////////
        open fun walkNullsSpec(node: PartiqlLogical.NullsSpec) {
            visitNullsSpec(node)
            when(node) {
                is PartiqlLogical.NullsSpec.NullsFirst -> walkNullsSpecNullsFirst(node)
                is PartiqlLogical.NullsSpec.NullsLast -> walkNullsSpecNullsLast(node)
            }
        }
    
        open fun walkNullsSpecNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst) {
            visitNullsSpecNullsFirst(node)
            walkMetas(node.metas)
        }
        open fun walkNullsSpecNullsLast(node: PartiqlLogical.NullsSpec.NullsLast) {
            visitNullsSpecNullsLast(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: CaseSensitivity
        //////////////////////////////////////
        open fun walkCaseSensitivity(node: PartiqlLogical.CaseSensitivity) {
            visitCaseSensitivity(node)
            when(node) {
                is PartiqlLogical.CaseSensitivity.CaseSensitive -> walkCaseSensitivityCaseSensitive(node)
                is PartiqlLogical.CaseSensitivity.CaseInsensitive -> walkCaseSensitivityCaseInsensitive(node)
            }
        }
    
        open fun walkCaseSensitivityCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive) {
            visitCaseSensitivityCaseSensitive(node)
            walkMetas(node.metas)
        }
        open fun walkCaseSensitivityCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive) {
            visitCaseSensitivityCaseInsensitive(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: ScopeQualifier
        //////////////////////////////////////
        open fun walkScopeQualifier(node: PartiqlLogical.ScopeQualifier) {
            visitScopeQualifier(node)
            when(node) {
                is PartiqlLogical.ScopeQualifier.Unqualified -> walkScopeQualifierUnqualified(node)
                is PartiqlLogical.ScopeQualifier.LocalsFirst -> walkScopeQualifierLocalsFirst(node)
            }
        }
    
        open fun walkScopeQualifierUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified) {
            visitScopeQualifierUnqualified(node)
            walkMetas(node.metas)
        }
        open fun walkScopeQualifierLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst) {
            visitScopeQualifierLocalsFirst(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: SetQuantifier
        //////////////////////////////////////
        open fun walkSetQuantifier(node: PartiqlLogical.SetQuantifier) {
            visitSetQuantifier(node)
            when(node) {
                is PartiqlLogical.SetQuantifier.All -> walkSetQuantifierAll(node)
                is PartiqlLogical.SetQuantifier.Distinct -> walkSetQuantifierDistinct(node)
            }
        }
    
        open fun walkSetQuantifierAll(node: PartiqlLogical.SetQuantifier.All) {
            visitSetQuantifierAll(node)
            walkMetas(node.metas)
        }
        open fun walkSetQuantifierDistinct(node: PartiqlLogical.SetQuantifier.Distinct) {
            visitSetQuantifierDistinct(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: BagOpType
        //////////////////////////////////////
        open fun walkBagOpType(node: PartiqlLogical.BagOpType) {
            visitBagOpType(node)
            when(node) {
                is PartiqlLogical.BagOpType.Union -> walkBagOpTypeUnion(node)
                is PartiqlLogical.BagOpType.Intersect -> walkBagOpTypeIntersect(node)
                is PartiqlLogical.BagOpType.Except -> walkBagOpTypeExcept(node)
                is PartiqlLogical.BagOpType.OuterUnion -> walkBagOpTypeOuterUnion(node)
                is PartiqlLogical.BagOpType.OuterIntersect -> walkBagOpTypeOuterIntersect(node)
                is PartiqlLogical.BagOpType.OuterExcept -> walkBagOpTypeOuterExcept(node)
            }
        }
    
        open fun walkBagOpTypeUnion(node: PartiqlLogical.BagOpType.Union) {
            visitBagOpTypeUnion(node)
            walkMetas(node.metas)
        }
        open fun walkBagOpTypeIntersect(node: PartiqlLogical.BagOpType.Intersect) {
            visitBagOpTypeIntersect(node)
            walkMetas(node.metas)
        }
        open fun walkBagOpTypeExcept(node: PartiqlLogical.BagOpType.Except) {
            visitBagOpTypeExcept(node)
            walkMetas(node.metas)
        }
        open fun walkBagOpTypeOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion) {
            visitBagOpTypeOuterUnion(node)
            walkMetas(node.metas)
        }
        open fun walkBagOpTypeOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect) {
            visitBagOpTypeOuterIntersect(node)
            walkMetas(node.metas)
        }
        open fun walkBagOpTypeOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept) {
            visitBagOpTypeOuterExcept(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: OnConflictValue
        //////////////////////////////////////
        open fun walkOnConflictValue(node: PartiqlLogical.OnConflictValue) {
            visitOnConflictValue(node)
            when(node) {
                is PartiqlLogical.OnConflictValue.Excluded -> walkOnConflictValueExcluded(node)
            }
        }
    
        open fun walkOnConflictValueExcluded(node: PartiqlLogical.OnConflictValue.Excluded) {
            visitOnConflictValueExcluded(node)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: Type
        //////////////////////////////////////
        open fun walkType(node: PartiqlLogical.Type) {
            visitType(node)
            when(node) {
                is PartiqlLogical.Type.NullType -> walkTypeNullType(node)
                is PartiqlLogical.Type.BooleanType -> walkTypeBooleanType(node)
                is PartiqlLogical.Type.SmallintType -> walkTypeSmallintType(node)
                is PartiqlLogical.Type.Integer4Type -> walkTypeInteger4Type(node)
                is PartiqlLogical.Type.Integer8Type -> walkTypeInteger8Type(node)
                is PartiqlLogical.Type.IntegerType -> walkTypeIntegerType(node)
                is PartiqlLogical.Type.FloatType -> walkTypeFloatType(node)
                is PartiqlLogical.Type.RealType -> walkTypeRealType(node)
                is PartiqlLogical.Type.DoublePrecisionType -> walkTypeDoublePrecisionType(node)
                is PartiqlLogical.Type.DecimalType -> walkTypeDecimalType(node)
                is PartiqlLogical.Type.NumericType -> walkTypeNumericType(node)
                is PartiqlLogical.Type.TimestampType -> walkTypeTimestampType(node)
                is PartiqlLogical.Type.CharacterType -> walkTypeCharacterType(node)
                is PartiqlLogical.Type.CharacterVaryingType -> walkTypeCharacterVaryingType(node)
                is PartiqlLogical.Type.MissingType -> walkTypeMissingType(node)
                is PartiqlLogical.Type.StringType -> walkTypeStringType(node)
                is PartiqlLogical.Type.SymbolType -> walkTypeSymbolType(node)
                is PartiqlLogical.Type.BlobType -> walkTypeBlobType(node)
                is PartiqlLogical.Type.ClobType -> walkTypeClobType(node)
                is PartiqlLogical.Type.DateType -> walkTypeDateType(node)
                is PartiqlLogical.Type.TimeType -> walkTypeTimeType(node)
                is PartiqlLogical.Type.TimeWithTimeZoneType -> walkTypeTimeWithTimeZoneType(node)
                is PartiqlLogical.Type.StructType -> walkTypeStructType(node)
                is PartiqlLogical.Type.TupleType -> walkTypeTupleType(node)
                is PartiqlLogical.Type.ListType -> walkTypeListType(node)
                is PartiqlLogical.Type.SexpType -> walkTypeSexpType(node)
                is PartiqlLogical.Type.BagType -> walkTypeBagType(node)
                is PartiqlLogical.Type.AnyType -> walkTypeAnyType(node)
                is PartiqlLogical.Type.CustomType -> walkTypeCustomType(node)
            }
        }
    
        open fun walkTypeNullType(node: PartiqlLogical.Type.NullType) {
            visitTypeNullType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeBooleanType(node: PartiqlLogical.Type.BooleanType) {
            visitTypeBooleanType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeSmallintType(node: PartiqlLogical.Type.SmallintType) {
            visitTypeSmallintType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeInteger4Type(node: PartiqlLogical.Type.Integer4Type) {
            visitTypeInteger4Type(node)
            walkMetas(node.metas)
        }
        open fun walkTypeInteger8Type(node: PartiqlLogical.Type.Integer8Type) {
            visitTypeInteger8Type(node)
            walkMetas(node.metas)
        }
        open fun walkTypeIntegerType(node: PartiqlLogical.Type.IntegerType) {
            visitTypeIntegerType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeFloatType(node: PartiqlLogical.Type.FloatType) {
            visitTypeFloatType(node)
            node.precision?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeRealType(node: PartiqlLogical.Type.RealType) {
            visitTypeRealType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType) {
            visitTypeDoublePrecisionType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeDecimalType(node: PartiqlLogical.Type.DecimalType) {
            visitTypeDecimalType(node)
            node.precision?.let { walkLongPrimitive(it) }
            node.scale?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeNumericType(node: PartiqlLogical.Type.NumericType) {
            visitTypeNumericType(node)
            node.precision?.let { walkLongPrimitive(it) }
            node.scale?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeTimestampType(node: PartiqlLogical.Type.TimestampType) {
            visitTypeTimestampType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeCharacterType(node: PartiqlLogical.Type.CharacterType) {
            visitTypeCharacterType(node)
            node.length?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType) {
            visitTypeCharacterVaryingType(node)
            node.length?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeMissingType(node: PartiqlLogical.Type.MissingType) {
            visitTypeMissingType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeStringType(node: PartiqlLogical.Type.StringType) {
            visitTypeStringType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeSymbolType(node: PartiqlLogical.Type.SymbolType) {
            visitTypeSymbolType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeBlobType(node: PartiqlLogical.Type.BlobType) {
            visitTypeBlobType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeClobType(node: PartiqlLogical.Type.ClobType) {
            visitTypeClobType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeDateType(node: PartiqlLogical.Type.DateType) {
            visitTypeDateType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeTimeType(node: PartiqlLogical.Type.TimeType) {
            visitTypeTimeType(node)
            node.precision?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType) {
            visitTypeTimeWithTimeZoneType(node)
            node.precision?.let { walkLongPrimitive(it) }
            walkMetas(node.metas)
        }
        open fun walkTypeStructType(node: PartiqlLogical.Type.StructType) {
            visitTypeStructType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeTupleType(node: PartiqlLogical.Type.TupleType) {
            visitTypeTupleType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeListType(node: PartiqlLogical.Type.ListType) {
            visitTypeListType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeSexpType(node: PartiqlLogical.Type.SexpType) {
            visitTypeSexpType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeBagType(node: PartiqlLogical.Type.BagType) {
            visitTypeBagType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeAnyType(node: PartiqlLogical.Type.AnyType) {
            visitTypeAnyType(node)
            walkMetas(node.metas)
        }
        open fun walkTypeCustomType(node: PartiqlLogical.Type.CustomType) {
            visitTypeCustomType(node)
            walkSymbolPrimitive(node.name)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: Expr
        //////////////////////////////////////
        open fun walkExpr(node: PartiqlLogical.Expr) {
            visitExpr(node)
            when(node) {
                is PartiqlLogical.Expr.Missing -> walkExprMissing(node)
                is PartiqlLogical.Expr.Lit -> walkExprLit(node)
                is PartiqlLogical.Expr.Id -> walkExprId(node)
                is PartiqlLogical.Expr.Parameter -> walkExprParameter(node)
                is PartiqlLogical.Expr.Not -> walkExprNot(node)
                is PartiqlLogical.Expr.Pos -> walkExprPos(node)
                is PartiqlLogical.Expr.Neg -> walkExprNeg(node)
                is PartiqlLogical.Expr.Plus -> walkExprPlus(node)
                is PartiqlLogical.Expr.Minus -> walkExprMinus(node)
                is PartiqlLogical.Expr.Times -> walkExprTimes(node)
                is PartiqlLogical.Expr.Divide -> walkExprDivide(node)
                is PartiqlLogical.Expr.Modulo -> walkExprModulo(node)
                is PartiqlLogical.Expr.Concat -> walkExprConcat(node)
                is PartiqlLogical.Expr.And -> walkExprAnd(node)
                is PartiqlLogical.Expr.Or -> walkExprOr(node)
                is PartiqlLogical.Expr.Eq -> walkExprEq(node)
                is PartiqlLogical.Expr.Ne -> walkExprNe(node)
                is PartiqlLogical.Expr.Gt -> walkExprGt(node)
                is PartiqlLogical.Expr.Gte -> walkExprGte(node)
                is PartiqlLogical.Expr.Lt -> walkExprLt(node)
                is PartiqlLogical.Expr.Lte -> walkExprLte(node)
                is PartiqlLogical.Expr.Like -> walkExprLike(node)
                is PartiqlLogical.Expr.Between -> walkExprBetween(node)
                is PartiqlLogical.Expr.InCollection -> walkExprInCollection(node)
                is PartiqlLogical.Expr.IsType -> walkExprIsType(node)
                is PartiqlLogical.Expr.SimpleCase -> walkExprSimpleCase(node)
                is PartiqlLogical.Expr.SearchedCase -> walkExprSearchedCase(node)
                is PartiqlLogical.Expr.Bag -> walkExprBag(node)
                is PartiqlLogical.Expr.List -> walkExprList(node)
                is PartiqlLogical.Expr.Sexp -> walkExprSexp(node)
                is PartiqlLogical.Expr.Date -> walkExprDate(node)
                is PartiqlLogical.Expr.LitTime -> walkExprLitTime(node)
                is PartiqlLogical.Expr.BagOp -> walkExprBagOp(node)
                is PartiqlLogical.Expr.GraphMatch -> walkExprGraphMatch(node)
                is PartiqlLogical.Expr.Path -> walkExprPath(node)
                is PartiqlLogical.Expr.Call -> walkExprCall(node)
                is PartiqlLogical.Expr.Cast -> walkExprCast(node)
                is PartiqlLogical.Expr.CanCast -> walkExprCanCast(node)
                is PartiqlLogical.Expr.CanLosslessCast -> walkExprCanLosslessCast(node)
                is PartiqlLogical.Expr.NullIf -> walkExprNullIf(node)
                is PartiqlLogical.Expr.Coalesce -> walkExprCoalesce(node)
                is PartiqlLogical.Expr.BindingsToValues -> walkExprBindingsToValues(node)
                is PartiqlLogical.Expr.Struct -> walkExprStruct(node)
                is PartiqlLogical.Expr.Pivot -> walkExprPivot(node)
            }
        }
    
        open fun walkExprMissing(node: PartiqlLogical.Expr.Missing) {
            visitExprMissing(node)
            walkMetas(node.metas)
        }
        open fun walkExprLit(node: PartiqlLogical.Expr.Lit) {
            visitExprLit(node)
            walkAnyElement(node.value)
            walkMetas(node.metas)
        }
        open fun walkExprId(node: PartiqlLogical.Expr.Id) {
            visitExprId(node)
            walkSymbolPrimitive(node.name)
            walkCaseSensitivity(node.case)
            walkScopeQualifier(node.qualifier)
            walkMetas(node.metas)
        }
        open fun walkExprParameter(node: PartiqlLogical.Expr.Parameter) {
            visitExprParameter(node)
            walkLongPrimitive(node.index)
            walkMetas(node.metas)
        }
        open fun walkExprNot(node: PartiqlLogical.Expr.Not) {
            visitExprNot(node)
            walkExpr(node.expr)
            walkMetas(node.metas)
        }
        open fun walkExprPos(node: PartiqlLogical.Expr.Pos) {
            visitExprPos(node)
            walkExpr(node.expr)
            walkMetas(node.metas)
        }
        open fun walkExprNeg(node: PartiqlLogical.Expr.Neg) {
            visitExprNeg(node)
            walkExpr(node.expr)
            walkMetas(node.metas)
        }
        open fun walkExprPlus(node: PartiqlLogical.Expr.Plus) {
            visitExprPlus(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprMinus(node: PartiqlLogical.Expr.Minus) {
            visitExprMinus(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprTimes(node: PartiqlLogical.Expr.Times) {
            visitExprTimes(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprDivide(node: PartiqlLogical.Expr.Divide) {
            visitExprDivide(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprModulo(node: PartiqlLogical.Expr.Modulo) {
            visitExprModulo(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprConcat(node: PartiqlLogical.Expr.Concat) {
            visitExprConcat(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprAnd(node: PartiqlLogical.Expr.And) {
            visitExprAnd(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprOr(node: PartiqlLogical.Expr.Or) {
            visitExprOr(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprEq(node: PartiqlLogical.Expr.Eq) {
            visitExprEq(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprNe(node: PartiqlLogical.Expr.Ne) {
            visitExprNe(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprGt(node: PartiqlLogical.Expr.Gt) {
            visitExprGt(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprGte(node: PartiqlLogical.Expr.Gte) {
            visitExprGte(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprLt(node: PartiqlLogical.Expr.Lt) {
            visitExprLt(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprLte(node: PartiqlLogical.Expr.Lte) {
            visitExprLte(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprLike(node: PartiqlLogical.Expr.Like) {
            visitExprLike(node)
            walkExpr(node.value)
            walkExpr(node.pattern)
            node.escape?.let { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprBetween(node: PartiqlLogical.Expr.Between) {
            visitExprBetween(node)
            walkExpr(node.value)
            walkExpr(node.from)
            walkExpr(node.to)
            walkMetas(node.metas)
        }
        open fun walkExprInCollection(node: PartiqlLogical.Expr.InCollection) {
            visitExprInCollection(node)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprIsType(node: PartiqlLogical.Expr.IsType) {
            visitExprIsType(node)
            walkExpr(node.value)
            walkType(node.type)
            walkMetas(node.metas)
        }
        open fun walkExprSimpleCase(node: PartiqlLogical.Expr.SimpleCase) {
            visitExprSimpleCase(node)
            walkExpr(node.expr)
            walkExprPairList(node.cases)
            node.default?.let { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprSearchedCase(node: PartiqlLogical.Expr.SearchedCase) {
            visitExprSearchedCase(node)
            walkExprPairList(node.cases)
            node.default?.let { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprBag(node: PartiqlLogical.Expr.Bag) {
            visitExprBag(node)
            node.values.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprList(node: PartiqlLogical.Expr.List) {
            visitExprList(node)
            node.values.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprSexp(node: PartiqlLogical.Expr.Sexp) {
            visitExprSexp(node)
            node.values.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprDate(node: PartiqlLogical.Expr.Date) {
            visitExprDate(node)
            walkLongPrimitive(node.year)
            walkLongPrimitive(node.month)
            walkLongPrimitive(node.day)
            walkMetas(node.metas)
        }
        open fun walkExprLitTime(node: PartiqlLogical.Expr.LitTime) {
            visitExprLitTime(node)
            walkTimeValue(node.value)
            walkMetas(node.metas)
        }
        open fun walkExprBagOp(node: PartiqlLogical.Expr.BagOp) {
            visitExprBagOp(node)
            walkBagOpType(node.op)
            walkSetQuantifier(node.quantifier)
            node.operands.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprGraphMatch(node: PartiqlLogical.Expr.GraphMatch) {
            visitExprGraphMatch(node)
            walkExpr(node.expr)
            walkGpmlPattern(node.gpmlPattern)
            walkMetas(node.metas)
        }
        open fun walkExprPath(node: PartiqlLogical.Expr.Path) {
            visitExprPath(node)
            walkExpr(node.root)
            node.steps.map { walkPathStep(it) }
            walkMetas(node.metas)
        }
        open fun walkExprCall(node: PartiqlLogical.Expr.Call) {
            visitExprCall(node)
            walkSymbolPrimitive(node.funcName)
            node.args.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprCast(node: PartiqlLogical.Expr.Cast) {
            visitExprCast(node)
            walkExpr(node.value)
            walkType(node.asType)
            walkMetas(node.metas)
        }
        open fun walkExprCanCast(node: PartiqlLogical.Expr.CanCast) {
            visitExprCanCast(node)
            walkExpr(node.value)
            walkType(node.asType)
            walkMetas(node.metas)
        }
        open fun walkExprCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast) {
            visitExprCanLosslessCast(node)
            walkExpr(node.value)
            walkType(node.asType)
            walkMetas(node.metas)
        }
        open fun walkExprNullIf(node: PartiqlLogical.Expr.NullIf) {
            visitExprNullIf(node)
            walkExpr(node.expr1)
            walkExpr(node.expr2)
            walkMetas(node.metas)
        }
        open fun walkExprCoalesce(node: PartiqlLogical.Expr.Coalesce) {
            visitExprCoalesce(node)
            node.args.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkExprBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues) {
            visitExprBindingsToValues(node)
            walkExpr(node.exp)
            walkBexpr(node.query)
            walkMetas(node.metas)
        }
        open fun walkExprStruct(node: PartiqlLogical.Expr.Struct) {
            visitExprStruct(node)
            node.parts.map { walkStructPart(it) }
            walkMetas(node.metas)
        }
        open fun walkExprPivot(node: PartiqlLogical.Expr.Pivot) {
            visitExprPivot(node)
            walkBexpr(node.input)
            walkExpr(node.key)
            walkExpr(node.value)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: Statement
        //////////////////////////////////////
        open fun walkStatement(node: PartiqlLogical.Statement) {
            visitStatement(node)
            when(node) {
                is PartiqlLogical.Statement.Query -> walkStatementQuery(node)
                is PartiqlLogical.Statement.Exec -> walkStatementExec(node)
                is PartiqlLogical.Statement.Explain -> walkStatementExplain(node)
                is PartiqlLogical.Statement.Dml -> walkStatementDml(node)
            }
        }
    
        open fun walkStatementQuery(node: PartiqlLogical.Statement.Query) {
            visitStatementQuery(node)
            walkExpr(node.expr)
            walkMetas(node.metas)
        }
        open fun walkStatementExec(node: PartiqlLogical.Statement.Exec) {
            visitStatementExec(node)
            walkSymbolPrimitive(node.procedureName)
            node.args.map { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkStatementExplain(node: PartiqlLogical.Statement.Explain) {
            visitStatementExplain(node)
            walkExplainTarget(node.target)
            walkMetas(node.metas)
        }
        open fun walkStatementDml(node: PartiqlLogical.Statement.Dml) {
            visitStatementDml(node)
            walkIdentifier(node.target)
            walkDmlOperation(node.operation)
            walkExpr(node.rows)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: StructPart
        //////////////////////////////////////
        open fun walkStructPart(node: PartiqlLogical.StructPart) {
            visitStructPart(node)
            when(node) {
                is PartiqlLogical.StructPart.StructFields -> walkStructPartStructFields(node)
                is PartiqlLogical.StructPart.StructField -> walkStructPartStructField(node)
            }
        }
    
        open fun walkStructPartStructFields(node: PartiqlLogical.StructPart.StructFields) {
            visitStructPartStructFields(node)
            walkExpr(node.partExpr)
            walkMetas(node.metas)
        }
        open fun walkStructPartStructField(node: PartiqlLogical.StructPart.StructField) {
            visitStructPartStructField(node)
            walkExpr(node.fieldName)
            walkExpr(node.value)
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: Bexpr
        //////////////////////////////////////
        open fun walkBexpr(node: PartiqlLogical.Bexpr) {
            visitBexpr(node)
            when(node) {
                is PartiqlLogical.Bexpr.Scan -> walkBexprScan(node)
                is PartiqlLogical.Bexpr.Unpivot -> walkBexprUnpivot(node)
                is PartiqlLogical.Bexpr.Filter -> walkBexprFilter(node)
                is PartiqlLogical.Bexpr.Aggregate -> walkBexprAggregate(node)
                is PartiqlLogical.Bexpr.Join -> walkBexprJoin(node)
                is PartiqlLogical.Bexpr.Window -> walkBexprWindow(node)
                is PartiqlLogical.Bexpr.Sort -> walkBexprSort(node)
                is PartiqlLogical.Bexpr.Offset -> walkBexprOffset(node)
                is PartiqlLogical.Bexpr.Limit -> walkBexprLimit(node)
                is PartiqlLogical.Bexpr.Let -> walkBexprLet(node)
            }
        }
    
        open fun walkBexprScan(node: PartiqlLogical.Bexpr.Scan) {
            visitBexprScan(node)
            walkExpr(node.expr)
            walkVarDecl(node.asDecl)
            node.atDecl?.let { walkVarDecl(it) }
            node.byDecl?.let { walkVarDecl(it) }
            walkMetas(node.metas)
        }
        open fun walkBexprUnpivot(node: PartiqlLogical.Bexpr.Unpivot) {
            visitBexprUnpivot(node)
            walkExpr(node.expr)
            walkVarDecl(node.asDecl)
            node.atDecl?.let { walkVarDecl(it) }
            node.byDecl?.let { walkVarDecl(it) }
            walkMetas(node.metas)
        }
        open fun walkBexprFilter(node: PartiqlLogical.Bexpr.Filter) {
            visitBexprFilter(node)
            walkExpr(node.predicate)
            walkBexpr(node.source)
            walkMetas(node.metas)
        }
        open fun walkBexprAggregate(node: PartiqlLogical.Bexpr.Aggregate) {
            visitBexprAggregate(node)
            walkBexpr(node.source)
            walkGroupingStrategy(node.strategy)
            walkGroupKeyList(node.groupList)
            walkAggregateFunctionList(node.functionList)
            walkMetas(node.metas)
        }
        open fun walkBexprJoin(node: PartiqlLogical.Bexpr.Join) {
            visitBexprJoin(node)
            walkJoinType(node.joinType)
            walkBexpr(node.left)
            walkBexpr(node.right)
            node.predicate?.let { walkExpr(it) }
            walkMetas(node.metas)
        }
        open fun walkBexprWindow(node: PartiqlLogical.Bexpr.Window) {
            visitBexprWindow(node)
            walkBexpr(node.source)
            walkOver(node.windowSpecification)
            node.windowExpressionList.map { walkWindowExpression(it) }
            walkMetas(node.metas)
        }
        open fun walkBexprSort(node: PartiqlLogical.Bexpr.Sort) {
            visitBexprSort(node)
            walkBexpr(node.source)
            node.sortSpecs.map { walkSortSpec(it) }
            walkMetas(node.metas)
        }
        open fun walkBexprOffset(node: PartiqlLogical.Bexpr.Offset) {
            visitBexprOffset(node)
            walkExpr(node.rowCount)
            walkBexpr(node.source)
            walkMetas(node.metas)
        }
        open fun walkBexprLimit(node: PartiqlLogical.Bexpr.Limit) {
            visitBexprLimit(node)
            walkExpr(node.rowCount)
            walkBexpr(node.source)
            walkMetas(node.metas)
        }
        open fun walkBexprLet(node: PartiqlLogical.Bexpr.Let) {
            visitBexprLet(node)
            walkBexpr(node.source)
            node.bindings.map { walkLetBinding(it) }
            walkMetas(node.metas)
        }
        //////////////////////////////////////
        // Sum Type: DmlOperation
        //////////////////////////////////////
        open fun walkDmlOperation(node: PartiqlLogical.DmlOperation) {
            visitDmlOperation(node)
            when(node) {
                is PartiqlLogical.DmlOperation.DmlInsert -> walkDmlOperationDmlInsert(node)
                is PartiqlLogical.DmlOperation.DmlDelete -> walkDmlOperationDmlDelete(node)
                is PartiqlLogical.DmlOperation.DmlReplace -> walkDmlOperationDmlReplace(node)
                is PartiqlLogical.DmlOperation.DmlUpdate -> walkDmlOperationDmlUpdate(node)
            }
        }
    
        open fun walkDmlOperationDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert) {
            visitDmlOperationDmlInsert(node)
            walkMetas(node.metas)
        }
        open fun walkDmlOperationDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete) {
            visitDmlOperationDmlDelete(node)
            walkMetas(node.metas)
        }
        open fun walkDmlOperationDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace) {
            visitDmlOperationDmlReplace(node)
            walkMetas(node.metas)
        }
        open fun walkDmlOperationDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate) {
            visitDmlOperationDmlUpdate(node)
            walkMetas(node.metas)
        }
    }
    open class VisitorFold : DomainVisitorFoldBase() {
        ////////////////////////////////////////////////////////////////////////////
        // Visit Functions
        ////////////////////////////////////////////////////////////////////////////
    
        //////////////////////////////////////
        // Tuple Types
        //////////////////////////////////////
        open protected fun visitTimeValue(node: PartiqlLogical.TimeValue, accumulator: T): T = accumulator
        open protected fun visitGraphMatchQuantifier(node: PartiqlLogical.GraphMatchQuantifier, accumulator: T): T = accumulator
        open protected fun visitGraphMatchPattern(node: PartiqlLogical.GraphMatchPattern, accumulator: T): T = accumulator
        open protected fun visitGpmlPattern(node: PartiqlLogical.GpmlPattern, accumulator: T): T = accumulator
        open protected fun visitExprPair(node: PartiqlLogical.ExprPair, accumulator: T): T = accumulator
        open protected fun visitExprPairList(node: PartiqlLogical.ExprPairList, accumulator: T): T = accumulator
        open protected fun visitSortSpec(node: PartiqlLogical.SortSpec, accumulator: T): T = accumulator
        open protected fun visitOver(node: PartiqlLogical.Over, accumulator: T): T = accumulator
        open protected fun visitWindowPartitionList(node: PartiqlLogical.WindowPartitionList, accumulator: T): T = accumulator
        open protected fun visitWindowSortSpecList(node: PartiqlLogical.WindowSortSpecList, accumulator: T): T = accumulator
        open protected fun visitIdentifier(node: PartiqlLogical.Identifier, accumulator: T): T = accumulator
        open protected fun visitPlan(node: PartiqlLogical.Plan, accumulator: T): T = accumulator
        open protected fun visitLetBinding(node: PartiqlLogical.LetBinding, accumulator: T): T = accumulator
        open protected fun visitGroupKey(node: PartiqlLogical.GroupKey, accumulator: T): T = accumulator
        open protected fun visitGroupKeyList(node: PartiqlLogical.GroupKeyList, accumulator: T): T = accumulator
        open protected fun visitAggregateFunction(node: PartiqlLogical.AggregateFunction, accumulator: T): T = accumulator
        open protected fun visitAggregateFunctionList(node: PartiqlLogical.AggregateFunctionList, accumulator: T): T = accumulator
        open protected fun visitWindowExpression(node: PartiqlLogical.WindowExpression, accumulator: T): T = accumulator
        open protected fun visitVarDecl(node: PartiqlLogical.VarDecl, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: ExplainTarget
        //////////////////////////////////////
        open protected fun visitExplainTarget(node: PartiqlLogical.ExplainTarget, accumulator: T): T = accumulator
        open protected fun visitExplainTargetDomain(node: PartiqlLogical.ExplainTarget.Domain, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: PathStep
        //////////////////////////////////////
        open protected fun visitPathStep(node: PartiqlLogical.PathStep, accumulator: T): T = accumulator
        open protected fun visitPathStepPathExpr(node: PartiqlLogical.PathStep.PathExpr, accumulator: T): T = accumulator
        open protected fun visitPathStepPathWildcard(node: PartiqlLogical.PathStep.PathWildcard, accumulator: T): T = accumulator
        open protected fun visitPathStepPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: JoinType
        //////////////////////////////////////
        open protected fun visitJoinType(node: PartiqlLogical.JoinType, accumulator: T): T = accumulator
        open protected fun visitJoinTypeInner(node: PartiqlLogical.JoinType.Inner, accumulator: T): T = accumulator
        open protected fun visitJoinTypeLeft(node: PartiqlLogical.JoinType.Left, accumulator: T): T = accumulator
        open protected fun visitJoinTypeRight(node: PartiqlLogical.JoinType.Right, accumulator: T): T = accumulator
        open protected fun visitJoinTypeFull(node: PartiqlLogical.JoinType.Full, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: GraphMatchDirection
        //////////////////////////////////////
        open protected fun visitGraphMatchDirection(node: PartiqlLogical.GraphMatchDirection, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight, accumulator: T): T = accumulator
        open protected fun visitGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: GraphMatchPatternPart
        //////////////////////////////////////
        open protected fun visitGraphMatchPatternPart(node: PartiqlLogical.GraphMatchPatternPart, accumulator: T): T = accumulator
        open protected fun visitGraphMatchPatternPartNode(node: PartiqlLogical.GraphMatchPatternPart.Node, accumulator: T): T = accumulator
        open protected fun visitGraphMatchPatternPartEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge, accumulator: T): T = accumulator
        open protected fun visitGraphMatchPatternPartPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: GraphMatchRestrictor
        //////////////////////////////////////
        open protected fun visitGraphMatchRestrictor(node: PartiqlLogical.GraphMatchRestrictor, accumulator: T): T = accumulator
        open protected fun visitGraphMatchRestrictorRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail, accumulator: T): T = accumulator
        open protected fun visitGraphMatchRestrictorRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic, accumulator: T): T = accumulator
        open protected fun visitGraphMatchRestrictorRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: GraphMatchSelector
        //////////////////////////////////////
        open protected fun visitGraphMatchSelector(node: PartiqlLogical.GraphMatchSelector, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK, accumulator: T): T = accumulator
        open protected fun visitGraphMatchSelectorSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: GroupingStrategy
        //////////////////////////////////////
        open protected fun visitGroupingStrategy(node: PartiqlLogical.GroupingStrategy, accumulator: T): T = accumulator
        open protected fun visitGroupingStrategyGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull, accumulator: T): T = accumulator
        open protected fun visitGroupingStrategyGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: OrderingSpec
        //////////////////////////////////////
        open protected fun visitOrderingSpec(node: PartiqlLogical.OrderingSpec, accumulator: T): T = accumulator
        open protected fun visitOrderingSpecAsc(node: PartiqlLogical.OrderingSpec.Asc, accumulator: T): T = accumulator
        open protected fun visitOrderingSpecDesc(node: PartiqlLogical.OrderingSpec.Desc, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: NullsSpec
        //////////////////////////////////////
        open protected fun visitNullsSpec(node: PartiqlLogical.NullsSpec, accumulator: T): T = accumulator
        open protected fun visitNullsSpecNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst, accumulator: T): T = accumulator
        open protected fun visitNullsSpecNullsLast(node: PartiqlLogical.NullsSpec.NullsLast, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: CaseSensitivity
        //////////////////////////////////////
        open protected fun visitCaseSensitivity(node: PartiqlLogical.CaseSensitivity, accumulator: T): T = accumulator
        open protected fun visitCaseSensitivityCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive, accumulator: T): T = accumulator
        open protected fun visitCaseSensitivityCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: ScopeQualifier
        //////////////////////////////////////
        open protected fun visitScopeQualifier(node: PartiqlLogical.ScopeQualifier, accumulator: T): T = accumulator
        open protected fun visitScopeQualifierUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified, accumulator: T): T = accumulator
        open protected fun visitScopeQualifierLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: SetQuantifier
        //////////////////////////////////////
        open protected fun visitSetQuantifier(node: PartiqlLogical.SetQuantifier, accumulator: T): T = accumulator
        open protected fun visitSetQuantifierAll(node: PartiqlLogical.SetQuantifier.All, accumulator: T): T = accumulator
        open protected fun visitSetQuantifierDistinct(node: PartiqlLogical.SetQuantifier.Distinct, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: BagOpType
        //////////////////////////////////////
        open protected fun visitBagOpType(node: PartiqlLogical.BagOpType, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeUnion(node: PartiqlLogical.BagOpType.Union, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeIntersect(node: PartiqlLogical.BagOpType.Intersect, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeExcept(node: PartiqlLogical.BagOpType.Except, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect, accumulator: T): T = accumulator
        open protected fun visitBagOpTypeOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: OnConflictValue
        //////////////////////////////////////
        open protected fun visitOnConflictValue(node: PartiqlLogical.OnConflictValue, accumulator: T): T = accumulator
        open protected fun visitOnConflictValueExcluded(node: PartiqlLogical.OnConflictValue.Excluded, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: Type
        //////////////////////////////////////
        open protected fun visitType(node: PartiqlLogical.Type, accumulator: T): T = accumulator
        open protected fun visitTypeNullType(node: PartiqlLogical.Type.NullType, accumulator: T): T = accumulator
        open protected fun visitTypeBooleanType(node: PartiqlLogical.Type.BooleanType, accumulator: T): T = accumulator
        open protected fun visitTypeSmallintType(node: PartiqlLogical.Type.SmallintType, accumulator: T): T = accumulator
        open protected fun visitTypeInteger4Type(node: PartiqlLogical.Type.Integer4Type, accumulator: T): T = accumulator
        open protected fun visitTypeInteger8Type(node: PartiqlLogical.Type.Integer8Type, accumulator: T): T = accumulator
        open protected fun visitTypeIntegerType(node: PartiqlLogical.Type.IntegerType, accumulator: T): T = accumulator
        open protected fun visitTypeFloatType(node: PartiqlLogical.Type.FloatType, accumulator: T): T = accumulator
        open protected fun visitTypeRealType(node: PartiqlLogical.Type.RealType, accumulator: T): T = accumulator
        open protected fun visitTypeDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType, accumulator: T): T = accumulator
        open protected fun visitTypeDecimalType(node: PartiqlLogical.Type.DecimalType, accumulator: T): T = accumulator
        open protected fun visitTypeNumericType(node: PartiqlLogical.Type.NumericType, accumulator: T): T = accumulator
        open protected fun visitTypeTimestampType(node: PartiqlLogical.Type.TimestampType, accumulator: T): T = accumulator
        open protected fun visitTypeCharacterType(node: PartiqlLogical.Type.CharacterType, accumulator: T): T = accumulator
        open protected fun visitTypeCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType, accumulator: T): T = accumulator
        open protected fun visitTypeMissingType(node: PartiqlLogical.Type.MissingType, accumulator: T): T = accumulator
        open protected fun visitTypeStringType(node: PartiqlLogical.Type.StringType, accumulator: T): T = accumulator
        open protected fun visitTypeSymbolType(node: PartiqlLogical.Type.SymbolType, accumulator: T): T = accumulator
        open protected fun visitTypeBlobType(node: PartiqlLogical.Type.BlobType, accumulator: T): T = accumulator
        open protected fun visitTypeClobType(node: PartiqlLogical.Type.ClobType, accumulator: T): T = accumulator
        open protected fun visitTypeDateType(node: PartiqlLogical.Type.DateType, accumulator: T): T = accumulator
        open protected fun visitTypeTimeType(node: PartiqlLogical.Type.TimeType, accumulator: T): T = accumulator
        open protected fun visitTypeTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType, accumulator: T): T = accumulator
        open protected fun visitTypeStructType(node: PartiqlLogical.Type.StructType, accumulator: T): T = accumulator
        open protected fun visitTypeTupleType(node: PartiqlLogical.Type.TupleType, accumulator: T): T = accumulator
        open protected fun visitTypeListType(node: PartiqlLogical.Type.ListType, accumulator: T): T = accumulator
        open protected fun visitTypeSexpType(node: PartiqlLogical.Type.SexpType, accumulator: T): T = accumulator
        open protected fun visitTypeBagType(node: PartiqlLogical.Type.BagType, accumulator: T): T = accumulator
        open protected fun visitTypeAnyType(node: PartiqlLogical.Type.AnyType, accumulator: T): T = accumulator
        open protected fun visitTypeCustomType(node: PartiqlLogical.Type.CustomType, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: Expr
        //////////////////////////////////////
        open protected fun visitExpr(node: PartiqlLogical.Expr, accumulator: T): T = accumulator
        open protected fun visitExprMissing(node: PartiqlLogical.Expr.Missing, accumulator: T): T = accumulator
        open protected fun visitExprLit(node: PartiqlLogical.Expr.Lit, accumulator: T): T = accumulator
        open protected fun visitExprId(node: PartiqlLogical.Expr.Id, accumulator: T): T = accumulator
        open protected fun visitExprParameter(node: PartiqlLogical.Expr.Parameter, accumulator: T): T = accumulator
        open protected fun visitExprNot(node: PartiqlLogical.Expr.Not, accumulator: T): T = accumulator
        open protected fun visitExprPos(node: PartiqlLogical.Expr.Pos, accumulator: T): T = accumulator
        open protected fun visitExprNeg(node: PartiqlLogical.Expr.Neg, accumulator: T): T = accumulator
        open protected fun visitExprPlus(node: PartiqlLogical.Expr.Plus, accumulator: T): T = accumulator
        open protected fun visitExprMinus(node: PartiqlLogical.Expr.Minus, accumulator: T): T = accumulator
        open protected fun visitExprTimes(node: PartiqlLogical.Expr.Times, accumulator: T): T = accumulator
        open protected fun visitExprDivide(node: PartiqlLogical.Expr.Divide, accumulator: T): T = accumulator
        open protected fun visitExprModulo(node: PartiqlLogical.Expr.Modulo, accumulator: T): T = accumulator
        open protected fun visitExprConcat(node: PartiqlLogical.Expr.Concat, accumulator: T): T = accumulator
        open protected fun visitExprAnd(node: PartiqlLogical.Expr.And, accumulator: T): T = accumulator
        open protected fun visitExprOr(node: PartiqlLogical.Expr.Or, accumulator: T): T = accumulator
        open protected fun visitExprEq(node: PartiqlLogical.Expr.Eq, accumulator: T): T = accumulator
        open protected fun visitExprNe(node: PartiqlLogical.Expr.Ne, accumulator: T): T = accumulator
        open protected fun visitExprGt(node: PartiqlLogical.Expr.Gt, accumulator: T): T = accumulator
        open protected fun visitExprGte(node: PartiqlLogical.Expr.Gte, accumulator: T): T = accumulator
        open protected fun visitExprLt(node: PartiqlLogical.Expr.Lt, accumulator: T): T = accumulator
        open protected fun visitExprLte(node: PartiqlLogical.Expr.Lte, accumulator: T): T = accumulator
        open protected fun visitExprLike(node: PartiqlLogical.Expr.Like, accumulator: T): T = accumulator
        open protected fun visitExprBetween(node: PartiqlLogical.Expr.Between, accumulator: T): T = accumulator
        open protected fun visitExprInCollection(node: PartiqlLogical.Expr.InCollection, accumulator: T): T = accumulator
        open protected fun visitExprIsType(node: PartiqlLogical.Expr.IsType, accumulator: T): T = accumulator
        open protected fun visitExprSimpleCase(node: PartiqlLogical.Expr.SimpleCase, accumulator: T): T = accumulator
        open protected fun visitExprSearchedCase(node: PartiqlLogical.Expr.SearchedCase, accumulator: T): T = accumulator
        open protected fun visitExprBag(node: PartiqlLogical.Expr.Bag, accumulator: T): T = accumulator
        open protected fun visitExprList(node: PartiqlLogical.Expr.List, accumulator: T): T = accumulator
        open protected fun visitExprSexp(node: PartiqlLogical.Expr.Sexp, accumulator: T): T = accumulator
        open protected fun visitExprDate(node: PartiqlLogical.Expr.Date, accumulator: T): T = accumulator
        open protected fun visitExprLitTime(node: PartiqlLogical.Expr.LitTime, accumulator: T): T = accumulator
        open protected fun visitExprBagOp(node: PartiqlLogical.Expr.BagOp, accumulator: T): T = accumulator
        open protected fun visitExprGraphMatch(node: PartiqlLogical.Expr.GraphMatch, accumulator: T): T = accumulator
        open protected fun visitExprPath(node: PartiqlLogical.Expr.Path, accumulator: T): T = accumulator
        open protected fun visitExprCall(node: PartiqlLogical.Expr.Call, accumulator: T): T = accumulator
        open protected fun visitExprCast(node: PartiqlLogical.Expr.Cast, accumulator: T): T = accumulator
        open protected fun visitExprCanCast(node: PartiqlLogical.Expr.CanCast, accumulator: T): T = accumulator
        open protected fun visitExprCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast, accumulator: T): T = accumulator
        open protected fun visitExprNullIf(node: PartiqlLogical.Expr.NullIf, accumulator: T): T = accumulator
        open protected fun visitExprCoalesce(node: PartiqlLogical.Expr.Coalesce, accumulator: T): T = accumulator
        open protected fun visitExprBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues, accumulator: T): T = accumulator
        open protected fun visitExprStruct(node: PartiqlLogical.Expr.Struct, accumulator: T): T = accumulator
        open protected fun visitExprPivot(node: PartiqlLogical.Expr.Pivot, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: Statement
        //////////////////////////////////////
        open protected fun visitStatement(node: PartiqlLogical.Statement, accumulator: T): T = accumulator
        open protected fun visitStatementQuery(node: PartiqlLogical.Statement.Query, accumulator: T): T = accumulator
        open protected fun visitStatementExec(node: PartiqlLogical.Statement.Exec, accumulator: T): T = accumulator
        open protected fun visitStatementExplain(node: PartiqlLogical.Statement.Explain, accumulator: T): T = accumulator
        open protected fun visitStatementDml(node: PartiqlLogical.Statement.Dml, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: StructPart
        //////////////////////////////////////
        open protected fun visitStructPart(node: PartiqlLogical.StructPart, accumulator: T): T = accumulator
        open protected fun visitStructPartStructFields(node: PartiqlLogical.StructPart.StructFields, accumulator: T): T = accumulator
        open protected fun visitStructPartStructField(node: PartiqlLogical.StructPart.StructField, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: Bexpr
        //////////////////////////////////////
        open protected fun visitBexpr(node: PartiqlLogical.Bexpr, accumulator: T): T = accumulator
        open protected fun visitBexprScan(node: PartiqlLogical.Bexpr.Scan, accumulator: T): T = accumulator
        open protected fun visitBexprUnpivot(node: PartiqlLogical.Bexpr.Unpivot, accumulator: T): T = accumulator
        open protected fun visitBexprFilter(node: PartiqlLogical.Bexpr.Filter, accumulator: T): T = accumulator
        open protected fun visitBexprAggregate(node: PartiqlLogical.Bexpr.Aggregate, accumulator: T): T = accumulator
        open protected fun visitBexprJoin(node: PartiqlLogical.Bexpr.Join, accumulator: T): T = accumulator
        open protected fun visitBexprWindow(node: PartiqlLogical.Bexpr.Window, accumulator: T): T = accumulator
        open protected fun visitBexprSort(node: PartiqlLogical.Bexpr.Sort, accumulator: T): T = accumulator
        open protected fun visitBexprOffset(node: PartiqlLogical.Bexpr.Offset, accumulator: T): T = accumulator
        open protected fun visitBexprLimit(node: PartiqlLogical.Bexpr.Limit, accumulator: T): T = accumulator
        open protected fun visitBexprLet(node: PartiqlLogical.Bexpr.Let, accumulator: T): T = accumulator
        //////////////////////////////////////
        // Sum Type: DmlOperation
        //////////////////////////////////////
        open protected fun visitDmlOperation(node: PartiqlLogical.DmlOperation, accumulator: T): T = accumulator
        open protected fun visitDmlOperationDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert, accumulator: T): T = accumulator
        open protected fun visitDmlOperationDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete, accumulator: T): T = accumulator
        open protected fun visitDmlOperationDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace, accumulator: T): T = accumulator
        open protected fun visitDmlOperationDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate, accumulator: T): T = accumulator
    
        ////////////////////////////////////////////////////////////////////////////
        // Walk Functions
        ////////////////////////////////////////////////////////////////////////////
    
        //////////////////////////////////////
        // Tuple Types
        //////////////////////////////////////
        open fun walkTimeValue(node: PartiqlLogical.TimeValue, accumulator: T): T {
            var current = accumulator
            current = visitTimeValue(node, current)
            current = walkLongPrimitive(node.hour, current)
            current = walkLongPrimitive(node.minute, current)
            current = walkLongPrimitive(node.second, current)
            current = walkLongPrimitive(node.nano, current)
            current = walkLongPrimitive(node.precision, current)
            current = walkBoolPrimitive(node.withTimeZone, current)
            node.tzMinutes?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchQuantifier(node: PartiqlLogical.GraphMatchQuantifier, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchQuantifier(node, current)
            current = walkLongPrimitive(node.lower, current)
            node.upper?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchPattern(node: PartiqlLogical.GraphMatchPattern, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchPattern(node, current)
            node.restrictor?.let { current = walkGraphMatchRestrictor(it, current) }
            node.prefilter?.let { current = walkExpr(it, current) }
            node.variable?.let { current = walkSymbolPrimitive(it, current) }
            node.quantifier?.let { current = walkGraphMatchQuantifier(it, current) }
            node.parts.map { current = walkGraphMatchPatternPart(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGpmlPattern(node: PartiqlLogical.GpmlPattern, accumulator: T): T {
            var current = accumulator
            current = visitGpmlPattern(node, current)
            node.selector?.let { current = walkGraphMatchSelector(it, current) }
            node.patterns.map { current = walkGraphMatchPattern(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPair(node: PartiqlLogical.ExprPair, accumulator: T): T {
            var current = accumulator
            current = visitExprPair(node, current)
            current = walkExpr(node.first, current)
            current = walkExpr(node.second, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPairList(node: PartiqlLogical.ExprPairList, accumulator: T): T {
            var current = accumulator
            current = visitExprPairList(node, current)
            node.pairs.map { current = walkExprPair(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkSortSpec(node: PartiqlLogical.SortSpec, accumulator: T): T {
            var current = accumulator
            current = visitSortSpec(node, current)
            current = walkExpr(node.expr, current)
            node.orderingSpec?.let { current = walkOrderingSpec(it, current) }
            node.nullsSpec?.let { current = walkNullsSpec(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkOver(node: PartiqlLogical.Over, accumulator: T): T {
            var current = accumulator
            current = visitOver(node, current)
            node.partitionBy?.let { current = walkWindowPartitionList(it, current) }
            node.orderBy?.let { current = walkWindowSortSpecList(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkWindowPartitionList(node: PartiqlLogical.WindowPartitionList, accumulator: T): T {
            var current = accumulator
            current = visitWindowPartitionList(node, current)
            node.exprs.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkWindowSortSpecList(node: PartiqlLogical.WindowSortSpecList, accumulator: T): T {
            var current = accumulator
            current = visitWindowSortSpecList(node, current)
            node.sortSpecs.map { current = walkSortSpec(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkIdentifier(node: PartiqlLogical.Identifier, accumulator: T): T {
            var current = accumulator
            current = visitIdentifier(node, current)
            current = walkSymbolPrimitive(node.name, current)
            current = walkCaseSensitivity(node.case, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkPlan(node: PartiqlLogical.Plan, accumulator: T): T {
            var current = accumulator
            current = visitPlan(node, current)
            current = walkStatement(node.stmt, current)
            current = walkSymbolPrimitive(node.version, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkLetBinding(node: PartiqlLogical.LetBinding, accumulator: T): T {
            var current = accumulator
            current = visitLetBinding(node, current)
            current = walkExpr(node.value, current)
            current = walkVarDecl(node.decl, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGroupKey(node: PartiqlLogical.GroupKey, accumulator: T): T {
            var current = accumulator
            current = visitGroupKey(node, current)
            current = walkExpr(node.expr, current)
            current = walkVarDecl(node.asVar, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGroupKeyList(node: PartiqlLogical.GroupKeyList, accumulator: T): T {
            var current = accumulator
            current = visitGroupKeyList(node, current)
            node.keys.map { current = walkGroupKey(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkAggregateFunction(node: PartiqlLogical.AggregateFunction, accumulator: T): T {
            var current = accumulator
            current = visitAggregateFunction(node, current)
            current = walkSetQuantifier(node.quantifier, current)
            current = walkSymbolPrimitive(node.name, current)
            current = walkExpr(node.arg, current)
            current = walkVarDecl(node.asVar, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkAggregateFunctionList(node: PartiqlLogical.AggregateFunctionList, accumulator: T): T {
            var current = accumulator
            current = visitAggregateFunctionList(node, current)
            node.functions.map { current = walkAggregateFunction(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkWindowExpression(node: PartiqlLogical.WindowExpression, accumulator: T): T {
            var current = accumulator
            current = visitWindowExpression(node, current)
            current = walkVarDecl(node.decl, current)
            current = walkSymbolPrimitive(node.funcName, current)
            node.args.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkVarDecl(node: PartiqlLogical.VarDecl, accumulator: T): T {
            var current = accumulator
            current = visitVarDecl(node, current)
            current = walkSymbolPrimitive(node.name, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: ExplainTarget
        //////////////////////////////////////
        open fun walkExplainTarget(node: PartiqlLogical.ExplainTarget, accumulator: T): T {
            val current = visitExplainTarget(node, accumulator)
            return when(node) {
                is PartiqlLogical.ExplainTarget.Domain -> walkExplainTargetDomain(node, current)
            }
        }
    
        open fun walkExplainTargetDomain(node: PartiqlLogical.ExplainTarget.Domain, accumulator: T): T {
            var current = accumulator
            current = visitExplainTargetDomain(node, current)
            current = walkStatement(node.statement, current)
            node.type?.let { current = walkSymbolPrimitive(it, current) }
            node.format?.let { current = walkSymbolPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: PathStep
        //////////////////////////////////////
        open fun walkPathStep(node: PartiqlLogical.PathStep, accumulator: T): T {
            val current = visitPathStep(node, accumulator)
            return when(node) {
                is PartiqlLogical.PathStep.PathExpr -> walkPathStepPathExpr(node, current)
                is PartiqlLogical.PathStep.PathWildcard -> walkPathStepPathWildcard(node, current)
                is PartiqlLogical.PathStep.PathUnpivot -> walkPathStepPathUnpivot(node, current)
            }
        }
    
        open fun walkPathStepPathExpr(node: PartiqlLogical.PathStep.PathExpr, accumulator: T): T {
            var current = accumulator
            current = visitPathStepPathExpr(node, current)
            current = walkExpr(node.index, current)
            current = walkCaseSensitivity(node.case, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkPathStepPathWildcard(node: PartiqlLogical.PathStep.PathWildcard, accumulator: T): T {
            var current = accumulator
            current = visitPathStepPathWildcard(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkPathStepPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot, accumulator: T): T {
            var current = accumulator
            current = visitPathStepPathUnpivot(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: JoinType
        //////////////////////////////////////
        open fun walkJoinType(node: PartiqlLogical.JoinType, accumulator: T): T {
            val current = visitJoinType(node, accumulator)
            return when(node) {
                is PartiqlLogical.JoinType.Inner -> walkJoinTypeInner(node, current)
                is PartiqlLogical.JoinType.Left -> walkJoinTypeLeft(node, current)
                is PartiqlLogical.JoinType.Right -> walkJoinTypeRight(node, current)
                is PartiqlLogical.JoinType.Full -> walkJoinTypeFull(node, current)
            }
        }
    
        open fun walkJoinTypeInner(node: PartiqlLogical.JoinType.Inner, accumulator: T): T {
            var current = accumulator
            current = visitJoinTypeInner(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkJoinTypeLeft(node: PartiqlLogical.JoinType.Left, accumulator: T): T {
            var current = accumulator
            current = visitJoinTypeLeft(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkJoinTypeRight(node: PartiqlLogical.JoinType.Right, accumulator: T): T {
            var current = accumulator
            current = visitJoinTypeRight(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkJoinTypeFull(node: PartiqlLogical.JoinType.Full, accumulator: T): T {
            var current = accumulator
            current = visitJoinTypeFull(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: GraphMatchDirection
        //////////////////////////////////////
        open fun walkGraphMatchDirection(node: PartiqlLogical.GraphMatchDirection, accumulator: T): T {
            val current = visitGraphMatchDirection(node, accumulator)
            return when(node) {
                is PartiqlLogical.GraphMatchDirection.EdgeLeft -> walkGraphMatchDirectionEdgeLeft(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirected -> walkGraphMatchDirectionEdgeUndirected(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeRight -> walkGraphMatchDirectionEdgeRight(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected -> walkGraphMatchDirectionEdgeLeftOrUndirected(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight -> walkGraphMatchDirectionEdgeUndirectedOrRight(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight -> walkGraphMatchDirectionEdgeLeftOrRight(node, current)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight -> walkGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node, current)
            }
        }
    
        open fun walkGraphMatchDirectionEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeLeft(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeUndirected(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeRight(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeLeftOrUndirected(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeUndirectedOrRight(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeLeftOrRight(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: GraphMatchPatternPart
        //////////////////////////////////////
        open fun walkGraphMatchPatternPart(node: PartiqlLogical.GraphMatchPatternPart, accumulator: T): T {
            val current = visitGraphMatchPatternPart(node, accumulator)
            return when(node) {
                is PartiqlLogical.GraphMatchPatternPart.Node -> walkGraphMatchPatternPartNode(node, current)
                is PartiqlLogical.GraphMatchPatternPart.Edge -> walkGraphMatchPatternPartEdge(node, current)
                is PartiqlLogical.GraphMatchPatternPart.Pattern -> walkGraphMatchPatternPartPattern(node, current)
            }
        }
    
        open fun walkGraphMatchPatternPartNode(node: PartiqlLogical.GraphMatchPatternPart.Node, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchPatternPartNode(node, current)
            node.prefilter?.let { current = walkExpr(it, current) }
            node.variable?.let { current = walkSymbolPrimitive(it, current) }
            node.label.map { current = walkSymbolPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchPatternPartEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchPatternPartEdge(node, current)
            current = walkGraphMatchDirection(node.direction, current)
            node.quantifier?.let { current = walkGraphMatchQuantifier(it, current) }
            node.prefilter?.let { current = walkExpr(it, current) }
            node.variable?.let { current = walkSymbolPrimitive(it, current) }
            node.label.map { current = walkSymbolPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchPatternPartPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchPatternPartPattern(node, current)
            current = walkGraphMatchPattern(node.pattern, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: GraphMatchRestrictor
        //////////////////////////////////////
        open fun walkGraphMatchRestrictor(node: PartiqlLogical.GraphMatchRestrictor, accumulator: T): T {
            val current = visitGraphMatchRestrictor(node, accumulator)
            return when(node) {
                is PartiqlLogical.GraphMatchRestrictor.RestrictorTrail -> walkGraphMatchRestrictorRestrictorTrail(node, current)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic -> walkGraphMatchRestrictorRestrictorAcyclic(node, current)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorSimple -> walkGraphMatchRestrictorRestrictorSimple(node, current)
            }
        }
    
        open fun walkGraphMatchRestrictorRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchRestrictorRestrictorTrail(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchRestrictorRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchRestrictorRestrictorAcyclic(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchRestrictorRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchRestrictorRestrictorSimple(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: GraphMatchSelector
        //////////////////////////////////////
        open fun walkGraphMatchSelector(node: PartiqlLogical.GraphMatchSelector, accumulator: T): T {
            val current = visitGraphMatchSelector(node, accumulator)
            return when(node) {
                is PartiqlLogical.GraphMatchSelector.SelectorAnyShortest -> walkGraphMatchSelectorSelectorAnyShortest(node, current)
                is PartiqlLogical.GraphMatchSelector.SelectorAllShortest -> walkGraphMatchSelectorSelectorAllShortest(node, current)
                is PartiqlLogical.GraphMatchSelector.SelectorAny -> walkGraphMatchSelectorSelectorAny(node, current)
                is PartiqlLogical.GraphMatchSelector.SelectorAnyK -> walkGraphMatchSelectorSelectorAnyK(node, current)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestK -> walkGraphMatchSelectorSelectorShortestK(node, current)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup -> walkGraphMatchSelectorSelectorShortestKGroup(node, current)
            }
        }
    
        open fun walkGraphMatchSelectorSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorAnyShortest(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchSelectorSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorAllShortest(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchSelectorSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorAny(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchSelectorSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorAnyK(node, current)
            current = walkLongPrimitive(node.k, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchSelectorSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorShortestK(node, current)
            current = walkLongPrimitive(node.k, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGraphMatchSelectorSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup, accumulator: T): T {
            var current = accumulator
            current = visitGraphMatchSelectorSelectorShortestKGroup(node, current)
            current = walkLongPrimitive(node.k, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: GroupingStrategy
        //////////////////////////////////////
        open fun walkGroupingStrategy(node: PartiqlLogical.GroupingStrategy, accumulator: T): T {
            val current = visitGroupingStrategy(node, accumulator)
            return when(node) {
                is PartiqlLogical.GroupingStrategy.GroupFull -> walkGroupingStrategyGroupFull(node, current)
                is PartiqlLogical.GroupingStrategy.GroupPartial -> walkGroupingStrategyGroupPartial(node, current)
            }
        }
    
        open fun walkGroupingStrategyGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull, accumulator: T): T {
            var current = accumulator
            current = visitGroupingStrategyGroupFull(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkGroupingStrategyGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial, accumulator: T): T {
            var current = accumulator
            current = visitGroupingStrategyGroupPartial(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: OrderingSpec
        //////////////////////////////////////
        open fun walkOrderingSpec(node: PartiqlLogical.OrderingSpec, accumulator: T): T {
            val current = visitOrderingSpec(node, accumulator)
            return when(node) {
                is PartiqlLogical.OrderingSpec.Asc -> walkOrderingSpecAsc(node, current)
                is PartiqlLogical.OrderingSpec.Desc -> walkOrderingSpecDesc(node, current)
            }
        }
    
        open fun walkOrderingSpecAsc(node: PartiqlLogical.OrderingSpec.Asc, accumulator: T): T {
            var current = accumulator
            current = visitOrderingSpecAsc(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkOrderingSpecDesc(node: PartiqlLogical.OrderingSpec.Desc, accumulator: T): T {
            var current = accumulator
            current = visitOrderingSpecDesc(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: NullsSpec
        //////////////////////////////////////
        open fun walkNullsSpec(node: PartiqlLogical.NullsSpec, accumulator: T): T {
            val current = visitNullsSpec(node, accumulator)
            return when(node) {
                is PartiqlLogical.NullsSpec.NullsFirst -> walkNullsSpecNullsFirst(node, current)
                is PartiqlLogical.NullsSpec.NullsLast -> walkNullsSpecNullsLast(node, current)
            }
        }
    
        open fun walkNullsSpecNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst, accumulator: T): T {
            var current = accumulator
            current = visitNullsSpecNullsFirst(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkNullsSpecNullsLast(node: PartiqlLogical.NullsSpec.NullsLast, accumulator: T): T {
            var current = accumulator
            current = visitNullsSpecNullsLast(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: CaseSensitivity
        //////////////////////////////////////
        open fun walkCaseSensitivity(node: PartiqlLogical.CaseSensitivity, accumulator: T): T {
            val current = visitCaseSensitivity(node, accumulator)
            return when(node) {
                is PartiqlLogical.CaseSensitivity.CaseSensitive -> walkCaseSensitivityCaseSensitive(node, current)
                is PartiqlLogical.CaseSensitivity.CaseInsensitive -> walkCaseSensitivityCaseInsensitive(node, current)
            }
        }
    
        open fun walkCaseSensitivityCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive, accumulator: T): T {
            var current = accumulator
            current = visitCaseSensitivityCaseSensitive(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkCaseSensitivityCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive, accumulator: T): T {
            var current = accumulator
            current = visitCaseSensitivityCaseInsensitive(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: ScopeQualifier
        //////////////////////////////////////
        open fun walkScopeQualifier(node: PartiqlLogical.ScopeQualifier, accumulator: T): T {
            val current = visitScopeQualifier(node, accumulator)
            return when(node) {
                is PartiqlLogical.ScopeQualifier.Unqualified -> walkScopeQualifierUnqualified(node, current)
                is PartiqlLogical.ScopeQualifier.LocalsFirst -> walkScopeQualifierLocalsFirst(node, current)
            }
        }
    
        open fun walkScopeQualifierUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified, accumulator: T): T {
            var current = accumulator
            current = visitScopeQualifierUnqualified(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkScopeQualifierLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst, accumulator: T): T {
            var current = accumulator
            current = visitScopeQualifierLocalsFirst(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: SetQuantifier
        //////////////////////////////////////
        open fun walkSetQuantifier(node: PartiqlLogical.SetQuantifier, accumulator: T): T {
            val current = visitSetQuantifier(node, accumulator)
            return when(node) {
                is PartiqlLogical.SetQuantifier.All -> walkSetQuantifierAll(node, current)
                is PartiqlLogical.SetQuantifier.Distinct -> walkSetQuantifierDistinct(node, current)
            }
        }
    
        open fun walkSetQuantifierAll(node: PartiqlLogical.SetQuantifier.All, accumulator: T): T {
            var current = accumulator
            current = visitSetQuantifierAll(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkSetQuantifierDistinct(node: PartiqlLogical.SetQuantifier.Distinct, accumulator: T): T {
            var current = accumulator
            current = visitSetQuantifierDistinct(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: BagOpType
        //////////////////////////////////////
        open fun walkBagOpType(node: PartiqlLogical.BagOpType, accumulator: T): T {
            val current = visitBagOpType(node, accumulator)
            return when(node) {
                is PartiqlLogical.BagOpType.Union -> walkBagOpTypeUnion(node, current)
                is PartiqlLogical.BagOpType.Intersect -> walkBagOpTypeIntersect(node, current)
                is PartiqlLogical.BagOpType.Except -> walkBagOpTypeExcept(node, current)
                is PartiqlLogical.BagOpType.OuterUnion -> walkBagOpTypeOuterUnion(node, current)
                is PartiqlLogical.BagOpType.OuterIntersect -> walkBagOpTypeOuterIntersect(node, current)
                is PartiqlLogical.BagOpType.OuterExcept -> walkBagOpTypeOuterExcept(node, current)
            }
        }
    
        open fun walkBagOpTypeUnion(node: PartiqlLogical.BagOpType.Union, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeUnion(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBagOpTypeIntersect(node: PartiqlLogical.BagOpType.Intersect, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeIntersect(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBagOpTypeExcept(node: PartiqlLogical.BagOpType.Except, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeExcept(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBagOpTypeOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeOuterUnion(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBagOpTypeOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeOuterIntersect(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBagOpTypeOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept, accumulator: T): T {
            var current = accumulator
            current = visitBagOpTypeOuterExcept(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: OnConflictValue
        //////////////////////////////////////
        open fun walkOnConflictValue(node: PartiqlLogical.OnConflictValue, accumulator: T): T {
            val current = visitOnConflictValue(node, accumulator)
            return when(node) {
                is PartiqlLogical.OnConflictValue.Excluded -> walkOnConflictValueExcluded(node, current)
            }
        }
    
        open fun walkOnConflictValueExcluded(node: PartiqlLogical.OnConflictValue.Excluded, accumulator: T): T {
            var current = accumulator
            current = visitOnConflictValueExcluded(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: Type
        //////////////////////////////////////
        open fun walkType(node: PartiqlLogical.Type, accumulator: T): T {
            val current = visitType(node, accumulator)
            return when(node) {
                is PartiqlLogical.Type.NullType -> walkTypeNullType(node, current)
                is PartiqlLogical.Type.BooleanType -> walkTypeBooleanType(node, current)
                is PartiqlLogical.Type.SmallintType -> walkTypeSmallintType(node, current)
                is PartiqlLogical.Type.Integer4Type -> walkTypeInteger4Type(node, current)
                is PartiqlLogical.Type.Integer8Type -> walkTypeInteger8Type(node, current)
                is PartiqlLogical.Type.IntegerType -> walkTypeIntegerType(node, current)
                is PartiqlLogical.Type.FloatType -> walkTypeFloatType(node, current)
                is PartiqlLogical.Type.RealType -> walkTypeRealType(node, current)
                is PartiqlLogical.Type.DoublePrecisionType -> walkTypeDoublePrecisionType(node, current)
                is PartiqlLogical.Type.DecimalType -> walkTypeDecimalType(node, current)
                is PartiqlLogical.Type.NumericType -> walkTypeNumericType(node, current)
                is PartiqlLogical.Type.TimestampType -> walkTypeTimestampType(node, current)
                is PartiqlLogical.Type.CharacterType -> walkTypeCharacterType(node, current)
                is PartiqlLogical.Type.CharacterVaryingType -> walkTypeCharacterVaryingType(node, current)
                is PartiqlLogical.Type.MissingType -> walkTypeMissingType(node, current)
                is PartiqlLogical.Type.StringType -> walkTypeStringType(node, current)
                is PartiqlLogical.Type.SymbolType -> walkTypeSymbolType(node, current)
                is PartiqlLogical.Type.BlobType -> walkTypeBlobType(node, current)
                is PartiqlLogical.Type.ClobType -> walkTypeClobType(node, current)
                is PartiqlLogical.Type.DateType -> walkTypeDateType(node, current)
                is PartiqlLogical.Type.TimeType -> walkTypeTimeType(node, current)
                is PartiqlLogical.Type.TimeWithTimeZoneType -> walkTypeTimeWithTimeZoneType(node, current)
                is PartiqlLogical.Type.StructType -> walkTypeStructType(node, current)
                is PartiqlLogical.Type.TupleType -> walkTypeTupleType(node, current)
                is PartiqlLogical.Type.ListType -> walkTypeListType(node, current)
                is PartiqlLogical.Type.SexpType -> walkTypeSexpType(node, current)
                is PartiqlLogical.Type.BagType -> walkTypeBagType(node, current)
                is PartiqlLogical.Type.AnyType -> walkTypeAnyType(node, current)
                is PartiqlLogical.Type.CustomType -> walkTypeCustomType(node, current)
            }
        }
    
        open fun walkTypeNullType(node: PartiqlLogical.Type.NullType, accumulator: T): T {
            var current = accumulator
            current = visitTypeNullType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeBooleanType(node: PartiqlLogical.Type.BooleanType, accumulator: T): T {
            var current = accumulator
            current = visitTypeBooleanType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeSmallintType(node: PartiqlLogical.Type.SmallintType, accumulator: T): T {
            var current = accumulator
            current = visitTypeSmallintType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeInteger4Type(node: PartiqlLogical.Type.Integer4Type, accumulator: T): T {
            var current = accumulator
            current = visitTypeInteger4Type(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeInteger8Type(node: PartiqlLogical.Type.Integer8Type, accumulator: T): T {
            var current = accumulator
            current = visitTypeInteger8Type(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeIntegerType(node: PartiqlLogical.Type.IntegerType, accumulator: T): T {
            var current = accumulator
            current = visitTypeIntegerType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeFloatType(node: PartiqlLogical.Type.FloatType, accumulator: T): T {
            var current = accumulator
            current = visitTypeFloatType(node, current)
            node.precision?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeRealType(node: PartiqlLogical.Type.RealType, accumulator: T): T {
            var current = accumulator
            current = visitTypeRealType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType, accumulator: T): T {
            var current = accumulator
            current = visitTypeDoublePrecisionType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeDecimalType(node: PartiqlLogical.Type.DecimalType, accumulator: T): T {
            var current = accumulator
            current = visitTypeDecimalType(node, current)
            node.precision?.let { current = walkLongPrimitive(it, current) }
            node.scale?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeNumericType(node: PartiqlLogical.Type.NumericType, accumulator: T): T {
            var current = accumulator
            current = visitTypeNumericType(node, current)
            node.precision?.let { current = walkLongPrimitive(it, current) }
            node.scale?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeTimestampType(node: PartiqlLogical.Type.TimestampType, accumulator: T): T {
            var current = accumulator
            current = visitTypeTimestampType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeCharacterType(node: PartiqlLogical.Type.CharacterType, accumulator: T): T {
            var current = accumulator
            current = visitTypeCharacterType(node, current)
            node.length?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType, accumulator: T): T {
            var current = accumulator
            current = visitTypeCharacterVaryingType(node, current)
            node.length?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeMissingType(node: PartiqlLogical.Type.MissingType, accumulator: T): T {
            var current = accumulator
            current = visitTypeMissingType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeStringType(node: PartiqlLogical.Type.StringType, accumulator: T): T {
            var current = accumulator
            current = visitTypeStringType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeSymbolType(node: PartiqlLogical.Type.SymbolType, accumulator: T): T {
            var current = accumulator
            current = visitTypeSymbolType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeBlobType(node: PartiqlLogical.Type.BlobType, accumulator: T): T {
            var current = accumulator
            current = visitTypeBlobType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeClobType(node: PartiqlLogical.Type.ClobType, accumulator: T): T {
            var current = accumulator
            current = visitTypeClobType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeDateType(node: PartiqlLogical.Type.DateType, accumulator: T): T {
            var current = accumulator
            current = visitTypeDateType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeTimeType(node: PartiqlLogical.Type.TimeType, accumulator: T): T {
            var current = accumulator
            current = visitTypeTimeType(node, current)
            node.precision?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType, accumulator: T): T {
            var current = accumulator
            current = visitTypeTimeWithTimeZoneType(node, current)
            node.precision?.let { current = walkLongPrimitive(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeStructType(node: PartiqlLogical.Type.StructType, accumulator: T): T {
            var current = accumulator
            current = visitTypeStructType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeTupleType(node: PartiqlLogical.Type.TupleType, accumulator: T): T {
            var current = accumulator
            current = visitTypeTupleType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeListType(node: PartiqlLogical.Type.ListType, accumulator: T): T {
            var current = accumulator
            current = visitTypeListType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeSexpType(node: PartiqlLogical.Type.SexpType, accumulator: T): T {
            var current = accumulator
            current = visitTypeSexpType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeBagType(node: PartiqlLogical.Type.BagType, accumulator: T): T {
            var current = accumulator
            current = visitTypeBagType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeAnyType(node: PartiqlLogical.Type.AnyType, accumulator: T): T {
            var current = accumulator
            current = visitTypeAnyType(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkTypeCustomType(node: PartiqlLogical.Type.CustomType, accumulator: T): T {
            var current = accumulator
            current = visitTypeCustomType(node, current)
            current = walkSymbolPrimitive(node.name, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: Expr
        //////////////////////////////////////
        open fun walkExpr(node: PartiqlLogical.Expr, accumulator: T): T {
            val current = visitExpr(node, accumulator)
            return when(node) {
                is PartiqlLogical.Expr.Missing -> walkExprMissing(node, current)
                is PartiqlLogical.Expr.Lit -> walkExprLit(node, current)
                is PartiqlLogical.Expr.Id -> walkExprId(node, current)
                is PartiqlLogical.Expr.Parameter -> walkExprParameter(node, current)
                is PartiqlLogical.Expr.Not -> walkExprNot(node, current)
                is PartiqlLogical.Expr.Pos -> walkExprPos(node, current)
                is PartiqlLogical.Expr.Neg -> walkExprNeg(node, current)
                is PartiqlLogical.Expr.Plus -> walkExprPlus(node, current)
                is PartiqlLogical.Expr.Minus -> walkExprMinus(node, current)
                is PartiqlLogical.Expr.Times -> walkExprTimes(node, current)
                is PartiqlLogical.Expr.Divide -> walkExprDivide(node, current)
                is PartiqlLogical.Expr.Modulo -> walkExprModulo(node, current)
                is PartiqlLogical.Expr.Concat -> walkExprConcat(node, current)
                is PartiqlLogical.Expr.And -> walkExprAnd(node, current)
                is PartiqlLogical.Expr.Or -> walkExprOr(node, current)
                is PartiqlLogical.Expr.Eq -> walkExprEq(node, current)
                is PartiqlLogical.Expr.Ne -> walkExprNe(node, current)
                is PartiqlLogical.Expr.Gt -> walkExprGt(node, current)
                is PartiqlLogical.Expr.Gte -> walkExprGte(node, current)
                is PartiqlLogical.Expr.Lt -> walkExprLt(node, current)
                is PartiqlLogical.Expr.Lte -> walkExprLte(node, current)
                is PartiqlLogical.Expr.Like -> walkExprLike(node, current)
                is PartiqlLogical.Expr.Between -> walkExprBetween(node, current)
                is PartiqlLogical.Expr.InCollection -> walkExprInCollection(node, current)
                is PartiqlLogical.Expr.IsType -> walkExprIsType(node, current)
                is PartiqlLogical.Expr.SimpleCase -> walkExprSimpleCase(node, current)
                is PartiqlLogical.Expr.SearchedCase -> walkExprSearchedCase(node, current)
                is PartiqlLogical.Expr.Bag -> walkExprBag(node, current)
                is PartiqlLogical.Expr.List -> walkExprList(node, current)
                is PartiqlLogical.Expr.Sexp -> walkExprSexp(node, current)
                is PartiqlLogical.Expr.Date -> walkExprDate(node, current)
                is PartiqlLogical.Expr.LitTime -> walkExprLitTime(node, current)
                is PartiqlLogical.Expr.BagOp -> walkExprBagOp(node, current)
                is PartiqlLogical.Expr.GraphMatch -> walkExprGraphMatch(node, current)
                is PartiqlLogical.Expr.Path -> walkExprPath(node, current)
                is PartiqlLogical.Expr.Call -> walkExprCall(node, current)
                is PartiqlLogical.Expr.Cast -> walkExprCast(node, current)
                is PartiqlLogical.Expr.CanCast -> walkExprCanCast(node, current)
                is PartiqlLogical.Expr.CanLosslessCast -> walkExprCanLosslessCast(node, current)
                is PartiqlLogical.Expr.NullIf -> walkExprNullIf(node, current)
                is PartiqlLogical.Expr.Coalesce -> walkExprCoalesce(node, current)
                is PartiqlLogical.Expr.BindingsToValues -> walkExprBindingsToValues(node, current)
                is PartiqlLogical.Expr.Struct -> walkExprStruct(node, current)
                is PartiqlLogical.Expr.Pivot -> walkExprPivot(node, current)
            }
        }
    
        open fun walkExprMissing(node: PartiqlLogical.Expr.Missing, accumulator: T): T {
            var current = accumulator
            current = visitExprMissing(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprLit(node: PartiqlLogical.Expr.Lit, accumulator: T): T {
            var current = accumulator
            current = visitExprLit(node, current)
            current = walkAnyElement(node.value, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprId(node: PartiqlLogical.Expr.Id, accumulator: T): T {
            var current = accumulator
            current = visitExprId(node, current)
            current = walkSymbolPrimitive(node.name, current)
            current = walkCaseSensitivity(node.case, current)
            current = walkScopeQualifier(node.qualifier, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprParameter(node: PartiqlLogical.Expr.Parameter, accumulator: T): T {
            var current = accumulator
            current = visitExprParameter(node, current)
            current = walkLongPrimitive(node.index, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprNot(node: PartiqlLogical.Expr.Not, accumulator: T): T {
            var current = accumulator
            current = visitExprNot(node, current)
            current = walkExpr(node.expr, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPos(node: PartiqlLogical.Expr.Pos, accumulator: T): T {
            var current = accumulator
            current = visitExprPos(node, current)
            current = walkExpr(node.expr, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprNeg(node: PartiqlLogical.Expr.Neg, accumulator: T): T {
            var current = accumulator
            current = visitExprNeg(node, current)
            current = walkExpr(node.expr, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPlus(node: PartiqlLogical.Expr.Plus, accumulator: T): T {
            var current = accumulator
            current = visitExprPlus(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprMinus(node: PartiqlLogical.Expr.Minus, accumulator: T): T {
            var current = accumulator
            current = visitExprMinus(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprTimes(node: PartiqlLogical.Expr.Times, accumulator: T): T {
            var current = accumulator
            current = visitExprTimes(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprDivide(node: PartiqlLogical.Expr.Divide, accumulator: T): T {
            var current = accumulator
            current = visitExprDivide(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprModulo(node: PartiqlLogical.Expr.Modulo, accumulator: T): T {
            var current = accumulator
            current = visitExprModulo(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprConcat(node: PartiqlLogical.Expr.Concat, accumulator: T): T {
            var current = accumulator
            current = visitExprConcat(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprAnd(node: PartiqlLogical.Expr.And, accumulator: T): T {
            var current = accumulator
            current = visitExprAnd(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprOr(node: PartiqlLogical.Expr.Or, accumulator: T): T {
            var current = accumulator
            current = visitExprOr(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprEq(node: PartiqlLogical.Expr.Eq, accumulator: T): T {
            var current = accumulator
            current = visitExprEq(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprNe(node: PartiqlLogical.Expr.Ne, accumulator: T): T {
            var current = accumulator
            current = visitExprNe(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprGt(node: PartiqlLogical.Expr.Gt, accumulator: T): T {
            var current = accumulator
            current = visitExprGt(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprGte(node: PartiqlLogical.Expr.Gte, accumulator: T): T {
            var current = accumulator
            current = visitExprGte(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprLt(node: PartiqlLogical.Expr.Lt, accumulator: T): T {
            var current = accumulator
            current = visitExprLt(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprLte(node: PartiqlLogical.Expr.Lte, accumulator: T): T {
            var current = accumulator
            current = visitExprLte(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprLike(node: PartiqlLogical.Expr.Like, accumulator: T): T {
            var current = accumulator
            current = visitExprLike(node, current)
            current = walkExpr(node.value, current)
            current = walkExpr(node.pattern, current)
            node.escape?.let { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprBetween(node: PartiqlLogical.Expr.Between, accumulator: T): T {
            var current = accumulator
            current = visitExprBetween(node, current)
            current = walkExpr(node.value, current)
            current = walkExpr(node.from, current)
            current = walkExpr(node.to, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprInCollection(node: PartiqlLogical.Expr.InCollection, accumulator: T): T {
            var current = accumulator
            current = visitExprInCollection(node, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprIsType(node: PartiqlLogical.Expr.IsType, accumulator: T): T {
            var current = accumulator
            current = visitExprIsType(node, current)
            current = walkExpr(node.value, current)
            current = walkType(node.type, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprSimpleCase(node: PartiqlLogical.Expr.SimpleCase, accumulator: T): T {
            var current = accumulator
            current = visitExprSimpleCase(node, current)
            current = walkExpr(node.expr, current)
            current = walkExprPairList(node.cases, current)
            node.default?.let { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprSearchedCase(node: PartiqlLogical.Expr.SearchedCase, accumulator: T): T {
            var current = accumulator
            current = visitExprSearchedCase(node, current)
            current = walkExprPairList(node.cases, current)
            node.default?.let { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprBag(node: PartiqlLogical.Expr.Bag, accumulator: T): T {
            var current = accumulator
            current = visitExprBag(node, current)
            node.values.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprList(node: PartiqlLogical.Expr.List, accumulator: T): T {
            var current = accumulator
            current = visitExprList(node, current)
            node.values.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprSexp(node: PartiqlLogical.Expr.Sexp, accumulator: T): T {
            var current = accumulator
            current = visitExprSexp(node, current)
            node.values.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprDate(node: PartiqlLogical.Expr.Date, accumulator: T): T {
            var current = accumulator
            current = visitExprDate(node, current)
            current = walkLongPrimitive(node.year, current)
            current = walkLongPrimitive(node.month, current)
            current = walkLongPrimitive(node.day, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprLitTime(node: PartiqlLogical.Expr.LitTime, accumulator: T): T {
            var current = accumulator
            current = visitExprLitTime(node, current)
            current = walkTimeValue(node.value, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprBagOp(node: PartiqlLogical.Expr.BagOp, accumulator: T): T {
            var current = accumulator
            current = visitExprBagOp(node, current)
            current = walkBagOpType(node.op, current)
            current = walkSetQuantifier(node.quantifier, current)
            node.operands.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprGraphMatch(node: PartiqlLogical.Expr.GraphMatch, accumulator: T): T {
            var current = accumulator
            current = visitExprGraphMatch(node, current)
            current = walkExpr(node.expr, current)
            current = walkGpmlPattern(node.gpmlPattern, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPath(node: PartiqlLogical.Expr.Path, accumulator: T): T {
            var current = accumulator
            current = visitExprPath(node, current)
            current = walkExpr(node.root, current)
            node.steps.map { current = walkPathStep(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprCall(node: PartiqlLogical.Expr.Call, accumulator: T): T {
            var current = accumulator
            current = visitExprCall(node, current)
            current = walkSymbolPrimitive(node.funcName, current)
            node.args.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprCast(node: PartiqlLogical.Expr.Cast, accumulator: T): T {
            var current = accumulator
            current = visitExprCast(node, current)
            current = walkExpr(node.value, current)
            current = walkType(node.asType, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprCanCast(node: PartiqlLogical.Expr.CanCast, accumulator: T): T {
            var current = accumulator
            current = visitExprCanCast(node, current)
            current = walkExpr(node.value, current)
            current = walkType(node.asType, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast, accumulator: T): T {
            var current = accumulator
            current = visitExprCanLosslessCast(node, current)
            current = walkExpr(node.value, current)
            current = walkType(node.asType, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprNullIf(node: PartiqlLogical.Expr.NullIf, accumulator: T): T {
            var current = accumulator
            current = visitExprNullIf(node, current)
            current = walkExpr(node.expr1, current)
            current = walkExpr(node.expr2, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprCoalesce(node: PartiqlLogical.Expr.Coalesce, accumulator: T): T {
            var current = accumulator
            current = visitExprCoalesce(node, current)
            node.args.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues, accumulator: T): T {
            var current = accumulator
            current = visitExprBindingsToValues(node, current)
            current = walkExpr(node.exp, current)
            current = walkBexpr(node.query, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprStruct(node: PartiqlLogical.Expr.Struct, accumulator: T): T {
            var current = accumulator
            current = visitExprStruct(node, current)
            node.parts.map { current = walkStructPart(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkExprPivot(node: PartiqlLogical.Expr.Pivot, accumulator: T): T {
            var current = accumulator
            current = visitExprPivot(node, current)
            current = walkBexpr(node.input, current)
            current = walkExpr(node.key, current)
            current = walkExpr(node.value, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: Statement
        //////////////////////////////////////
        open fun walkStatement(node: PartiqlLogical.Statement, accumulator: T): T {
            val current = visitStatement(node, accumulator)
            return when(node) {
                is PartiqlLogical.Statement.Query -> walkStatementQuery(node, current)
                is PartiqlLogical.Statement.Exec -> walkStatementExec(node, current)
                is PartiqlLogical.Statement.Explain -> walkStatementExplain(node, current)
                is PartiqlLogical.Statement.Dml -> walkStatementDml(node, current)
            }
        }
    
        open fun walkStatementQuery(node: PartiqlLogical.Statement.Query, accumulator: T): T {
            var current = accumulator
            current = visitStatementQuery(node, current)
            current = walkExpr(node.expr, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkStatementExec(node: PartiqlLogical.Statement.Exec, accumulator: T): T {
            var current = accumulator
            current = visitStatementExec(node, current)
            current = walkSymbolPrimitive(node.procedureName, current)
            node.args.map { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkStatementExplain(node: PartiqlLogical.Statement.Explain, accumulator: T): T {
            var current = accumulator
            current = visitStatementExplain(node, current)
            current = walkExplainTarget(node.target, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkStatementDml(node: PartiqlLogical.Statement.Dml, accumulator: T): T {
            var current = accumulator
            current = visitStatementDml(node, current)
            current = walkIdentifier(node.target, current)
            current = walkDmlOperation(node.operation, current)
            current = walkExpr(node.rows, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: StructPart
        //////////////////////////////////////
        open fun walkStructPart(node: PartiqlLogical.StructPart, accumulator: T): T {
            val current = visitStructPart(node, accumulator)
            return when(node) {
                is PartiqlLogical.StructPart.StructFields -> walkStructPartStructFields(node, current)
                is PartiqlLogical.StructPart.StructField -> walkStructPartStructField(node, current)
            }
        }
    
        open fun walkStructPartStructFields(node: PartiqlLogical.StructPart.StructFields, accumulator: T): T {
            var current = accumulator
            current = visitStructPartStructFields(node, current)
            current = walkExpr(node.partExpr, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkStructPartStructField(node: PartiqlLogical.StructPart.StructField, accumulator: T): T {
            var current = accumulator
            current = visitStructPartStructField(node, current)
            current = walkExpr(node.fieldName, current)
            current = walkExpr(node.value, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: Bexpr
        //////////////////////////////////////
        open fun walkBexpr(node: PartiqlLogical.Bexpr, accumulator: T): T {
            val current = visitBexpr(node, accumulator)
            return when(node) {
                is PartiqlLogical.Bexpr.Scan -> walkBexprScan(node, current)
                is PartiqlLogical.Bexpr.Unpivot -> walkBexprUnpivot(node, current)
                is PartiqlLogical.Bexpr.Filter -> walkBexprFilter(node, current)
                is PartiqlLogical.Bexpr.Aggregate -> walkBexprAggregate(node, current)
                is PartiqlLogical.Bexpr.Join -> walkBexprJoin(node, current)
                is PartiqlLogical.Bexpr.Window -> walkBexprWindow(node, current)
                is PartiqlLogical.Bexpr.Sort -> walkBexprSort(node, current)
                is PartiqlLogical.Bexpr.Offset -> walkBexprOffset(node, current)
                is PartiqlLogical.Bexpr.Limit -> walkBexprLimit(node, current)
                is PartiqlLogical.Bexpr.Let -> walkBexprLet(node, current)
            }
        }
    
        open fun walkBexprScan(node: PartiqlLogical.Bexpr.Scan, accumulator: T): T {
            var current = accumulator
            current = visitBexprScan(node, current)
            current = walkExpr(node.expr, current)
            current = walkVarDecl(node.asDecl, current)
            node.atDecl?.let { current = walkVarDecl(it, current) }
            node.byDecl?.let { current = walkVarDecl(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprUnpivot(node: PartiqlLogical.Bexpr.Unpivot, accumulator: T): T {
            var current = accumulator
            current = visitBexprUnpivot(node, current)
            current = walkExpr(node.expr, current)
            current = walkVarDecl(node.asDecl, current)
            node.atDecl?.let { current = walkVarDecl(it, current) }
            node.byDecl?.let { current = walkVarDecl(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprFilter(node: PartiqlLogical.Bexpr.Filter, accumulator: T): T {
            var current = accumulator
            current = visitBexprFilter(node, current)
            current = walkExpr(node.predicate, current)
            current = walkBexpr(node.source, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprAggregate(node: PartiqlLogical.Bexpr.Aggregate, accumulator: T): T {
            var current = accumulator
            current = visitBexprAggregate(node, current)
            current = walkBexpr(node.source, current)
            current = walkGroupingStrategy(node.strategy, current)
            current = walkGroupKeyList(node.groupList, current)
            current = walkAggregateFunctionList(node.functionList, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprJoin(node: PartiqlLogical.Bexpr.Join, accumulator: T): T {
            var current = accumulator
            current = visitBexprJoin(node, current)
            current = walkJoinType(node.joinType, current)
            current = walkBexpr(node.left, current)
            current = walkBexpr(node.right, current)
            node.predicate?.let { current = walkExpr(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprWindow(node: PartiqlLogical.Bexpr.Window, accumulator: T): T {
            var current = accumulator
            current = visitBexprWindow(node, current)
            current = walkBexpr(node.source, current)
            current = walkOver(node.windowSpecification, current)
            node.windowExpressionList.map { current = walkWindowExpression(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprSort(node: PartiqlLogical.Bexpr.Sort, accumulator: T): T {
            var current = accumulator
            current = visitBexprSort(node, current)
            current = walkBexpr(node.source, current)
            node.sortSpecs.map { current = walkSortSpec(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprOffset(node: PartiqlLogical.Bexpr.Offset, accumulator: T): T {
            var current = accumulator
            current = visitBexprOffset(node, current)
            current = walkExpr(node.rowCount, current)
            current = walkBexpr(node.source, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprLimit(node: PartiqlLogical.Bexpr.Limit, accumulator: T): T {
            var current = accumulator
            current = visitBexprLimit(node, current)
            current = walkExpr(node.rowCount, current)
            current = walkBexpr(node.source, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkBexprLet(node: PartiqlLogical.Bexpr.Let, accumulator: T): T {
            var current = accumulator
            current = visitBexprLet(node, current)
            current = walkBexpr(node.source, current)
            node.bindings.map { current = walkLetBinding(it, current) }
            current = walkMetas(node.metas, current)
            return current
        }
    
        //////////////////////////////////////
        // Sum Type: DmlOperation
        //////////////////////////////////////
        open fun walkDmlOperation(node: PartiqlLogical.DmlOperation, accumulator: T): T {
            val current = visitDmlOperation(node, accumulator)
            return when(node) {
                is PartiqlLogical.DmlOperation.DmlInsert -> walkDmlOperationDmlInsert(node, current)
                is PartiqlLogical.DmlOperation.DmlDelete -> walkDmlOperationDmlDelete(node, current)
                is PartiqlLogical.DmlOperation.DmlReplace -> walkDmlOperationDmlReplace(node, current)
                is PartiqlLogical.DmlOperation.DmlUpdate -> walkDmlOperationDmlUpdate(node, current)
            }
        }
    
        open fun walkDmlOperationDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert, accumulator: T): T {
            var current = accumulator
            current = visitDmlOperationDmlInsert(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkDmlOperationDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete, accumulator: T): T {
            var current = accumulator
            current = visitDmlOperationDmlDelete(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkDmlOperationDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace, accumulator: T): T {
            var current = accumulator
            current = visitDmlOperationDmlReplace(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
        open fun walkDmlOperationDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate, accumulator: T): T {
            var current = accumulator
            current = visitDmlOperationDmlUpdate(node, current)
            current = walkMetas(node.metas, current)
            return current
        }
    
    }
    abstract class VisitorTransform : DomainVisitorTransformBase() {
        //////////////////////////////////////
        // Tuple Types
        //////////////////////////////////////
        // Tuple TimeValue
        open fun transformTimeValue(node: PartiqlLogical.TimeValue): PartiqlLogical.TimeValue {
            val new_hour = transformTimeValue_hour(node)
            val new_minute = transformTimeValue_minute(node)
            val new_second = transformTimeValue_second(node)
            val new_nano = transformTimeValue_nano(node)
            val new_precision = transformTimeValue_precision(node)
            val new_withTimeZone = transformTimeValue_withTimeZone(node)
            val new_tzMinutes = transformTimeValue_tzMinutes(node)
            val new_metas = transformTimeValue_metas(node)
            return if (
                node.hour !== new_hour ||
                node.minute !== new_minute ||
                node.second !== new_second ||
                node.nano !== new_nano ||
                node.precision !== new_precision ||
                node.withTimeZone !== new_withTimeZone ||
                node.tzMinutes !== new_tzMinutes ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.TimeValue(
                    hour = new_hour,
                    minute = new_minute,
                    second = new_second,
                    nano = new_nano,
                    precision = new_precision,
                    withTimeZone = new_withTimeZone,
                    tzMinutes = new_tzMinutes,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTimeValue_hour(node: PartiqlLogical.TimeValue) =
            transformLongPrimitive(node.hour)
        open fun transformTimeValue_minute(node: PartiqlLogical.TimeValue) =
            transformLongPrimitive(node.minute)
        open fun transformTimeValue_second(node: PartiqlLogical.TimeValue) =
            transformLongPrimitive(node.second)
        open fun transformTimeValue_nano(node: PartiqlLogical.TimeValue) =
            transformLongPrimitive(node.nano)
        open fun transformTimeValue_precision(node: PartiqlLogical.TimeValue) =
            transformLongPrimitive(node.precision)
        open fun transformTimeValue_withTimeZone(node: PartiqlLogical.TimeValue) =
            transformBoolPrimitive(node.withTimeZone)
        open fun transformTimeValue_tzMinutes(node: PartiqlLogical.TimeValue) =
            node.tzMinutes?.let { transformLongPrimitive(it) }
        open fun transformTimeValue_metas(node: PartiqlLogical.TimeValue) =
            transformMetas(node.metas)
    
        // Tuple GraphMatchQuantifier
        open fun transformGraphMatchQuantifier(node: PartiqlLogical.GraphMatchQuantifier): PartiqlLogical.GraphMatchQuantifier {
            val new_lower = transformGraphMatchQuantifier_lower(node)
            val new_upper = transformGraphMatchQuantifier_upper(node)
            val new_metas = transformGraphMatchQuantifier_metas(node)
            return if (
                node.lower !== new_lower ||
                node.upper !== new_upper ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchQuantifier(
                    lower = new_lower,
                    upper = new_upper,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchQuantifier_lower(node: PartiqlLogical.GraphMatchQuantifier) =
            transformLongPrimitive(node.lower)
        open fun transformGraphMatchQuantifier_upper(node: PartiqlLogical.GraphMatchQuantifier) =
            node.upper?.let { transformLongPrimitive(it) }
        open fun transformGraphMatchQuantifier_metas(node: PartiqlLogical.GraphMatchQuantifier) =
            transformMetas(node.metas)
    
        // Tuple GraphMatchPattern
        open fun transformGraphMatchPattern(node: PartiqlLogical.GraphMatchPattern): PartiqlLogical.GraphMatchPattern {
            val new_restrictor = transformGraphMatchPattern_restrictor(node)
            val new_prefilter = transformGraphMatchPattern_prefilter(node)
            val new_variable = transformGraphMatchPattern_variable(node)
            val new_quantifier = transformGraphMatchPattern_quantifier(node)
            val new_parts = transformGraphMatchPattern_parts(node)
            val new_metas = transformGraphMatchPattern_metas(node)
            return if (
                node.restrictor !== new_restrictor ||
                node.prefilter !== new_prefilter ||
                node.variable !== new_variable ||
                node.quantifier !== new_quantifier ||
                node.parts !== new_parts ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchPattern(
                    restrictor = new_restrictor,
                    prefilter = new_prefilter,
                    variable = new_variable,
                    quantifier = new_quantifier,
                    parts = new_parts,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchPattern_restrictor(node: PartiqlLogical.GraphMatchPattern) =
            node.restrictor?.let { transformGraphMatchRestrictor(it) }
        open fun transformGraphMatchPattern_prefilter(node: PartiqlLogical.GraphMatchPattern) =
            node.prefilter?.let { transformExpr(it) }
        open fun transformGraphMatchPattern_variable(node: PartiqlLogical.GraphMatchPattern) =
            node.variable?.let { transformSymbolPrimitive(it) }
        open fun transformGraphMatchPattern_quantifier(node: PartiqlLogical.GraphMatchPattern) =
            node.quantifier?.let { transformGraphMatchQuantifier(it) }
        open fun transformGraphMatchPattern_parts(node: PartiqlLogical.GraphMatchPattern) =
            node.parts.map { transformGraphMatchPatternPart(it) }
        open fun transformGraphMatchPattern_metas(node: PartiqlLogical.GraphMatchPattern) =
            transformMetas(node.metas)
    
        // Tuple GpmlPattern
        open fun transformGpmlPattern(node: PartiqlLogical.GpmlPattern): PartiqlLogical.GpmlPattern {
            val new_selector = transformGpmlPattern_selector(node)
            val new_patterns = transformGpmlPattern_patterns(node)
            val new_metas = transformGpmlPattern_metas(node)
            return if (
                node.selector !== new_selector ||
                node.patterns !== new_patterns ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GpmlPattern(
                    selector = new_selector,
                    patterns = new_patterns,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGpmlPattern_selector(node: PartiqlLogical.GpmlPattern) =
            node.selector?.let { transformGraphMatchSelector(it) }
        open fun transformGpmlPattern_patterns(node: PartiqlLogical.GpmlPattern) =
            node.patterns.map { transformGraphMatchPattern(it) }
        open fun transformGpmlPattern_metas(node: PartiqlLogical.GpmlPattern) =
            transformMetas(node.metas)
    
        // Tuple ExprPair
        open fun transformExprPair(node: PartiqlLogical.ExprPair): PartiqlLogical.ExprPair {
            val new_first = transformExprPair_first(node)
            val new_second = transformExprPair_second(node)
            val new_metas = transformExprPair_metas(node)
            return if (
                node.first !== new_first ||
                node.second !== new_second ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.ExprPair(
                    first = new_first,
                    second = new_second,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPair_first(node: PartiqlLogical.ExprPair) =
            transformExpr(node.first)
        open fun transformExprPair_second(node: PartiqlLogical.ExprPair) =
            transformExpr(node.second)
        open fun transformExprPair_metas(node: PartiqlLogical.ExprPair) =
            transformMetas(node.metas)
    
        // Tuple ExprPairList
        open fun transformExprPairList(node: PartiqlLogical.ExprPairList): PartiqlLogical.ExprPairList {
            val new_pairs = transformExprPairList_pairs(node)
            val new_metas = transformExprPairList_metas(node)
            return if (
                node.pairs !== new_pairs ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.ExprPairList(
                    pairs = new_pairs,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPairList_pairs(node: PartiqlLogical.ExprPairList) =
            node.pairs.map { transformExprPair(it) }
        open fun transformExprPairList_metas(node: PartiqlLogical.ExprPairList) =
            transformMetas(node.metas)
    
        // Tuple SortSpec
        open fun transformSortSpec(node: PartiqlLogical.SortSpec): PartiqlLogical.SortSpec {
            val new_expr = transformSortSpec_expr(node)
            val new_orderingSpec = transformSortSpec_orderingSpec(node)
            val new_nullsSpec = transformSortSpec_nullsSpec(node)
            val new_metas = transformSortSpec_metas(node)
            return if (
                node.expr !== new_expr ||
                node.orderingSpec !== new_orderingSpec ||
                node.nullsSpec !== new_nullsSpec ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.SortSpec(
                    expr = new_expr,
                    orderingSpec = new_orderingSpec,
                    nullsSpec = new_nullsSpec,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformSortSpec_expr(node: PartiqlLogical.SortSpec) =
            transformExpr(node.expr)
        open fun transformSortSpec_orderingSpec(node: PartiqlLogical.SortSpec) =
            node.orderingSpec?.let { transformOrderingSpec(it) }
        open fun transformSortSpec_nullsSpec(node: PartiqlLogical.SortSpec) =
            node.nullsSpec?.let { transformNullsSpec(it) }
        open fun transformSortSpec_metas(node: PartiqlLogical.SortSpec) =
            transformMetas(node.metas)
    
        // Tuple Over
        open fun transformOver(node: PartiqlLogical.Over): PartiqlLogical.Over {
            val new_partitionBy = transformOver_partitionBy(node)
            val new_orderBy = transformOver_orderBy(node)
            val new_metas = transformOver_metas(node)
            return if (
                node.partitionBy !== new_partitionBy ||
                node.orderBy !== new_orderBy ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Over(
                    partitionBy = new_partitionBy,
                    orderBy = new_orderBy,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformOver_partitionBy(node: PartiqlLogical.Over) =
            node.partitionBy?.let { transformWindowPartitionList(it) }
        open fun transformOver_orderBy(node: PartiqlLogical.Over) =
            node.orderBy?.let { transformWindowSortSpecList(it) }
        open fun transformOver_metas(node: PartiqlLogical.Over) =
            transformMetas(node.metas)
    
        // Tuple WindowPartitionList
        open fun transformWindowPartitionList(node: PartiqlLogical.WindowPartitionList): PartiqlLogical.WindowPartitionList {
            val new_exprs = transformWindowPartitionList_exprs(node)
            val new_metas = transformWindowPartitionList_metas(node)
            return if (
                node.exprs !== new_exprs ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.WindowPartitionList(
                    exprs = new_exprs,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformWindowPartitionList_exprs(node: PartiqlLogical.WindowPartitionList) =
            node.exprs.map { transformExpr(it) }
        open fun transformWindowPartitionList_metas(node: PartiqlLogical.WindowPartitionList) =
            transformMetas(node.metas)
    
        // Tuple WindowSortSpecList
        open fun transformWindowSortSpecList(node: PartiqlLogical.WindowSortSpecList): PartiqlLogical.WindowSortSpecList {
            val new_sortSpecs = transformWindowSortSpecList_sortSpecs(node)
            val new_metas = transformWindowSortSpecList_metas(node)
            return if (
                node.sortSpecs !== new_sortSpecs ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.WindowSortSpecList(
                    sortSpecs = new_sortSpecs,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformWindowSortSpecList_sortSpecs(node: PartiqlLogical.WindowSortSpecList) =
            node.sortSpecs.map { transformSortSpec(it) }
        open fun transformWindowSortSpecList_metas(node: PartiqlLogical.WindowSortSpecList) =
            transformMetas(node.metas)
    
        // Tuple Identifier
        open fun transformIdentifier(node: PartiqlLogical.Identifier): PartiqlLogical.Identifier {
            val new_name = transformIdentifier_name(node)
            val new_case = transformIdentifier_case(node)
            val new_metas = transformIdentifier_metas(node)
            return if (
                node.name !== new_name ||
                node.case !== new_case ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Identifier(
                    name = new_name,
                    case = new_case,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformIdentifier_name(node: PartiqlLogical.Identifier) =
            transformSymbolPrimitive(node.name)
        open fun transformIdentifier_case(node: PartiqlLogical.Identifier) =
            transformCaseSensitivity(node.case)
        open fun transformIdentifier_metas(node: PartiqlLogical.Identifier) =
            transformMetas(node.metas)
    
        // Tuple Plan
        open fun transformPlan(node: PartiqlLogical.Plan): PartiqlLogical.Plan {
            val new_stmt = transformPlan_stmt(node)
            val new_version = transformPlan_version(node)
            val new_metas = transformPlan_metas(node)
            return if (
                node.stmt !== new_stmt ||
                node.version !== new_version ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Plan(
                    stmt = new_stmt,
                    version = new_version,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformPlan_stmt(node: PartiqlLogical.Plan) =
            transformStatement(node.stmt)
        open fun transformPlan_version(node: PartiqlLogical.Plan) =
            transformSymbolPrimitive(node.version)
        open fun transformPlan_metas(node: PartiqlLogical.Plan) =
            transformMetas(node.metas)
    
        // Tuple LetBinding
        open fun transformLetBinding(node: PartiqlLogical.LetBinding): PartiqlLogical.LetBinding {
            val new_value = transformLetBinding_value(node)
            val new_decl = transformLetBinding_decl(node)
            val new_metas = transformLetBinding_metas(node)
            return if (
                node.value !== new_value ||
                node.decl !== new_decl ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.LetBinding(
                    value = new_value,
                    decl = new_decl,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformLetBinding_value(node: PartiqlLogical.LetBinding) =
            transformExpr(node.value)
        open fun transformLetBinding_decl(node: PartiqlLogical.LetBinding) =
            transformVarDecl(node.decl)
        open fun transformLetBinding_metas(node: PartiqlLogical.LetBinding) =
            transformMetas(node.metas)
    
        // Tuple GroupKey
        open fun transformGroupKey(node: PartiqlLogical.GroupKey): PartiqlLogical.GroupKey {
            val new_expr = transformGroupKey_expr(node)
            val new_asVar = transformGroupKey_asVar(node)
            val new_metas = transformGroupKey_metas(node)
            return if (
                node.expr !== new_expr ||
                node.asVar !== new_asVar ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GroupKey(
                    expr = new_expr,
                    asVar = new_asVar,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGroupKey_expr(node: PartiqlLogical.GroupKey) =
            transformExpr(node.expr)
        open fun transformGroupKey_asVar(node: PartiqlLogical.GroupKey) =
            transformVarDecl(node.asVar)
        open fun transformGroupKey_metas(node: PartiqlLogical.GroupKey) =
            transformMetas(node.metas)
    
        // Tuple GroupKeyList
        open fun transformGroupKeyList(node: PartiqlLogical.GroupKeyList): PartiqlLogical.GroupKeyList {
            val new_keys = transformGroupKeyList_keys(node)
            val new_metas = transformGroupKeyList_metas(node)
            return if (
                node.keys !== new_keys ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GroupKeyList(
                    keys = new_keys,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGroupKeyList_keys(node: PartiqlLogical.GroupKeyList) =
            node.keys.map { transformGroupKey(it) }
        open fun transformGroupKeyList_metas(node: PartiqlLogical.GroupKeyList) =
            transformMetas(node.metas)
    
        // Tuple AggregateFunction
        open fun transformAggregateFunction(node: PartiqlLogical.AggregateFunction): PartiqlLogical.AggregateFunction {
            val new_quantifier = transformAggregateFunction_quantifier(node)
            val new_name = transformAggregateFunction_name(node)
            val new_arg = transformAggregateFunction_arg(node)
            val new_asVar = transformAggregateFunction_asVar(node)
            val new_metas = transformAggregateFunction_metas(node)
            return if (
                node.quantifier !== new_quantifier ||
                node.name !== new_name ||
                node.arg !== new_arg ||
                node.asVar !== new_asVar ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.AggregateFunction(
                    quantifier = new_quantifier,
                    name = new_name,
                    arg = new_arg,
                    asVar = new_asVar,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformAggregateFunction_quantifier(node: PartiqlLogical.AggregateFunction) =
            transformSetQuantifier(node.quantifier)
        open fun transformAggregateFunction_name(node: PartiqlLogical.AggregateFunction) =
            transformSymbolPrimitive(node.name)
        open fun transformAggregateFunction_arg(node: PartiqlLogical.AggregateFunction) =
            transformExpr(node.arg)
        open fun transformAggregateFunction_asVar(node: PartiqlLogical.AggregateFunction) =
            transformVarDecl(node.asVar)
        open fun transformAggregateFunction_metas(node: PartiqlLogical.AggregateFunction) =
            transformMetas(node.metas)
    
        // Tuple AggregateFunctionList
        open fun transformAggregateFunctionList(node: PartiqlLogical.AggregateFunctionList): PartiqlLogical.AggregateFunctionList {
            val new_functions = transformAggregateFunctionList_functions(node)
            val new_metas = transformAggregateFunctionList_metas(node)
            return if (
                node.functions !== new_functions ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.AggregateFunctionList(
                    functions = new_functions,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformAggregateFunctionList_functions(node: PartiqlLogical.AggregateFunctionList) =
            node.functions.map { transformAggregateFunction(it) }
        open fun transformAggregateFunctionList_metas(node: PartiqlLogical.AggregateFunctionList) =
            transformMetas(node.metas)
    
        // Tuple WindowExpression
        open fun transformWindowExpression(node: PartiqlLogical.WindowExpression): PartiqlLogical.WindowExpression {
            val new_decl = transformWindowExpression_decl(node)
            val new_funcName = transformWindowExpression_funcName(node)
            val new_args = transformWindowExpression_args(node)
            val new_metas = transformWindowExpression_metas(node)
            return if (
                node.decl !== new_decl ||
                node.funcName !== new_funcName ||
                node.args !== new_args ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.WindowExpression(
                    decl = new_decl,
                    funcName = new_funcName,
                    args = new_args,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformWindowExpression_decl(node: PartiqlLogical.WindowExpression) =
            transformVarDecl(node.decl)
        open fun transformWindowExpression_funcName(node: PartiqlLogical.WindowExpression) =
            transformSymbolPrimitive(node.funcName)
        open fun transformWindowExpression_args(node: PartiqlLogical.WindowExpression) =
            node.args.map { transformExpr(it) }
        open fun transformWindowExpression_metas(node: PartiqlLogical.WindowExpression) =
            transformMetas(node.metas)
    
        // Tuple VarDecl
        open fun transformVarDecl(node: PartiqlLogical.VarDecl): PartiqlLogical.VarDecl {
            val new_name = transformVarDecl_name(node)
            val new_metas = transformVarDecl_metas(node)
            return if (
                node.name !== new_name ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.VarDecl(
                    name = new_name,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformVarDecl_name(node: PartiqlLogical.VarDecl) =
            transformSymbolPrimitive(node.name)
        open fun transformVarDecl_metas(node: PartiqlLogical.VarDecl) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: ExplainTarget
        //////////////////////////////////////
        open fun transformExplainTarget(node: PartiqlLogical.ExplainTarget): PartiqlLogical.ExplainTarget =
            when(node) {
                is PartiqlLogical.ExplainTarget.Domain -> transformExplainTargetDomain(node)
            }
        // Variant ExplainTargetDomain
        open fun transformExplainTargetDomain(node: PartiqlLogical.ExplainTarget.Domain): PartiqlLogical.ExplainTarget {
            val new_statement = transformExplainTargetDomain_statement(node)
            val new_type = transformExplainTargetDomain_type(node)
            val new_format = transformExplainTargetDomain_format(node)
            val new_metas = transformExplainTargetDomain_metas(node)
            return if (
                node.statement !== new_statement ||
                node.type !== new_type ||
                node.format !== new_format ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.ExplainTarget.Domain(
                    statement = new_statement,
                    type = new_type,
                    format = new_format,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExplainTargetDomain_statement(node: PartiqlLogical.ExplainTarget.Domain) =
            transformStatement(node.statement)
        open fun transformExplainTargetDomain_type(node: PartiqlLogical.ExplainTarget.Domain) =
            node.type?.let { transformSymbolPrimitive(it) }
        open fun transformExplainTargetDomain_format(node: PartiqlLogical.ExplainTarget.Domain) =
            node.format?.let { transformSymbolPrimitive(it) }
        open fun transformExplainTargetDomain_metas(node: PartiqlLogical.ExplainTarget.Domain) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: PathStep
        //////////////////////////////////////
        open fun transformPathStep(node: PartiqlLogical.PathStep): PartiqlLogical.PathStep =
            when(node) {
                is PartiqlLogical.PathStep.PathExpr -> transformPathStepPathExpr(node)
                is PartiqlLogical.PathStep.PathWildcard -> transformPathStepPathWildcard(node)
                is PartiqlLogical.PathStep.PathUnpivot -> transformPathStepPathUnpivot(node)
            }
        // Variant PathStepPathExpr
        open fun transformPathStepPathExpr(node: PartiqlLogical.PathStep.PathExpr): PartiqlLogical.PathStep {
            val new_index = transformPathStepPathExpr_index(node)
            val new_case = transformPathStepPathExpr_case(node)
            val new_metas = transformPathStepPathExpr_metas(node)
            return if (
                node.index !== new_index ||
                node.case !== new_case ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.PathStep.PathExpr(
                    index = new_index,
                    case = new_case,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformPathStepPathExpr_index(node: PartiqlLogical.PathStep.PathExpr) =
            transformExpr(node.index)
        open fun transformPathStepPathExpr_case(node: PartiqlLogical.PathStep.PathExpr) =
            transformCaseSensitivity(node.case)
        open fun transformPathStepPathExpr_metas(node: PartiqlLogical.PathStep.PathExpr) =
            transformMetas(node.metas)
    
        // Variant PathStepPathWildcard
        open fun transformPathStepPathWildcard(node: PartiqlLogical.PathStep.PathWildcard): PartiqlLogical.PathStep {
            val new_metas = transformPathStepPathWildcard_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.PathStep.PathWildcard(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformPathStepPathWildcard_metas(node: PartiqlLogical.PathStep.PathWildcard) =
            transformMetas(node.metas)
    
        // Variant PathStepPathUnpivot
        open fun transformPathStepPathUnpivot(node: PartiqlLogical.PathStep.PathUnpivot): PartiqlLogical.PathStep {
            val new_metas = transformPathStepPathUnpivot_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.PathStep.PathUnpivot(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformPathStepPathUnpivot_metas(node: PartiqlLogical.PathStep.PathUnpivot) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: JoinType
        //////////////////////////////////////
        open fun transformJoinType(node: PartiqlLogical.JoinType): PartiqlLogical.JoinType =
            when(node) {
                is PartiqlLogical.JoinType.Inner -> transformJoinTypeInner(node)
                is PartiqlLogical.JoinType.Left -> transformJoinTypeLeft(node)
                is PartiqlLogical.JoinType.Right -> transformJoinTypeRight(node)
                is PartiqlLogical.JoinType.Full -> transformJoinTypeFull(node)
            }
        // Variant JoinTypeInner
        open fun transformJoinTypeInner(node: PartiqlLogical.JoinType.Inner): PartiqlLogical.JoinType {
            val new_metas = transformJoinTypeInner_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.JoinType.Inner(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformJoinTypeInner_metas(node: PartiqlLogical.JoinType.Inner) =
            transformMetas(node.metas)
    
        // Variant JoinTypeLeft
        open fun transformJoinTypeLeft(node: PartiqlLogical.JoinType.Left): PartiqlLogical.JoinType {
            val new_metas = transformJoinTypeLeft_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.JoinType.Left(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformJoinTypeLeft_metas(node: PartiqlLogical.JoinType.Left) =
            transformMetas(node.metas)
    
        // Variant JoinTypeRight
        open fun transformJoinTypeRight(node: PartiqlLogical.JoinType.Right): PartiqlLogical.JoinType {
            val new_metas = transformJoinTypeRight_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.JoinType.Right(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformJoinTypeRight_metas(node: PartiqlLogical.JoinType.Right) =
            transformMetas(node.metas)
    
        // Variant JoinTypeFull
        open fun transformJoinTypeFull(node: PartiqlLogical.JoinType.Full): PartiqlLogical.JoinType {
            val new_metas = transformJoinTypeFull_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.JoinType.Full(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformJoinTypeFull_metas(node: PartiqlLogical.JoinType.Full) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: GraphMatchDirection
        //////////////////////////////////////
        open fun transformGraphMatchDirection(node: PartiqlLogical.GraphMatchDirection): PartiqlLogical.GraphMatchDirection =
            when(node) {
                is PartiqlLogical.GraphMatchDirection.EdgeLeft -> transformGraphMatchDirectionEdgeLeft(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirected -> transformGraphMatchDirectionEdgeUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeRight -> transformGraphMatchDirectionEdgeRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected -> transformGraphMatchDirectionEdgeLeftOrUndirected(node)
                is PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight -> transformGraphMatchDirectionEdgeUndirectedOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight -> transformGraphMatchDirectionEdgeLeftOrRight(node)
                is PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight -> transformGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node)
            }
        // Variant GraphMatchDirectionEdgeLeft
        open fun transformGraphMatchDirectionEdgeLeft(node: PartiqlLogical.GraphMatchDirection.EdgeLeft): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeLeft_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeLeft(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeLeft_metas(node: PartiqlLogical.GraphMatchDirection.EdgeLeft) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeUndirected
        open fun transformGraphMatchDirectionEdgeUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeUndirected_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeUndirected(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeUndirected_metas(node: PartiqlLogical.GraphMatchDirection.EdgeUndirected) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeRight
        open fun transformGraphMatchDirectionEdgeRight(node: PartiqlLogical.GraphMatchDirection.EdgeRight): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeRight_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeRight(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeRight_metas(node: PartiqlLogical.GraphMatchDirection.EdgeRight) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeLeftOrUndirected
        open fun transformGraphMatchDirectionEdgeLeftOrUndirected(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeLeftOrUndirected_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeLeftOrUndirected_metas(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirected) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeUndirectedOrRight
        open fun transformGraphMatchDirectionEdgeUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeUndirectedOrRight_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeUndirectedOrRight_metas(node: PartiqlLogical.GraphMatchDirection.EdgeUndirectedOrRight) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeLeftOrRight
        open fun transformGraphMatchDirectionEdgeLeftOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeLeftOrRight_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeLeftOrRight_metas(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrRight) =
            transformMetas(node.metas)
    
        // Variant GraphMatchDirectionEdgeLeftOrUndirectedOrRight
        open fun transformGraphMatchDirectionEdgeLeftOrUndirectedOrRight(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight): PartiqlLogical.GraphMatchDirection {
            val new_metas = transformGraphMatchDirectionEdgeLeftOrUndirectedOrRight_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchDirectionEdgeLeftOrUndirectedOrRight_metas(node: PartiqlLogical.GraphMatchDirection.EdgeLeftOrUndirectedOrRight) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: GraphMatchPatternPart
        //////////////////////////////////////
        open fun transformGraphMatchPatternPart(node: PartiqlLogical.GraphMatchPatternPart): PartiqlLogical.GraphMatchPatternPart =
            when(node) {
                is PartiqlLogical.GraphMatchPatternPart.Node -> transformGraphMatchPatternPartNode(node)
                is PartiqlLogical.GraphMatchPatternPart.Edge -> transformGraphMatchPatternPartEdge(node)
                is PartiqlLogical.GraphMatchPatternPart.Pattern -> transformGraphMatchPatternPartPattern(node)
            }
        // Variant GraphMatchPatternPartNode
        open fun transformGraphMatchPatternPartNode(node: PartiqlLogical.GraphMatchPatternPart.Node): PartiqlLogical.GraphMatchPatternPart {
            val new_prefilter = transformGraphMatchPatternPartNode_prefilter(node)
            val new_variable = transformGraphMatchPatternPartNode_variable(node)
            val new_label = transformGraphMatchPatternPartNode_label(node)
            val new_metas = transformGraphMatchPatternPartNode_metas(node)
            return if (
                node.prefilter !== new_prefilter ||
                node.variable !== new_variable ||
                node.label !== new_label ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchPatternPart.Node(
                    prefilter = new_prefilter,
                    variable = new_variable,
                    label = new_label,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchPatternPartNode_prefilter(node: PartiqlLogical.GraphMatchPatternPart.Node) =
            node.prefilter?.let { transformExpr(it) }
        open fun transformGraphMatchPatternPartNode_variable(node: PartiqlLogical.GraphMatchPatternPart.Node) =
            node.variable?.let { transformSymbolPrimitive(it) }
        open fun transformGraphMatchPatternPartNode_label(node: PartiqlLogical.GraphMatchPatternPart.Node) =
            node.label.map { transformSymbolPrimitive(it) }
        open fun transformGraphMatchPatternPartNode_metas(node: PartiqlLogical.GraphMatchPatternPart.Node) =
            transformMetas(node.metas)
    
        // Variant GraphMatchPatternPartEdge
        open fun transformGraphMatchPatternPartEdge(node: PartiqlLogical.GraphMatchPatternPart.Edge): PartiqlLogical.GraphMatchPatternPart {
            val new_direction = transformGraphMatchPatternPartEdge_direction(node)
            val new_quantifier = transformGraphMatchPatternPartEdge_quantifier(node)
            val new_prefilter = transformGraphMatchPatternPartEdge_prefilter(node)
            val new_variable = transformGraphMatchPatternPartEdge_variable(node)
            val new_label = transformGraphMatchPatternPartEdge_label(node)
            val new_metas = transformGraphMatchPatternPartEdge_metas(node)
            return if (
                node.direction !== new_direction ||
                node.quantifier !== new_quantifier ||
                node.prefilter !== new_prefilter ||
                node.variable !== new_variable ||
                node.label !== new_label ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchPatternPart.Edge(
                    direction = new_direction,
                    quantifier = new_quantifier,
                    prefilter = new_prefilter,
                    variable = new_variable,
                    label = new_label,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchPatternPartEdge_direction(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            transformGraphMatchDirection(node.direction)
        open fun transformGraphMatchPatternPartEdge_quantifier(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            node.quantifier?.let { transformGraphMatchQuantifier(it) }
        open fun transformGraphMatchPatternPartEdge_prefilter(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            node.prefilter?.let { transformExpr(it) }
        open fun transformGraphMatchPatternPartEdge_variable(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            node.variable?.let { transformSymbolPrimitive(it) }
        open fun transformGraphMatchPatternPartEdge_label(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            node.label.map { transformSymbolPrimitive(it) }
        open fun transformGraphMatchPatternPartEdge_metas(node: PartiqlLogical.GraphMatchPatternPart.Edge) =
            transformMetas(node.metas)
    
        // Variant GraphMatchPatternPartPattern
        open fun transformGraphMatchPatternPartPattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern): PartiqlLogical.GraphMatchPatternPart {
            val new_pattern = transformGraphMatchPatternPartPattern_pattern(node)
            val new_metas = transformGraphMatchPatternPartPattern_metas(node)
            return if (
                node.pattern !== new_pattern ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchPatternPart.Pattern(
                    pattern = new_pattern,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchPatternPartPattern_pattern(node: PartiqlLogical.GraphMatchPatternPart.Pattern) =
            transformGraphMatchPattern(node.pattern)
        open fun transformGraphMatchPatternPartPattern_metas(node: PartiqlLogical.GraphMatchPatternPart.Pattern) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: GraphMatchRestrictor
        //////////////////////////////////////
        open fun transformGraphMatchRestrictor(node: PartiqlLogical.GraphMatchRestrictor): PartiqlLogical.GraphMatchRestrictor =
            when(node) {
                is PartiqlLogical.GraphMatchRestrictor.RestrictorTrail -> transformGraphMatchRestrictorRestrictorTrail(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic -> transformGraphMatchRestrictorRestrictorAcyclic(node)
                is PartiqlLogical.GraphMatchRestrictor.RestrictorSimple -> transformGraphMatchRestrictorRestrictorSimple(node)
            }
        // Variant GraphMatchRestrictorRestrictorTrail
        open fun transformGraphMatchRestrictorRestrictorTrail(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail): PartiqlLogical.GraphMatchRestrictor {
            val new_metas = transformGraphMatchRestrictorRestrictorTrail_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchRestrictor.RestrictorTrail(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchRestrictorRestrictorTrail_metas(node: PartiqlLogical.GraphMatchRestrictor.RestrictorTrail) =
            transformMetas(node.metas)
    
        // Variant GraphMatchRestrictorRestrictorAcyclic
        open fun transformGraphMatchRestrictorRestrictorAcyclic(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic): PartiqlLogical.GraphMatchRestrictor {
            val new_metas = transformGraphMatchRestrictorRestrictorAcyclic_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchRestrictorRestrictorAcyclic_metas(node: PartiqlLogical.GraphMatchRestrictor.RestrictorAcyclic) =
            transformMetas(node.metas)
    
        // Variant GraphMatchRestrictorRestrictorSimple
        open fun transformGraphMatchRestrictorRestrictorSimple(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple): PartiqlLogical.GraphMatchRestrictor {
            val new_metas = transformGraphMatchRestrictorRestrictorSimple_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchRestrictor.RestrictorSimple(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchRestrictorRestrictorSimple_metas(node: PartiqlLogical.GraphMatchRestrictor.RestrictorSimple) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: GraphMatchSelector
        //////////////////////////////////////
        open fun transformGraphMatchSelector(node: PartiqlLogical.GraphMatchSelector): PartiqlLogical.GraphMatchSelector =
            when(node) {
                is PartiqlLogical.GraphMatchSelector.SelectorAnyShortest -> transformGraphMatchSelectorSelectorAnyShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAllShortest -> transformGraphMatchSelectorSelectorAllShortest(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAny -> transformGraphMatchSelectorSelectorAny(node)
                is PartiqlLogical.GraphMatchSelector.SelectorAnyK -> transformGraphMatchSelectorSelectorAnyK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestK -> transformGraphMatchSelectorSelectorShortestK(node)
                is PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup -> transformGraphMatchSelectorSelectorShortestKGroup(node)
            }
        // Variant GraphMatchSelectorSelectorAnyShortest
        open fun transformGraphMatchSelectorSelectorAnyShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest): PartiqlLogical.GraphMatchSelector {
            val new_metas = transformGraphMatchSelectorSelectorAnyShortest_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorAnyShortest(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorAnyShortest_metas(node: PartiqlLogical.GraphMatchSelector.SelectorAnyShortest) =
            transformMetas(node.metas)
    
        // Variant GraphMatchSelectorSelectorAllShortest
        open fun transformGraphMatchSelectorSelectorAllShortest(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest): PartiqlLogical.GraphMatchSelector {
            val new_metas = transformGraphMatchSelectorSelectorAllShortest_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorAllShortest(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorAllShortest_metas(node: PartiqlLogical.GraphMatchSelector.SelectorAllShortest) =
            transformMetas(node.metas)
    
        // Variant GraphMatchSelectorSelectorAny
        open fun transformGraphMatchSelectorSelectorAny(node: PartiqlLogical.GraphMatchSelector.SelectorAny): PartiqlLogical.GraphMatchSelector {
            val new_metas = transformGraphMatchSelectorSelectorAny_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorAny(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorAny_metas(node: PartiqlLogical.GraphMatchSelector.SelectorAny) =
            transformMetas(node.metas)
    
        // Variant GraphMatchSelectorSelectorAnyK
        open fun transformGraphMatchSelectorSelectorAnyK(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK): PartiqlLogical.GraphMatchSelector {
            val new_k = transformGraphMatchSelectorSelectorAnyK_k(node)
            val new_metas = transformGraphMatchSelectorSelectorAnyK_metas(node)
            return if (
                node.k !== new_k ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorAnyK(
                    k = new_k,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorAnyK_k(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK) =
            transformLongPrimitive(node.k)
        open fun transformGraphMatchSelectorSelectorAnyK_metas(node: PartiqlLogical.GraphMatchSelector.SelectorAnyK) =
            transformMetas(node.metas)
    
        // Variant GraphMatchSelectorSelectorShortestK
        open fun transformGraphMatchSelectorSelectorShortestK(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK): PartiqlLogical.GraphMatchSelector {
            val new_k = transformGraphMatchSelectorSelectorShortestK_k(node)
            val new_metas = transformGraphMatchSelectorSelectorShortestK_metas(node)
            return if (
                node.k !== new_k ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorShortestK(
                    k = new_k,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorShortestK_k(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK) =
            transformLongPrimitive(node.k)
        open fun transformGraphMatchSelectorSelectorShortestK_metas(node: PartiqlLogical.GraphMatchSelector.SelectorShortestK) =
            transformMetas(node.metas)
    
        // Variant GraphMatchSelectorSelectorShortestKGroup
        open fun transformGraphMatchSelectorSelectorShortestKGroup(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup): PartiqlLogical.GraphMatchSelector {
            val new_k = transformGraphMatchSelectorSelectorShortestKGroup_k(node)
            val new_metas = transformGraphMatchSelectorSelectorShortestKGroup_metas(node)
            return if (
                node.k !== new_k ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup(
                    k = new_k,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGraphMatchSelectorSelectorShortestKGroup_k(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup) =
            transformLongPrimitive(node.k)
        open fun transformGraphMatchSelectorSelectorShortestKGroup_metas(node: PartiqlLogical.GraphMatchSelector.SelectorShortestKGroup) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: GroupingStrategy
        //////////////////////////////////////
        open fun transformGroupingStrategy(node: PartiqlLogical.GroupingStrategy): PartiqlLogical.GroupingStrategy =
            when(node) {
                is PartiqlLogical.GroupingStrategy.GroupFull -> transformGroupingStrategyGroupFull(node)
                is PartiqlLogical.GroupingStrategy.GroupPartial -> transformGroupingStrategyGroupPartial(node)
            }
        // Variant GroupingStrategyGroupFull
        open fun transformGroupingStrategyGroupFull(node: PartiqlLogical.GroupingStrategy.GroupFull): PartiqlLogical.GroupingStrategy {
            val new_metas = transformGroupingStrategyGroupFull_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GroupingStrategy.GroupFull(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGroupingStrategyGroupFull_metas(node: PartiqlLogical.GroupingStrategy.GroupFull) =
            transformMetas(node.metas)
    
        // Variant GroupingStrategyGroupPartial
        open fun transformGroupingStrategyGroupPartial(node: PartiqlLogical.GroupingStrategy.GroupPartial): PartiqlLogical.GroupingStrategy {
            val new_metas = transformGroupingStrategyGroupPartial_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.GroupingStrategy.GroupPartial(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformGroupingStrategyGroupPartial_metas(node: PartiqlLogical.GroupingStrategy.GroupPartial) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: OrderingSpec
        //////////////////////////////////////
        open fun transformOrderingSpec(node: PartiqlLogical.OrderingSpec): PartiqlLogical.OrderingSpec =
            when(node) {
                is PartiqlLogical.OrderingSpec.Asc -> transformOrderingSpecAsc(node)
                is PartiqlLogical.OrderingSpec.Desc -> transformOrderingSpecDesc(node)
            }
        // Variant OrderingSpecAsc
        open fun transformOrderingSpecAsc(node: PartiqlLogical.OrderingSpec.Asc): PartiqlLogical.OrderingSpec {
            val new_metas = transformOrderingSpecAsc_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.OrderingSpec.Asc(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformOrderingSpecAsc_metas(node: PartiqlLogical.OrderingSpec.Asc) =
            transformMetas(node.metas)
    
        // Variant OrderingSpecDesc
        open fun transformOrderingSpecDesc(node: PartiqlLogical.OrderingSpec.Desc): PartiqlLogical.OrderingSpec {
            val new_metas = transformOrderingSpecDesc_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.OrderingSpec.Desc(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformOrderingSpecDesc_metas(node: PartiqlLogical.OrderingSpec.Desc) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: NullsSpec
        //////////////////////////////////////
        open fun transformNullsSpec(node: PartiqlLogical.NullsSpec): PartiqlLogical.NullsSpec =
            when(node) {
                is PartiqlLogical.NullsSpec.NullsFirst -> transformNullsSpecNullsFirst(node)
                is PartiqlLogical.NullsSpec.NullsLast -> transformNullsSpecNullsLast(node)
            }
        // Variant NullsSpecNullsFirst
        open fun transformNullsSpecNullsFirst(node: PartiqlLogical.NullsSpec.NullsFirst): PartiqlLogical.NullsSpec {
            val new_metas = transformNullsSpecNullsFirst_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.NullsSpec.NullsFirst(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformNullsSpecNullsFirst_metas(node: PartiqlLogical.NullsSpec.NullsFirst) =
            transformMetas(node.metas)
    
        // Variant NullsSpecNullsLast
        open fun transformNullsSpecNullsLast(node: PartiqlLogical.NullsSpec.NullsLast): PartiqlLogical.NullsSpec {
            val new_metas = transformNullsSpecNullsLast_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.NullsSpec.NullsLast(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformNullsSpecNullsLast_metas(node: PartiqlLogical.NullsSpec.NullsLast) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: CaseSensitivity
        //////////////////////////////////////
        open fun transformCaseSensitivity(node: PartiqlLogical.CaseSensitivity): PartiqlLogical.CaseSensitivity =
            when(node) {
                is PartiqlLogical.CaseSensitivity.CaseSensitive -> transformCaseSensitivityCaseSensitive(node)
                is PartiqlLogical.CaseSensitivity.CaseInsensitive -> transformCaseSensitivityCaseInsensitive(node)
            }
        // Variant CaseSensitivityCaseSensitive
        open fun transformCaseSensitivityCaseSensitive(node: PartiqlLogical.CaseSensitivity.CaseSensitive): PartiqlLogical.CaseSensitivity {
            val new_metas = transformCaseSensitivityCaseSensitive_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.CaseSensitivity.CaseSensitive(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformCaseSensitivityCaseSensitive_metas(node: PartiqlLogical.CaseSensitivity.CaseSensitive) =
            transformMetas(node.metas)
    
        // Variant CaseSensitivityCaseInsensitive
        open fun transformCaseSensitivityCaseInsensitive(node: PartiqlLogical.CaseSensitivity.CaseInsensitive): PartiqlLogical.CaseSensitivity {
            val new_metas = transformCaseSensitivityCaseInsensitive_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.CaseSensitivity.CaseInsensitive(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformCaseSensitivityCaseInsensitive_metas(node: PartiqlLogical.CaseSensitivity.CaseInsensitive) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: ScopeQualifier
        //////////////////////////////////////
        open fun transformScopeQualifier(node: PartiqlLogical.ScopeQualifier): PartiqlLogical.ScopeQualifier =
            when(node) {
                is PartiqlLogical.ScopeQualifier.Unqualified -> transformScopeQualifierUnqualified(node)
                is PartiqlLogical.ScopeQualifier.LocalsFirst -> transformScopeQualifierLocalsFirst(node)
            }
        // Variant ScopeQualifierUnqualified
        open fun transformScopeQualifierUnqualified(node: PartiqlLogical.ScopeQualifier.Unqualified): PartiqlLogical.ScopeQualifier {
            val new_metas = transformScopeQualifierUnqualified_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.ScopeQualifier.Unqualified(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformScopeQualifierUnqualified_metas(node: PartiqlLogical.ScopeQualifier.Unqualified) =
            transformMetas(node.metas)
    
        // Variant ScopeQualifierLocalsFirst
        open fun transformScopeQualifierLocalsFirst(node: PartiqlLogical.ScopeQualifier.LocalsFirst): PartiqlLogical.ScopeQualifier {
            val new_metas = transformScopeQualifierLocalsFirst_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.ScopeQualifier.LocalsFirst(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformScopeQualifierLocalsFirst_metas(node: PartiqlLogical.ScopeQualifier.LocalsFirst) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: SetQuantifier
        //////////////////////////////////////
        open fun transformSetQuantifier(node: PartiqlLogical.SetQuantifier): PartiqlLogical.SetQuantifier =
            when(node) {
                is PartiqlLogical.SetQuantifier.All -> transformSetQuantifierAll(node)
                is PartiqlLogical.SetQuantifier.Distinct -> transformSetQuantifierDistinct(node)
            }
        // Variant SetQuantifierAll
        open fun transformSetQuantifierAll(node: PartiqlLogical.SetQuantifier.All): PartiqlLogical.SetQuantifier {
            val new_metas = transformSetQuantifierAll_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.SetQuantifier.All(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformSetQuantifierAll_metas(node: PartiqlLogical.SetQuantifier.All) =
            transformMetas(node.metas)
    
        // Variant SetQuantifierDistinct
        open fun transformSetQuantifierDistinct(node: PartiqlLogical.SetQuantifier.Distinct): PartiqlLogical.SetQuantifier {
            val new_metas = transformSetQuantifierDistinct_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.SetQuantifier.Distinct(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformSetQuantifierDistinct_metas(node: PartiqlLogical.SetQuantifier.Distinct) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: BagOpType
        //////////////////////////////////////
        open fun transformBagOpType(node: PartiqlLogical.BagOpType): PartiqlLogical.BagOpType =
            when(node) {
                is PartiqlLogical.BagOpType.Union -> transformBagOpTypeUnion(node)
                is PartiqlLogical.BagOpType.Intersect -> transformBagOpTypeIntersect(node)
                is PartiqlLogical.BagOpType.Except -> transformBagOpTypeExcept(node)
                is PartiqlLogical.BagOpType.OuterUnion -> transformBagOpTypeOuterUnion(node)
                is PartiqlLogical.BagOpType.OuterIntersect -> transformBagOpTypeOuterIntersect(node)
                is PartiqlLogical.BagOpType.OuterExcept -> transformBagOpTypeOuterExcept(node)
            }
        // Variant BagOpTypeUnion
        open fun transformBagOpTypeUnion(node: PartiqlLogical.BagOpType.Union): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeUnion_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.Union(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeUnion_metas(node: PartiqlLogical.BagOpType.Union) =
            transformMetas(node.metas)
    
        // Variant BagOpTypeIntersect
        open fun transformBagOpTypeIntersect(node: PartiqlLogical.BagOpType.Intersect): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeIntersect_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.Intersect(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeIntersect_metas(node: PartiqlLogical.BagOpType.Intersect) =
            transformMetas(node.metas)
    
        // Variant BagOpTypeExcept
        open fun transformBagOpTypeExcept(node: PartiqlLogical.BagOpType.Except): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeExcept_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.Except(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeExcept_metas(node: PartiqlLogical.BagOpType.Except) =
            transformMetas(node.metas)
    
        // Variant BagOpTypeOuterUnion
        open fun transformBagOpTypeOuterUnion(node: PartiqlLogical.BagOpType.OuterUnion): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeOuterUnion_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.OuterUnion(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeOuterUnion_metas(node: PartiqlLogical.BagOpType.OuterUnion) =
            transformMetas(node.metas)
    
        // Variant BagOpTypeOuterIntersect
        open fun transformBagOpTypeOuterIntersect(node: PartiqlLogical.BagOpType.OuterIntersect): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeOuterIntersect_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.OuterIntersect(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeOuterIntersect_metas(node: PartiqlLogical.BagOpType.OuterIntersect) =
            transformMetas(node.metas)
    
        // Variant BagOpTypeOuterExcept
        open fun transformBagOpTypeOuterExcept(node: PartiqlLogical.BagOpType.OuterExcept): PartiqlLogical.BagOpType {
            val new_metas = transformBagOpTypeOuterExcept_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.BagOpType.OuterExcept(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBagOpTypeOuterExcept_metas(node: PartiqlLogical.BagOpType.OuterExcept) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: OnConflictValue
        //////////////////////////////////////
        open fun transformOnConflictValue(node: PartiqlLogical.OnConflictValue): PartiqlLogical.OnConflictValue =
            when(node) {
                is PartiqlLogical.OnConflictValue.Excluded -> transformOnConflictValueExcluded(node)
            }
        // Variant OnConflictValueExcluded
        open fun transformOnConflictValueExcluded(node: PartiqlLogical.OnConflictValue.Excluded): PartiqlLogical.OnConflictValue {
            val new_metas = transformOnConflictValueExcluded_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.OnConflictValue.Excluded(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformOnConflictValueExcluded_metas(node: PartiqlLogical.OnConflictValue.Excluded) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: Type
        //////////////////////////////////////
        open fun transformType(node: PartiqlLogical.Type): PartiqlLogical.Type =
            when(node) {
                is PartiqlLogical.Type.NullType -> transformTypeNullType(node)
                is PartiqlLogical.Type.BooleanType -> transformTypeBooleanType(node)
                is PartiqlLogical.Type.SmallintType -> transformTypeSmallintType(node)
                is PartiqlLogical.Type.Integer4Type -> transformTypeInteger4Type(node)
                is PartiqlLogical.Type.Integer8Type -> transformTypeInteger8Type(node)
                is PartiqlLogical.Type.IntegerType -> transformTypeIntegerType(node)
                is PartiqlLogical.Type.FloatType -> transformTypeFloatType(node)
                is PartiqlLogical.Type.RealType -> transformTypeRealType(node)
                is PartiqlLogical.Type.DoublePrecisionType -> transformTypeDoublePrecisionType(node)
                is PartiqlLogical.Type.DecimalType -> transformTypeDecimalType(node)
                is PartiqlLogical.Type.NumericType -> transformTypeNumericType(node)
                is PartiqlLogical.Type.TimestampType -> transformTypeTimestampType(node)
                is PartiqlLogical.Type.CharacterType -> transformTypeCharacterType(node)
                is PartiqlLogical.Type.CharacterVaryingType -> transformTypeCharacterVaryingType(node)
                is PartiqlLogical.Type.MissingType -> transformTypeMissingType(node)
                is PartiqlLogical.Type.StringType -> transformTypeStringType(node)
                is PartiqlLogical.Type.SymbolType -> transformTypeSymbolType(node)
                is PartiqlLogical.Type.BlobType -> transformTypeBlobType(node)
                is PartiqlLogical.Type.ClobType -> transformTypeClobType(node)
                is PartiqlLogical.Type.DateType -> transformTypeDateType(node)
                is PartiqlLogical.Type.TimeType -> transformTypeTimeType(node)
                is PartiqlLogical.Type.TimeWithTimeZoneType -> transformTypeTimeWithTimeZoneType(node)
                is PartiqlLogical.Type.StructType -> transformTypeStructType(node)
                is PartiqlLogical.Type.TupleType -> transformTypeTupleType(node)
                is PartiqlLogical.Type.ListType -> transformTypeListType(node)
                is PartiqlLogical.Type.SexpType -> transformTypeSexpType(node)
                is PartiqlLogical.Type.BagType -> transformTypeBagType(node)
                is PartiqlLogical.Type.AnyType -> transformTypeAnyType(node)
                is PartiqlLogical.Type.CustomType -> transformTypeCustomType(node)
            }
        // Variant TypeNullType
        open fun transformTypeNullType(node: PartiqlLogical.Type.NullType): PartiqlLogical.Type {
            val new_metas = transformTypeNullType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.NullType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeNullType_metas(node: PartiqlLogical.Type.NullType) =
            transformMetas(node.metas)
    
        // Variant TypeBooleanType
        open fun transformTypeBooleanType(node: PartiqlLogical.Type.BooleanType): PartiqlLogical.Type {
            val new_metas = transformTypeBooleanType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.BooleanType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeBooleanType_metas(node: PartiqlLogical.Type.BooleanType) =
            transformMetas(node.metas)
    
        // Variant TypeSmallintType
        open fun transformTypeSmallintType(node: PartiqlLogical.Type.SmallintType): PartiqlLogical.Type {
            val new_metas = transformTypeSmallintType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.SmallintType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeSmallintType_metas(node: PartiqlLogical.Type.SmallintType) =
            transformMetas(node.metas)
    
        // Variant TypeInteger4Type
        open fun transformTypeInteger4Type(node: PartiqlLogical.Type.Integer4Type): PartiqlLogical.Type {
            val new_metas = transformTypeInteger4Type_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.Integer4Type(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeInteger4Type_metas(node: PartiqlLogical.Type.Integer4Type) =
            transformMetas(node.metas)
    
        // Variant TypeInteger8Type
        open fun transformTypeInteger8Type(node: PartiqlLogical.Type.Integer8Type): PartiqlLogical.Type {
            val new_metas = transformTypeInteger8Type_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.Integer8Type(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeInteger8Type_metas(node: PartiqlLogical.Type.Integer8Type) =
            transformMetas(node.metas)
    
        // Variant TypeIntegerType
        open fun transformTypeIntegerType(node: PartiqlLogical.Type.IntegerType): PartiqlLogical.Type {
            val new_metas = transformTypeIntegerType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.IntegerType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeIntegerType_metas(node: PartiqlLogical.Type.IntegerType) =
            transformMetas(node.metas)
    
        // Variant TypeFloatType
        open fun transformTypeFloatType(node: PartiqlLogical.Type.FloatType): PartiqlLogical.Type {
            val new_precision = transformTypeFloatType_precision(node)
            val new_metas = transformTypeFloatType_metas(node)
            return if (
                node.precision !== new_precision ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.FloatType(
                    precision = new_precision,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeFloatType_precision(node: PartiqlLogical.Type.FloatType) =
            node.precision?.let { transformLongPrimitive(it) }
        open fun transformTypeFloatType_metas(node: PartiqlLogical.Type.FloatType) =
            transformMetas(node.metas)
    
        // Variant TypeRealType
        open fun transformTypeRealType(node: PartiqlLogical.Type.RealType): PartiqlLogical.Type {
            val new_metas = transformTypeRealType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.RealType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeRealType_metas(node: PartiqlLogical.Type.RealType) =
            transformMetas(node.metas)
    
        // Variant TypeDoublePrecisionType
        open fun transformTypeDoublePrecisionType(node: PartiqlLogical.Type.DoublePrecisionType): PartiqlLogical.Type {
            val new_metas = transformTypeDoublePrecisionType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.DoublePrecisionType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeDoublePrecisionType_metas(node: PartiqlLogical.Type.DoublePrecisionType) =
            transformMetas(node.metas)
    
        // Variant TypeDecimalType
        open fun transformTypeDecimalType(node: PartiqlLogical.Type.DecimalType): PartiqlLogical.Type {
            val new_precision = transformTypeDecimalType_precision(node)
            val new_scale = transformTypeDecimalType_scale(node)
            val new_metas = transformTypeDecimalType_metas(node)
            return if (
                node.precision !== new_precision ||
                node.scale !== new_scale ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.DecimalType(
                    precision = new_precision,
                    scale = new_scale,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeDecimalType_precision(node: PartiqlLogical.Type.DecimalType) =
            node.precision?.let { transformLongPrimitive(it) }
        open fun transformTypeDecimalType_scale(node: PartiqlLogical.Type.DecimalType) =
            node.scale?.let { transformLongPrimitive(it) }
        open fun transformTypeDecimalType_metas(node: PartiqlLogical.Type.DecimalType) =
            transformMetas(node.metas)
    
        // Variant TypeNumericType
        open fun transformTypeNumericType(node: PartiqlLogical.Type.NumericType): PartiqlLogical.Type {
            val new_precision = transformTypeNumericType_precision(node)
            val new_scale = transformTypeNumericType_scale(node)
            val new_metas = transformTypeNumericType_metas(node)
            return if (
                node.precision !== new_precision ||
                node.scale !== new_scale ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.NumericType(
                    precision = new_precision,
                    scale = new_scale,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeNumericType_precision(node: PartiqlLogical.Type.NumericType) =
            node.precision?.let { transformLongPrimitive(it) }
        open fun transformTypeNumericType_scale(node: PartiqlLogical.Type.NumericType) =
            node.scale?.let { transformLongPrimitive(it) }
        open fun transformTypeNumericType_metas(node: PartiqlLogical.Type.NumericType) =
            transformMetas(node.metas)
    
        // Variant TypeTimestampType
        open fun transformTypeTimestampType(node: PartiqlLogical.Type.TimestampType): PartiqlLogical.Type {
            val new_metas = transformTypeTimestampType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.TimestampType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeTimestampType_metas(node: PartiqlLogical.Type.TimestampType) =
            transformMetas(node.metas)
    
        // Variant TypeCharacterType
        open fun transformTypeCharacterType(node: PartiqlLogical.Type.CharacterType): PartiqlLogical.Type {
            val new_length = transformTypeCharacterType_length(node)
            val new_metas = transformTypeCharacterType_metas(node)
            return if (
                node.length !== new_length ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.CharacterType(
                    length = new_length,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeCharacterType_length(node: PartiqlLogical.Type.CharacterType) =
            node.length?.let { transformLongPrimitive(it) }
        open fun transformTypeCharacterType_metas(node: PartiqlLogical.Type.CharacterType) =
            transformMetas(node.metas)
    
        // Variant TypeCharacterVaryingType
        open fun transformTypeCharacterVaryingType(node: PartiqlLogical.Type.CharacterVaryingType): PartiqlLogical.Type {
            val new_length = transformTypeCharacterVaryingType_length(node)
            val new_metas = transformTypeCharacterVaryingType_metas(node)
            return if (
                node.length !== new_length ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.CharacterVaryingType(
                    length = new_length,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeCharacterVaryingType_length(node: PartiqlLogical.Type.CharacterVaryingType) =
            node.length?.let { transformLongPrimitive(it) }
        open fun transformTypeCharacterVaryingType_metas(node: PartiqlLogical.Type.CharacterVaryingType) =
            transformMetas(node.metas)
    
        // Variant TypeMissingType
        open fun transformTypeMissingType(node: PartiqlLogical.Type.MissingType): PartiqlLogical.Type {
            val new_metas = transformTypeMissingType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.MissingType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeMissingType_metas(node: PartiqlLogical.Type.MissingType) =
            transformMetas(node.metas)
    
        // Variant TypeStringType
        open fun transformTypeStringType(node: PartiqlLogical.Type.StringType): PartiqlLogical.Type {
            val new_metas = transformTypeStringType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.StringType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeStringType_metas(node: PartiqlLogical.Type.StringType) =
            transformMetas(node.metas)
    
        // Variant TypeSymbolType
        open fun transformTypeSymbolType(node: PartiqlLogical.Type.SymbolType): PartiqlLogical.Type {
            val new_metas = transformTypeSymbolType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.SymbolType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeSymbolType_metas(node: PartiqlLogical.Type.SymbolType) =
            transformMetas(node.metas)
    
        // Variant TypeBlobType
        open fun transformTypeBlobType(node: PartiqlLogical.Type.BlobType): PartiqlLogical.Type {
            val new_metas = transformTypeBlobType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.BlobType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeBlobType_metas(node: PartiqlLogical.Type.BlobType) =
            transformMetas(node.metas)
    
        // Variant TypeClobType
        open fun transformTypeClobType(node: PartiqlLogical.Type.ClobType): PartiqlLogical.Type {
            val new_metas = transformTypeClobType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.ClobType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeClobType_metas(node: PartiqlLogical.Type.ClobType) =
            transformMetas(node.metas)
    
        // Variant TypeDateType
        open fun transformTypeDateType(node: PartiqlLogical.Type.DateType): PartiqlLogical.Type {
            val new_metas = transformTypeDateType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.DateType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeDateType_metas(node: PartiqlLogical.Type.DateType) =
            transformMetas(node.metas)
    
        // Variant TypeTimeType
        open fun transformTypeTimeType(node: PartiqlLogical.Type.TimeType): PartiqlLogical.Type {
            val new_precision = transformTypeTimeType_precision(node)
            val new_metas = transformTypeTimeType_metas(node)
            return if (
                node.precision !== new_precision ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.TimeType(
                    precision = new_precision,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeTimeType_precision(node: PartiqlLogical.Type.TimeType) =
            node.precision?.let { transformLongPrimitive(it) }
        open fun transformTypeTimeType_metas(node: PartiqlLogical.Type.TimeType) =
            transformMetas(node.metas)
    
        // Variant TypeTimeWithTimeZoneType
        open fun transformTypeTimeWithTimeZoneType(node: PartiqlLogical.Type.TimeWithTimeZoneType): PartiqlLogical.Type {
            val new_precision = transformTypeTimeWithTimeZoneType_precision(node)
            val new_metas = transformTypeTimeWithTimeZoneType_metas(node)
            return if (
                node.precision !== new_precision ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.TimeWithTimeZoneType(
                    precision = new_precision,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeTimeWithTimeZoneType_precision(node: PartiqlLogical.Type.TimeWithTimeZoneType) =
            node.precision?.let { transformLongPrimitive(it) }
        open fun transformTypeTimeWithTimeZoneType_metas(node: PartiqlLogical.Type.TimeWithTimeZoneType) =
            transformMetas(node.metas)
    
        // Variant TypeStructType
        open fun transformTypeStructType(node: PartiqlLogical.Type.StructType): PartiqlLogical.Type {
            val new_metas = transformTypeStructType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.StructType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeStructType_metas(node: PartiqlLogical.Type.StructType) =
            transformMetas(node.metas)
    
        // Variant TypeTupleType
        open fun transformTypeTupleType(node: PartiqlLogical.Type.TupleType): PartiqlLogical.Type {
            val new_metas = transformTypeTupleType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.TupleType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeTupleType_metas(node: PartiqlLogical.Type.TupleType) =
            transformMetas(node.metas)
    
        // Variant TypeListType
        open fun transformTypeListType(node: PartiqlLogical.Type.ListType): PartiqlLogical.Type {
            val new_metas = transformTypeListType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.ListType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeListType_metas(node: PartiqlLogical.Type.ListType) =
            transformMetas(node.metas)
    
        // Variant TypeSexpType
        open fun transformTypeSexpType(node: PartiqlLogical.Type.SexpType): PartiqlLogical.Type {
            val new_metas = transformTypeSexpType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.SexpType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeSexpType_metas(node: PartiqlLogical.Type.SexpType) =
            transformMetas(node.metas)
    
        // Variant TypeBagType
        open fun transformTypeBagType(node: PartiqlLogical.Type.BagType): PartiqlLogical.Type {
            val new_metas = transformTypeBagType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.BagType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeBagType_metas(node: PartiqlLogical.Type.BagType) =
            transformMetas(node.metas)
    
        // Variant TypeAnyType
        open fun transformTypeAnyType(node: PartiqlLogical.Type.AnyType): PartiqlLogical.Type {
            val new_metas = transformTypeAnyType_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.AnyType(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeAnyType_metas(node: PartiqlLogical.Type.AnyType) =
            transformMetas(node.metas)
    
        // Variant TypeCustomType
        open fun transformTypeCustomType(node: PartiqlLogical.Type.CustomType): PartiqlLogical.Type {
            val new_name = transformTypeCustomType_name(node)
            val new_metas = transformTypeCustomType_metas(node)
            return if (
                node.name !== new_name ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Type.CustomType(
                    name = new_name,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformTypeCustomType_name(node: PartiqlLogical.Type.CustomType) =
            transformSymbolPrimitive(node.name)
        open fun transformTypeCustomType_metas(node: PartiqlLogical.Type.CustomType) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: Expr
        //////////////////////////////////////
        open fun transformExpr(node: PartiqlLogical.Expr): PartiqlLogical.Expr =
            when(node) {
                is PartiqlLogical.Expr.Missing -> transformExprMissing(node)
                is PartiqlLogical.Expr.Lit -> transformExprLit(node)
                is PartiqlLogical.Expr.Id -> transformExprId(node)
                is PartiqlLogical.Expr.Parameter -> transformExprParameter(node)
                is PartiqlLogical.Expr.Not -> transformExprNot(node)
                is PartiqlLogical.Expr.Pos -> transformExprPos(node)
                is PartiqlLogical.Expr.Neg -> transformExprNeg(node)
                is PartiqlLogical.Expr.Plus -> transformExprPlus(node)
                is PartiqlLogical.Expr.Minus -> transformExprMinus(node)
                is PartiqlLogical.Expr.Times -> transformExprTimes(node)
                is PartiqlLogical.Expr.Divide -> transformExprDivide(node)
                is PartiqlLogical.Expr.Modulo -> transformExprModulo(node)
                is PartiqlLogical.Expr.Concat -> transformExprConcat(node)
                is PartiqlLogical.Expr.And -> transformExprAnd(node)
                is PartiqlLogical.Expr.Or -> transformExprOr(node)
                is PartiqlLogical.Expr.Eq -> transformExprEq(node)
                is PartiqlLogical.Expr.Ne -> transformExprNe(node)
                is PartiqlLogical.Expr.Gt -> transformExprGt(node)
                is PartiqlLogical.Expr.Gte -> transformExprGte(node)
                is PartiqlLogical.Expr.Lt -> transformExprLt(node)
                is PartiqlLogical.Expr.Lte -> transformExprLte(node)
                is PartiqlLogical.Expr.Like -> transformExprLike(node)
                is PartiqlLogical.Expr.Between -> transformExprBetween(node)
                is PartiqlLogical.Expr.InCollection -> transformExprInCollection(node)
                is PartiqlLogical.Expr.IsType -> transformExprIsType(node)
                is PartiqlLogical.Expr.SimpleCase -> transformExprSimpleCase(node)
                is PartiqlLogical.Expr.SearchedCase -> transformExprSearchedCase(node)
                is PartiqlLogical.Expr.Bag -> transformExprBag(node)
                is PartiqlLogical.Expr.List -> transformExprList(node)
                is PartiqlLogical.Expr.Sexp -> transformExprSexp(node)
                is PartiqlLogical.Expr.Date -> transformExprDate(node)
                is PartiqlLogical.Expr.LitTime -> transformExprLitTime(node)
                is PartiqlLogical.Expr.BagOp -> transformExprBagOp(node)
                is PartiqlLogical.Expr.GraphMatch -> transformExprGraphMatch(node)
                is PartiqlLogical.Expr.Path -> transformExprPath(node)
                is PartiqlLogical.Expr.Call -> transformExprCall(node)
                is PartiqlLogical.Expr.Cast -> transformExprCast(node)
                is PartiqlLogical.Expr.CanCast -> transformExprCanCast(node)
                is PartiqlLogical.Expr.CanLosslessCast -> transformExprCanLosslessCast(node)
                is PartiqlLogical.Expr.NullIf -> transformExprNullIf(node)
                is PartiqlLogical.Expr.Coalesce -> transformExprCoalesce(node)
                is PartiqlLogical.Expr.BindingsToValues -> transformExprBindingsToValues(node)
                is PartiqlLogical.Expr.Struct -> transformExprStruct(node)
                is PartiqlLogical.Expr.Pivot -> transformExprPivot(node)
            }
        // Variant ExprMissing
        open fun transformExprMissing(node: PartiqlLogical.Expr.Missing): PartiqlLogical.Expr {
            val new_metas = transformExprMissing_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Missing(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprMissing_metas(node: PartiqlLogical.Expr.Missing) =
            transformMetas(node.metas)
    
        // Variant ExprLit
        open fun transformExprLit(node: PartiqlLogical.Expr.Lit): PartiqlLogical.Expr {
            val new_value = transformExprLit_value(node)
            val new_metas = transformExprLit_metas(node)
            return if (
                node.value !== new_value ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Lit(
                    value = new_value,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprLit_value(node: PartiqlLogical.Expr.Lit) =
            transformAnyElement(node.value)
        open fun transformExprLit_metas(node: PartiqlLogical.Expr.Lit) =
            transformMetas(node.metas)
    
        // Variant ExprId
        open fun transformExprId(node: PartiqlLogical.Expr.Id): PartiqlLogical.Expr {
            val new_name = transformExprId_name(node)
            val new_case = transformExprId_case(node)
            val new_qualifier = transformExprId_qualifier(node)
            val new_metas = transformExprId_metas(node)
            return if (
                node.name !== new_name ||
                node.case !== new_case ||
                node.qualifier !== new_qualifier ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Id(
                    name = new_name,
                    case = new_case,
                    qualifier = new_qualifier,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprId_name(node: PartiqlLogical.Expr.Id) =
            transformSymbolPrimitive(node.name)
        open fun transformExprId_case(node: PartiqlLogical.Expr.Id) =
            transformCaseSensitivity(node.case)
        open fun transformExprId_qualifier(node: PartiqlLogical.Expr.Id) =
            transformScopeQualifier(node.qualifier)
        open fun transformExprId_metas(node: PartiqlLogical.Expr.Id) =
            transformMetas(node.metas)
    
        // Variant ExprParameter
        open fun transformExprParameter(node: PartiqlLogical.Expr.Parameter): PartiqlLogical.Expr {
            val new_index = transformExprParameter_index(node)
            val new_metas = transformExprParameter_metas(node)
            return if (
                node.index !== new_index ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Parameter(
                    index = new_index,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprParameter_index(node: PartiqlLogical.Expr.Parameter) =
            transformLongPrimitive(node.index)
        open fun transformExprParameter_metas(node: PartiqlLogical.Expr.Parameter) =
            transformMetas(node.metas)
    
        // Variant ExprNot
        open fun transformExprNot(node: PartiqlLogical.Expr.Not): PartiqlLogical.Expr {
            val new_expr = transformExprNot_expr(node)
            val new_metas = transformExprNot_metas(node)
            return if (
                node.expr !== new_expr ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Not(
                    expr = new_expr,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprNot_expr(node: PartiqlLogical.Expr.Not) =
            transformExpr(node.expr)
        open fun transformExprNot_metas(node: PartiqlLogical.Expr.Not) =
            transformMetas(node.metas)
    
        // Variant ExprPos
        open fun transformExprPos(node: PartiqlLogical.Expr.Pos): PartiqlLogical.Expr {
            val new_expr = transformExprPos_expr(node)
            val new_metas = transformExprPos_metas(node)
            return if (
                node.expr !== new_expr ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Pos(
                    expr = new_expr,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPos_expr(node: PartiqlLogical.Expr.Pos) =
            transformExpr(node.expr)
        open fun transformExprPos_metas(node: PartiqlLogical.Expr.Pos) =
            transformMetas(node.metas)
    
        // Variant ExprNeg
        open fun transformExprNeg(node: PartiqlLogical.Expr.Neg): PartiqlLogical.Expr {
            val new_expr = transformExprNeg_expr(node)
            val new_metas = transformExprNeg_metas(node)
            return if (
                node.expr !== new_expr ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Neg(
                    expr = new_expr,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprNeg_expr(node: PartiqlLogical.Expr.Neg) =
            transformExpr(node.expr)
        open fun transformExprNeg_metas(node: PartiqlLogical.Expr.Neg) =
            transformMetas(node.metas)
    
        // Variant ExprPlus
        open fun transformExprPlus(node: PartiqlLogical.Expr.Plus): PartiqlLogical.Expr {
            val new_operands = transformExprPlus_operands(node)
            val new_metas = transformExprPlus_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Plus(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPlus_operands(node: PartiqlLogical.Expr.Plus) =
            node.operands.map { transformExpr(it) }
        open fun transformExprPlus_metas(node: PartiqlLogical.Expr.Plus) =
            transformMetas(node.metas)
    
        // Variant ExprMinus
        open fun transformExprMinus(node: PartiqlLogical.Expr.Minus): PartiqlLogical.Expr {
            val new_operands = transformExprMinus_operands(node)
            val new_metas = transformExprMinus_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Minus(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprMinus_operands(node: PartiqlLogical.Expr.Minus) =
            node.operands.map { transformExpr(it) }
        open fun transformExprMinus_metas(node: PartiqlLogical.Expr.Minus) =
            transformMetas(node.metas)
    
        // Variant ExprTimes
        open fun transformExprTimes(node: PartiqlLogical.Expr.Times): PartiqlLogical.Expr {
            val new_operands = transformExprTimes_operands(node)
            val new_metas = transformExprTimes_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Times(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprTimes_operands(node: PartiqlLogical.Expr.Times) =
            node.operands.map { transformExpr(it) }
        open fun transformExprTimes_metas(node: PartiqlLogical.Expr.Times) =
            transformMetas(node.metas)
    
        // Variant ExprDivide
        open fun transformExprDivide(node: PartiqlLogical.Expr.Divide): PartiqlLogical.Expr {
            val new_operands = transformExprDivide_operands(node)
            val new_metas = transformExprDivide_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Divide(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprDivide_operands(node: PartiqlLogical.Expr.Divide) =
            node.operands.map { transformExpr(it) }
        open fun transformExprDivide_metas(node: PartiqlLogical.Expr.Divide) =
            transformMetas(node.metas)
    
        // Variant ExprModulo
        open fun transformExprModulo(node: PartiqlLogical.Expr.Modulo): PartiqlLogical.Expr {
            val new_operands = transformExprModulo_operands(node)
            val new_metas = transformExprModulo_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Modulo(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprModulo_operands(node: PartiqlLogical.Expr.Modulo) =
            node.operands.map { transformExpr(it) }
        open fun transformExprModulo_metas(node: PartiqlLogical.Expr.Modulo) =
            transformMetas(node.metas)
    
        // Variant ExprConcat
        open fun transformExprConcat(node: PartiqlLogical.Expr.Concat): PartiqlLogical.Expr {
            val new_operands = transformExprConcat_operands(node)
            val new_metas = transformExprConcat_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Concat(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprConcat_operands(node: PartiqlLogical.Expr.Concat) =
            node.operands.map { transformExpr(it) }
        open fun transformExprConcat_metas(node: PartiqlLogical.Expr.Concat) =
            transformMetas(node.metas)
    
        // Variant ExprAnd
        open fun transformExprAnd(node: PartiqlLogical.Expr.And): PartiqlLogical.Expr {
            val new_operands = transformExprAnd_operands(node)
            val new_metas = transformExprAnd_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.And(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprAnd_operands(node: PartiqlLogical.Expr.And) =
            node.operands.map { transformExpr(it) }
        open fun transformExprAnd_metas(node: PartiqlLogical.Expr.And) =
            transformMetas(node.metas)
    
        // Variant ExprOr
        open fun transformExprOr(node: PartiqlLogical.Expr.Or): PartiqlLogical.Expr {
            val new_operands = transformExprOr_operands(node)
            val new_metas = transformExprOr_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Or(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprOr_operands(node: PartiqlLogical.Expr.Or) =
            node.operands.map { transformExpr(it) }
        open fun transformExprOr_metas(node: PartiqlLogical.Expr.Or) =
            transformMetas(node.metas)
    
        // Variant ExprEq
        open fun transformExprEq(node: PartiqlLogical.Expr.Eq): PartiqlLogical.Expr {
            val new_operands = transformExprEq_operands(node)
            val new_metas = transformExprEq_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Eq(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprEq_operands(node: PartiqlLogical.Expr.Eq) =
            node.operands.map { transformExpr(it) }
        open fun transformExprEq_metas(node: PartiqlLogical.Expr.Eq) =
            transformMetas(node.metas)
    
        // Variant ExprNe
        open fun transformExprNe(node: PartiqlLogical.Expr.Ne): PartiqlLogical.Expr {
            val new_operands = transformExprNe_operands(node)
            val new_metas = transformExprNe_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Ne(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprNe_operands(node: PartiqlLogical.Expr.Ne) =
            node.operands.map { transformExpr(it) }
        open fun transformExprNe_metas(node: PartiqlLogical.Expr.Ne) =
            transformMetas(node.metas)
    
        // Variant ExprGt
        open fun transformExprGt(node: PartiqlLogical.Expr.Gt): PartiqlLogical.Expr {
            val new_operands = transformExprGt_operands(node)
            val new_metas = transformExprGt_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Gt(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprGt_operands(node: PartiqlLogical.Expr.Gt) =
            node.operands.map { transformExpr(it) }
        open fun transformExprGt_metas(node: PartiqlLogical.Expr.Gt) =
            transformMetas(node.metas)
    
        // Variant ExprGte
        open fun transformExprGte(node: PartiqlLogical.Expr.Gte): PartiqlLogical.Expr {
            val new_operands = transformExprGte_operands(node)
            val new_metas = transformExprGte_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Gte(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprGte_operands(node: PartiqlLogical.Expr.Gte) =
            node.operands.map { transformExpr(it) }
        open fun transformExprGte_metas(node: PartiqlLogical.Expr.Gte) =
            transformMetas(node.metas)
    
        // Variant ExprLt
        open fun transformExprLt(node: PartiqlLogical.Expr.Lt): PartiqlLogical.Expr {
            val new_operands = transformExprLt_operands(node)
            val new_metas = transformExprLt_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Lt(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprLt_operands(node: PartiqlLogical.Expr.Lt) =
            node.operands.map { transformExpr(it) }
        open fun transformExprLt_metas(node: PartiqlLogical.Expr.Lt) =
            transformMetas(node.metas)
    
        // Variant ExprLte
        open fun transformExprLte(node: PartiqlLogical.Expr.Lte): PartiqlLogical.Expr {
            val new_operands = transformExprLte_operands(node)
            val new_metas = transformExprLte_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Lte(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprLte_operands(node: PartiqlLogical.Expr.Lte) =
            node.operands.map { transformExpr(it) }
        open fun transformExprLte_metas(node: PartiqlLogical.Expr.Lte) =
            transformMetas(node.metas)
    
        // Variant ExprLike
        open fun transformExprLike(node: PartiqlLogical.Expr.Like): PartiqlLogical.Expr {
            val new_value = transformExprLike_value(node)
            val new_pattern = transformExprLike_pattern(node)
            val new_escape = transformExprLike_escape(node)
            val new_metas = transformExprLike_metas(node)
            return if (
                node.value !== new_value ||
                node.pattern !== new_pattern ||
                node.escape !== new_escape ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Like(
                    value = new_value,
                    pattern = new_pattern,
                    escape = new_escape,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprLike_value(node: PartiqlLogical.Expr.Like) =
            transformExpr(node.value)
        open fun transformExprLike_pattern(node: PartiqlLogical.Expr.Like) =
            transformExpr(node.pattern)
        open fun transformExprLike_escape(node: PartiqlLogical.Expr.Like) =
            node.escape?.let { transformExpr(it) }
        open fun transformExprLike_metas(node: PartiqlLogical.Expr.Like) =
            transformMetas(node.metas)
    
        // Variant ExprBetween
        open fun transformExprBetween(node: PartiqlLogical.Expr.Between): PartiqlLogical.Expr {
            val new_value = transformExprBetween_value(node)
            val new_from = transformExprBetween_from(node)
            val new_to = transformExprBetween_to(node)
            val new_metas = transformExprBetween_metas(node)
            return if (
                node.value !== new_value ||
                node.from !== new_from ||
                node.to !== new_to ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Between(
                    value = new_value,
                    from = new_from,
                    to = new_to,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprBetween_value(node: PartiqlLogical.Expr.Between) =
            transformExpr(node.value)
        open fun transformExprBetween_from(node: PartiqlLogical.Expr.Between) =
            transformExpr(node.from)
        open fun transformExprBetween_to(node: PartiqlLogical.Expr.Between) =
            transformExpr(node.to)
        open fun transformExprBetween_metas(node: PartiqlLogical.Expr.Between) =
            transformMetas(node.metas)
    
        // Variant ExprInCollection
        open fun transformExprInCollection(node: PartiqlLogical.Expr.InCollection): PartiqlLogical.Expr {
            val new_operands = transformExprInCollection_operands(node)
            val new_metas = transformExprInCollection_metas(node)
            return if (
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.InCollection(
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprInCollection_operands(node: PartiqlLogical.Expr.InCollection) =
            node.operands.map { transformExpr(it) }
        open fun transformExprInCollection_metas(node: PartiqlLogical.Expr.InCollection) =
            transformMetas(node.metas)
    
        // Variant ExprIsType
        open fun transformExprIsType(node: PartiqlLogical.Expr.IsType): PartiqlLogical.Expr {
            val new_value = transformExprIsType_value(node)
            val new_type = transformExprIsType_type(node)
            val new_metas = transformExprIsType_metas(node)
            return if (
                node.value !== new_value ||
                node.type !== new_type ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.IsType(
                    value = new_value,
                    type = new_type,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprIsType_value(node: PartiqlLogical.Expr.IsType) =
            transformExpr(node.value)
        open fun transformExprIsType_type(node: PartiqlLogical.Expr.IsType) =
            transformType(node.type)
        open fun transformExprIsType_metas(node: PartiqlLogical.Expr.IsType) =
            transformMetas(node.metas)
    
        // Variant ExprSimpleCase
        open fun transformExprSimpleCase(node: PartiqlLogical.Expr.SimpleCase): PartiqlLogical.Expr {
            val new_expr = transformExprSimpleCase_expr(node)
            val new_cases = transformExprSimpleCase_cases(node)
            val new_default = transformExprSimpleCase_default(node)
            val new_metas = transformExprSimpleCase_metas(node)
            return if (
                node.expr !== new_expr ||
                node.cases !== new_cases ||
                node.default !== new_default ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.SimpleCase(
                    expr = new_expr,
                    cases = new_cases,
                    default = new_default,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprSimpleCase_expr(node: PartiqlLogical.Expr.SimpleCase) =
            transformExpr(node.expr)
        open fun transformExprSimpleCase_cases(node: PartiqlLogical.Expr.SimpleCase) =
            transformExprPairList(node.cases)
        open fun transformExprSimpleCase_default(node: PartiqlLogical.Expr.SimpleCase) =
            node.default?.let { transformExpr(it) }
        open fun transformExprSimpleCase_metas(node: PartiqlLogical.Expr.SimpleCase) =
            transformMetas(node.metas)
    
        // Variant ExprSearchedCase
        open fun transformExprSearchedCase(node: PartiqlLogical.Expr.SearchedCase): PartiqlLogical.Expr {
            val new_cases = transformExprSearchedCase_cases(node)
            val new_default = transformExprSearchedCase_default(node)
            val new_metas = transformExprSearchedCase_metas(node)
            return if (
                node.cases !== new_cases ||
                node.default !== new_default ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.SearchedCase(
                    cases = new_cases,
                    default = new_default,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprSearchedCase_cases(node: PartiqlLogical.Expr.SearchedCase) =
            transformExprPairList(node.cases)
        open fun transformExprSearchedCase_default(node: PartiqlLogical.Expr.SearchedCase) =
            node.default?.let { transformExpr(it) }
        open fun transformExprSearchedCase_metas(node: PartiqlLogical.Expr.SearchedCase) =
            transformMetas(node.metas)
    
        // Variant ExprBag
        open fun transformExprBag(node: PartiqlLogical.Expr.Bag): PartiqlLogical.Expr {
            val new_values = transformExprBag_values(node)
            val new_metas = transformExprBag_metas(node)
            return if (
                node.values !== new_values ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Bag(
                    values = new_values,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprBag_values(node: PartiqlLogical.Expr.Bag) =
            node.values.map { transformExpr(it) }
        open fun transformExprBag_metas(node: PartiqlLogical.Expr.Bag) =
            transformMetas(node.metas)
    
        // Variant ExprList
        open fun transformExprList(node: PartiqlLogical.Expr.List): PartiqlLogical.Expr {
            val new_values = transformExprList_values(node)
            val new_metas = transformExprList_metas(node)
            return if (
                node.values !== new_values ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.List(
                    values = new_values,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprList_values(node: PartiqlLogical.Expr.List) =
            node.values.map { transformExpr(it) }
        open fun transformExprList_metas(node: PartiqlLogical.Expr.List) =
            transformMetas(node.metas)
    
        // Variant ExprSexp
        open fun transformExprSexp(node: PartiqlLogical.Expr.Sexp): PartiqlLogical.Expr {
            val new_values = transformExprSexp_values(node)
            val new_metas = transformExprSexp_metas(node)
            return if (
                node.values !== new_values ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Sexp(
                    values = new_values,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprSexp_values(node: PartiqlLogical.Expr.Sexp) =
            node.values.map { transformExpr(it) }
        open fun transformExprSexp_metas(node: PartiqlLogical.Expr.Sexp) =
            transformMetas(node.metas)
    
        // Variant ExprDate
        open fun transformExprDate(node: PartiqlLogical.Expr.Date): PartiqlLogical.Expr {
            val new_year = transformExprDate_year(node)
            val new_month = transformExprDate_month(node)
            val new_day = transformExprDate_day(node)
            val new_metas = transformExprDate_metas(node)
            return if (
                node.year !== new_year ||
                node.month !== new_month ||
                node.day !== new_day ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Date(
                    year = new_year,
                    month = new_month,
                    day = new_day,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprDate_year(node: PartiqlLogical.Expr.Date) =
            transformLongPrimitive(node.year)
        open fun transformExprDate_month(node: PartiqlLogical.Expr.Date) =
            transformLongPrimitive(node.month)
        open fun transformExprDate_day(node: PartiqlLogical.Expr.Date) =
            transformLongPrimitive(node.day)
        open fun transformExprDate_metas(node: PartiqlLogical.Expr.Date) =
            transformMetas(node.metas)
    
        // Variant ExprLitTime
        open fun transformExprLitTime(node: PartiqlLogical.Expr.LitTime): PartiqlLogical.Expr {
            val new_value = transformExprLitTime_value(node)
            val new_metas = transformExprLitTime_metas(node)
            return if (
                node.value !== new_value ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.LitTime(
                    value = new_value,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprLitTime_value(node: PartiqlLogical.Expr.LitTime) =
            transformTimeValue(node.value)
        open fun transformExprLitTime_metas(node: PartiqlLogical.Expr.LitTime) =
            transformMetas(node.metas)
    
        // Variant ExprBagOp
        open fun transformExprBagOp(node: PartiqlLogical.Expr.BagOp): PartiqlLogical.Expr {
            val new_op = transformExprBagOp_op(node)
            val new_quantifier = transformExprBagOp_quantifier(node)
            val new_operands = transformExprBagOp_operands(node)
            val new_metas = transformExprBagOp_metas(node)
            return if (
                node.op !== new_op ||
                node.quantifier !== new_quantifier ||
                node.operands !== new_operands ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.BagOp(
                    op = new_op,
                    quantifier = new_quantifier,
                    operands = new_operands,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprBagOp_op(node: PartiqlLogical.Expr.BagOp) =
            transformBagOpType(node.op)
        open fun transformExprBagOp_quantifier(node: PartiqlLogical.Expr.BagOp) =
            transformSetQuantifier(node.quantifier)
        open fun transformExprBagOp_operands(node: PartiqlLogical.Expr.BagOp) =
            node.operands.map { transformExpr(it) }
        open fun transformExprBagOp_metas(node: PartiqlLogical.Expr.BagOp) =
            transformMetas(node.metas)
    
        // Variant ExprGraphMatch
        open fun transformExprGraphMatch(node: PartiqlLogical.Expr.GraphMatch): PartiqlLogical.Expr {
            val new_expr = transformExprGraphMatch_expr(node)
            val new_gpmlPattern = transformExprGraphMatch_gpmlPattern(node)
            val new_metas = transformExprGraphMatch_metas(node)
            return if (
                node.expr !== new_expr ||
                node.gpmlPattern !== new_gpmlPattern ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.GraphMatch(
                    expr = new_expr,
                    gpmlPattern = new_gpmlPattern,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprGraphMatch_expr(node: PartiqlLogical.Expr.GraphMatch) =
            transformExpr(node.expr)
        open fun transformExprGraphMatch_gpmlPattern(node: PartiqlLogical.Expr.GraphMatch) =
            transformGpmlPattern(node.gpmlPattern)
        open fun transformExprGraphMatch_metas(node: PartiqlLogical.Expr.GraphMatch) =
            transformMetas(node.metas)
    
        // Variant ExprPath
        open fun transformExprPath(node: PartiqlLogical.Expr.Path): PartiqlLogical.Expr {
            val new_root = transformExprPath_root(node)
            val new_steps = transformExprPath_steps(node)
            val new_metas = transformExprPath_metas(node)
            return if (
                node.root !== new_root ||
                node.steps !== new_steps ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Path(
                    root = new_root,
                    steps = new_steps,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPath_root(node: PartiqlLogical.Expr.Path) =
            transformExpr(node.root)
        open fun transformExprPath_steps(node: PartiqlLogical.Expr.Path) =
            node.steps.map { transformPathStep(it) }
        open fun transformExprPath_metas(node: PartiqlLogical.Expr.Path) =
            transformMetas(node.metas)
    
        // Variant ExprCall
        open fun transformExprCall(node: PartiqlLogical.Expr.Call): PartiqlLogical.Expr {
            val new_funcName = transformExprCall_funcName(node)
            val new_args = transformExprCall_args(node)
            val new_metas = transformExprCall_metas(node)
            return if (
                node.funcName !== new_funcName ||
                node.args !== new_args ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Call(
                    funcName = new_funcName,
                    args = new_args,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprCall_funcName(node: PartiqlLogical.Expr.Call) =
            transformSymbolPrimitive(node.funcName)
        open fun transformExprCall_args(node: PartiqlLogical.Expr.Call) =
            node.args.map { transformExpr(it) }
        open fun transformExprCall_metas(node: PartiqlLogical.Expr.Call) =
            transformMetas(node.metas)
    
        // Variant ExprCast
        open fun transformExprCast(node: PartiqlLogical.Expr.Cast): PartiqlLogical.Expr {
            val new_value = transformExprCast_value(node)
            val new_asType = transformExprCast_asType(node)
            val new_metas = transformExprCast_metas(node)
            return if (
                node.value !== new_value ||
                node.asType !== new_asType ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Cast(
                    value = new_value,
                    asType = new_asType,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprCast_value(node: PartiqlLogical.Expr.Cast) =
            transformExpr(node.value)
        open fun transformExprCast_asType(node: PartiqlLogical.Expr.Cast) =
            transformType(node.asType)
        open fun transformExprCast_metas(node: PartiqlLogical.Expr.Cast) =
            transformMetas(node.metas)
    
        // Variant ExprCanCast
        open fun transformExprCanCast(node: PartiqlLogical.Expr.CanCast): PartiqlLogical.Expr {
            val new_value = transformExprCanCast_value(node)
            val new_asType = transformExprCanCast_asType(node)
            val new_metas = transformExprCanCast_metas(node)
            return if (
                node.value !== new_value ||
                node.asType !== new_asType ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.CanCast(
                    value = new_value,
                    asType = new_asType,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprCanCast_value(node: PartiqlLogical.Expr.CanCast) =
            transformExpr(node.value)
        open fun transformExprCanCast_asType(node: PartiqlLogical.Expr.CanCast) =
            transformType(node.asType)
        open fun transformExprCanCast_metas(node: PartiqlLogical.Expr.CanCast) =
            transformMetas(node.metas)
    
        // Variant ExprCanLosslessCast
        open fun transformExprCanLosslessCast(node: PartiqlLogical.Expr.CanLosslessCast): PartiqlLogical.Expr {
            val new_value = transformExprCanLosslessCast_value(node)
            val new_asType = transformExprCanLosslessCast_asType(node)
            val new_metas = transformExprCanLosslessCast_metas(node)
            return if (
                node.value !== new_value ||
                node.asType !== new_asType ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.CanLosslessCast(
                    value = new_value,
                    asType = new_asType,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprCanLosslessCast_value(node: PartiqlLogical.Expr.CanLosslessCast) =
            transformExpr(node.value)
        open fun transformExprCanLosslessCast_asType(node: PartiqlLogical.Expr.CanLosslessCast) =
            transformType(node.asType)
        open fun transformExprCanLosslessCast_metas(node: PartiqlLogical.Expr.CanLosslessCast) =
            transformMetas(node.metas)
    
        // Variant ExprNullIf
        open fun transformExprNullIf(node: PartiqlLogical.Expr.NullIf): PartiqlLogical.Expr {
            val new_expr1 = transformExprNullIf_expr1(node)
            val new_expr2 = transformExprNullIf_expr2(node)
            val new_metas = transformExprNullIf_metas(node)
            return if (
                node.expr1 !== new_expr1 ||
                node.expr2 !== new_expr2 ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.NullIf(
                    expr1 = new_expr1,
                    expr2 = new_expr2,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprNullIf_expr1(node: PartiqlLogical.Expr.NullIf) =
            transformExpr(node.expr1)
        open fun transformExprNullIf_expr2(node: PartiqlLogical.Expr.NullIf) =
            transformExpr(node.expr2)
        open fun transformExprNullIf_metas(node: PartiqlLogical.Expr.NullIf) =
            transformMetas(node.metas)
    
        // Variant ExprCoalesce
        open fun transformExprCoalesce(node: PartiqlLogical.Expr.Coalesce): PartiqlLogical.Expr {
            val new_args = transformExprCoalesce_args(node)
            val new_metas = transformExprCoalesce_metas(node)
            return if (
                node.args !== new_args ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Coalesce(
                    args = new_args,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprCoalesce_args(node: PartiqlLogical.Expr.Coalesce) =
            node.args.map { transformExpr(it) }
        open fun transformExprCoalesce_metas(node: PartiqlLogical.Expr.Coalesce) =
            transformMetas(node.metas)
    
        // Variant ExprBindingsToValues
        open fun transformExprBindingsToValues(node: PartiqlLogical.Expr.BindingsToValues): PartiqlLogical.Expr {
            val new_exp = transformExprBindingsToValues_exp(node)
            val new_query = transformExprBindingsToValues_query(node)
            val new_metas = transformExprBindingsToValues_metas(node)
            return if (
                node.exp !== new_exp ||
                node.query !== new_query ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.BindingsToValues(
                    exp = new_exp,
                    query = new_query,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprBindingsToValues_exp(node: PartiqlLogical.Expr.BindingsToValues) =
            transformExpr(node.exp)
        open fun transformExprBindingsToValues_query(node: PartiqlLogical.Expr.BindingsToValues) =
            transformBexpr(node.query)
        open fun transformExprBindingsToValues_metas(node: PartiqlLogical.Expr.BindingsToValues) =
            transformMetas(node.metas)
    
        // Variant ExprStruct
        open fun transformExprStruct(node: PartiqlLogical.Expr.Struct): PartiqlLogical.Expr {
            val new_parts = transformExprStruct_parts(node)
            val new_metas = transformExprStruct_metas(node)
            return if (
                node.parts !== new_parts ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Struct(
                    parts = new_parts,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprStruct_parts(node: PartiqlLogical.Expr.Struct) =
            node.parts.map { transformStructPart(it) }
        open fun transformExprStruct_metas(node: PartiqlLogical.Expr.Struct) =
            transformMetas(node.metas)
    
        // Variant ExprPivot
        open fun transformExprPivot(node: PartiqlLogical.Expr.Pivot): PartiqlLogical.Expr {
            val new_input = transformExprPivot_input(node)
            val new_key = transformExprPivot_key(node)
            val new_value = transformExprPivot_value(node)
            val new_metas = transformExprPivot_metas(node)
            return if (
                node.input !== new_input ||
                node.key !== new_key ||
                node.value !== new_value ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Expr.Pivot(
                    input = new_input,
                    key = new_key,
                    value = new_value,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformExprPivot_input(node: PartiqlLogical.Expr.Pivot) =
            transformBexpr(node.input)
        open fun transformExprPivot_key(node: PartiqlLogical.Expr.Pivot) =
            transformExpr(node.key)
        open fun transformExprPivot_value(node: PartiqlLogical.Expr.Pivot) =
            transformExpr(node.value)
        open fun transformExprPivot_metas(node: PartiqlLogical.Expr.Pivot) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: Statement
        //////////////////////////////////////
        open fun transformStatement(node: PartiqlLogical.Statement): PartiqlLogical.Statement =
            when(node) {
                is PartiqlLogical.Statement.Query -> transformStatementQuery(node)
                is PartiqlLogical.Statement.Exec -> transformStatementExec(node)
                is PartiqlLogical.Statement.Explain -> transformStatementExplain(node)
                is PartiqlLogical.Statement.Dml -> transformStatementDml(node)
            }
        // Variant StatementQuery
        open fun transformStatementQuery(node: PartiqlLogical.Statement.Query): PartiqlLogical.Statement {
            val new_expr = transformStatementQuery_expr(node)
            val new_metas = transformStatementQuery_metas(node)
            return if (
                node.expr !== new_expr ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Statement.Query(
                    expr = new_expr,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStatementQuery_expr(node: PartiqlLogical.Statement.Query) =
            transformExpr(node.expr)
        open fun transformStatementQuery_metas(node: PartiqlLogical.Statement.Query) =
            transformMetas(node.metas)
    
        // Variant StatementExec
        open fun transformStatementExec(node: PartiqlLogical.Statement.Exec): PartiqlLogical.Statement {
            val new_procedureName = transformStatementExec_procedureName(node)
            val new_args = transformStatementExec_args(node)
            val new_metas = transformStatementExec_metas(node)
            return if (
                node.procedureName !== new_procedureName ||
                node.args !== new_args ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Statement.Exec(
                    procedureName = new_procedureName,
                    args = new_args,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStatementExec_procedureName(node: PartiqlLogical.Statement.Exec) =
            transformSymbolPrimitive(node.procedureName)
        open fun transformStatementExec_args(node: PartiqlLogical.Statement.Exec) =
            node.args.map { transformExpr(it) }
        open fun transformStatementExec_metas(node: PartiqlLogical.Statement.Exec) =
            transformMetas(node.metas)
    
        // Variant StatementExplain
        open fun transformStatementExplain(node: PartiqlLogical.Statement.Explain): PartiqlLogical.Statement {
            val new_target = transformStatementExplain_target(node)
            val new_metas = transformStatementExplain_metas(node)
            return if (
                node.target !== new_target ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Statement.Explain(
                    target = new_target,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStatementExplain_target(node: PartiqlLogical.Statement.Explain) =
            transformExplainTarget(node.target)
        open fun transformStatementExplain_metas(node: PartiqlLogical.Statement.Explain) =
            transformMetas(node.metas)
    
        // Variant StatementDml
        open fun transformStatementDml(node: PartiqlLogical.Statement.Dml): PartiqlLogical.Statement {
            val new_target = transformStatementDml_target(node)
            val new_operation = transformStatementDml_operation(node)
            val new_rows = transformStatementDml_rows(node)
            val new_metas = transformStatementDml_metas(node)
            return if (
                node.target !== new_target ||
                node.operation !== new_operation ||
                node.rows !== new_rows ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Statement.Dml(
                    target = new_target,
                    operation = new_operation,
                    rows = new_rows,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStatementDml_target(node: PartiqlLogical.Statement.Dml) =
            transformIdentifier(node.target)
        open fun transformStatementDml_operation(node: PartiqlLogical.Statement.Dml) =
            transformDmlOperation(node.operation)
        open fun transformStatementDml_rows(node: PartiqlLogical.Statement.Dml) =
            transformExpr(node.rows)
        open fun transformStatementDml_metas(node: PartiqlLogical.Statement.Dml) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: StructPart
        //////////////////////////////////////
        open fun transformStructPart(node: PartiqlLogical.StructPart): PartiqlLogical.StructPart =
            when(node) {
                is PartiqlLogical.StructPart.StructFields -> transformStructPartStructFields(node)
                is PartiqlLogical.StructPart.StructField -> transformStructPartStructField(node)
            }
        // Variant StructPartStructFields
        open fun transformStructPartStructFields(node: PartiqlLogical.StructPart.StructFields): PartiqlLogical.StructPart {
            val new_partExpr = transformStructPartStructFields_partExpr(node)
            val new_metas = transformStructPartStructFields_metas(node)
            return if (
                node.partExpr !== new_partExpr ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.StructPart.StructFields(
                    partExpr = new_partExpr,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStructPartStructFields_partExpr(node: PartiqlLogical.StructPart.StructFields) =
            transformExpr(node.partExpr)
        open fun transformStructPartStructFields_metas(node: PartiqlLogical.StructPart.StructFields) =
            transformMetas(node.metas)
    
        // Variant StructPartStructField
        open fun transformStructPartStructField(node: PartiqlLogical.StructPart.StructField): PartiqlLogical.StructPart {
            val new_fieldName = transformStructPartStructField_fieldName(node)
            val new_value = transformStructPartStructField_value(node)
            val new_metas = transformStructPartStructField_metas(node)
            return if (
                node.fieldName !== new_fieldName ||
                node.value !== new_value ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.StructPart.StructField(
                    fieldName = new_fieldName,
                    value = new_value,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformStructPartStructField_fieldName(node: PartiqlLogical.StructPart.StructField) =
            transformExpr(node.fieldName)
        open fun transformStructPartStructField_value(node: PartiqlLogical.StructPart.StructField) =
            transformExpr(node.value)
        open fun transformStructPartStructField_metas(node: PartiqlLogical.StructPart.StructField) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: Bexpr
        //////////////////////////////////////
        open fun transformBexpr(node: PartiqlLogical.Bexpr): PartiqlLogical.Bexpr =
            when(node) {
                is PartiqlLogical.Bexpr.Scan -> transformBexprScan(node)
                is PartiqlLogical.Bexpr.Unpivot -> transformBexprUnpivot(node)
                is PartiqlLogical.Bexpr.Filter -> transformBexprFilter(node)
                is PartiqlLogical.Bexpr.Aggregate -> transformBexprAggregate(node)
                is PartiqlLogical.Bexpr.Join -> transformBexprJoin(node)
                is PartiqlLogical.Bexpr.Window -> transformBexprWindow(node)
                is PartiqlLogical.Bexpr.Sort -> transformBexprSort(node)
                is PartiqlLogical.Bexpr.Offset -> transformBexprOffset(node)
                is PartiqlLogical.Bexpr.Limit -> transformBexprLimit(node)
                is PartiqlLogical.Bexpr.Let -> transformBexprLet(node)
            }
        // Variant BexprScan
        open fun transformBexprScan(node: PartiqlLogical.Bexpr.Scan): PartiqlLogical.Bexpr {
            val new_expr = transformBexprScan_expr(node)
            val new_asDecl = transformBexprScan_asDecl(node)
            val new_atDecl = transformBexprScan_atDecl(node)
            val new_byDecl = transformBexprScan_byDecl(node)
            val new_metas = transformBexprScan_metas(node)
            return if (
                node.expr !== new_expr ||
                node.asDecl !== new_asDecl ||
                node.atDecl !== new_atDecl ||
                node.byDecl !== new_byDecl ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Scan(
                    expr = new_expr,
                    asDecl = new_asDecl,
                    atDecl = new_atDecl,
                    byDecl = new_byDecl,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprScan_expr(node: PartiqlLogical.Bexpr.Scan) =
            transformExpr(node.expr)
        open fun transformBexprScan_asDecl(node: PartiqlLogical.Bexpr.Scan) =
            transformVarDecl(node.asDecl)
        open fun transformBexprScan_atDecl(node: PartiqlLogical.Bexpr.Scan) =
            node.atDecl?.let { transformVarDecl(it) }
        open fun transformBexprScan_byDecl(node: PartiqlLogical.Bexpr.Scan) =
            node.byDecl?.let { transformVarDecl(it) }
        open fun transformBexprScan_metas(node: PartiqlLogical.Bexpr.Scan) =
            transformMetas(node.metas)
    
        // Variant BexprUnpivot
        open fun transformBexprUnpivot(node: PartiqlLogical.Bexpr.Unpivot): PartiqlLogical.Bexpr {
            val new_expr = transformBexprUnpivot_expr(node)
            val new_asDecl = transformBexprUnpivot_asDecl(node)
            val new_atDecl = transformBexprUnpivot_atDecl(node)
            val new_byDecl = transformBexprUnpivot_byDecl(node)
            val new_metas = transformBexprUnpivot_metas(node)
            return if (
                node.expr !== new_expr ||
                node.asDecl !== new_asDecl ||
                node.atDecl !== new_atDecl ||
                node.byDecl !== new_byDecl ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Unpivot(
                    expr = new_expr,
                    asDecl = new_asDecl,
                    atDecl = new_atDecl,
                    byDecl = new_byDecl,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprUnpivot_expr(node: PartiqlLogical.Bexpr.Unpivot) =
            transformExpr(node.expr)
        open fun transformBexprUnpivot_asDecl(node: PartiqlLogical.Bexpr.Unpivot) =
            transformVarDecl(node.asDecl)
        open fun transformBexprUnpivot_atDecl(node: PartiqlLogical.Bexpr.Unpivot) =
            node.atDecl?.let { transformVarDecl(it) }
        open fun transformBexprUnpivot_byDecl(node: PartiqlLogical.Bexpr.Unpivot) =
            node.byDecl?.let { transformVarDecl(it) }
        open fun transformBexprUnpivot_metas(node: PartiqlLogical.Bexpr.Unpivot) =
            transformMetas(node.metas)
    
        // Variant BexprFilter
        open fun transformBexprFilter(node: PartiqlLogical.Bexpr.Filter): PartiqlLogical.Bexpr {
            val new_predicate = transformBexprFilter_predicate(node)
            val new_source = transformBexprFilter_source(node)
            val new_metas = transformBexprFilter_metas(node)
            return if (
                node.predicate !== new_predicate ||
                node.source !== new_source ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Filter(
                    predicate = new_predicate,
                    source = new_source,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprFilter_predicate(node: PartiqlLogical.Bexpr.Filter) =
            transformExpr(node.predicate)
        open fun transformBexprFilter_source(node: PartiqlLogical.Bexpr.Filter) =
            transformBexpr(node.source)
        open fun transformBexprFilter_metas(node: PartiqlLogical.Bexpr.Filter) =
            transformMetas(node.metas)
    
        // Variant BexprAggregate
        open fun transformBexprAggregate(node: PartiqlLogical.Bexpr.Aggregate): PartiqlLogical.Bexpr {
            val new_source = transformBexprAggregate_source(node)
            val new_strategy = transformBexprAggregate_strategy(node)
            val new_groupList = transformBexprAggregate_groupList(node)
            val new_functionList = transformBexprAggregate_functionList(node)
            val new_metas = transformBexprAggregate_metas(node)
            return if (
                node.source !== new_source ||
                node.strategy !== new_strategy ||
                node.groupList !== new_groupList ||
                node.functionList !== new_functionList ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Aggregate(
                    source = new_source,
                    strategy = new_strategy,
                    groupList = new_groupList,
                    functionList = new_functionList,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprAggregate_source(node: PartiqlLogical.Bexpr.Aggregate) =
            transformBexpr(node.source)
        open fun transformBexprAggregate_strategy(node: PartiqlLogical.Bexpr.Aggregate) =
            transformGroupingStrategy(node.strategy)
        open fun transformBexprAggregate_groupList(node: PartiqlLogical.Bexpr.Aggregate) =
            transformGroupKeyList(node.groupList)
        open fun transformBexprAggregate_functionList(node: PartiqlLogical.Bexpr.Aggregate) =
            transformAggregateFunctionList(node.functionList)
        open fun transformBexprAggregate_metas(node: PartiqlLogical.Bexpr.Aggregate) =
            transformMetas(node.metas)
    
        // Variant BexprJoin
        open fun transformBexprJoin(node: PartiqlLogical.Bexpr.Join): PartiqlLogical.Bexpr {
            val new_joinType = transformBexprJoin_joinType(node)
            val new_left = transformBexprJoin_left(node)
            val new_right = transformBexprJoin_right(node)
            val new_predicate = transformBexprJoin_predicate(node)
            val new_metas = transformBexprJoin_metas(node)
            return if (
                node.joinType !== new_joinType ||
                node.left !== new_left ||
                node.right !== new_right ||
                node.predicate !== new_predicate ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Join(
                    joinType = new_joinType,
                    left = new_left,
                    right = new_right,
                    predicate = new_predicate,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprJoin_joinType(node: PartiqlLogical.Bexpr.Join) =
            transformJoinType(node.joinType)
        open fun transformBexprJoin_left(node: PartiqlLogical.Bexpr.Join) =
            transformBexpr(node.left)
        open fun transformBexprJoin_right(node: PartiqlLogical.Bexpr.Join) =
            transformBexpr(node.right)
        open fun transformBexprJoin_predicate(node: PartiqlLogical.Bexpr.Join) =
            node.predicate?.let { transformExpr(it) }
        open fun transformBexprJoin_metas(node: PartiqlLogical.Bexpr.Join) =
            transformMetas(node.metas)
    
        // Variant BexprWindow
        open fun transformBexprWindow(node: PartiqlLogical.Bexpr.Window): PartiqlLogical.Bexpr {
            val new_source = transformBexprWindow_source(node)
            val new_windowSpecification = transformBexprWindow_windowSpecification(node)
            val new_windowExpressionList = transformBexprWindow_windowExpressionList(node)
            val new_metas = transformBexprWindow_metas(node)
            return if (
                node.source !== new_source ||
                node.windowSpecification !== new_windowSpecification ||
                node.windowExpressionList !== new_windowExpressionList ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Window(
                    source = new_source,
                    windowSpecification = new_windowSpecification,
                    windowExpressionList = new_windowExpressionList,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprWindow_source(node: PartiqlLogical.Bexpr.Window) =
            transformBexpr(node.source)
        open fun transformBexprWindow_windowSpecification(node: PartiqlLogical.Bexpr.Window) =
            transformOver(node.windowSpecification)
        open fun transformBexprWindow_windowExpressionList(node: PartiqlLogical.Bexpr.Window) =
            node.windowExpressionList.map { transformWindowExpression(it) }
        open fun transformBexprWindow_metas(node: PartiqlLogical.Bexpr.Window) =
            transformMetas(node.metas)
    
        // Variant BexprSort
        open fun transformBexprSort(node: PartiqlLogical.Bexpr.Sort): PartiqlLogical.Bexpr {
            val new_source = transformBexprSort_source(node)
            val new_sortSpecs = transformBexprSort_sortSpecs(node)
            val new_metas = transformBexprSort_metas(node)
            return if (
                node.source !== new_source ||
                node.sortSpecs !== new_sortSpecs ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Sort(
                    source = new_source,
                    sortSpecs = new_sortSpecs,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprSort_source(node: PartiqlLogical.Bexpr.Sort) =
            transformBexpr(node.source)
        open fun transformBexprSort_sortSpecs(node: PartiqlLogical.Bexpr.Sort) =
            node.sortSpecs.map { transformSortSpec(it) }
        open fun transformBexprSort_metas(node: PartiqlLogical.Bexpr.Sort) =
            transformMetas(node.metas)
    
        // Variant BexprOffset
        open fun transformBexprOffset(node: PartiqlLogical.Bexpr.Offset): PartiqlLogical.Bexpr {
            val new_rowCount = transformBexprOffset_rowCount(node)
            val new_source = transformBexprOffset_source(node)
            val new_metas = transformBexprOffset_metas(node)
            return if (
                node.rowCount !== new_rowCount ||
                node.source !== new_source ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Offset(
                    rowCount = new_rowCount,
                    source = new_source,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprOffset_rowCount(node: PartiqlLogical.Bexpr.Offset) =
            transformExpr(node.rowCount)
        open fun transformBexprOffset_source(node: PartiqlLogical.Bexpr.Offset) =
            transformBexpr(node.source)
        open fun transformBexprOffset_metas(node: PartiqlLogical.Bexpr.Offset) =
            transformMetas(node.metas)
    
        // Variant BexprLimit
        open fun transformBexprLimit(node: PartiqlLogical.Bexpr.Limit): PartiqlLogical.Bexpr {
            val new_rowCount = transformBexprLimit_rowCount(node)
            val new_source = transformBexprLimit_source(node)
            val new_metas = transformBexprLimit_metas(node)
            return if (
                node.rowCount !== new_rowCount ||
                node.source !== new_source ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Limit(
                    rowCount = new_rowCount,
                    source = new_source,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprLimit_rowCount(node: PartiqlLogical.Bexpr.Limit) =
            transformExpr(node.rowCount)
        open fun transformBexprLimit_source(node: PartiqlLogical.Bexpr.Limit) =
            transformBexpr(node.source)
        open fun transformBexprLimit_metas(node: PartiqlLogical.Bexpr.Limit) =
            transformMetas(node.metas)
    
        // Variant BexprLet
        open fun transformBexprLet(node: PartiqlLogical.Bexpr.Let): PartiqlLogical.Bexpr {
            val new_source = transformBexprLet_source(node)
            val new_bindings = transformBexprLet_bindings(node)
            val new_metas = transformBexprLet_metas(node)
            return if (
                node.source !== new_source ||
                node.bindings !== new_bindings ||
                node.metas !== new_metas
            ) {
                PartiqlLogical.Bexpr.Let(
                    source = new_source,
                    bindings = new_bindings,
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformBexprLet_source(node: PartiqlLogical.Bexpr.Let) =
            transformBexpr(node.source)
        open fun transformBexprLet_bindings(node: PartiqlLogical.Bexpr.Let) =
            node.bindings.map { transformLetBinding(it) }
        open fun transformBexprLet_metas(node: PartiqlLogical.Bexpr.Let) =
            transformMetas(node.metas)
    
        //////////////////////////////////////
        // Sum Type: DmlOperation
        //////////////////////////////////////
        open fun transformDmlOperation(node: PartiqlLogical.DmlOperation): PartiqlLogical.DmlOperation =
            when(node) {
                is PartiqlLogical.DmlOperation.DmlInsert -> transformDmlOperationDmlInsert(node)
                is PartiqlLogical.DmlOperation.DmlDelete -> transformDmlOperationDmlDelete(node)
                is PartiqlLogical.DmlOperation.DmlReplace -> transformDmlOperationDmlReplace(node)
                is PartiqlLogical.DmlOperation.DmlUpdate -> transformDmlOperationDmlUpdate(node)
            }
        // Variant DmlOperationDmlInsert
        open fun transformDmlOperationDmlInsert(node: PartiqlLogical.DmlOperation.DmlInsert): PartiqlLogical.DmlOperation {
            val new_metas = transformDmlOperationDmlInsert_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.DmlOperation.DmlInsert(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformDmlOperationDmlInsert_metas(node: PartiqlLogical.DmlOperation.DmlInsert) =
            transformMetas(node.metas)
    
        // Variant DmlOperationDmlDelete
        open fun transformDmlOperationDmlDelete(node: PartiqlLogical.DmlOperation.DmlDelete): PartiqlLogical.DmlOperation {
            val new_metas = transformDmlOperationDmlDelete_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.DmlOperation.DmlDelete(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformDmlOperationDmlDelete_metas(node: PartiqlLogical.DmlOperation.DmlDelete) =
            transformMetas(node.metas)
    
        // Variant DmlOperationDmlReplace
        open fun transformDmlOperationDmlReplace(node: PartiqlLogical.DmlOperation.DmlReplace): PartiqlLogical.DmlOperation {
            val new_metas = transformDmlOperationDmlReplace_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.DmlOperation.DmlReplace(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformDmlOperationDmlReplace_metas(node: PartiqlLogical.DmlOperation.DmlReplace) =
            transformMetas(node.metas)
    
        // Variant DmlOperationDmlUpdate
        open fun transformDmlOperationDmlUpdate(node: PartiqlLogical.DmlOperation.DmlUpdate): PartiqlLogical.DmlOperation {
            val new_metas = transformDmlOperationDmlUpdate_metas(node)
            return if (
                node.metas !== new_metas
            ) {
                PartiqlLogical.DmlOperation.DmlUpdate(
                    metas = new_metas
                )
            } else {
                node
            }
        }
        open fun transformDmlOperationDmlUpdate_metas(node: PartiqlLogical.DmlOperation.DmlUpdate) =
            transformMetas(node.metas)
    
    }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy