/* Ċ Ġ* Ġ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 . eval .* Ċ Ċ /** Ċ Ġ* ĠAssign s Ġaliases Ġto Ġany Ġ[ From Source Expr ] Ġthat Ġdoes Ġnot Ġalready Ġhave Ġone . Ċ Ġ* Ċ Ġ* ĠFor Ġexample : Ġ` SELECT Ġ* ĠFROM Ġfoo ` Ġgets Ġre written Ġas Ġ` SELECT Ġ* Ġfrom Ġfoo Ġas Ġfoo `. Ċ Ġ* ĠPath Ġexpressions : Ġ Ġ` SELECT Ġ* ĠFROM Ġfoo . bar . bat ` Ġgets Ġre written Ġas Ġ` SELECT Ġ* Ġfrom Ġfoo . bar . bat Ġas Ġbat ` Ċ Ġ* Ċ Ġ* ĠIf Ġprovided Ġwith Ġa Ġquery Ġthat Ġhas Ġall Ġof Ġthe Ġfrom Ġsource Ġaliases Ġalready Ġspecified , Ġan Ġexact Ġclone Ġis Ġreturned . Ċ Ġ*/ Ċ class ĠFrom Source Alias Rew riter Ġ: ĠAst Rew riter Base () Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠInner From Source Alias Rew riter Ġ: ĠAst Rew riter Base () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġfrom Source Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġextract Source Location Meta Container ( metas : ĠMeta Container ): ĠMeta Container Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġmet as . find ( Source Location Meta . TAG ) Ġ?: Ġreturn Ġmeta Container Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmeta Container Of ( found ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrewrite From Source Expr ( from Source : ĠFrom Source Expr ): ĠFrom Source Expr Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġyes Ġthis Ġfunction Ġis Ġidentical Ġto Ġ[ rewrite From Source Un pivot ]. ĠThis Ġis Ġbecause Ġ[ From Source Expr ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġ[ From Source Un pivot ] Ġhave Ġalmost Ġthe Ġsame Ġproperties Ġwith Ġthe Ġdifference Ġbeing Ġthat Ġ[ From Source Un pivot ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhas Ġan Ġadditional Ġ` metas ` Ġproperty Ġwhile Ġ[ From Source Expr ] Ġdoes Ġnot . Ġ ĠWe Ġconsidered Ġmerging Ġthese ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtwo Ġtypes Ġso Ġthat Ġthis Ġduplication Ġisn 't Ġneeded Ġbut Ġhave Ġdetermined Ġnot Ġto Ġdo Ġso Ġat Ġthis Ġtime Ġand Ġattempts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġde duplicate Ġthrough Ġother Ġmeans Ġwere Ġrather Ġcon vol uted , Ġcreating Ġmore Ġproblems Ġthan Ġthey Ġsolved . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / part i ql / part i ql - lang - kotlin / issues / 3 9 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis From Source Index Ġ= Ġfrom Source Counter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Expr Ġ= Ġsuper . rewrite Expr Node ( from Source . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Source . as Name Ġ!= Ġnull Ġ-> Ġfrom Source . copy ( expr Ġ= Ġnew Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Source Alias Ġ= Ġfrom Source . expr . extract Column Alias ( this From Source Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Name Ġ= ĠS ymbolic Name ( from Source Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Source Location Meta Container ( from Source . expr . metas )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Source . copy ( expr Ġ= Ġnew Expr , Ġas Name Ġ= Ġas Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrewrite From Source Un pivot ( from Source : ĠFrom Source Un pivot ): ĠFrom Source Un pivot Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis From Source Index Ġ= Ġfrom Source Counter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Expr Ġ= Ġsuper . rewrite Expr Node ( from Source . expr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Source . as Name Ġ!= Ġnull Ġ-> Ġfrom Source . copy ( expr Ġ= Ġnew Expr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Source Alias Ġ= Ġfrom Source . expr . extract Column Alias ( this From Source Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Name Ġ= ĠS ymbolic Name ( from Source Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Source Location Meta Container ( from Source . expr . metas )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Source . copy ( expr Ġ= Ġnew Expr , Ġas Name Ġ= Ġas Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrewrite Select ( select Expr : ĠSelect ): ĠExpr Node Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġneed Ġto Ġmake Ġsure Ġto Ġuse Ġa Ġdifferent Ġ[ from Source Counter ] Ġfor Ġsub - queries . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFrom Source Alias Rew riter (). rewrite Select ( select Expr ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrewrite From Source ( from Source : ĠFrom Source ): ĠFrom Source Ġ= ĊĠĠĠĠĠĠĠ ĠInner From Source Alias Rew riter (). rewrite From Source ( from Source ) Ċ Ċ }