simplify fulltext keys to just be values
This commit is contained in:
@@ -22,7 +22,7 @@ import (
|
|||||||
// requested not to, so that the event can't be saved again.
|
// requested not to, so that the event can't be saved again.
|
||||||
func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err error) {
|
func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err error) {
|
||||||
var foundSerial []byte
|
var foundSerial []byte
|
||||||
seri := serial.New(nil)
|
ser := serial.New(nil)
|
||||||
err = r.View(func(txn *badger.Txn) (err error) {
|
err = r.View(func(txn *badger.Txn) (err error) {
|
||||||
// query event by id to ensure we don't try to save duplicates
|
// query event by id to ensure we don't try to save duplicates
|
||||||
prf := prefixes.Id.Key(id.New(eid))
|
prf := prefixes.Id.Key(id.New(eid))
|
||||||
@@ -34,9 +34,9 @@ func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err e
|
|||||||
// get the serial
|
// get the serial
|
||||||
k = it.Item().Key()
|
k = it.Item().Key()
|
||||||
// copy serial out
|
// copy serial out
|
||||||
keys.Read(k, index.Empty(), id.New(&eventid.T{}), seri)
|
keys.Read(k, index.Empty(), id.New(&eventid.T{}), ser)
|
||||||
// save into foundSerial
|
// save into foundSerial
|
||||||
foundSerial = seri.Val
|
foundSerial = ser.Val
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
})
|
})
|
||||||
@@ -49,10 +49,11 @@ func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err e
|
|||||||
var indexKeys [][]byte
|
var indexKeys [][]byte
|
||||||
ev := event.New()
|
ev := event.New()
|
||||||
var evKey, evb, tombstoneKey []byte
|
var evKey, evb, tombstoneKey []byte
|
||||||
|
var w, l [][]byte
|
||||||
// fetch the event to get its index keys
|
// fetch the event to get its index keys
|
||||||
err = r.View(func(txn *badger.Txn) (err error) {
|
err = r.View(func(txn *badger.Txn) (err error) {
|
||||||
// retrieve the event record
|
// retrieve the event record
|
||||||
evKey = keys.Write(index.New(prefixes.Event), seri)
|
evKey = keys.Write(index.New(prefixes.Event), ser)
|
||||||
it := txn.NewIterator(badger.IteratorOptions{})
|
it := txn.NewIterator(badger.IteratorOptions{})
|
||||||
defer it.Close()
|
defer it.Close()
|
||||||
it.Seek(evKey)
|
it.Seek(evKey)
|
||||||
@@ -63,7 +64,9 @@ func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err e
|
|||||||
if _, err = r.Unmarshal(ev, evb); chk.E(err) {
|
if _, err = r.Unmarshal(ev, evb); chk.E(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
indexKeys = GetIndexKeysForEvent(ev, seri)
|
indexKeys = GetIndexKeysForEvent(ev, ser)
|
||||||
|
indexKeys = append(indexKeys, r.GetFulltextKeys(ev, ser)...)
|
||||||
|
indexKeys = append(indexKeys, r.GetLangKeys(ev, ser)...)
|
||||||
// we don't make tombstones for replacements, but it is better to shift that
|
// we don't make tombstones for replacements, but it is better to shift that
|
||||||
// logic outside of this closure.
|
// logic outside of this closure.
|
||||||
if len(noTombstone) > 0 && !noTombstone[0] {
|
if len(noTombstone) > 0 && !noTombstone[0] {
|
||||||
@@ -77,6 +80,8 @@ func (r *T) DeleteEvent(c context.T, eid *eventid.T, noTombstone ...bool) (err e
|
|||||||
if chk.E(err) {
|
if chk.E(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
_, _ = w, l
|
||||||
|
|
||||||
err = r.Update(func(txn *badger.Txn) (err error) {
|
err = r.Update(func(txn *badger.Txn) (err error) {
|
||||||
if err = txn.Delete(evKey); chk.E(err) {
|
if err = txn.Delete(evKey); chk.E(err) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,37 +28,13 @@ func (r *T) WriteFulltextIndex(w *Words) (err error) {
|
|||||||
}
|
}
|
||||||
r.WG.Add(1)
|
r.WG.Add(1)
|
||||||
defer r.WG.Done()
|
defer r.WG.Done()
|
||||||
// log.I.F("making fulltext index for %d", w.ser.Uint64())
|
|
||||||
for i := range w.wordMap {
|
for i := range w.wordMap {
|
||||||
retry:
|
retry:
|
||||||
if err = r.Update(func(txn *badger.Txn) (err error) {
|
if err = r.Update(func(txn *badger.Txn) (err error) {
|
||||||
prf := prefixes.FulltextIndex.Key(arb.New(i))
|
key := prefixes.FulltextIndex.Key(arb.New(i), w.ser)
|
||||||
var item2 *badger.Item
|
if err = txn.Set(key, nil); chk.E(err) {
|
||||||
if item2, err = txn.Get(prf); err != nil {
|
|
||||||
// make a new record
|
|
||||||
if err = txn.Set(prf, w.ser.Val); chk.E(err) {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if item2.KeySize() == int64(len(prf)) {
|
|
||||||
select {
|
|
||||||
case <-r.Ctx.Done():
|
|
||||||
return
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
var val2 []byte
|
|
||||||
if val2, err = item2.ValueCopy(nil); chk.E(err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !bytes.Contains(val2, w.ser.Val) {
|
|
||||||
val2 = append(val2, w.ser.Val...)
|
|
||||||
if err = txn.Set(prf, val2); chk.E(err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}); chk.E(err) {
|
}); chk.E(err) {
|
||||||
goto retry
|
goto retry
|
||||||
@@ -67,6 +43,15 @@ func (r *T) WriteFulltextIndex(w *Words) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *T) GetFulltextKeys(ev *event.T, ser *serial.T) (keys [][]byte) {
|
||||||
|
w := r.GetWordsFromContent(ev)
|
||||||
|
for i := range w {
|
||||||
|
key := prefixes.FulltextIndex.Key(arb.New(i), ser)
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (r *T) GetWordsFromContent(ev *event.T) (wordMap map[string]struct{}) {
|
func (r *T) GetWordsFromContent(ev *event.T) (wordMap map[string]struct{}) {
|
||||||
wordMap = make(map[string]struct{})
|
wordMap = make(map[string]struct{})
|
||||||
if ev.Kind.IsText() {
|
if ev.Kind.IsText() {
|
||||||
|
|||||||
@@ -49,6 +49,15 @@ retry:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *T) GetLangKeys(ev *event.T, ser *serial.T) (keys [][]byte) {
|
||||||
|
langs := r.GetLangTags(ev)
|
||||||
|
for _, v := range langs {
|
||||||
|
key := prefixes.LangIndex.Key(lang.New(v), ser)
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (r *T) GetLangTags(ev *event.T) (langs []string) {
|
func (r *T) GetLangTags(ev *event.T) (langs []string) {
|
||||||
if ev.Kind.IsText() {
|
if ev.Kind.IsText() {
|
||||||
tgs := ev.Tags.GetAll(tag.New("l"))
|
tgs := ev.Tags.GetAll(tag.New("l"))
|
||||||
|
|||||||
@@ -117,8 +117,10 @@ const (
|
|||||||
Configuration
|
Configuration
|
||||||
|
|
||||||
// FulltextIndex is an inverted index that maps a search term to the events it is found in.
|
// FulltextIndex is an inverted index that maps a search term to the events it is found in.
|
||||||
|
// The keys are written with the word and serial to make handling them easier, even though
|
||||||
|
// it's a little bigger, it's much faster to search, which is what matters.
|
||||||
//
|
//
|
||||||
// [ 15 ][ word ] [ array of serials of events containing the word ]
|
// [ 15 ][ word ][ serial ]
|
||||||
FulltextIndex
|
FulltextIndex
|
||||||
|
|
||||||
// LangIndex is an index of events with language tags. These use ISO639-2 3-letter codes
|
// LangIndex is an index of events with language tags. These use ISO639-2 3-letter codes
|
||||||
|
|||||||
Reference in New Issue
Block a user