package Ġnet . cord a . node . utilities Ċ Ċ import Ġnet . cord a . core . serialization . Serialized Bytes Ċ import Ġnet . cord a . core . serialization . deserialize Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . serialization . storage K ry o Ċ import Ġnet . cord a . core . utilities . logger For Ċ import Ġnet . cord a . core . utilities . trace Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . statements . Insert Statement Ċ import Ġorg . jetbrains . ex posed . sql . transactions . Transaction Manager Ċ import Ġjava . sql . Blob Ċ import Ġjava . util .* Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ /** Ċ Ġ* ĠThe Ġclasses Ġin Ġthis Ġfile Ġprovide Ġa Ġconvenient Ġway Ġto Ġquickly Ġimplement Ġpersistence Ġfor Ġmap - Ġand Ġset - like Ċ Ġ* Ġcollections Ġof Ġdata . Ġ ĠThese Ġmight Ġnot Ġbe Ġsufficient Ġfor Ġthe Ġevent ual Ġimplementations Ġof Ġpersistence Ġdependent Ġon Ċ Ġ* Ġaccess Ġpatterns Ġand Ġperformance Ġrequirements . Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault Ġmaximum Ġsize Ġof Ġthe ĠL RU Ġcache . Ċ Ġ* ĠCurrent Ġcomputation Ġis Ġlinear Ġto Ġmax Ġheap Ġsize , Ġensuring Ġa Ġminimum Ġof Ġ 2 5 6 Ġbuckets . Ċ Ġ* Ċ Ġ* ĠTODO : Ġmake Ġthis Ġvalue Ġconfigurable Ċ Ġ* ĠTODO : Ġtune Ġthis Ġvalue , Ġas Ġit 's Ġcurrently Ġmostly Ġa Ġguess Ċ Ġ*/ Ċ val ĠDEFAULT _ MAX _ BUCKET S Ġ= Ġ( 2 5 6 Ġ* Ġ( 1 Ġ+ ĠMath . max ( 0 , Ġ( Runtime . get Runtime (). max Memory () Ġ/ Ġ 1 0 0 0 0 0 0 Ġ- Ġ 1 2 8 ) Ġ/ Ġ 6 4 ))). toInt () Ċ Ċ /** Ċ Ġ* ĠA Ġconvenient ĠJDBC Ġtable Ġbacked Ġhash Ġmap Ġwith Ġiteration Ġorder Ġbased Ġon Ġinsertion Ġorder . Ċ Ġ* ĠSee Ġ[ Abstract J DB CH ash Map ] Ġfor Ġfurther Ġimplementation Ġdetails . Ċ Ġ* Ċ Ġ* ĠIn Ġthis Ġsubclass , Ġkeys Ġand Ġvalues Ġare Ġrepresented Ġby ĠBlob s Ġof ĠK ry o Ġserialized Ġforms Ġof Ġthe Ġkey Ġand Ġvalue Ġobjects . Ċ Ġ* ĠIf Ġyou Ġcan Ġextend Ġ[ Abstract J DB CH ash Map ] Ġand Ġimplement Ġless ĠK ry o Ġdependent Ġkey Ġand / or Ġvalue Ġmappings Ġthen Ġthat Ġis Ċ Ġ* Ġlikely Ġpref err able . Ċ Ġ*/ Ċ class ĠJ DB CH ash Map < K Ġ: ĠAny , ĠV Ġ: ĠAny >( tableName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload OnInit : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Buckets : ĠInt Ġ= ĠDEFAULT _ MAX _ BUCKET S ) ĊĠĠĠ Ġ: ĠAbstract J DB CH ash Map < K , ĠV , ĠJ DB CH ash Map . Blob Map Table >( Blob Map Table ( tableName ), Ġload OnInit , Ġmax Buckets ) Ġ{ ĊĊĠĠĠ Ġclass ĠBlob Map Table ( tableName : ĠString ) Ġ: ĠJ DB CH ashed Table ( tableName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġblob (" key ") ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġblob (" value ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġkey From Row ( row : ĠResult Row ): ĠK Ġ= Ġdeserialize From Blob ( row [ table . key ]) ĊĠĠĠ Ġoverride Ġfun Ġvalue From Row ( row : ĠResult Row ): ĠV Ġ= Ġdeserialize From Blob ( row [ table . value ]) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Key To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠV >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert [ table . key ] Ġ= Ġserialize To Blob ( entry . key , Ġfinal izable s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Value To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠV >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert [ table . value ] Ġ= Ġserialize To Blob ( entry . value , Ġfinal izable s ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġbytes To Blob ( value : ĠSerialized Bytes <* >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >): ĠBlob Ġ{ ĊĠĠĠ Ġval Ġblob Ġ= ĠTransaction Manager . current (). connection . create Blob () ĊĠĠĠ Ġfinal izable s Ġ+= Ġ{ Ġblob . free () Ġ} ĊĠĠĠ Ġblob . set Bytes ( 1 , Ġvalue . bytes ) ĊĠĠĠ Ġreturn Ġblob Ċ } Ċ Ċ fun Ġserialize To Blob ( value : ĠAny , Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >): ĠBlob Ġ= Ġbytes To Blob ( value . serialize ( storage K ry o (), Ġtrue ), Ġfinal izable s ) Ċ Ċ fun Ġ< T Ġ: ĠAny > Ġbytes From Blob ( blob : ĠBlob ): ĠSerialized Bytes < T > Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSerialized Bytes ( blob . getBytes ( 0 , Ġblob . length (). toInt ()), Ġtrue ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġblob . free () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > Ġdeserialize From Blob ( blob : ĠBlob ): ĠT Ġ= Ġbytes From Blob < T >( blob ). deserialize () Ċ Ċ /** Ċ Ġ* ĠA Ġconvenient ĠJDBC Ġtable Ġbacked Ġhash Ġset Ġwith Ġiteration Ġorder Ġbased Ġon Ġinsertion Ġorder . Ċ Ġ* ĠSee Ġ[ Abstract J DB CH ash Set ] Ġand Ġ[ Abstract J DB CH ash Map ] Ġfor Ġfurther Ġimplementation Ġdetails . Ċ Ġ* Ċ Ġ* ĠIn Ġthis Ġsubclass , Ġelements Ġare Ġrepresented Ġby ĠBlob s Ġof ĠK ry o Ġserialized Ġforms Ġof Ġthe Ġelement Ġobjects . Ċ Ġ* ĠIf Ġyou Ġcan Ġextend Ġ[ Abstract J DB CH ash Set ] Ġand Ġimplement Ġless ĠK ry o Ġdependent Ġelement Ġmappings Ġthen Ġthat Ġis Ċ Ġ* Ġlikely Ġpref err able . Ċ Ġ*/ Ċ class ĠJ DB CH ash Set < K Ġ: ĠAny >( tableName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload OnInit : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Buckets : ĠInt Ġ= ĠDEFAULT _ MAX _ BUCKET S ) ĊĠĠĠ Ġ: ĠAbstract J DB CH ash Set < K , ĠJ DB CH ash Set . Blob Set Table >( Blob Set Table ( tableName ), Ġload OnInit , Ġmax Buckets ) Ġ{ ĊĊĠĠĠ Ġclass ĠBlob Set Table ( tableName : ĠString ) Ġ: ĠJ DB CH ashed Table ( tableName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġblob (" key ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġelement From Row ( row : ĠResult Row ): ĠK Ġ= Ġdeserialize From Blob ( row [ table . key ]) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Element To Insert ( insert : ĠInsert Statement , Ġentry : ĠK , Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert [ table . key ] Ġ= Ġserialize To Blob ( entry , Ġfinal izable s ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor ĠJDBC Ġbacked Ġhash Ġset Ġthat Ġdeleg ates Ġto Ġa ĠJDBC Ġbacked Ġhash Ġmap Ġwhere Ġthe Ġvalues Ġare Ġall Ċ Ġ* Ġ[ Unit ] Ġand Ġnot Ġactually Ġpersisted . Ġ ĠIteration Ġorder Ġis Ġorder Ġof Ġinsertion . Ġ ĠIter ators Ġcan Ġremove (). Ċ Ġ* Ċ Ġ* ĠSee Ġ[ Abstract J DB CH ash Map ] Ġfor Ġimplementation Ġdetails . Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract J DB CH ash Set < K Ġ: ĠAny , Ġout ĠT Ġ: ĠJ DB CH ashed Table >( protected Ġval Ġtable : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ Ġload OnInit : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠ Ġmax Buckets : ĠInt Ġ= ĠDEFAULT _ MAX _ BUCKET S ) Ġ: ĠMutable Set < K >, ĠAbstract Set < K >() Ġ{ ĊĠĠĠ Ġprotected Ġval Ġinner Map Ġ= Ġobject Ġ: ĠAbstract J DB CH ash Map < K , ĠUnit , ĠT >( table , Ġload OnInit , Ġmax Buckets ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġkey From Row ( row : ĠResult Row ): ĠK Ġ= Ġthis @ Abstract J DB CH ash Set . element From Row ( row ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġconstant . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvalue From Row ( row : ĠResult Row ) Ġ= ĠUnit ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Key To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠUnit >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract J DB CH ash Set . addElement To Insert ( insert , Ġentry . key , Ġfinal izable s ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġop Ġas Ġnot Ġactually Ġpersisted . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Value To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠUnit >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠK ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inner Map . containsKey ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Map . put ( element , ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġinner Map . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < K > Ġ= Ġinner Map . keys . iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠK ): ĠBoolean Ġ= Ġ( inner Map . remove ( element ) Ġ!= Ġnull ) ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġinner Map . size ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠK ): ĠBoolean Ġ= Ġinner Map . containsKey ( element ) ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġinner Map . isEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġreturn Ġthe Ġelement Ġobject Ġmarshal led Ġfrom Ġthe Ġdatabase Ġtable Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Set ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġelement From Row ( row : ĠResult Row ): ĠK ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġmarshall Ġthe Ġelement Ġto Ġthe Ġinsert Ġstatement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġsome Ġcleanup Ġis Ġrequired Ġafter Ġthe Ġinsert Ġstatement Ġis Ġexecuted , Ġsuch Ġas Ġclosing Ġa ĠBlob , Ġthen Ġadd Ġa Ġclosure ĊĠĠĠĠ Ġ* Ġto Ġthe Ġfinal izable s Ġto Ġdo Ġso . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Set ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġadd Element To Insert ( insert : ĠInsert Statement , Ġentry : ĠK , Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġbase Ġclass Ġfor Ġa ĠJDBC Ġtable Ġbacked Ġhash Ġmap Ġthat Ġiter ates Ġin Ġinsertion Ġorder Ġby Ġusing Ċ Ġ* Ġan Ġever Ġincreasing Ġsequence Ġnumber Ġon Ġentries . Ġ ĠIter ators Ġsupports Ġremove () Ġbut Ġentries Ġare Ġnot Ġreally Ġmutable Ġand Ċ Ġ* Ġdo Ġnot Ġsupport ĠsetValue () Ġmethod Ġfrom Ġ[ Mutable Map . Mutable Entry ]. Ċ Ġ* Ċ Ġ* ĠYou Ġshould Ġonly Ġuse Ġkeys Ġthat Ġhave Ġoverridden Ġ[ Object . hashCode ] Ġand Ġthat Ġhave Ġa Ġgood Ġhash Ġcode Ġdistribution . Ġ ĠB ew are Ċ Ġ* Ġchanging Ġthe ĠhashCode () Ġimplementation Ġonce Ġobjects Ġhave Ġbeen Ġpersisted . Ġ ĠA Ġprocess Ġto Ġre - hash Ġthe Ġentries Ġpersisted Ċ Ġ* Ġwould Ġbe Ġnecessary Ġif Ġyou Ġdo Ġthis . Ċ Ġ* Ċ Ġ* ĠSub classes Ġmust Ġprovide Ġtheir Ġown Ġmapping Ġto Ġand Ġfrom Ġkeys / values Ġand Ġthe Ġdatabase Ġtable Ġcolumns , Ġbut Ġthere Ġare Ċ Ġ* Ġinherited Ġcolumns Ġthat Ġall Ġtables Ġmust Ġprovide Ġto Ġsupport Ġiteration Ġorder Ġand Ġhashing . Ċ Ġ* Ċ Ġ* ĠThe Ġmap Ġoper ates Ġin Ġone Ġof Ġtwo Ġmodes . Ċ Ġ* Ġ 1 . Ġload OnInit = true Ġwhere Ġthe Ġentire Ġtable Ġis Ġloaded Ġinto Ġmemory Ġin Ġthe Ġconstructor Ġand Ġall Ġentries Ġremain Ġin Ġmemory , Ċ Ġ* Ġwith Ġonly Ġwrites Ġneeding Ġto Ġperform Ġdatabase Ġaccess . Ċ Ġ* Ġ 2 . Ġload OnInit = false Ġwhere Ġall Ġentries Ġwith Ġthe Ġsame Ġkey Ġhash Ġcode Ġare Ġloaded Ġfrom Ġthe Ġdatabase Ġon Ġdemand Ġwhen Ġaccessed Ċ Ġ* Ġvia Ġany Ġmethod Ġother Ġthan Ġvia Ġkeys / values / entries Ġproperties , Ġand Ġthus Ġthe Ġwhole Ġmap Ġis Ġnot Ġloaded Ġinto Ġmemory . Ġ ĠThe Ġnumber Ċ Ġ* Ġof Ġentries Ġretained Ġin Ġmemory Ġis Ġcontrolled Ġindirect ly Ġby Ġan ĠL RU Ġalgorithm Ġ( cour tes y Ġof Ġ[ Linked HashMap ]) Ġand Ġa Ġmaximum Ċ Ġ* Ġnumber Ġof Ġhash Ġ" buckets ", Ġwhere Ġone Ġbucket Ġrepresents Ġall Ġentries Ġwith Ġthe Ġsame Ġhash Ġcode . Ġ ĠThere Ġis Ġa Ġdefault Ġvalue Ċ Ġ* Ġfor Ġmaximum Ġbuckets . Ċ Ġ* Ċ Ġ* ĠAll Ġoperations Ġrequire Ġa Ġ[ transaction ] Ġto Ġbe Ġstarted . Ċ Ġ* Ċ Ġ* ĠThe Ġkeys / values / entries Ġcollections Ġare Ġreally Ġdesigned Ġjust Ġfor Ġiter ating Ġand Ġother Ġuses Ġmight Ġturn Ġout Ġto Ġbe Ċ Ġ* Ġcost ly Ġin Ġterms Ġof Ġperformance . Ġ ĠB ew are Ġwhen Ġload OnInit = true , Ġthe Ġiterator Ġfirst Ġsorts Ġthe Ġentries Ġwhich Ġcould Ġbe Ċ Ġ* Ġcost ly Ġtoo . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġ* not * Ġthread Ġsafe . Ċ Ġ* Ċ Ġ* ĠTODO : Ġconsider Ġcaching Ġsize Ġonce Ġcalculated Ġfor Ġthe Ġfirst Ġtime . Ċ Ġ* ĠTODO : Ġbuckets Ġjust Ġuse Ġa Ġlist Ġand Ġso Ġare Ġvulner able Ġto Ġpoor Ġhash Ġcode Ġimplementations Ġwith Ġcollisions . Ċ Ġ* ĠTODO : Ġif Ġiterators Ġare Ġused Ġextens ively Ġwhen Ġload OnInit = true , Ġconsider Ġmaintaining Ġa Ġcollection Ġof Ġkeys Ġin Ġiteration Ġorder Ġto Ġavoid Ġsorting Ġeach Ġtime . Ċ Ġ* ĠTODO : Ġre visit Ġwhether Ġwe Ġneed Ġthe Ġload OnInit == true Ġfunctionality Ġand Ġremove Ġif Ġnot . Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract J DB CH ash Map < K Ġ: ĠAny , ĠV Ġ: ĠAny , Ġout ĠT Ġ: ĠJ DB CH ashed Table >( val Ġtable : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload OnInit : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Buckets : ĠInt Ġ= ĠDEFAULT _ MAX _ BUCKET S ) Ġ: ĠMutable Map < K , ĠV >, ĠAbstract Map < K , ĠV >() Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġlog Ġ= Ġlogger For < Abstract J DB CH ash Map < *, Ġ*, Ġ* >>() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINITIAL _ CAP ACITY : ĠInt Ġ= Ġ 1 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOAD _ FACTOR : ĠFloat Ġ= Ġ 0 . 7 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHash Ġcode Ġ-> Ġentries Ġmapping . ĊĠĠĠ Ġ// ĠWhen Ġload OnInit Ġ= Ġfalse , Ġsize Ġwill Ġbe Ġlimited Ġto Ġmax Buckets Ġentries Ġ( which Ġare Ġhash Ġbuckets ) Ġand Ġmap Ġmaintains Ġaccess Ġorder Ġrather Ġthan Ġinsertion Ġorder . ĊĠĠĠ Ġprivate Ġval Ġbuckets Ġ= Ġobject Ġ: ĠLinkedHashMap < Int , ĠMutable List < Not Re ally Mutable Entry < K , ĠV >> >( INITIAL _ CAP ACITY , ĠLOAD _ FACTOR , Ġ! load OnInit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove El dest Entry ( el dest : ĠMutable Map . Mutable Entry < Int , ĠMutable List < Not Re ally Mutable Entry < K , ĠV >>> ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! load OnInit Ġ&& Ġsize Ġ> Ġmax Buckets ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( max Buckets Ġ> Ġ 0 ) Ġ{ Ġ" The Ġmaximum Ġnumber Ġof Ġbuckets Ġto Ġretain Ġin Ġmemory Ġmust Ġbe Ġa Ġpositive Ġinteger ." Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠMove Ġthis Ġto Ġschema Ġversion Ġman ag ment Ġtool . ĊĠĠĠĠĠĠĠ Ġcreate Tables If Ne cessary () ĊĠĠĠĠĠĠĠ Ġif Ġ( load OnInit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Loading Ġall Ġentries Ġon Ġinit Ġfor Ġ${ table . tableName }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelapsed Millis Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġfrom Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . selectAll (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġcreate Entry ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġget Bucket ( entry . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket . add ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Loaded Ġ$ size Ġentries Ġon Ġinit Ġfor Ġ${ table . tableName } Ġin Ġ$ elapsed Millis Ġmillis ." Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Tables If Ne cessary () Ġ{ ĊĠĠĠĠĠĠĠ ĠSchema Utils . create ( table ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( bucket Ġin Ġbuckets . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bucket . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsize Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġget Bucket ( key ) ĊĠĠĠĠĠĠĠ Ġvar Ġremoved : ĠV ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġbuckets . compute If Present ( key . hashCode ()) Ġ{ Ġ_, Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . key Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket . remove ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Record ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġremoved ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains Key ( key : ĠK ): ĠBoolean Ġ= Ġ( get ( key ) Ġ!= Ġnull ) ĊĊĠĠĠ Ġ// ĠWe Ġhaven 't Ġimplemented ĠsetValue . Ġ ĠWe Ġcould Ġimplement Ġif Ġnecessary . ĊĠĠĠ Ġ// ĠMake Ġsure Ġto Ġremove Ġthe Ġrelevant Ġsupp ressed Ġtests Ġin ĠJ DB CH ash Map TestSuite . create Map TestSuite Ġif Ġthis Ġis Ġimplemented . ĊĠĠĠ Ġprivate Ġclass ĠNot Re ally Mutable Entry < K , ĠV >( key : ĠK , Ġvalue : ĠV , Ġval Ġseq No : ĠInt ) Ġ: ĠAbstract Map . Simple Immutable Entry < K , ĠV >( key , Ġvalue ), ĠMutable Map . Mutable Entry < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( newValue : ĠV ): ĠV Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġreally Ġmutable . Ġ ĠImplement Ġif Ġreally Ġrequired .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠEntry Iterator Ġ: ĠMutable Iterator < Mutable Map . Mutable Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġiterator Ġ= Ġif Ġ( load OnInit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuckets . values . flatten (). sorted By Ġ{ Ġit . seq No Ġ}. iterator () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġuses Ġa ĠSequence Ġto Ġmake Ġthe Ġmapping Ġlazy . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . selectAll (). orderBy ( table . seq No ). as Sequence (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġbuckets [ it [ table . key Hash ]] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bucket Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq No Ġ= Ġit [ table . seq No ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġbucket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . seq No Ġ== Ġseq No ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġcreate Entry ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. iterator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent : ĠMutable Map . Mutable Entry < K , ĠV >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġiterator . hasNext () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠMutable Map . Mutable Entry < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextracted Next Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġextracted Next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġextracted Next ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Current Ġ= Ġcurrent Ġ?: Ġthrow ĠIllegalStateException (" Not Ġcalled Ġnext () Ġyet Ġor Ġalready Ġremoved .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( saved Current . key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġkeys : ĠMutable Set < K > Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠAbstract Set < K >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġthis @ Abstract J DB CH ash Map . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < K > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMutable Iterator < K > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġentry Iterator Ġ= ĠEntry Iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġentry Iterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠK Ġ= Ġentry Iterator . next (). key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Iterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġvalues : ĠMutable Collection < V > Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠAbstract Collection < V >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġthis @ Abstract J DB CH ash Map . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < V > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMutable Iterator < V > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġentry Iterator Ġ= ĠEntry Iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġentry Iterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠV Ġ= Ġentry Iterator . next (). value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Iterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġentries : ĠMutable Set < Mutable Map . Mutable Entry < K , ĠV >> Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠAbstract Set < Mutable Map . Mutable Entry < K , ĠV >>() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġthis @ Abstract J DB CH ash Map . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < Mutable Map . Mutable Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMutable Iterator < Mutable Map . Mutable Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġentry Iterator Ġ= ĠEntry Iterator () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġentry Iterator . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠMutable Map . Mutable Entry < K , ĠV > Ġ= Ġentry Iterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Iterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠoldValue : ĠV ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġold Seq No : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget Bucket ( key ) ĊĠĠĠĠĠĠĠ Ġbuckets . compute ( key . hashCode ()) Ġ{ Ġ_, Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġlist Ġ?: Ġnew Bucket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġnew List . list Iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . key Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Seq No Ġ= Ġentry . seq No ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Record ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq No Ġ= Ġadd Record ( key , Ġvalue , Ġold Seq No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Entry Ġ= ĠNot Re ally Mutable Entry < K , ĠV >( key , Ġvalue , Ġseq No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew List . add ( new Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠoldValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains Value ( value : ĠV ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( stored Value Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stored Value Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( load OnInit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuckets . values . map Ġ{ Ġit . size Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . slice ( table . seq No ). selectAll (). count () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! load OnInit Ġ|| Ġ! isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuckets . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( entry Key , Ġvalue ) Ġin Ġget Bucket ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Key Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bucket ( key : ĠAny ): ĠMutable List < Not Re ally Mutable Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuckets . compute If Absent ( key . hashCode ()) Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! load OnInit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Bucket ( key . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Bucket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Bucket (): ĠMutable List < Not Re ally Mutable Entry < K , ĠV >> Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġfun Ġload Bucket ( hashCode : ĠInt ): ĠMutable List < Not Re ally Mutable Entry < K , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtable . select Ġ{ Ġtable . key Hash . eq ( hashCode ) Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Entry ( it ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List < Not Re ally Mutable Entry < K , ĠV >>() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġreturn Ġthe Ġkey Ġobject Ġmarshal led Ġfrom Ġthe Ġdatabase Ġtable Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Map ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġkey From Row ( row : ĠResult Row ): ĠK ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġreturn Ġthe Ġvalue Ġobject Ġmarshal led Ġfrom Ġthe Ġdatabase Ġtable Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Map ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġvalue From Row ( row : ĠResult Row ): ĠV ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġmarshall Ġthe Ġkey Ġto Ġthe Ġinsert Ġstatement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġsome Ġcleanup Ġis Ġrequired Ġafter Ġthe Ġinsert Ġstatement Ġis Ġexecuted , Ġsuch Ġas Ġclosing Ġa ĠBlob , Ġthen Ġadd Ġa Ġclosure ĊĠĠĠĠ Ġ* Ġto Ġthe Ġfinal izable s Ġto Ġdo Ġso . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Map ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġadd Key To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠV >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImplementation Ġshould Ġmarshall Ġthe Ġvalue Ġto Ġthe Ġinsert Ġstatement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġsome Ġcleanup Ġis Ġrequired Ġafter Ġthe Ġinsert Ġstatement Ġis Ġexecuted , Ġsuch Ġas Ġclosing Ġa ĠBlob , Ġthen Ġadd Ġa Ġclosure ĊĠĠĠĠ Ġ* Ġto Ġthe Ġfinal izable s Ġto Ġdo Ġso . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġexample Ġimplementations Ġin Ġ[ J DB CH ash Map ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġadd Value To Insert ( insert : ĠInsert Statement , Ġentry : ĠMap . Entry < K , ĠV >, Ġfinal izable s : ĠMutable List < () Ġ-> ĠUnit >) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Entry ( it : ĠResult Row ) Ġ= ĠNot Re ally Mutable Entry < K , ĠV >( key From Row ( it ), Ġvalue From Row ( it ), Ġit [ table . seq No ]) ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Record ( entry : ĠNot Re ally Mutable Entry < K , ĠV >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable . delete Where Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable . seq No Ġeq Ġentry . seq No ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Record ( key : ĠK , Ġvalue : ĠV , Ġold Seq No : ĠInt ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal izable s Ġ= Ġmutable ListOf < () Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtable . insert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ key Hash ] Ġ= Ġkey . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠSimple Entry < K , ĠV >( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Key To Insert ( it , Ġentry , Ġfinal izable s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Value To Insert ( it , Ġentry , Ġfinal izable s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Seq No Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ seq No ] Ġ= Ġold Seq No ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . generated Key Ġ= Ġold Seq No ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġget Ġtable . seq No ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal izable s . forEach Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠJ DB CH ashed Table ( tableName : ĠString ) Ġ: ĠTable ( tableName ) Ġ{ ĊĠĠĠ Ġval Ġkey Hash Ġ= Ġinteger (" key _ hash "). index () ĊĠĠĠ Ġval Ġseq No Ġ= Ġinteger (" seq _ no "). auto Increment (). index (). primaryKey () Ċ } Ċ