package Ġio . l enses . jdbc 4 Ċ Ċ import Ġio . kot lint est . matchers . collections . should Contain Ċ import Ġio . kot lint est . matchers . collections . should Contain All Ċ import Ġio . kot lint est . matchers . collections . should Have Size Ċ import Ġio . kot lint est . matchers . collections . should Not Contain Ċ import Ġio . kot lint est . matchers . gte Ċ import Ġio . kot lint est . shouldBe Ċ import Ġio . kot lint est . specs . Word Spec Ċ import Ġio . l enses . jdbc 4 . result set . resultSet List Ċ import Ġio . l enses . jdbc 4 . result set . toList Ċ import Ġorg . apache . avro . Schema Builder Ċ import Ġorg . apache . avro . generic . Generic Data Ċ import Ġorg . apache . kafka . clients . producer . Kafka Producer Ċ import Ġorg . apache . kafka . clients . producer . Producer Record Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . Database MetaData Ċ Ċ class ĠL Database MetaData Test Ġ: ĠWord Spec (), ĠProducer Setup Ġ{ ĊĊĠ Ġinit Ġ{ ĊĊĠĠĠ ĠL enses Driver () ĊĊĠĠĠ Ġval Ġconn Ġ= Ġconn () ĊĠĠĠ Ġval Ġtopic 1 Ġ= Ġnew Topic Name () ĊĠĠĠ Ġval Ġtopic 2 Ġ= Ġnew Topic Name () ĊĊĠĠĠ Ġval Ġtax i Topic Ġ= Ġcreate Tax i Topic ( conn ) ĊĊĠĠĠ Ġconn . createStatement (). executeQuery (""" ĊĠĠĠĠĠĠĠ ĠCREATE ĠTABLE Ġ$ topic 1 Ġ(_ key Ġint , Ġid Ġint , Ġname Ġstring , Ġquantity Ġint , Ġprice Ġdouble ) ĠFORMAT ( INT , ĠAv ro ) Ġproperties ( partitions = 3 ); ĊĠĠĠĠĠĠĠ ĠCREATE ĠTABLE Ġ$ topic 2 Ġ(_ key Ġint , Ġid Ġint , Ġname Ġstring , Ġquantity Ġint , Ġprice Ġdouble ) ĠFORMAT ( INT , ĠJson ) Ġproperties ( partitions = 4 ); ĊĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĊĊĠĠĠ Ġ" L sql Database MetaData Test " Ġshould Ġ{ ĊĠĠĠĠĠ Ġ" declare Ġsupport Ġfor Ġmultiple Ġresult Ġsets " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Multiple Result Sets () ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Multiple Open Results () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Multiple Transactions () ĠshouldBe Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" declare Ġsupport Ġfor Ġjoins " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Full Outer Join s () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Limit ed Outer Join s () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Outer Join s () ĠshouldBe Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" declare Ġsupport Ġfor Ġsub queries " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Sub queries In Ins () ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Corre lated Sub queries () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Sub queries In Comp arisons () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Sub queries In Exists () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Sub queries In Quant ified s () ĠshouldBe Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" declare Ġsupport Ġfor Ġtransactions " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Transactions () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Multiple Transactions () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . data Definition Ignored In Transactions () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . default Transaction Isolation ĠshouldBe ĠConnection . TRANSACTION _ NONE ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Transaction Isolation Level ( Connection . TRANSACTION _ READ _ COMMIT TED ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Transaction Isolation Level ( Connection . TRANSACTION _ REPEAT ABLE _ READ ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Transaction Isolation Level ( Connection . TRANSACTION _ SERIAL IZ ABLE ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Data Definition And Data Manip ulation Transactions () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Data Manip ulation Transactions Only () ĠshouldBe Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" return Ġtype Ġinfo " Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠresultSet List ( conn . metaData . type Info ). first Ġ{ Ġit [ 0 ] Ġ== Ġ" STRING " Ġ} ĊĠĠĠĠĠĠĠ Ġstring [ 1 ] ĠshouldBe Ġjava . sql . Types . VARCHAR ĊĠĠĠĠĠĠĠ Ġstring [ 6 ] ĠshouldBe ĠDatabase MetaData . type Nullable ĊĠĠĠĠĠĠĠ Ġstring [ 3 ] ĠshouldBe Ġ'"' ĊĠĠĠĠĠĠĠ Ġstring [ 4 ] ĠshouldBe Ġ'"' ĊĊĠĠĠĠĠĠĠ Ġval Ġlong Ġ= ĠresultSet List ( conn . metaData . type Info ). first Ġ{ Ġit [ 0 ] Ġ== Ġ" LONG " Ġ} ĊĠĠĠĠĠĠĠ Ġlong [ 1 ] ĠshouldBe Ġjava . sql . Types . BIG INT ĊĠĠĠĠĠĠĠ Ġlong [ 6 ] ĠshouldBe ĠDatabase MetaData . type Nullable ĊĠĠĠĠĠĠĠ Ġlong [ 3 ] ĠshouldBe Ġnull ĊĠĠĠĠĠĠĠ Ġlong [ 4 ] ĠshouldBe Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" return Ġtable Ġtypes " Ġ{ ĊĠĠĠĠĠĠĠ ĠresultSet List ( conn . metaData . table Types ). map Ġ{ Ġit [ 0 ] Ġ} ĠshouldBe ĠlistOf (" SYSTEM ", Ġ" USER ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" return Ġall Ġtable Ġnames " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Names Ġ= ĠresultSet List ( conn . metaData . get Tables ( null , Ġnull , Ġnull , Ġnull )). map Ġ{ Ġit [ 2 ] Ġ} ĊĠĠĠĠĠĠĠ Ġtable Names . should Contain All ( topic 1 , Ġtopic 2 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġtable Ġtypes Ġwhen Ġlisting Ġtables " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Names Ġ= ĠresultSet List ( conn . metaData . get Tables ( null , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" USER ")) ). map Ġ{ Ġit [ 2 ]. toString () Ġ} ĊĠĠĠĠĠĠĠ Ġtable Names . should Contain ( topic 1 ) ĊĠĠĠĠĠĠĠ Ġtable Names . should Contain ( topic 2 ) ĊĠĠĠĠĠĠĠ Ġtable Names . should Not Contain ("__ consumer _ offsets ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsystem Table Names Ġ= ĠresultSet List ( conn . metaData . get Tables ( null , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" SYSTEM ")) ). map Ġ{ Ġit [ 2 ]. toString () Ġ} ĊĠĠĠĠĠĠĠ Ġsystem Table Names . should Contain ("__ consumer _ offsets ") ĊĠĠĠĠĠĠĠ Ġsystem Table Names . should Not Contain ( topic 1 ) ĊĠĠĠĠĠĠĠ Ġsystem Table Names . should Not Contain ( topic 2 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġtable Ġregex Ġwhen Ġlisting Ġtables " Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlets Ġadd Ġsome Ġof Ġour Ġown Ġtables Ġand Ġmake Ġsure Ġthey Ġappear Ġin Ġthe Ġlist Ġof Ġall ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= ĠSchema Builder . record (" w ib ble "). fields (). required String (" foo "). end Record () ĊĠĠĠĠĠĠĠ Ġval Ġproducer Ġ= ĠKafka Producer < String , ĠGeneric Data . Record >( producer Props ()) ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠGeneric Data . Record ( schema ) ĊĠĠĠĠĠĠĠ Ġrecord . put (" foo ", Ġ" a ") ĊĊĠĠĠĠĠĠĠ Ġproducer . send ( Producer Record < String , ĠGeneric Data . Record >(" topic regex _ d ib ble ", Ġ" key 1 ", Ġrecord )) ĊĠĠĠĠĠĠĠ Ġproducer . send ( Producer Record < String , ĠGeneric Data . Record >(" topic regex _ dob ble ", Ġ" key 1 ", Ġrecord )) ĊĠĠĠĠĠĠĠ Ġproducer . send ( Producer Record < String , ĠGeneric Data . Record >(" topic regex _ d ubble ", Ġ" key 1 ", Ġrecord )) ĊĠĠĠĠĠĠĠ Ġproducer . close () ĊĊĠĠĠĠĠĠĠ Ġval Ġtable Names Ġ= ĠresultSet List ( conn . metaData . get Tables ( null , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" topic regex _ d %", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull )). map Ġ{ Ġit [ 2 ]. toString () Ġ} ĊĠĠĠĠĠĠĠ Ġtable Names . size ĠshouldBe Ġ 3 ĊĠĠĠĠĠĠĠ Ġtable Names . should Contain All (" topic regex _ d ib ble ", Ġ" topic regex _ dob ble ", Ġ" topic regex _ d ubble ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġlisting Ġcolumns Ġwith Ġcorrect Ġtypes " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġconn . metaData . get Columns ( null , Ġnull , Ġnull , Ġnull ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" Vendor ID " Ġ} ĊĠĠĠĠĠĠĠ Ġcurrency [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġcurrency [ 5 ] ĠshouldBe Ġ" INT " ĊĊĠĠĠĠĠĠĠ Ġval Ġmerchant Id Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" t pep _ pickup _ datetime " Ġ} ĊĠĠĠĠĠĠĠ Ġmerchant Id [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġmerchant Id [ 5 ] ĠshouldBe Ġ" STRING " ĊĊĠĠĠĠĠĠĠ Ġval Ġblocked Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" trip _ distance " Ġ} ĊĠĠĠĠĠĠĠ Ġblocked [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġblocked [ 5 ] ĠshouldBe Ġ" DOUBLE " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġlisting Ġcolumns Ġusing Ġtable Ġregex " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġconn . metaData . get Columns ( null , Ġnull , Ġtax i Topic , Ġnull ). toList () ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" Vendor ID " Ġ} ĊĠĠĠĠĠĠĠ Ġcurrency [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġcurrency [ 5 ] ĠshouldBe Ġ" INT " ĊĊĠĠĠĠĠĠĠ Ġval Ġmerchant Id Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" t pep _ pickup _ datetime " Ġ} ĊĠĠĠĠĠĠĠ Ġmerchant Id [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġmerchant Id [ 5 ] ĠshouldBe Ġ" STRING " ĊĊĠĠĠĠĠĠĠ Ġval Ġblocked Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" trip _ distance " Ġ} ĊĠĠĠĠĠĠĠ Ġblocked [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġblocked [ 5 ] ĠshouldBe Ġ" DOUBLE " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġlisting Ġcolumns Ġusing Ġcolumn Ġregex " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġconn . metaData . get Columns ( null , Ġnull , Ġnull , Ġ" Vendor ID "). toList () ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" Vendor ID " Ġ} ĊĠĠĠĠĠĠĠ Ġcurrency [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġcurrency [ 5 ] ĠshouldBe Ġ" INT " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" support Ġlisting Ġcolumns Ġusing Ġtable Ġand Ġcolumn Ġregex " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġconn . metaData . get Columns ( null , Ġnull , Ġtax i Topic , Ġ" Vendor ID "). toList () ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġcolumns . filter Ġ{ Ġit [ 2 ] Ġ== Ġtax i Topic Ġ}. first Ġ{ Ġit [ 3 ] Ġ== Ġ" Vendor ID " Ġ} ĊĠĠĠĠĠĠĠ Ġcurrency [ 4 ] ĠshouldBe Ġjava . sql . Types . OTHER ĊĠĠĠĠĠĠĠ Ġcurrency [ 5 ] ĠshouldBe Ġ" INT " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" return Ġversioning Ġinformation " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . database Major Version ĠshouldBe Ġg te ( 1 ) ĊĠĠĠĠĠĠĠ Ġconn . metaData . database Minor Version ĠshouldBe Ġg te ( 1 ) ĊĠĠĠĠĠĠĠ Ġconn . metaData . driver Major Version ĠshouldBe Ġ 3 ĊĠĠĠĠĠĠĠ Ġconn . metaData . driver Minor Version ĠshouldBe Ġ 0 ĊĠĠĠĠĠĠĠ Ġconn . metaData . database ProductName ĠshouldBe ĠConstants . ProductName ĊĠĠĠĠĠĠĠ Ġconn . metaData . jdbc Major Version ĠshouldBe Ġ 4 ĊĠĠĠĠĠĠĠ Ġconn . metaData . jdbc Minor Version ĠshouldBe Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" not Ġsupport Ġbatch Ġupdates " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . supports Batch Updates () ĠshouldBe Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ" be Ġread Ġonly " Ġ{ ĊĠĠĠĠĠĠĠ Ġconn . metaData . is ReadOnly ĠshouldBe Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Tax i Topic ( conn : ĠConnection ): ĠString Ġ{ ĊĠĠĠ Ġval Ġtopic Ġ= Ġnew Topic Name () ĊĠĠĠ Ġconn . createStatement (). executeQuery (""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Ġtable Ġ$ topic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ key Ġstring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVendor ID Ġint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt pep _ pickup _ datetime Ġstring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt pep _ dro po ff _ datetime Ġstring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass enger _ count Ġint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrip _ distance Ġdouble , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpick up _ longitude Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpick up _ latitude Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRate Code ID Ġint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore _ and _ fwd _ flag Ġstring , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdro po ff _ longitude Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdro po ff _ latitude Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayment _ type Ġint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf are _ amount Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ta _ tax Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimprovement _ sur charge Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtip _ amount Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtol ls _ amount Ġdouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal _ amount Ġdouble ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ( string , Ġav ro ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ()). toList (). should Have Size ( 1 ) ĊĠĠĠ Ġreturn Ġtopic ĊĠ Ġ} Ċ }