package Ġorg . jetbrains . ex posed . sql . tests . shared . d ml Ċ Ċ import Ġorg . jetbrains . ex posed . dao . id . Int Id Table Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . tests . Database Tests Base Ċ import Ġorg . jetbrains . ex posed . sql . tests . shared . assertEquals Ċ import Ġorg . jetbrains . ex posed . sql . tests . shared . expect Exception Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠJoin Tests Ġ: ĠDatabase Tests Base () Ġ{ ĊĠĠĠ Ġ// Ġmanual Ġjoin ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join 0 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( users Ġinner Join Ġcities ). slice ( users . name , Ġcities . name ). select Ġ{ Ġ( users . id . eq (" and rey ") Ġor Ġusers . name . eq (" Ser ge y ")) Ġand Ġusers . city Id . eq ( cities . id ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġit [ users . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcity Name Ġ= Ġit [ cities . name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( userName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" And rey " Ġ-> ĠassertEquals (" St . ĠPet ers burg ", Ġcity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ser ge y " Ġ-> ĠassertEquals (" M un ich ", Ġcity Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġuser Ġ$ userName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġjoin Ġwith Ġforeign Ġkey ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join 0 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Pet ers burg User Ġ= Ġ( users Ġinner Join Ġcities ). slice ( users . name , Ġusers . city Id , Ġcities . name ). select Ġ{ Ġcities . name . eq (" St . ĠPet ers burg ") Ġor Ġusers . city Id . isNull () Ġ}. single () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" And rey ", Ġst Pet ers burg User [ users . name ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" St . ĠPet ers burg ", Ġst Pet ers burg User [ cities . name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtriple Ġjoin ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join 0 3 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ( cities Ġinner Join Ġusers Ġinner Join ĠuserData ). selectAll (). orderBy ( users . id ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġr . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" E ug ene ", Ġr [ 0 ][ users . name ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Comment Ġfor ĠE ug ene ", Ġr [ 0 ][ userData . comment ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" M un ich ", Ġr [ 0 ][ cities . name ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Ser ge y ", Ġr [ 1 ][ users . name ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Comment Ġfor ĠSer ge y ", Ġr [ 1 ][ userData . comment ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" M un ich ", Ġr [ 1 ][ cities . name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtriple Ġjoin ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join 0 4 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠNumbers Ġ= Ġobject Ġ: ĠTable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġinteger (" id "). primaryKey () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠNames Ġ= Ġobject Ġ: ĠTable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġvarchar (" name ", Ġ 1 0 ). primaryKey () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠMap Ġ= Ġobject Ġ: ĠTable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid _ ref Ġ= Ġinteger (" id _ ref ") Ġreferences ĠNumbers . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname _ ref Ġ= Ġvarchar (" name _ ref ", Ġ 1 0 ) Ġreferences ĠNames . name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Tables ( Numbers , ĠNames , ĠMap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNumbers . insert Ġ{ Ġit [ id ] Ġ= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNumbers . insert Ġ{ Ġit [ id ] Ġ= Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . insert Ġ{ Ġit [ name ] Ġ= Ġ" Foo " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . insert Ġ{ Ġit [ name ] Ġ= Ġ" Bar " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMap . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ id _ ref ] Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ name _ ref ] Ġ= Ġ" Foo " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ( Numbers Ġinner Join ĠMap Ġinner Join ĠNames ). selectAll (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġr . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġr [ 0 ][ Numbers . id ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Foo ", Ġr [ 0 ][ Names . name ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcross Ġjoin ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join 0 5 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Users To St Pet ers burg Ġ= Ġ( users Ġcross Join Ġcities ). slice ( users . name , Ġusers . city Id , Ġcities . name ). select Ġ{ Ġcities . name . eq (" St . ĠPet ers burg ") Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ users . name ] Ġto Ġit [ cities . name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Users Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" And rey ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ser ge y ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" E ug ene ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Alex ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Something " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Users To St Pet ers burg . all Ġ{ Ġit . second Ġ== Ġ" St . ĠPet ers burg " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( all Users , Ġall Users To St Pet ers burg . map Ġ{ Ġit . first Ġ}. toSet ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Reference Join 0 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfoo Ġ= Ġobject Ġ: ĠInt Id Table (" foo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbaz Ġ= Ġinteger (" baz "). unique Index () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbar Ġ= Ġobject Ġ: ĠInt Id Table (" bar ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo Ġ= Ġreference (" foo ", Ġfoo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbaz Ġ= Ġinteger (" baz ") Ġreferences Ġfoo . baz ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwith Tables ( foo , Ġbar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo Id Ġ= Ġfoo . insert AndGet Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ baz ] Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbar . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ this . foo ] Ġ= Ġfoo Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ baz ] Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfoo . inner Join ( bar ). selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 L , Ġresult . count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Reference Join 0 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfoo Ġ= Ġobject Ġ: ĠInt Id Table (" foo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbaz Ġ= Ġinteger (" baz "). unique Index () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbar Ġ= Ġobject Ġ: ĠInt Id Table (" bar ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo Ġ= Ġreference (" foo ", Ġfoo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo 2 Ġ= Ġreference (" foo 2 ", Ġfoo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbaz Ġ= Ġinteger (" baz ") Ġreferences Ġfoo . baz ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwith Tables ( foo , Ġbar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Exception < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo Id Ġ= Ġfoo . insert AndGet Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ baz ] Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ this . foo ] Ġ= Ġfoo Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ this . foo 2 ] Ġ= Ġfoo Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ baz ] Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfoo . inner Join ( bar ). selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 L , Ġresult . count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join With Alias 0 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Alias Ġ= Ġusers . alias (" u 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Row Ġ= ĠJoin ( users ). join ( users Alias , ĠJoin Type . LEFT , Ġusers Alias [ users . id ], Ġstring Literal (" sm th ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ Ġusers . id Ġeq Ġ" alex " Ġ}. single () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( result Row [ users . name ] Ġ== Ġ" Alex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( result Row [ users Alias [ users . name ]] Ġ== Ġ" Something ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join With Join 0 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġ( cities Ġinner Join Ġ( users Ġinner Join ĠuserData )). selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 L , Ġrows . count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Join With Additional Constraint () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith C ities And Users Ġ{ Ġcities , Ġusers , ĠuserData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Alias Ġ= Ġusers . alias (" name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjoin Ġ= Ġcities . join ( users Alias , ĠJoin Type . INNER , Ġcities . id , Ġusers Alias [ users . city Id ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcities . id Ġgreater Ġ 1 Ġand Ġ( cities . name . neq ( users Alias [ users . name ])) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 L , Ġjoin . selectAll (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest No Warnings On Left Join Regression (){ ĊĠĠĠĠĠĠĠ Ġval ĠMain Table Ġ= Ġobject Ġ: ĠTable (" maint able "){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġinteger (" id Col ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠJoin Table Ġ= Ġobject Ġ: ĠTable (" joint able "){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġinteger (" id Col ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġinteger (" data Col "). default ( 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Tables ( Main Table , ĠJoin Table ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Table . insert Ġ{ Ġit [ id ] Ġ= Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Table . join ( Join Table , ĠJoin Type . LEFT , ĠJoin Table . id , ĠMain Table . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. slice ( Join Table . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrNull ( Join Table . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġno Ġlogging Ġtook Ġplace . ĠNo Ġidea Ġhow Ġto . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }