package Ġcom . dan il afe . kt star bound . data Ċ Ċ import Ġcom . dan il afe . kt star bound . compare Byte Arrays Ċ import Ġcom . dan il afe . kt star bound . readers . Random Leaf Reader Ċ import Ġcom . dan il afe . kt star bound . readers . Random Reader Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠA ĠB Tree DB 5 Ġparser . Ċ Ġ* ĠThis Ġclass Ġis Ġable Ġto Ġopen Ġa ĠStar bound ĠB - Tree Ġdatabase Ċ Ġ* Ġand Ġread Ġraw Ġdata Ġfrom Ġit . Ċ Ġ*/ Ċ public Ġclass ĠB Tree DB 5 ( val Ġfile : ĠFile ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġheader Ġof Ġa ĠB Tree DB 5 Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġheader Size Ġ= Ġ 5 1 2 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġprefix Ġthat Ġidentifies Ġa Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġprefix Size Ġ= Ġ 2 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠKey String Ġthat Ġis Ġread Ġfirst Ġin ĊĠĠĠĠ Ġ* Ġthe Ġfile . ĠShould Ġalways Ġbe ĠB Tree DB 5 . ĊĠĠĠĠ Ġ* ĠThe Ġstring Ġbeing Ġanything Ġelse Ġindicates Ġan ĊĠĠĠĠ Ġ* Ġinvalid Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġkey String : ĠString ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġname : ĠString ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġdata Ġblocks Ġin Ġthis Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval ĠblockSize : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġkeys Ġin Ġthis Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġkey Size : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġkey - value Ġentries Ġin Ġthe Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġentry Size : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġto Ġuse Ġthe Ġsecond Ġroot Ġnode Ġinstead ĊĠĠĠĠ Ġ* Ġof Ġthe Ġfirst . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġswap : ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġblock Ġindex Ġof Ġthe Ġfirst Ġfree Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġfirst Free Node : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġoffset Ġof Ġthe Ġfirst Ġfree Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġfirst Free Node Offset : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġblock Ġindex Ġof Ġthe Ġfirst Ġroot Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġfirst Root Node : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġfirst Ġroot Ġnode Ġis Ġa Ġleaf . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis First Root Leaf : ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġblock Ġindex Ġof Ġthe Ġsecond Ġfree Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsecond Free Node : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġoffset Ġof Ġthe Ġsecond Ġfree Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsecond Free Node Offset : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġblock Ġindex Ġof Ġthe Ġsecond Ġroot Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġsecond Root Node : ĠInt ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġsecond Ġroot Ġnode Ġis Ġa Ġleaf . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis Second Root Leaf : ĠBoolean ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠRandom Reader ( file , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġkey String Ġ= Ġreader . readString ( 8 ) !! ĊĠĠĠĠĠĠĠ ĠblockSize Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġreader . readString ( 1 6 ) !! ĊĠĠĠĠĠĠĠ Ġkey Size Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġentry Size Ġ= Ġkey Size Ġ+ Ġ 4 ĊĠĠĠĠĠĠĠ Ġswap Ġ= Ġreader . read Boolean () !! ĊĊĠĠĠĠĠĠĠ Ġfirst Free Node Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġreader . advance ( 4 ) ĊĠĠĠĠĠĠĠ Ġfirst Free Node Offset Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġfirst Root Node Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġis First Root Leaf Ġ= Ġreader . read Boolean () !! ĊĊĠĠĠĠĠĠĠ Ġsecond Free Node Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġreader . advance ( 4 ) ĊĠĠĠĠĠĠĠ Ġsecond Free Node Offset Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġsecond Root Node Ġ= Ġreader . readInt () !! ĊĠĠĠĠĠĠĠ Ġis Second Root Leaf Ġ= Ġreader . read Boolean () !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġdata Ġfrom Ġthe Ġgiven Ġkey Ġof Ġthe ĠB Tree . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġkey Ġis Ġnot Ġfound Ġor Ġsomething Ġgoes Ġwrong , Ġreturns ĠNULL . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġget ( key : ĠByteArray ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĠGets Ġthe Ġindex Ġwhere Ġto Ġstart Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġheader Size Ġ+ Ġ( if Ġ( swap ) Ġsecond Root Node Ġelse Ġfirst Root Node ) Ġ* ĠblockSize ĊĊĠĠĠĠĠĠĠ Ġ/* ĠReader Ġto Ġactually Ġread Ġthe Ġfile Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠRandom Reader ( file , Ġindex . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠThe ĠString Ġrepresenting Ġthe Ġtype Ġof Ġthe Ġnode . Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġtype String : ĠString ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype String Ġ= Ġreader . readString ( 2 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠIf Ġthe Ġnode Ġis Ġan Ġindex , Ġwe Ġkeep Ġgoing Ġin Ġthis Ġloop . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnfortunately , ĠKotlin Ġdoesn 't Ġhave Ġevaluate Ġassignments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Ġexpressions , Ġso Ġit 's Ġnot Ġpossible Ġto Ġmake Ġa Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġan Ġactual Ġcondition . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type String Ġ== Ġ" II ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠSk ips Ġapparently Ġun important Ġdata Ġ. Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . advance ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠInitial Ġbounds Ġfor Ġlow Ġand Ġhigh Ġdata Ġin Ġa ĠB Tree . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlow Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhigh Ġ= Ġreader . readInt () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠThe Ġblock Ġto Ġgo Ġto Ġif Ġthe Ġkey Ġis Ġsmaller Ġthan Ġall Ġkeys Ġin Ġthis Ġnode . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSince ĠB Trees Ġhave Ġ 1 Ġmore Ġchild Ġthan Ġthe Ġnumber Ġof Ġvalues Ġin Ġeach Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit 's Ġimpossible Ġto Ġsimply Ġmaintain Ġa Ġkey - pointer Ġmapping Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġrest Ġof Ġthis Ġtree Ġdoes . ĠThus , Ġthe Ġfirst Ġpointer , Ġwhich Ġis Ġsmaller ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthan Ġall Ġkeys , Ġis Ġalone , Ġand Ġis Ġread Ġseparately . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġblock Ġ= Ġreader . readInt () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠPerforms Ġa Ġbinary Ġsearch . ĠWe 'll Ġneed Ġto Ġjump Ġaround , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġso Ġwe Ġsave Ġthe Ġstart Ġindex Ġsince Ġadvance () Ġwon 't Ġcut Ġit . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġreader . index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( low Ġ< Ġhigh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠFind Ġthe Ġnew Ġmid Ġand Ġcheck Ġthe Ġkey Ġunder Ġit . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġ( low Ġ+ Ġhigh ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . move ( startIndex Ġ+ Ġentry Size Ġ* Ġmid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Key Ġ= Ġreader . read ( key Size ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠThis Ġis Ġpart Ġof Ġbinary Ġsearch . ĠMov es Ġlow Ġor Ġhigh Ġto Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġmid , Ġthus Ġgetting Ġus Ġcloser Ġto Ġthe Ġvalue Ġwe 're Ġlooking Ġfor . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomparison Result Ġ= Ġcompare Byte Arrays ( other Key , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comparison Result Ġ> Ġ 0 ) Ġhigh Ġ= Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlow Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠThe Ġkey Ġisn 't Ġsmaller Ġthan ĠALL Ġothers , Ġso Ġwe Ġneed Ġto Ġread Ġthe Ġpointer . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( low Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . move ( startIndex Ġ+ Ġentry Size Ġ* Ġ( low Ġ- Ġ 1 ) Ġ+ Ġkey Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġreader . readInt () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . move (( header Size Ġ+ ĠblockSize Ġ* Ġblock ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type String Ġ== Ġ" LL ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠLeaf Reader Ġis Ġa Ġnice Ġimplementation Ġof ĠGeneric Reader Ġthat Ġallows Ġfor Ġjump ing Ġaround Ġleaf Ġnodes Ġand Ġtheir Ġdata . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Reader Ġ= ĠRandom Leaf Reader ( file , Ġreader . index (), Ġheader Size . to Long (), ĠblockSize . to Long (), Ġprefix Size . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Keys Ġ= Ġleaf Reader . readInt () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠLook Ġthrough Ġall Ġthe Ġkeys , Ġlooking Ġfor Ġthe Ġright Ġone . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. num Keys Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Key Ġ= Ġleaf Reader . read ( key Size ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġleaf Reader . read Variable Int () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compare Byte Arrays ( key , Ġother Key ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠIf Ġthe Ġkey Ġwe Ġread Ġis Ġright , Ġread Ġthat Ġdata Ġand Ġreturn . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleaf Reader . read ( length . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠOtherwise , Ġsince Ġthe Ġdata Ġis Ġsequential , Ġwe Ġstill Ġhave Ġto Ġskip Ġit . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaf Reader . advance ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ Ċ } Ċ