// ĠCopyright Ġ 2 0 2 0 ĠThe ĠCross - Media ĠMeasurement ĠAuthors Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġ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 . wf an et . measurement . g cloud . spanner Ċ Ċ import Ġcom . google . cloud . Timestamp Ċ import Ġcom . google . cloud . spanner . Struct Ċ import Ġcom . google . cloud . spanner . Type Ċ import Ġcom . google . cloud . spanner . Value Binder Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġcom . google . protobuf . Message Ċ import Ġcom . google . protobuf . Parser Ċ import Ġcom . google . protobuf . Protocol Message Enum Ċ import Ġorg . wf an et . measurement . common . number As Long Ċ import Ġorg . wf an et . measurement . common . toJson Ċ import Ġorg . wf an et . measurement . g cloud . common . parseFrom Ċ import Ġorg . wf an et . measurement . g cloud . common . to G cloud ByteArray Ċ Ċ private Ġfun Ġ< T > ĠStruct . null Or Value ( ĊĠ Ġcolumn : ĠString , ĊĠ Ġtype Code : ĠType . Code , ĊĠ Ġgetter : ĠStruct .( String ) Ġ-> ĠT Ċ ): ĠT ? Ġ{ ĊĠ Ġval Ġcolumn Type Ġ= Ġget ColumnType ( column ). code ĊĠ Ġcheck ( column Type Ġ== Ġtype Code ) Ġ{ Ġ" Cannot Ġread Ġ$ type Code Ġfrom Ġ$ column , Ġit Ġhas Ġtype Ġ$ column Type " Ġ} ĊĠ Ġreturn Ġif Ġ( isNull ( column )) Ġnull Ġelse Ġgetter ( column ) Ċ } Ċ Ċ /** ĠReturns Ġthe Ġvalue Ġof Ġa ĠString Ġcolumn Ġeven Ġif Ġit Ġis Ġnull . Ġ*/ Ċ fun ĠStruct . get Nullable String ( column : ĠString ): ĠString ? Ġ= ĊĠ Ġnull Or Value ( column , ĠType . Code . STRING , ĠStruct :: getString ) Ċ Ċ /** ĠReturns Ġthe Ġvalue Ġof Ġan ĠArray Ġof ĠStruct s Ġcolumn Ġeven Ġif Ġit Ġis Ġnull . Ġ*/ Ċ fun ĠStruct . get Nullable Struct List ( column : ĠString ): ĠMutable List < Struct >? Ġ= ĊĠ Ġnull Or Value ( column , ĠType . Code . ARRAY , ĠStruct :: get Struct List ) Ċ Ċ /** ĠReturns Ġthe Ġvalue Ġof Ġa ĠTimestamp Ġcolumn Ġeven Ġif Ġit Ġis Ġnull . Ġ*/ Ċ fun ĠStruct . get Nullable Timestamp ( column : ĠString ): ĠTimestamp ? Ġ= ĊĠ Ġnull Or Value ( column , ĠType . Code . TIMESTAMP , ĠStruct :: getTimestamp ) Ċ Ċ /** ĠReturns Ġthe Ġvalue Ġof Ġa ĠINT 6 4 Ġcolumn Ġeven Ġif Ġit Ġis Ġnull . Ġ*/ Ċ fun ĠStruct . get Nullable Long ( column : ĠString ): ĠLong ? Ġ= ĊĠ Ġnull Or Value ( column , ĠType . Code . INT 6 4 , ĠStruct :: getLong ) Ċ Ċ /** ĠReturns Ġa Ġbytes Ġcolumn Ġas Ġa ĠKotlin Ġnative ĠByteArray . ĠThis Ġis Ġuseful Ġfor Ġde serializing Ġprotos . Ġ*/ Ċ fun ĠStruct . getBytes As ByteArray ( column : ĠString ): ĠByteArray Ġ= Ġget Bytes ( column ). toByteArray () Ċ Ċ /** ĠReturns Ġa Ġbytes Ġcolumn Ġas Ġa Ġprotobuf ĠByte String . Ġ*/ Ċ fun ĠStruct . getBytes As ByteString ( column : ĠString ): ĠByte String Ġ= ĊĠ ĠByte String . copyFrom ( getBytes ( column ). as ReadOnly ByteBuffer ()) Ċ Ċ /** ĠParses Ġa Ġprotobuf Ġ[ Message ] Ġfrom Ġa Ġbytes Ġcolumn . Ġ*/ Ċ fun Ġ< T Ġ: ĠMessage > ĠStruct . get Proto Message ( column : ĠString , Ġparser : ĠParser < T >): ĠT Ġ= ĊĠ Ġparser . parseFrom ( getBytes ( column )) Ċ Ċ /** ĠParses Ġan Ġenum Ġfrom Ġan ĠINT 6 4 ĠSp anner Ġcolumn . Ġ*/ Ċ fun Ġ< T Ġ: ĠEnum < T >> ĠStruct . get Proto Enum ( column : ĠString , Ġparser : Ġ( Int ) Ġ-> ĠT ): ĠT Ġ= ĊĠ Ġparser ( getLong ( column ). toInt ()) Ċ Ċ /** ĠBind Ġa Ġprotobuf Ġ[ Message ] Ġas Ġa ĠSp anner ĠByteArray . Ġ*/ Ċ fun Ġ< T > ĠValue Binder < T >. to Proto Bytes ( message : ĠMessage ?): ĠT Ġ= Ġto ( message ?. to G cloud ByteArray ()) Ċ Ċ /** ĠBind Ġa Ġprotobuf Ġ[ Message ] Ġas Ġa ĠJSON Ġstring Ġrepresentation . Ġ*/ Ċ fun Ġ< T > ĠValue Binder < T >. to Proto Json ( message : ĠMessage ?): ĠT Ġ= Ġto ( message ?. toJson ()) Ċ Ċ /** ĠBind Ġa Ġprotobuf Ġenum Ġto Ġan ĠINT 6 4 ĠSp anner Ġcolumn . Ġ*/ Ċ fun Ġ< T > ĠValue Binder < T >. to Proto Enum ( value : ĠProtocol Message Enum ): ĠT Ġ= Ġto ( value . number As Long ) Ċ Ċ /** ĠBind Ġa Ġlist Ġof Ġprotobuf Ġenums Ġto Ġan ĠINT 6 4 ĠSp anner Ġcolumn . Ġ*/ Ċ fun Ġ< T > ĠValue Binder < T >. to Proto Enum Array ( value : ĠList < Protocol Message Enum >): ĠT Ġ= ĊĠ Ġto Int 6 4 Array ( value . map Ġ{ Ġit . number As Long Ġ}) Ċ