/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* Ġ ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// aws . amazon . com / apache 2 . 0 / Ċ Ġ* Ċ Ġ* Ġ Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ċ Ġ* Ġ Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . part i ql . lang . ast . passes Ċ Ċ import Ġorg . part i ql . lang . ast .* Ċ import Ġorg . part i ql . lang . util .* Ċ Ċ /** Ċ Ġ* ĠContains Ġthe Ġlogic Ġnecessary Ġto Ġwalk Ġevery Ġnode Ġin Ġthe ĠAST Ġand Ġinvokes Ġmethods Ġof Ġ[ Ast Visitor ] Ġalong Ġthe Ġway . Ċ Ġ*/ Ċ open Ġclass ĠAst Walker ( private Ġval Ġvisitor : ĠAst Visitor ) Ġ{ ĊĊĠĠĠ Ġfun Ġwalk ( expr Node : ĠExpr Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwalk Expr Node ( expr Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġwalk Expr Node ( var arg Ġexpr s : ĠExpr Node ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpr s . filter NotNull (). forEach Ġ{ Ġexpr : ĠExpr Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Thread Inter rupted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Expr Node ( expr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLiteral , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLiteral Missing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLeaf Ġnodes Ġhave Ġno Ġchildren Ġto Ġwalk . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNA ry ĠĠĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġargs , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . forEach Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCall Agg ĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( func Expr , Ġ_, Ġarg , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( func Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( arg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTyped ĠĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġexp , Ġsql DataType , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( exp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit DataType ( sql DataType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPath ĠĠĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Path ( expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSimple Case ĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value Expr , Ġbranches , Ġelse Expr , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( value Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranches . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( branch Value Expr , Ġthen Expr ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( branch Value Expr , Ġthen Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( else Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS ear ched Case Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( branches , Ġelse Expr , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranches . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( condition Expr , Ġthen Expr ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( condition Expr , Ġthen Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( else Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStruct ĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( fields , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( name Expr , Ġvalue Expr ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( name Expr , Ġvalue Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSeq ĠĠĠĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġitems , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWith ĠĠĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect ĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġprojection , Ġfrom , Ġfrom Let , Ġwhere , Ġgroup By , Ġhaving , ĠorderBy , Ġlimit , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Select Projection ( projection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk From Source ( from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( where ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġgroup By Items , Ġ_) Ġ= Ġit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup By Items . forEach Ġ{ Ġg bi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( group Expr ) Ġ= Ġg bi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( group Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( having ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . sort Spec Items . forEach Ġ{ Ġs si Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( ssi . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠData Manip ulation Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( d ml Operation , Ġfrom , Ġwhere , Ġreturning , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk D ml Operations ( d ml Operation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk From Source ( from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( where ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturning ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . return ing E lems . forEach Ġ{ Ġre Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( re . column Component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReturn ing Column ĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( re . column Component . column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReturn ing Wildcard Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Leaf Ġnodes Ġhave Ġno Ġchildren Ġto Ġwalk . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCreate Index Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġkeys , Ġ_: ĠMeta Container ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġkeys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCreate Table , Ġis ĠDrop Table , Ġis ĠDrop Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExec , Ġis ĠDateTime Type Ġ-> Ġcase Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk Path ( expr : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( root , Ġcomponents ) Ġ= Ġexpr ĊĠĠĠĠĠĠĠ Ġwalk Expr Node ( root ) ĊĠĠĠĠĠĠĠ Ġcomponents . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Path Component ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPath Component Un pivot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPath Component Wildcard Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Leaf Ġnodes Ġhave Ġno Ġchildren Ġto Ġwalk . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPath Component Expr ĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exp ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( exp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk From Source ( from Source : ĠFrom Source ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisitor . visit From Source ( from Source ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( from Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrom Source Expr ĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exp , Ġ_) Ġ= Ġfrom Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( exp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrom Source Un pivot Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exp , Ġ_, Ġ_) Ġ= Ġfrom Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( exp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrom Source Join ĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġleft Ref , Ġright Ref , Ġcondition , Ġ_: ĠMeta Container ) Ġ= Ġfrom Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk From Source ( left Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk From Source ( right Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk Select Projection ( projection : ĠSelect Projection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisitor . visit Select Projection ( projection ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( projection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection Value Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value Expr ) Ġ= Ġprojection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( value Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection Pivot Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( as Expr , Ġat Expr ) Ġ= Ġprojection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( as Expr , Ġat Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection List Ġ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( items ) Ġ= Ġprojection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Select ListItem ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect ListItem Star ĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Leaf Ġnodes Ġhave Ġno Ġchildren Ġto Ġwalk . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect ListItem Expr ĠĠĠĠĠĠ Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( it . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect ListItem Project All Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( it . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk D ml Operations ( d ml Operations : ĠD ml Op List ) Ġ= ĊĠĠĠĠĠĠĠ Ġd ml Operations . ops . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwalk D ml Operation ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk D ml Operation ( d ml Operation : ĠData Manip ulation Operation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( d ml Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInsert Op Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( l Value , Ġvalues ) Ġ= Ġd ml Operation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( l Value , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInsert Value Op Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( l value , Ġvalue , Ġposition , Ġon Conflict ) Ġ= Ġd ml Operation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( l value , Ġvalue , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk On Conflict ( on Conflict ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAssignment Op Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( assignment ) Ġ= Ġd ml Operation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( assignment . l value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( assignment . r value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemove Op Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( l value ) Ġ= Ġd ml Operation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( l value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDelete Op Ġ-> Ġcase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op Ġ- Ġimplicit Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. to Unit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwalk On Conflict ( on Conflict : ĠOn Conflict ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( on Conflict Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit On Conflict ( on Conflict ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( condition , Ġconflict Action ) Ġ= Ġon Conflict ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwalk Expr Node ( condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( conflict Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConflict Action . DO _ NOTH ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ