package Ġorg . part i ql . examples Ċ Ċ import Ġorg . junit .* Ċ import Ġorg . junit . Assert .* Ċ import Ġcom . amazon . ion .* Ċ import Ġcom . amazon . ion . system .* Ċ import Ġorg . part i ql . examples . util . Example Ċ import Ġorg . part i ql . lang .* Ċ import Ġorg . part i ql . lang . eval .* Ċ import Ġorg . part i ql . lang . util .* Ċ import Ġjava . io . Print Stream Ċ Ċ /** Ċ Ġ* ĠD emon str ates Ġhow Ġto Ġimplement Ġa Ġcustom Ġ[ Expr Value ] Ġtype . Ġ ĠCustom Ġimplementations Ġof Ġ[ Expr Value ] Ġsuch Ġas Ġthis Ġone Ċ Ġ* Ġare Ġused Ġto Ġfeed Ġdata Ġfrom Ġany Ġsource Ġinto Ġthe ĠPart i QL Ġinterpreter Ġin Ġthe Ġform Ġof Ġglobal Ġvariables . Ċ Ġ* Ċ Ġ* ĠThis Ġimplementation Ġof Ġ[ Expr Value ] Ġrepresents Ġa Ġsingle Ġrow Ġwithin Ġa Ġcomma - separated Ġvalue Ġ( CSV ) Ġfile . Ċ Ġ* Ċ Ġ* ĠThe Ġfirst Ġcolumn Ġin Ġthe Ġrow Ġwill Ġbe Ġassigned Ġthe Ġname Ġ`_ 1 `, Ġthe Ġsecond Ġ`_ 2 ` Ġand Ġso Ġon . Ċ Ġ*/ Ċ private Ġclass ĠCsv Row Expr Value ( private Ġval Ġvalue Factory : ĠExpr Value Factory , Ġprivate Ġval Ġrow String : ĠString ): ĠBase Expr Value () Ġ{ ĊĊĠĠĠ Ġ/** ĠThe ĠIon Ġtype Ġthat ĠCsv Row Expr Value Ġis Ġmust Ġsimilar Ġto Ġis Ġa Ġstruct . Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġtype : ĠExpr ValueType Ġget () Ġ= ĠExpr ValueType . STRUCT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġl az ily Ġconstructed Ġset Ġof Ġrow Ġvalues . Ġ ĠL az iness Ġis Ġgood Ġpractice Ġhere Ġbecause Ġit Ġavoids ĊĠĠĠĠ Ġ* Ġconstructing Ġthis Ġmap Ġif Ġit Ġisn 't Ġneeded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrow Values : ĠMap < String , ĠExpr Value > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġrow String . split (',') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġ"_ ${ i Ġ+ Ġ 1 }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġwe Ġinvoke ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfieldName Ġto Ġvalue Factory . new String ( it ). named Value ( value Factory . new String ( fieldName )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠL az iness Ġis Ġeven Ġmore Ġimportant Ġhere Ġbecause Ġ[ ion Value ] Ġis Ġlikely Ġto Ġnever Ġbe Ġcalled . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlazy Ion Value Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Factory . ion . new Empty Struct (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Values . map Ġ{ Ġk vp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( k vp . key , Ġvalue Factory . ion . new String ( k vp . value . stringValue ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake ReadOnly () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAn Ġiterator Ġover Ġthe Ġvalues Ġcontained Ġin Ġthis Ġinstance Ġof Ġ[ Expr Value ], Ġif Ġany . Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġrow Values . values . iterator () ĊĊĠĠĠ Ġ/** ĠThe ĠIon Ġrepresentation Ġof Ġthe Ġcurrent Ġvalue . Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġion Value : ĠIon Value ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlazy Ion Value ĊĊĠĠĠ Ġprivate Ġval Ġbindings Instance Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠBind ings . of Map ( row Values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġbindings : ĠBind ings ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbindings Instance Ċ } Ċ Ċ class ĠCsv Expr Value Example ( out : ĠPrint Stream ) Ġ: ĠExample ( out ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġion Ġ= ĠIon System Builder . standard (). build () ĊĠĠĠ Ġprivate Ġval Ġvalue Factory Ġ= ĠExpr Value Factory . standard ( ion ) ĊĠĠĠ Ġprivate Ġval Ġpipeline Ġ= ĠCompiler Pipeline . standard ( value Factory ) ĊĊĠĠĠ Ġprivate Ġval ĠEX AMPLE _ CSV _ FILE _ CONTENTS Ġ= Ġ" Cat , N ibb ler , F \ n Cat , H ob bes , M \ n Dog , F ido , M " ĊĊĠĠĠ Ġ/** ĠEvalu ates Ġthe Ġspecified Ġ[ query ], Ġusing Ġa Ġstandard Ġ[ session ] Ġif Ġnone Ġwas Ġspecified . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġeval ( query : ĠString , Ġsession : ĠEvaluation Session Ġ= ĠEvaluation Session . standard ()): ĠExpr Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġpipeline . compile ( query ) ĊĠĠĠĠĠĠĠ Ġreturn Ġe . eval ( session ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġprint (" CSV Ġfile :", ĠEX AMPLE _ CSV _ FILE _ CONTENTS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġglobals Ġ= ĠBind ings . build Lazy Bindings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Binding (" csv _ data ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfirst Ġtime Ġ" csv _ data " Ġis Ġencountered Ġduring Ġquery Ġevaluation Ġthis Ġclosure Ġwill Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvoked Ġto Ġobtain Ġits Ġvalue , Ġwhich Ġwill Ġthen Ġbe Ġcached Ġfor Ġlater Ġuse . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ[ Sequence Expr Value ] Ġrepresents Ġa ĠPart i QL Ġbag Ġdata Ġtype . Ġ ĠIt Ġis Ġan Ġimplementation Ġof Ġ[ Expr Value ] Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontains Ġa ĠKotlin Ġ[ Sequence < >] Ġof Ġother Ġ[ Expr Value ] Ġinstances . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Factory . new Bag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEX AMPLE _ CSV _ FILE _ CONTENTS . split ('\ n '). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCsv Row Expr Value ( pipeline . value Factory , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" SELECT Ġ_ 1 , Ġ_ 2 , Ġ_ 3 ĠFROM Ġcsv _ data " ĊĠĠĠĠĠĠĠ Ġprint (" Part i QL Ġquery :", Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġeval ( query , ĠEvaluation Session . build Ġ{ Ġglobals ( globals ) Ġ}) ĊĠĠĠĠĠĠĠ Ġprint (" result :", Ġresult . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ