package db import ( "log" "github.com/tardisx/linkwallet/entity" bolthold "github.com/timshannon/bolthold" ) func (db *DB) InitIndices() { wi := entity.WordIndex{} db.store.DeleteMatching(wi, &bolthold.Query{}) } func (db *DB) UpdateIndexForWordsByID(words []string, id uint64) { // delete this id from all indices txn, err := db.store.Bolt().Begin(true) if err != nil { panic(err) } db.store.TxForEach(txn, &bolthold.Query{}, func(wi *entity.WordIndex) error { delete(wi.Bitmap, id) // if the index is now completely empty, nuke it entirely empty := true for _, v := range wi.Bitmap { if v { empty = false break } } if empty { db.store.TxDelete(txn, "word_index_"+wi.Word, wi) } else { db.store.TxUpdate(txn, "word_index_"+wi.Word, wi) } return nil }) // adding for i, word := range words { // log.Printf("indexing %s", word) thisWI := entity.WordIndex{Word: word} err := db.store.TxGet(txn, "word_index_"+word, &thisWI) if err == bolthold.ErrNotFound { // create it thisWI.Bitmap = map[uint64]bool{} } else if err != nil { panic(err) } thisWI.Bitmap[id] = true err = db.store.TxUpsert(txn, "word_index_"+word, thisWI) if err != nil { panic(err) } if i > 0 && i%100 == 0 { txn.Commit() txn, err = db.store.Bolt().Begin(true) if err != nil { panic(err) } } } txn.Commit() } func (db *DB) DumpIndex() { // delete this id from all indices err := db.store.ForEach(&bolthold.Query{}, func(wi *entity.WordIndex) error { log.Printf("%10s: %v", wi.Word, wi.Bitmap) return nil }) if err != nil { panic(err) } }