package Ġcom . ec wid . click house . raw Ċ Ċ import Ġcom . ec wid . click house . Meta Ċ import Ġcom . ec wid . click house . Statistics Ċ import Ġcom . ec wid . click house . Type Ċ import Ġcom . ec wid . click house . parse Type Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Token Ċ Ċ internal Ġfun Ġread Meta Object ( reader : ĠJson Reader ): ĠMeta Ġ{ Ċ ĉ // Ġcolumn Ġtypes Ċ ĉ val Ġindexes Ġ= Ġmutable ListOf < Type >() Ċ ĉ // Ġcolumn Ġnames Ġto Ġindexes Ġmap Ċ ĉ val Ġnames Ġ= Ġmutable Map Of < String , ĠInt >() ĊĊ ĉ reader . begin Array () Ċ ĉ while Ġ( reader . hasNext ()) Ġ{ Ċĉ ĉ reader . begin Object () Ċĉ ĉ reader . next Name () Ġ// Ġread Ġ' name ' Ġkey Ċĉ ĉ val ĠcolumnName Ġ= Ġreader . next String () Ġ// Ġread Ġ' name ' Ġvalue Ċĉ ĉ reader . next Name () Ġ// Ġread Ġ' type ' Ġkey Ċĉ ĉ val Ġcolumn Type Ġ= Ġparse Type ( reader . next String ()) Ġ// Ġread Ġ' type ' Ġvalue Ċĉ ĉ reader . end Object () ĊĊĉ ĉ indexes Ġ+= Ġcolumn Type Ċĉ ĉ names [ columnName ] Ġ= Ġindexes . size Ġ- Ġ 1 Ċ ĉ } Ċ ĉ reader . end Array () ĊĊ ĉ return ĠMeta ( indexes , Ġnames ) Ċ } Ċ Ċ internal Ġfun Ġread Statistics ( reader : ĠJson Reader ): ĠStatistics Ġ{ Ċ ĉ var Ġelapsed : ĠDouble ? Ġ= Ġnull Ċ ĉ var Ġrows Read : ĠLong ? Ġ= Ġnull Ċ ĉ var Ġbytes Read : ĠLong ? Ġ= Ġnull ĊĊ ĉ reader . begin Object () Ċ ĉ while Ġ( reader . hasNext ()) Ġ{ Ċĉ ĉ val Ġkey Name Ġ= Ġreader . next Name () Ċĉ ĉ when Ġ( key Name ) Ġ{ Ċĉĉ ĉ " elapsed " Ġ-> Ġelapsed Ġ= Ġreader . next Double () Ċĉĉ ĉ " rows _ read " Ġ-> Ġrows Read Ġ= Ġreader . next Long () Ċĉĉ ĉ " bytes _ read " Ġ-> Ġbytes Read Ġ= Ġreader . next Long () Ċĉ ĉ } Ċ ĉ } Ċ ĉ reader . end Object () ĊĊ ĉ require NotNull ( elapsed ) Ġ{ Ġ" Wrong Ġ' statistics ' Ġsection Ġin ĠSELECT Ġresponse Ġ- Ġno Ġ' elapsed ' Ġkey Ġfound " Ġ} Ċ ĉ require NotNull ( rows Read ) Ġ{ Ġ" Wrong Ġ' statistics ' Ġsection Ġin ĠSELECT Ġresponse Ġ- Ġno Ġ' rows _ read ' Ġkey Ġfound " Ġ} Ċ ĉ require NotNull ( bytes Read ) Ġ{ Ġ" Wrong Ġ' statistics ' Ġsection Ġin ĠSELECT Ġresponse Ġ- Ġno Ġ' bytes _ read ' Ġkey Ġfound " Ġ} ĊĊ ĉ return ĠStatistics ( elapsed , Ġrows Read , Ġbytes Read ) Ċ } Ċ Ċ internal Ġfun Ġread Raw Row ( reader : ĠJson Reader , Ġmeta : ĠMeta ): ĠRaw Row Ġ{ Ċ ĉ val Ġvalues Ġ= ĠArrayList < Any ? >( meta . columns . size ) ĊĊ ĉ reader . begin Array () Ċ ĉ while Ġ( reader . hasNext ()) Ġ{ Ċĉ ĉ val Ġnext Token Ġ= Ġreader . peek () ĊĊĉ ĉ when Ġ( nextToken ) Ġ{ Ċĉĉ ĉ Json Token . NULL Ġ-> Ġ{ Ċĉĉĉ ĉ reader . next Null () Ċĉĉĉ ĉ values . add ( null ) Ċĉĉ ĉ } ĊĊĉĉ ĉ Json Token . BEGIN _ ARRAY Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġarray Ġ= Ġarray ListOf < String ?> () ĊĊĉĉĉ ĉ reader . begin Array () Ċĉĉĉ ĉ while Ġ( reader . hasNext ()) Ġ{ Ċĉĉĉĉ ĉ val Ġnext Ġ= Ġreader . peek () Ċĉĉĉĉ ĉ if Ġ( next Ġ== ĠJson Token . NULL ) Ġ{ Ċĉĉĉĉĉ ĉ reader . next Null () Ċĉĉĉĉĉ ĉ array . add ( null ) Ċĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉ ĉ val Ġvalue Ġ= Ġreader . next String () Ċĉĉĉĉĉ ĉ array . add ( value ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ reader . end Array () ĊĊĉĉĉ ĉ values . add ( array ) Ċĉĉ ĉ } ĊĊĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġvalue Ġ= Ġreader . next String () Ċĉĉĉ ĉ values . add ( value ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ ĉ reader . end Array () ĊĊ ĉ return ĠRaw Row ( meta , Ġvalues ) Ċ } Ċ