// deleteRecursive is used by the delete logic. The recursion depth // only goes as far as the number of dimensions, so this shouldn't be an // issue. func (rt *skipListRT) deleteRecursive(sl *skip.SkipList, dimension uint64, entry rangetree.Entry) rangetree.Entry { value := entry.ValueAtDimension(dimension) if isLastDimension(dimension, rt.dimensions) { entries := sl.Delete(skipEntry(value)) if entries[0] == nil { return nil } rt.number-- return entries[0].(*lastBundle).entry } db, ok := sl.Get(skipEntry(value))[0].(*dimensionalBundle) if !ok { // value was not found return nil } result := rt.deleteRecursive(db.sl, dimension+1, entry) if result == nil { return nil } if db.sl.Len() == 0 { sl.Delete(db) } return result }
func (rt *skipListRT) get(entry rangetree.Entry) rangetree.Entry { var ( sl = rt.top e common.Comparator value uint64 ) for i := uint64(0); i < rt.dimensions; i++ { value = uint64(entry.ValueAtDimension(i)) e = sl.Get(skipEntry(value))[0] if e == nil { return nil } if isLastDimension(i, rt.dimensions) { return e.(*lastBundle).entry } sl = e.(*dimensionalBundle).sl } panic(`Reached past for loop without finding last dimension.`) }
func (rt *skipListRT) add(entry rangetree.Entry) rangetree.Entry { var ( value int64 e common.Comparator sl = rt.top db *dimensionalBundle lb *lastBundle ) for i := uint64(0); i < rt.dimensions; i++ { value = entry.ValueAtDimension(i) e = sl.Get(skipEntry(value))[0] if isLastDimension(i, rt.dimensions) { if e != nil { // this is an overwrite lb = e.(*lastBundle) oldEntry := lb.entry lb.entry = entry return oldEntry } // need to add new sl entry lb = &lastBundle{id: uint64(value), entry: entry} rt.number++ sl.Insert(lb) return nil } if e == nil { // we need the intermediate dimension db = &dimensionalBundle{id: uint64(value), sl: skip.New(uint64(0))} sl.Insert(db) } else { db = e.(*dimensionalBundle) } sl = db.sl } panic(`Ran out of dimensions before for loop completed.`) }