/* Ċ Ġ* Ġ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 . eval Ċ Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThe Ġenvironment Ġfor Ġexecution . Ċ Ġ* Ċ Ġ* Ġ@ param Ġlocals ĠThe Ġcurrent Ġlocal Ġbindings . Ċ Ġ* Ġ@ param Ġcurrent ĠThe Ġcurrent Ġbindings Ġto Ġuse Ġfor Ġevaluation Ġwhich Ġis Ġgenerally Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` globals ` Ġor Ġ` locals ` Ġdepending Ġon Ġthe Ġcontext . Ċ Ġ* Ġ@ param Ġsession ĠThe Ġevaluation Ġsession . Ċ Ġ* Ġ@ param Ġgroups ĠThe Ġmap Ġof Ġ[ Group ] s Ġthat Ġis Ġcurrently Ġbeing Ġbuilt Ġduring Ġquery Ġexecution . Ċ Ġ*/ Ċ data Ġclass ĠEnvironment ( ĊĠĠĠ Ġinternal Ġval Ġlocals : ĠBind ings , ĊĠĠĠ Ġval Ġcurrent : ĠBind ings Ġ= Ġlocals , ĊĠĠĠ Ġval Ġsession : ĠEvaluation Session , ĊĠĠĠ Ġval Ġgroups : ĠMutable Map < Expr Value , ĠGroup > Ġ= Ġcreate Group Map (), ĊĠĠĠ Ġval Ġcurrent Group : ĠGroup ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġstandard () Ġ= ĠEnvironment ( locals Ġ= ĠBind ings . EMPTY , Ġsession Ġ= ĠEvaluation Session . standard ()) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Group Map () Ġ= ĠTreeMap < Expr Value , ĠGroup >( DEFAULT _ COMP AR ATOR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġenum Ġclass ĠCurrent Mode Ġ{ ĊĠĠĠĠĠĠĠ ĠLOCAL S , ĊĠĠĠĠĠĠĠ ĠGLOBAL S _ THEN _ LOCAL S ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConstructs Ġa Ġnew Ġnested Ġenvironment Ġwith Ġthe Ġlocals Ġbeing Ġthe Ġ[ current ] Ġbindings . Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġnest ( ĊĠĠĠĠĠĠĠ Ġnew Local s : ĠBind ings , ĊĠĠĠĠĠĠĠ Ġcurrent Mode : ĠCurrent Mode Ġ= ĠCurrent Mode . LOCAL S , ĊĠĠĠĠĠĠĠ Ġnew Group : ĠGroup ? Ġ= Ġcurrent Group ): ĠEnvironment Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġderived Local s Ġ= Ġnew Local s . delegate ( locals ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Current Ġ= Ġwhen Ġ( current Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent Mode . LOCAL S Ġ-> Ġderived Local s ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent Mode . GLOBALS _ THEN _ LOCAL S Ġ-> Ġsession . globals . delegate ( derived Local s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( locals Ġ= Ġderived Local s , Ġcurrent Ġ= Ġnew Current , Ġcurrent Group Ġ= Ġnew Group ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġenvironment Ġwith Ġthe Ġsame Ġ[ Bindings ] Ġand Ġsession Ġbut Ġwith Ġempty Ġgrouping Ġstate . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhat Ġallows ĠGROUP ĠBY Ġto Ġwork Ġin Ġsub - queries Ġwithout Ġrunning Ġinto Ġany Ġgrouping Ġstate ĊĠĠĠĠ Ġ* Ġfrom Ġthe Ġouter Ġquery . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġnest Query () Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠ Ġcurrent Group Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġgroups Ġ= Ġcreate Group Map ()) ĊĊĠĠĠ Ġ/** ĠConstructs Ġa Ġcopy Ġof Ġthis Ġenvironment Ġwith Ġthe Ġlocals Ġbeing Ġthe Ġcurrent Ġbindings . Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġflip ToLocal s (): ĠEnvironment Ġ= Ġcopy ( current Ġ= Ġlocals ) ĊĊĠĠĠ Ġ/** ĠConstructs Ġa Ġcopy Ġof Ġthis Ġenvironment Ġwith Ġthe Ġ[ globals ] Ġbeing Ġthe Ġcurrent Ġbindings . Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġflip To Globals First (): ĠEnvironment Ġ= Ġcopy ( current Ġ= Ġsession . globals . delegate ( locals )) Ċ Ċ } Ċ