package Ġch . un ib as . d mi . db is . cott ont ail . database . column Ċ Ċ import Ġch . un ib as . d mi . db is . cott ont ail . database . serializers .* Ċ import Ġch . un ib as . d mi . db is . cott ont ail . model . values .* Ċ Ċ import Ġorg . map db . Serializer Ċ Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . safe Cast Ċ Ċ /** Ċ Ġ* ĠSpecifies Ġthe Ġtype Ġof Ġa ĠC ott ont ail ĠDB Ġ[ Column ]. ĠThis Ġconstruct Ġallows Ġfor Ġsome Ġdegree Ġof Ġtype Ġsafety Ġin Ġthe Ġeye Ġde -/ serialization . Ċ Ġ* ĠThe Ġcolumn Ġtypes Ġare Ġstored Ġas Ġstrings Ġand Ġmapped Ġto Ġthe Ġrespective Ġclass Ġusing Ġ[ ColumnType . type For Name ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠColumn Ċ Ġ* Ċ Ġ* Ġ@ author ĠR alph ĠG asser Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ*/ Ċ sealed Ġclass ĠColumn Type < T Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġabstract Ġval Ġname Ġ: ĠString ĊĠĠĠ Ġabstract Ġval Ġtype : ĠK Class < out ĠValue < T >> ĊĠĠĠ Ġabstract Ġval Ġnumeric : ĠBoolean ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ ColumnType ] Ġfor Ġthe Ġprovided Ġname . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠFor Ġwhich Ġto Ġlookup Ġthe Ġ[ ColumnType ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Name ( name : ĠString ): ĠColumn Type < *> Ġ= Ġwhen ( name . toUpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" BOOLEAN " Ġ-> ĠBoolean ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" BYTE " Ġ-> ĠByte ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" SHORT " Ġ-> ĠShort ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" INTEGER " Ġ-> ĠInt ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" LONG " Ġ-> ĠLong ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" FLOAT " Ġ-> ĠFloat ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DOUBLE " Ġ-> ĠDouble ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" STRING " Ġ-> ĠString ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" INT _ VEC " Ġ-> ĠInt Array ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" LONG _ VEC " Ġ-> ĠLong Array ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" FLOAT _ VEC " Ġ-> ĠFloat Array ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DOUBLE _ VEC " Ġ-> ĠDouble Array ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" BOOLEAN _ VEC " Ġ-> ĠBoolean Array ColumnType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġjava . lang . IllegalArgumentException (" The Ġcolumn Ġtype Ġ$ name Ġdoes Ġnot Ġexists !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcast ( value : ĠValue < *> ?) Ġ: ĠValue < T >? Ġ= Ġthis . type . safe Cast ( value ) ĊĠĠĠ Ġfun Ġcompatible ( value : ĠValue <* >) Ġ= Ġthis . type . is Instance ( value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ Serializer ] Ġfor Ġthis Ġ[ ColumnType ]. ĠSome Ġ[ ColumnType ] Ġrequire Ġa Ġsize Ġattribute ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsize ĠThe Ġsize Ġof Ġthe Ġcolumn Ġ( e . g . Ġfor Ġvectors ). ĠDefaults Ġto Ġ- 1 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġserializer ( size : ĠInt Ġ= Ġ- 1 ): ĠSerializer < Value < T >> ĊĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġother Ġas ĠColumn Type < *> ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġthis . name Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠBoolean ColumnType Ġ: ĠColumn Type < Boolean >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" BOOLEAN " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Boolean Value > Ġ= ĠBoolean Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Boolean >> Ġ= ĠBoolean Value Serializer Ġas ĠSerializer < Value < Boolean >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠByte ColumnType Ġ: ĠColumn Type < Byte >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" BYTE " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Byte Value > Ġ= ĠByte Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Byte >> Ġ= ĠByte Value Serializer Ġas ĠSerializer < Value < Byte >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠShort ColumnType Ġ: ĠColumn Type < Short >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" SHORT " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Short Value > Ġ= ĠShort Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Short >> Ġ= ĠShort Value Serializer Ġ Ġas ĠSerializer < Value < Short >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠInt ColumnType Ġ: ĠColumn Type < Int >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" INTEGER " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Int Value > Ġ= ĠInt Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Int >> Ġ= ĠInt Value Serializer Ġ Ġas ĠSerializer < Value < Int >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠLong ColumnType Ġ: ĠColumn Type < Long >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" LONG " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Long Value > Ġ= ĠLong Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Long >> Ġ= ĠLong Value Serializer Ġ Ġas ĠSerializer < Value < Long >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠFloat ColumnType Ġ: ĠColumn Type < Float >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" FLOAT " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Float Value > Ġ= ĠFloat Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Float >> Ġ= ĠFloat Value Serializer Ġ Ġas ĠSerializer < Value < Float >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠDouble ColumnType Ġ: ĠColumn Type < Double >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" DOUBLE " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Double Value > Ġ= ĠDouble Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Double >> Ġ= ĠDouble Value Serializer Ġas ĠSerializer < Value < Double >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠString ColumnType Ġ: ĠColumn Type < String >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" STRING " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < StringValue > Ġ= ĠString Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < String >> Ġ= ĠString Value Serializer Ġas ĠSerializer < Value < String >> Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠInt Array ColumnType Ġ: ĠColumn Type < IntArray >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" INT _ VEC " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < IntArray Value > Ġ= ĠInt Array Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < IntArray >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Size Ġattribute Ġfor Ġa Ġ$ name Ġtype Ġmust Ġbe Ġ> Ġ 0 Ġ( is Ġ$ size ). ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFixed IntArray Serializer ( size ) Ġas ĠSerializer < Value < IntArray >> ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠLong Array ColumnType Ġ: ĠColumn Type < Long Array >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" LONG _ VEC " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Long Array Value > Ġ= ĠLong Array Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Long Array >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Size Ġattribute Ġfor Ġa Ġ$ name Ġtype Ġmust Ġbe Ġ> Ġ 0 Ġ( is Ġ$ size ). ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFixed Long Array Serializer ( size ) Ġas ĠSerializer < Value < Long Array >> ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠFloat Array ColumnType Ġ: ĠColumn Type < Float Array >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" FLOAT _ VEC " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Float Array Value > Ġ= ĠFloat Array Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Float Array >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Size Ġattribute Ġfor Ġa Ġ$ name Ġtype Ġmust Ġbe Ġ> Ġ 0 Ġ( is Ġ$ size ). ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFixed Float Vector Serializer ( size ) Ġas ĠSerializer < Value < Float Array >> ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠDouble Array ColumnType Ġ: ĠColumn Type < Double Array >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" DOUBLE _ VEC " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Double Array Value > Ġ= ĠDouble Array Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Double Array >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Size Ġattribute Ġfor Ġa Ġ$ name Ġtype Ġmust Ġbe Ġ> Ġ 0 Ġ( is Ġ$ size ). ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFixed Double Vector Serializer ( size ) Ġas ĠSerializer < Value < Double Array >> ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠBoolean Array ColumnType Ġ: ĠColumn Type < Boolean Array >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" BOOLEAN _ VEC " ĊĠĠĠ Ġoverride Ġval Ġnumeric Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġtype : ĠK Class < Boolean Array Value > Ġ= ĠBoolean Array Value :: class ĊĠĠĠ Ġoverride Ġfun Ġserializer ( size : ĠInt ): ĠSerializer < Value < Boolean Array >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Size Ġattribute Ġfor Ġa Ġ$ name Ġtype Ġmust Ġbe Ġ> Ġ 0 Ġ( is Ġ$ size ). ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFixed Boolean Vector Serializer ( size ) Ġas ĠSerializer < Value < Boolean Array >> ĊĠĠĠ Ġ} Ċ } ĊĊ