package Ġeu . j rie . put . t rec . domain . index Ċ Ċ import Ġeu . j rie . put . t rec . domain . Article Ċ import Ġeu . j rie . put . t rec . domain . Mesh Heading Ċ import Ġeu . j rie . put . t rec . domain . read Articles Stream Ċ import Ġeu . j rie . put . t rec . infra . config Ċ import Ġeu . j rie . put . t rec . infra . json Mapper Ċ import Ġg nu . tro ve . T Int Int HashMap Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . with Index Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . ter rier . indexing . Document Ċ import Ġorg . ter rier . indexing . Flat JSON Document Ċ import Ġorg . ter rier . query ing . ManagerFactory Ċ import Ġorg . ter rier . query ing . Search Request . CONTROL _ W MODEL Ċ import Ġorg . ter rier . structures . Abstract Post ing OutputStream Ċ import Ġorg . ter rier . structures . Basic Document Index Entry Ċ import Ġorg . ter rier . structures . Bit Index Pointer Ċ import Ġorg . ter rier . structures . Document Index Ċ import Ġorg . ter rier . structures . Document Index Entry Ċ import Ġorg . ter rier . structures . F SO Map File Lex icon OutputStream Ċ import Ġorg . ter rier . structures . Field Document Index Entry Ċ import Ġorg . ter rier . structures . Field Lex icon Entry Ċ import Ġorg . ter rier . structures . Index On Disk Ċ import Ġorg . ter rier . structures . Index On Disk . create Index Ċ import Ġorg . ter rier . structures . Index On Disk . createNew Index Ċ import Ġorg . ter rier . structures . Index Util Ċ import Ġorg . ter rier . structures . Index Util . delete Index Ċ import Ġorg . ter rier . structures . Index Util . rename Index Ċ import Ġorg . ter rier . structures . Lex icon Entry Ċ import Ġorg . ter rier . structures . Lex icon OutputStream Ċ import Ġorg . ter rier . structures . Pointer Ċ import Ġorg . ter rier . structures . Post ing Index Ċ import Ġorg . ter rier . structures . Post ing Index InputStream Ċ import Ġorg . ter rier . structures . Simple Bit Index Pointer Ċ import Ġorg . ter rier . structures . Simple Document Index Entry Ċ import Ġorg . ter rier . structures . bit . Direct In verted OutputStream Ċ import Ġorg . ter rier . structures . bit . Field Direct In verted OutputStream Ċ import Ġorg . ter rier . structures . indexing . Compress ing Meta Index Builder Ċ import Ġorg . ter rier . structures . indexing . Compression Factory Ċ import Ġorg . ter rier . structures . indexing . Compression Factory . Compression Configuration Ċ import Ġorg . ter rier . structures . indexing . Document Index Builder Ċ import Ġorg . ter rier . structures . indexing . Lex icon Builder Ċ import Ġorg . ter rier . structures . indexing . Meta Index Builder Ċ import Ġorg . ter rier . structures . indexing . class ical . Basic Indexer Ċ import Ġorg . ter rier . structures . mer ging . Lex icon Mer ger Ċ import Ġorg . ter rier . structures . post ings . Iterable Post ing Ċ import Ġorg . ter rier . structures . post ings . Post ing Ċ import Ġorg . ter rier . structures . post ings . Post ing Id Comparator Ċ import Ġorg . ter rier . structures . post ings . bit . Basic Iterable Post ing Ċ import Ġorg . ter rier . structures . post ings . bit . Field Iterable Post ing Ċ import Ġorg . ter rier . structures . ser al ization . Fixed Size Write able Factory Ċ import Ġorg . ter rier . utility . Application Setup Ċ import Ġorg . ter rier . utility . Array Utils Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġjava . util . UUID . randomUUID Ċ import Ġjava . util . concurrent . Fork Join Pool Ċ import Ġkotlin . coroutines . Coroutine Context ĊĊ Ċ data Ġclass ĠTer rier Article ( ĊĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠ Ġval Ġabstract : ĠString , ĊĠĠĠ Ġval Ġkeywords : ĠList < String >, ĊĠĠĠ Ġval Ġmesh Head ings : ĠList < Mesh Heading >, ĊĠĠĠ Ġval Ġprocess : ĠString Ġ= Ġ" id , title , abstract , keywords , mesh Head ings " Ċ ) ĊĊ Ċ class ĠFlat Article Collection ( ĊĠĠĠ Ġarticles : ĠSequence < Article > Ċ ) Ġ: Ġorg . ter rier . indexing . Collection Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġflat Articles : ĠIterator < Document > Ġ= Ġarticles ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTer rier Article ( it . id , Ġit . title , Ġit . abstract , Ġit . keywords , Ġit . mesh Head ings ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġjson Mapper . writeValue AsString ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFlat JSON Document ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ= ĠUnit ĊĠĠĠ Ġoverride Ġfun Ġnext Document () Ġ= Ġflat Articles . hasNext () ĊĠĠĠ Ġoverride Ġfun Ġget Document () Ġ= Ġflat Articles . next () ĊĠĠĠ Ġoverride Ġfun Ġend Of Collection () Ġ= Ġ! flat Articles . hasNext () ĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ= Ġthrow ĠIllegalStateException (" reset ") Ċ } Ċ Ċ private Ġconst Ġval ĠINDEX _ PATH Ġ= Ġ"/ ter rier _ data " Ċ private Ġconst Ġval ĠINDEX _ PREFIX Ġ= Ġ" t rec " Ċ private Ġval Ġnext Prefix : ĠString ĊĠĠĠ Ġget () Ġ= Ġ"${ INDEX _ PREFIX }_${ randomUUID () }" Ċ Ċ fun Ġinit Ter rier () Ġ{ ĊĠĠĠ Ġlogger . info (" Initializing Ġter rier Ġindex ") ĊĊĠĠĠ ĠApplication Setup . setProperty (" indexer . meta . forward . keys ", Ġ" id ") ĊĠĠĠ ĠApplication Setup . setProperty (" indexer . meta . forward . key lens ", Ġ" 2 0 ") ĊĊĠĠĠ Ġindex Th readed () Ċ } Ċ Ċ private Ġfun Ġmerge Indices ( first : ĠIndex On Disk , Ġsecond : ĠIndex On Disk ): ĠIndex On Disk Ġ{ ĊĠĠĠ Ġval Ġnew Index Ġ= Ġcreate New Index ( INDEX _ PATH , Ġnext Prefix ) ĊĠĠĠ Ġlogger . info (" Mer ging Ġ${ first . prefix } Ġand Ġ${ second . prefix } Ġinto Ġ${ new Index . prefix }") Ċ // ĠĠĠ Ġlogger . info (" First \ n ${ first . collection Statistics }") Ċ // ĠĠĠ Ġlogger . info (" Second \ n ${ second . collection Statistics }") ĊĠĠĠ ĠStructure Mer ger Custom ( first , Ġsecond , Ġnew Index ). merge Structures () ĊĠĠĠ Ġfirst . close () ĊĠĠĠ Ġsecond . close () ĊĠĠĠ Ġdelete Index ( INDEX _ PATH , Ġfirst . prefix ) ĊĠĠĠ Ġdelete Index ( INDEX _ PATH , Ġsecond . prefix ) ĊĠĠĠ Ġreturn Ġnew Index Ċ } Ċ Ċ private Ġfun Ġindex Th readed () Ġ{ ĊĠĠĠ Ġval Ġn Threads Ġ= Ġconfig . getInt (" ter rier . init . workers ") ĊĠĠĠ Ġval Ġaction : Ġ() Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Ter rier Ġindex Ġcreation Ġstarted ") ĊĠĠĠĠĠĠĠ Ġread Articles Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. parallel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġarticles Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" indexing Ġchunk ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġnext Prefix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindexer Ġ= ĠBasic Indexer ( INDEX _ PATH , Ġprefix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexer . external Par all l ism Ġ= Ġn Threads ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= ĠFlat Article Collection ( articles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexer . index ( array Of ( collection )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Index ( INDEX _ PATH , Ġprefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġfirst , Ġsecond Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" reduce Ġindices ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Indices ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrename Index ( INDEX _ PATH , Ġit . prefix , ĠINDEX _ PATH , ĠINDEX _ PREFIX ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠINDEX _ PREFIX Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmaster Prefix Ġ= ĠFork Join Pool ( n Threads ). submit ( action ). get () ĊĠĠĠ Ġlogger . info (" Created Ġter rier Ġindex : Ġ$ master Prefix ") Ċ } Ċ Ċ class ĠTer rier Repository ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠCor outine Context Ċ ) Ġ: ĠRepository () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġelasticsearch Repository Ġ= ĠElasticsearch Repository ( context ) ĊĠĠĠ Ġprivate Ġval Ġindex Ġ= Ġcreate Index ( INDEX _ PATH , ĠINDEX _ PREFIX ) ĊĠĠĠ Ġprivate Ġval Ġquerying Manager Ġ= Ġrun Blocking ( context ) Ġ{ ĠManager Factory . from ( index . index Ref ) Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Setup . setProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" query ing . processes ", Ġ" ter rier ql : Ter rier QL Parser ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" parse controls : Ter rier QL To Controls ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" parse ql : Ter rier QL To Matching Query Terms ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" match op ql : Matching Op QL Parser ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" apply pipeline : Apply Term Pipeline ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" local matching : Local Manager \$ Apply Local Matching ," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" filters : Local Manager \$ Post Filter Process " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠApplication Setup . setProperty (" query ing . post filters ", Ġ" decorate : org . ter rier . query ing . Simple Decor ate ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠfindBy DF R ( query : ĠString ) Ġ= Ġsearch ( query , Ġ" BB 2 ") ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠfindBy BM 2 5 ( query : ĠString ) Ġ= Ġsearch ( query , Ġ" BM 2 5 ") ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠfindBy DF R BM 2 5 ( query : ĠString ) Ġ= Ġsearch ( query , Ġ" DF R _ BM 2 5 ") ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsearch ( query : ĠString , Ġmodel : ĠString ) Ġ= Ġwith Context ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Query ing Ġter rier Ġfor Ġ\"$ query \" Ġby Ġ$ model ") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġquerying Manager . new Search Request From Query ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control ( CONTROL _ W MODEL , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" end ", Ġ" 2 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" ter rier ql ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" parse controls ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" parse ql ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" apply pipeline ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" local matching ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" filters ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control (" decorate ", Ġ" on ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġquerying Manager . run Search Request ( request ) ĊĠĠĠĠĠĠĠ Ġrequest . results ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Index () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( i , Ġdoc ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarticle Ġ= Ġelasticsearch Repository . get ( doc . getMetadata (" id ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArticle Match ( i Ġ+ Ġ 1 , Ġdoc . score . toFloat (), Ġarticle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger (" ter rier ") Ċ Ċ open Ġclass ĠStructure Mer ger Custom ( ĊĠĠĠ Ġ/** Ġsource Ġindex Ġ 1 Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġsrc Index 1 : ĠIndex On Disk , ĊĠĠĠ Ġ/** Ġsource Ġindex Ġ 2 Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġsrc Index 2 : ĠIndex On Disk , Ġ_ dest Index : ĠIndex On Disk Ċ ) Ġ{ ĊĠĠĠ Ġclass ĠNull Document Index ( var Ġnum Docs : ĠInt ) Ġ: ĠDocument Index Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Document Entry ( doc id : ĠInt ): ĠDocument Index Entry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Document Length ( doc id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( doc id Ġ< Ġnum Docs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget NumberOf Documents (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnum Docs ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhash map Ġfor Ġconverting Ġthe Ġcodes Ġof Ġterms Ġappearing Ġonly Ġin Ġthe ĊĠĠĠĠ Ġ* Ġvocabulary Ġof Ġthe Ġsecond Ġset Ġof Ġdata Ġstructures Ġinto Ġa Ġnew Ġset Ġof ĊĠĠĠĠ Ġ* Ġterm Ġcodes Ġfor Ġthe Ġmerged Ġset Ġof Ġdata Ġstructures . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġterm code Hash map : ĠT Int Int HashMap ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġkeep Term Code Map Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠThe Ġnumber Ġof Ġdocuments Ġin Ġthe Ġmerged Ġstructures . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar ĠnumberOf Documents : ĠInt ĊĊĠĠĠ Ġ/** ĠThe Ġnumber Ġof Ġpointers Ġin Ġthe Ġmerged Ġstructures . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar ĠnumberOf Pointers : ĠLong ĊĊĠĠĠ Ġ/** ĠThe Ġnumber Ġof Ġterms Ġin Ġthe Ġcollection . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar ĠnumberOf Terms : ĠInt ĊĠĠĠ Ġprotected Ġvar Ġcompression Direct Config : ĠCompression Configuration ĊĠĠĠ Ġprotected Ġvar Ġcompression In verted Config : ĠCompression Configuration ĊĠĠĠ Ġprotected Ġvar ĠMeta Reverse Ġ= ĊĠĠĠĠĠĠĠ Ġjava . lang . Boolean . parse Boolean ( Application Setup . getProperty (" mer ger . meta . reverse ", Ġ" true ")) ĊĊĠĠĠ Ġ/** Ġdestination Ġindex Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġdest Index : ĠIndex On Disk ĊĊĠĠĠ Ġ/** Ġclass Ġto Ġuse Ġto Ġwrite Ġdirect Ġfile Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġdirect File OutputStream Class : ĠClass < out ĠDirect In verted OutputStream ?> Ġ= ĊĠĠĠĠĠĠĠ ĠDirect In verted OutputStream :: class . java ĊĠĠĠ Ġprotected Ġvar Ġfield Direct File OutputStream Class : ĠClass < out ĠDirect In verted OutputStream ?> Ġ= ĊĠĠĠĠĠĠĠ ĠField Direct In verted OutputStream :: class . java ĊĠĠĠ Ġprotected Ġval Ġfield Count : ĠInt ĊĠĠĠ Ġprotected Ġvar Ġbasic In verted Index Post ing Iterator Class Ġ= ĠBasic Iterable Post ing :: class . java . name ĊĠĠĠ Ġprotected Ġvar Ġfield In verted Index Post ing Iterator Class Ġ= ĠField Iterable Post ing :: class . java . name ĊĠĠĠ Ġprotected Ġvar Ġbasic Direct Index Post ing Iterator Class Ġ= ĠBasic Iterable Post ing :: class . java . name ĊĠĠĠ Ġprotected Ġvar Ġfield Direct Index Post ing Iterator Class Ġ= ĠField Iterable Post ing :: class . java . name ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġoutput Ġindex . ĠThis Ġindex Ġshould Ġhave Ġno Ġdocuments ĊĠĠĠĠ Ġ* Ġ@ param Ġ_ output Index Ġthe Ġindex Ġto Ġbe Ġmerged Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Output Index (_ output Index : ĠIndex On Disk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdest Index Ġ= Ġ_ output Index ĊĠĠĠĠĠĠĠ Ġ// inverted File Output Ġ= Ġ_ output Name ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġthe Ġtwo Ġlex icons Ġinto Ġone . ĠAfter Ġthis Ġstage , Ġthe Ġoffsets Ġin Ġthe ĊĠĠĠĠ Ġ* Ġlex icon Ġare Ġot Ġcorrect . ĠThey Ġwill Ġbe Ġupdated Ġonly Ġafter Ġcreating Ġthe ĊĠĠĠĠ Ġ* Ġinverted Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġmerge In verted Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// getting Ġthe Ġnumber Ġof Ġentries Ġin Ġthe Ġfirst Ġdocument Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// in Ġorder Ġto Ġassign Ġthe Ġcorrect Ġdoc ids Ġto Ġthe Ġdocuments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// of Ġthe Ġsecond Ġinverted Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Docs 1 Ġ= Ġsrc Index 1 . collection Statistics . numberOf Documents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Docs 2 Ġ= Ġsrc Index 2 . collection Statistics . numberOf Documents ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Documents Ġ= ĠnumberOf Docs 1 Ġ+ ĠnumberOf Docs 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 1 Ġ= Ġ 4 Ġ// Ġsrc Index 1 . collection Statistics . numberOf Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 2 Ġ= Ġ 4 Ġ// src Field Count 1 Ġ// Ġsrc Index 2 . collection Statistics . numberOf Fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Field Count 1 Ġ!= Ġsrc Field Count 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Field Counts Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Count Ġ= Ġsrc Field Count 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// creating Ġa Ġnew Ġmap Ġbetween Ġnew Ġand Ġold Ġterm Ġcodes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keep Term Code Map ) Ġterm code Hash map Ġ= ĠT Int Int HashMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Opening Ġsrc Ġlex icons ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// setting Ġthe Ġinput Ġstreams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlex In Stream 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 1 . getIndex Structure InputStream (" lex icon ") Ġas ĠIterator < Map . Entry < String , ĠLex icon Entry >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlex In Stream 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 2 . getIndex Structure InputStream (" lex icon ") Ġas ĠIterator < Map . Entry < String , ĠLex icon Entry >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( property : ĠString ? Ġin ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . inverted . fields . names ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max . term . length ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - key factory . class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - key factory . parameter _ values ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - key factory . parameter _ types ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - value factory . class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - value factory . parameter _ values ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . lex icon - value factory . parameter _ types ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ter mp ipelines " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . set Index Property ( property , Ġsrc Index 1 . getIndex Property ( property , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlv f Ġ= Ġsrc Index 1 . getIndex Structure (" lex icon - value factory ") Ġas ĠFixed Size Write able Factory < Lex icon Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Opening Ġnew Ġtarget Ġlex icon ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// setting Ġthe Ġoutput Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlex Out Stream : ĠLex icon OutputStream < String > Ġ= ĠF SO Map File Lex icon OutputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lex icon ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlv f . java Class Ġas ĠClass < Fixed Size Write able Factory < Lex icon Entry ?> ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Codes Ġ= Ġif Ġ( keep Term Code Map ) Ġsrc Index 1 . collection Statistics . numberOf Unique Terms Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Opening Ġsrc Ġinv Ġfiles ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . force Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNull Document Index ( src Index 1 . collection Statistics . numberOf Documents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . force Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNull Document Index ( src Index 2 . collection Statistics . numberOf Documents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinverted 1 Ġ= Ġsrc Index 1 . inverted Index Ġas ĠPost ing Index < Pointer > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinverted 2 Ġ= Ġsrc Index 2 . inverted Index Ġas ĠPost ing Index < Pointer > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Opening Ġnew Ġtarget Ġinv Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinv OS : ĠAbstract Post ing OutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinv OS Ġ= Ġcompression In verted Config . getPost ing OutputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . path Ġ+ ĠApplication Setup . FILE _ SEPARATOR Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . prefix Ġ+ Ġ". inverted " Ġ+ Ġcompression In verted Config . structure File Extension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Couldn 't Ġcreate Ġspecified ĠAbstract Post ing OutputStream ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Starting Ġpass Ġthrough Ġinv Ġ& Ġlex icon Ġfiles ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas More 1 Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas More 2 Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġterm 1 : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġterm 2 : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġle e 1 : ĠMap . Entry < String , ĠLex icon Entry >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġle e 2 : ĠMap . Entry < String , ĠLex icon Entry >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 1 Ġ= Ġlex In Stream 1 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 1 ) Ġle e 1 Ġ= Ġlex In Stream 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 2 Ġ= Ġlex In Stream 2 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 2 ) Ġle e 2 Ġ= Ġlex In Stream 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( hasMore 1 Ġ&& Ġhas More 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm 1 Ġ= Ġle e 1 !!. key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm 2 Ġ= Ġle e 2 !!. key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlex ico graphical Compare Ġ= Ġterm 1 . compareTo ( term 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lex ico graphical Compare Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// write Ġto Ġinverted Ġfile Ġpost ings Ġfor Ġthe Ġterm Ġthat Ġonly Ġoccurs Ġin Ġ 1 st Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer Ġ= Ġinv OS . write Post ings ( inverted 1 . getPost ings ( lee 1 . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 . value . set Pointer ( new Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ+= Ġnew Pointer . numberOf Entries . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! keep Term Code Map ) Ġle e 1 . value . term Id Ġ= Ġnew Codes ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . write Next Entry ( term 1 , Ġle e 1 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 1 Ġ= Ġlex In Stream 1 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 1 ) Ġle e 1 Ġ= Ġlex In Stream 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( lex ico graphical Compare Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// write Ġto Ġinverted Ġfile Ġpost ings Ġfor Ġthe Ġterm Ġthat Ġonly Ġoccurs Ġin Ġ 2 nd Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// doc ids Ġare Ġtransformed Ġas Ġwe Ġgo . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer Ġ= Ġinv OS . write Post ings ( inverted 2 . getPost ings ( lee 2 . value ), Ġ-( numberOf Docs 1 Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 . value . set Pointer ( new Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ+= Ġnew Pointer . numberOf Entries . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Code Ġ= Ġnew Codes ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keep Term Code Map ) Ġterm code Hash map !!. put ( lee 2 . value . term Id , Ġnew Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 . value . term Id Ġ= Ġnew Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . write Next Entry ( term 2 , Ġle e 2 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 2 Ġ= Ġlex In Stream 2 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 2 ) Ġle e 2 Ġ= Ġlex In Stream 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// write Ġto Ġpost ings Ġfor Ġa Ġterm Ġthat Ġoccurs Ġin Ġboth Ġindices ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 1 . Ġpost ings Ġfrom Ġthe Ġfirst Ġindex Ġare Ġunchanged ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip 1 Ġ= Ġinverted 1 . getPost ings ( lee 1 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer 1 Ġ= Ġinv OS . write Post ings ( ip 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 2 . Ġpost ings Ġfrom Ġthe Ġ 2 nd Ġindex Ġhave Ġtheir Ġdoc ids Ġtransformed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip 2 Ġ= Ġinverted 2 . getPost ings ( lee 2 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer 2 Ġ= Ġinv OS . write Post ings ( ip 2 , Ġinv OS . last Doc id Written Ġ- ĠnumberOf Docs 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ+= Ġ( new Pointer 1 . numberOf Entries Ġ+ Ġnew Pointer 2 . numberOf Entries ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// don 't Ġset ĠnumberOf Entries , Ġas ĠLex icon Entry . add () Ġwill Ġtake Ġcare Ġof Ġthis . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 . value . set Pointer ( new Pointer 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keep Term Code Map ) Ġterm code Hash map !!. put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 . value . term Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 . value . term Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġle e 1 . value . term Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Codes ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 . value . add ( lee 2 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . write Next Entry ( term 1 , Ġle e 1 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 1 Ġ= Ġlex In Stream 1 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 1 ) Ġle e 1 Ġ= Ġlex In Stream 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 2 Ġ= Ġlex In Stream 2 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 2 ) Ġle e 2 Ġ= Ġlex In Stream 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Now Ġprocessing Ġtrailing Ġterms Ġfrom Ġlex 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( hasMore 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// write Ġto Ġinverted Ġfile Ġas Ġwell . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer Ġ= Ġinv OS . write Post ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinverted 1 . getPost ings ( lee 1 !!. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 . value . set Pointer ( new Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! keep Term Code Map ) Ġle e 1 . value . term Id Ġ= Ġnew Codes ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ+= Ġnew Pointer . numberOf Entries . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . write Next Entry ( lee 1 . key , Ġle e 1 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 1 Ġ= Ġlex In Stream 1 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 1 ) Ġle e 1 Ġ= Ġlex In Stream 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( hasMore 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 1 Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Now Ġprocessing Ġtrailing Ġterms Ġfrom Ġlex 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( hasMore 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// write Ġto Ġinverted Ġfile Ġas Ġwell . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer Ġ= Ġinv OS . write Post ings ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinverted 2 . getPost ings ( lee 2 !!. value ), Ġ-( numberOf Docs 1 Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 . value . set Pointer ( new Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ+= Ġnew Pointer . numberOf Entries . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Code Ġ= Ġnew Codes ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keep Term Code Map ) Ġterm code Hash map !!. put ( lee 2 . value . term Id , Ġnew Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġle e 2 . value . term Id Ġ= Ġnew Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . write Next Entry ( lee 2 . key , Ġle e 2 . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas More 2 Ġ= Ġlex In Stream 2 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasMore 2 ) Ġle e 2 Ġ= Ġlex In Stream 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Closing Ġstructures ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( lex In Stream 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( lex In Stream 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverted 1 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverted 2 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinv OS . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . set Index Property (" num . Documents ", Ġ"" Ġ+ ĠnumberOf Documents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" inverted ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression In verted Config . structure Class . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . ter rier . structures . Index On Disk , java . lang . String , org . ter rier . structures . Document Index , java . lang . Class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index , structure Name , document ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression In verted Config . post ing Iterator Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure InputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" inverted ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression In verted Config . structure InputStream Class . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" org . ter rier . structures . Index On Disk , java . lang . String , java . util . Iterator , java . lang . Class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index , structure Name , lex icon - entry - input stream ," Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression In verted Config . post ing Iterator Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . set Index Property (" index . inverted . fields . count ", Ġ"" Ġ+ Ġfield Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlex Out Stream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lex icon - value factory ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Lex icon Entry . Factory :: class . java . name , Ġ" java . lang . String ", Ġ"\ ${ index . inverted . fields . count }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . flush () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" IOException Ġwhile Ġmerging Ġlex icons Ġand Ġinverted Ġfiles .", Ġio e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Problem Ġwhile Ġmerging Ġlex icons Ġand Ġinverted Ġfiles .", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġthe Ġtwo Ġdirect Ġfiles Ġand Ġthe Ġcorresponding Ġdocument Ġid Ġfiles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġmerge Direct Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Output Ġ= ĠDocument Index Builder ( dest Index , Ġ" document ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Tags Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Utils . parse Comma Delimit edString ( src Index 1 . getIndex Property (" index . meta . key - names ", Ġ" doc no ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Tag Lengths Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Utils . parse Comma Delimited Ints ( src Index 1 . getIndex Property (" index . meta . value - lengths ", Ġ" 2 0 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Reverse Tags Ġ= Ġif Ġ( Meta Reverse ) ĠArray Utils . parse Comma Delimit edString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . meta . reverse - key - names ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠarrayOf Null s ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Builder : ĠMeta Index Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompress ing Meta Index Builder ( dest Index , Ġmeta Tags , Ġmeta Tag Lengths , Ġmeta Reverse Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . meta . key - names ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" doc no " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= Ġsrc Index 2 . getIndex Property (" index . meta . key - names ", Ġ" doc no ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Meta Ġfields Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Pointer : ĠBit Index Pointer Ġ= ĠSimple Bit Index Pointer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 1 Ġ= Ġ 4 Ġ// Ġsrc Index 1 . getInt Index Property (" index . direct . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 2 Ġ= Ġ 4 Ġ// src Field Count 1 Ġ// Ġsrc Index 1 . getInt Index Property (" index . direct . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Field Count 1 Ġ!= Ġsrc Field Count 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Field Counts Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Count Ġ= Ġsrc Field Count 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( property : ĠString ? Ġin ĠarrayOf (" index . direct . fields . names ", Ġ" index . direct . fields . count ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . set Index Property ( property , Ġsrc Index 1 . getIndex Property ( property , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdf Output : ĠAbstract Post ing OutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdf Output Ġ= Ġcompression Direct Config . getPost ing OutputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( dest Index . path Ġ+ ĠApplication Setup . FILE _ SEPARATOR Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . prefix Ġ+ Ġ". direct " Ġ+ Ġcompression Direct Config . structure File Extension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Couldn 't Ġcreate Ġspecified ĠDirect In verted OutputStream ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Input 1 Ġ= Ġsrc Index 1 . getIndex Structure InputStream (" document ") Ġas ĠIterator < Document Index Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdf Input 1 Ġ= Ġsrc Index 1 . getIndex Structure InputStream (" direct ") Ġas ĠPost ing Index InputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Input 1 Ġ= Ġsrc Index 1 . meta Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsource Doc id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// tra ver sing Ġthe Ġdirect Ġindex , Ġwithout Ġany Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( doc id Input 1 . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpointer DF : ĠBit Index Pointer ? Ġ= Ġempty Pointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie Ġ= Ġdoc id Input 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( die . document Length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer DF Ġ= Ġdf Output . write Post ings ( df Input 1 . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdie . set Bit Index Pointer ( pointer DF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . add Entry To Buffer ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . write Document Entry ( meta Input 1 . getAll Items ( source Doc id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Doc id ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf Input 1 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Input 1 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( doc id Input 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Input 2 Ġ= Ġsrc Index 2 . getIndex Structure InputStream (" document ") Ġas ĠIterator < Document Index Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdf Input 2 Ġ= Ġsrc Index 2 . getIndex Structure InputStream (" direct ") Ġas ĠPost ing Index InputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Input 2 Ġ= Ġsrc Index 2 . meta Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Doc id Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( doc id Input 2 . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie Ġ= Ġdoc id Input 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpointer DF : ĠBit Index Pointer ? Ġ= Ġempty Pointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( die . document Length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost ings Ġ= Ġdf Input 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposting List : ĠMutable List < Post ing > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( post ings . next () Ġ!= ĠIterable Post ing . EOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp : ĠPost ing Ġ= Ġpost ings . as Writable Post ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . id Ġ= Ġterm code Hash map !!. get ( post ings . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposting List . add ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . sort ( post ing List , ĠPost ing Id Comparator ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer DF Ġ= Ġdf Output . write Post ings ( post ing List . iterator ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdie . set Bit Index Pointer ( pointer DF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . add Entry To Buffer ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . write Document Entry ( meta Input 2 . getAll Items ( source Doc id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Doc id ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf Input 2 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( doc id Input 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Input 2 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf Output . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . finished Collections () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompression Direct Config . write Index Properties ( dest Index , Ġ" document - input stream ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document - factory ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Document Index Entry . Factory :: class . java . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . lang . String ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ ${ index . direct . fields . count }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document - factory ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Document Index Entry . Factory :: class . java . name , Ġ"", Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . flush () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" IOException Ġwhile Ġmerging Ġdf Ġand Ġdoc id Ġfiles .", Ġio e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġthe Ġtwo Ġdocument Ġindex Ġfiles , Ġand Ġthe Ġmeta Ġfiles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġmerge Document Index Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// the Ġoutput Ġdoc id Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Output Ġ= ĠDocument Index Builder ( dest Index , Ġ" document ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Tags Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Utils . parse Comma Delimit edString ( src Index 1 . getIndex Property (" index . meta . key - names ", Ġ" doc no ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Tag Lengths Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Utils . parse Comma Delimited Ints ( src Index 1 . getIndex Property (" index . meta . value - lengths ", Ġ" 2 0 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Reverse Tags Ġ= Ġif Ġ( Meta Reverse ) ĠArray Utils . parse Comma Delimit edString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . meta . reverse - key - names ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠarrayOf Null s ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Builder : ĠMeta Index Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompress ing Meta Index Builder ( dest Index , Ġmeta Tags , Ġmeta Tag Lengths , Ġmeta Reverse Tags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . meta . key - names ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" doc no " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= Ġsrc Index 2 . getIndex Property (" index . meta . key - names ", Ġ" doc no ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Meta Ġfields Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// opening Ġthe Ġfirst Ġset Ġof Ġfiles . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Input 1 Ġ= Ġsrc Index 1 . getIndex Structure InputStream (" document ") Ġas ĠIterator < Document Index Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Input 1 Ġ= Ġsrc Index 1 . getIndex Structure InputStream (" meta ") Ġas ĠIterator < Array < String >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsrc Field Count 1 Ġ= Ġ 4 Ġ// src Index 1 . getInt Index Property (" index . inverted . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 2 Ġ= Ġ 4 Ġ// Ġsrc Field Count 1 // Ġsrc Index 2 . getInt Index Property (" index . inverted . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Field Count 1 Ġ!= Ġsrc Field Count 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Field Counts Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ((( src Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . document - factory . class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== Ġ" org . ter rier . structures . Simple Document Index Entry \$ Factory ") Ġ|| Ġ( src Index 1 . getIndex Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" index . document - factory . class ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== Ġ" org . ter rier . structures . Basic Document Index Entry \$ Factory ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// for Ġsome Ġreason , Ġthe Ġsource Ġdocument Ġindex Ġhas Ġnot Ġfields . Ġso Ġwe Ġshouldn 't Ġassume Ġthat Ġfields Ġare Ġbeing Ġused . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Field Count 1 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Count Ġ= Ġsrc Field Count 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// tra ver sing Ġthe Ġfirst Ġset Ġof Ġfiles , Ġwithout Ġany Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( doc id Input 1 . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Input 1 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie Ġ= Ġdoc id Input 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie New Ġ= Ġif Ġ(( field Count Ġ> Ġ 0 )) Ġdie Ġelse ĠSimple Document Index Entry ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . add Entry To Buffer ( die New ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . write Document Entry ( meta Input 1 . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc id Input 2 Ġ= Ġsrc Index 2 . getIndex Structure InputStream (" document ") Ġas ĠIterator < Document Index Entry > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Input 2 Ġ= Ġsrc Index 2 . getIndex Structure InputStream (" meta ") Ġas ĠIterator < Array < String >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// tra ver sing Ġthe Ġ 2 nd Ġset Ġof Ġfiles , Ġwithout Ġany Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( doc id Input 2 . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Input 2 . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie Ġ= Ġdoc id Input 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdie New Ġ= Ġif Ġ(( field Count Ġ> Ġ 0 )) Ġdie Ġelse ĠSimple Document Index Entry ( die ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . add Entry To Buffer ( die New ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . write Document Entry ( meta Input 2 . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . finished Collections () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc id Output . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Builder . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( doc id Input 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( doc id Input 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( meta Input 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndex Util . close ( meta Input 2 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . set Index Property (" index . inverted . fields . count ", Ġ"" + Ġfield Count ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document - factory ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠField Document Index Entry . Factory :: class . java . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java . lang . String ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ ${ index . inverted . fields . count }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . addIndex Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" document - factory ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Document Index Entry . Factory :: class . java . name , Ġ"", Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Index . flush () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" IOException Ġwhile Ġmerging Ġdoc id Ġfiles .", Ġio e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcreates Ġthe Ġfinal Ġterm Ġcode Ġto Ġoffset Ġfile , Ġand Ġthe Ġlex icon Ġhash Ġif Ġenabled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġcreate Lex id File () Ġ{ ĊĠĠĠĠĠĠĠ ĠLex icon Builder . optim ise ( dest Index , Ġ" lex icon ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Reverse Meta ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMeta Reverse Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMerge s Ġthe Ġstructures Ġcreated Ġby Ġter rier . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmerge Structures () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġboth In verted Ġ= Ġsrc Index 1 . has Index Structure (" inverted ") Ġ&& Ġsrc Index 2 . has Index Structure (" inverted ") ĊĠĠĠĠĠĠĠ Ġval Ġboth Direct Ġ= Ġsrc Index 1 . has Index Structure (" direct ") Ġ&& Ġsrc Index 2 . has Index Structure (" direct ") ĊĠĠĠĠĠĠĠ Ġval Ġboth Lex icon Ġ= Ġsrc Index 1 . has Index Structure (" lex icon ") Ġ&& Ġsrc Index 2 . has Index Structure (" lex icon ") ĊĠĠĠĠĠĠĠ Ġval Ġboth Document Ġ= Ġsrc Index 1 . has Index Structure (" document ") Ġ&& Ġsrc Index 2 . has Index Structure (" document ") ĊĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġkeep Term Code Map Ġ= Ġboth Direct ĊĠĠĠĠĠĠĠ Ġvar Ġt 2 : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġt 3 : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġt 4 : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( both In verted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge In verted Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" merged Ġinverted Ġfiles Ġin Ġ" Ġ+ Ġ(( t 2 Ġ- Ġt 1 ) Ġ/ Ġ 1 0 0 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( both Lex icon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLex icon Mer ger ( src Index 1 , Ġsrc Index 2 , Ġdest Index ). merge Lex icons () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" merged Ġlex icons Ġin Ġ" Ġ+ Ġ(( t 2 Ġ- Ġt 1 ) Ġ/ Ġ 1 0 0 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" No Ġinverted Ġor Ġlex icon Ġ- Ġno Ġmerging Ġof Ġlex icons Ġtook Ġplace ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( both In verted Ġ|| Ġboth Lex icon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Lex id File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 3 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" created Ġlex id Ġfile Ġand Ġlex Ġhash Ġin Ġ" Ġ+ Ġ(( t 3 Ġ- Ġt 2 ) Ġ/ Ġ 1 0 0 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġt 3 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġif Ġ((! both Direct Ġ|| Ġ( Application Setup . getProperty (" merge . direct ", Ġ" true ") Ġ== Ġ" false ")) Ġ&& Ġboth Document ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Document Index Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 4 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" merged Ġdocument index Ġfiles Ġin Ġ" Ġ+ Ġ(( t 4 Ġ- Ġt 3 ) Ġ/ Ġ 1 0 0 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! both Document ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 2 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġdocument Ġ- Ġno Ġmerging Ġof Ġdocument Ġor Ġmeta Ġstructures Ġtook Ġplace ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Direct Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt 4 Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" merged Ġdirect Ġfiles Ġin Ġ" Ġ+ Ġ(( t 4 Ġ- Ġt 3 ) Ġ/ Ġ 1 0 0 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġdest Index . set Index Property (" index . inverted . fields . count ", Ġ"" + Ġfield Count ) Ċ // ĠĠĠĠĠĠĠ Ġdest Index . set Index Property (" index . inverted . fields . count ", Ġ"" + Ġfield Count ) ĊĠĠĠĠĠĠĠ Ġif Ġ( keep Term Code Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// save Ġup Ġsome Ġmemory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġterm code Hash map !!. clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġterm code Hash map Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** Ġthe Ġlogger Ġused Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Structure Mer ger Custom :: class . java ) ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġget Interfaces ( o : ĠAny ): ĠArray < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < Class <* >> Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc : ĠClass < *> Ġ= Ġo . java Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ!= ĠAny :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i : ĠClass < *> Ġin Ġc . interfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġc . super class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġconstructor ĊĠĠĠĠ Ġ* Ġ@ param Ġ_ src Index 1 ĊĠĠĠĠ Ġ* Ġ@ param Ġ_ src Index 2 ĊĠĠĠĠ Ġ* Ġ@ param Ġ_ dest Index ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsrc Index 2 Ġ= Ġsrc Index 2 ĊĠĠĠĠĠĠĠ Ġdest Index Ġ= Ġ_ dest Index ĊĠĠĠĠĠĠĠ ĠnumberOf Documents Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠnumberOf Pointers Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠnumberOf Terms Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 1 Ġ= Ġsrc Index 1 . getInt Index Property (" index . inverted . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc Field Count 2 Ġ= Ġsrc Index 2 . getInt Index Property (" index . inverted . fields . count ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( src Field Count 1 Ġ!= Ġsrc Field Count 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Field Counts Ġin Ġsource Ġindices Ġmust Ġmatch ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfield Names Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray Utils . parse Comma Delimit edString ( src Index 1 . getIndex Property (" index . inverted . fields . names ", Ġ"")) ĊĠĠĠĠĠĠĠ Ġassert ( src Field Count 1 Ġ== Ġfield Names . size ) ĊĠĠĠĠĠĠĠ Ġfield Count Ġ= Ġsrc Field Count 1 ĊĠĠĠĠĠĠĠ Ġcompression Direct Config Ġ= ĠCompression Factory . get Compression Configuration (" direct ", Ġfield Names , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcompression In verted Config Ġ= ĠCompression Factory . get Compression Configuration (" inverted ", Ġfield Names , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} Ċ } ĊĊ