package Ġdev . kom u . ah wen . query . aggreg ates Ċ Ċ import Ġdev . kom u . ah wen . query . Sql Value Ċ import Ġdev . kom u . ah wen . query . Scan Ċ import Ġdev . kom u . ah wen . types . ColumnName Ċ Ċ /** Ċ Ġ* ĠA Ġscan Ġthat Ġperforms Ġgroup Ġby Ġwith Ġgiven Ġaggregate Ġfunctions . Ċ Ġ*/ Ċ class ĠGroup By Scan ( ĊĠĠĠ Ġprivate Ġval Ġscan : ĠScan , ĊĠĠĠ Ġprivate Ġval Ġgroup Fields : ĠCollection < ColumnName >, ĊĠĠĠ Ġprivate Ġval Ġaggregation Fns : ĠCollection < Aggregation Fn > Ċ ) Ġ: ĠScan Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgroup Value : ĠGroup Value ĊĠĠĠ Ġprivate Ġvar Ġmore Groups Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbefore First () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore First () Ġ{ ĊĠĠĠĠĠĠĠ Ġscan . before First () ĊĠĠĠĠĠĠĠ Ġmore Groups Ġ= Ġscan . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! more Groups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( fn Ġin Ġaggregation Fns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn . process First ( scan ) ĊĊĠĠĠĠĠĠĠ Ġgroup Value Ġ= ĠGroup Value ( scan , Ġgroup Fields ) ĊĠĠĠĠĠĠĠ Ġmore Groups Ġ= Ġscan . next () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( more Groups ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgv Ġ= ĠGroup Value ( scan , Ġgroup Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gv Ġ!= Ġgroup Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( fn Ġin Ġaggregation Fns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . process Next ( scan ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmore Groups Ġ= Ġscan . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġscan . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( column : ĠColumn Name ): ĠSql Value Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( column Ġin Ġgroup Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Value [ column ] ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaggregation Fns . first Ġ{ Ġit . columnName Ġ== Ġcolumn Ġ}. value ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( column : ĠColumn Name ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcolumn Ġin Ġgroup Fields Ġ|| Ġaggregation Fns . any Ġ{ Ġit . columnName Ġ== Ġcolumn Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠGroup Value ( private Ġval Ġvalues : ĠMap < ColumnName , ĠSql Value >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( scan : ĠScan , Ġfields : ĠCollection < ColumnName >) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( fields . map Ġ{ Ġit Ġto Ġscan [ it ] Ġ}. toMap ()) ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( fieldName : ĠColumn Name ): ĠSql Value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ fieldName ] Ġ?: Ġerror (" unknown Ġfield Ġ$ fieldName ") ĊĠĠĠ Ġ} Ċ } Ċ