func (ts *LevelDBTripleStore) RemoveTriple(t *graph.Triple) { _, err := ts.db.Get(ts.createKeyFor("s", "p", "o", t), ts.readopts) if err != nil && err != leveldb.ErrNotFound { glog.Errorf("Couldn't access DB to confirm deletion") return } if err == leveldb.ErrNotFound { // No such triple in the database, forget about it. return } batch := &leveldb.Batch{} batch.Delete(ts.createKeyFor("s", "p", "o", t)) batch.Delete(ts.createKeyFor("o", "s", "p", t)) batch.Delete(ts.createKeyFor("p", "o", "s", t)) ts.UpdateValueKeyBy(t.Get("s"), -1, batch) ts.UpdateValueKeyBy(t.Get("p"), -1, batch) ts.UpdateValueKeyBy(t.Get("o"), -1, batch) if t.Get("c") != "" { batch.Delete(ts.createProvKeyFor("p", "s", "o", t)) ts.UpdateValueKeyBy(t.Get("c"), -1, batch) } err = ts.db.Write(batch, nil) if err != nil { glog.Errorf("Couldn't delete triple %s", t.ToString()) return } ts.size-- }
func (ts *LevelDBTripleStore) createKeyFor(dir1, dir2, dir3 string, triple *graph.Triple) []byte { key := make([]byte, 0, 2+(ts.hasher.Size()*3)) key = append(key, []byte(dir1+dir2)...) key = append(key, ts.convertStringToByteHash(triple.Get(dir1))...) key = append(key, ts.convertStringToByteHash(triple.Get(dir2))...) key = append(key, ts.convertStringToByteHash(triple.Get(dir3))...) return key }
func (ts *LevelDBTripleStore) AddTriple(t *graph.Triple) { batch := &leveldb.Batch{} ts.buildWrite(batch, t) err := ts.db.Write(batch, ts.writeopts) if err != nil { glog.Errorf("Couldn't write to DB for triple %s", t.ToString()) return } ts.size++ }
func (ts *LevelDBTripleStore) buildTripleWrite(batch *leveldb.Batch, t *graph.Triple) { bytes, err := json.Marshal(*t) if err != nil { glog.Errorf("Couldn't write to buffer for triple %s\n %s\n", t.ToString(), err) return } batch.Put(ts.createKeyFor("s", "p", "o", t), bytes) batch.Put(ts.createKeyFor("o", "s", "p", t), bytes) batch.Put(ts.createKeyFor("p", "o", "s", t), bytes) if t.Get("c") != "" { batch.Put(ts.createProvKeyFor("p", "s", "o", t), bytes) } }
func (ts *LevelDBTripleStore) buildWrite(batch *leveldb.Batch, t *graph.Triple) { ts.buildTripleWrite(batch, t) ts.UpdateValueKeyBy(t.Get("s"), 1, nil) ts.UpdateValueKeyBy(t.Get("p"), 1, nil) ts.UpdateValueKeyBy(t.Get("o"), 1, nil) if t.Get("c") != "" { ts.UpdateValueKeyBy(t.Get("c"), 1, nil) } }
func (ts *MemTripleStore) AddTriple(t *graph.Triple) { if exists, _ := ts.tripleExists(t); exists { return } var tripleID int64 ts.triples = append(ts.triples, *t) tripleID = ts.tripleIdCounter ts.size++ ts.tripleIdCounter++ for _, dir := range graph.TripleDirections { sid := t.Get(dir) if dir == "c" && sid == "" { continue } if _, ok := ts.idMap[sid]; !ok { ts.idMap[sid] = ts.idCounter ts.revIdMap[ts.idCounter] = sid ts.idCounter++ } } for _, dir := range graph.TripleDirections { if dir == "c" && t.Get(dir) == "" { continue } id := ts.idMap[t.Get(dir)] tree := ts.index.GetOrCreate(dir, id) tree.ReplaceOrInsert(Int64(tripleID)) } // TODO(barakmich): Add VIP indexing }
func (ts *MemTripleStore) tripleExists(t *graph.Triple) (bool, int64) { smallest := -1 var smallest_tree *llrb.LLRB for _, dir := range graph.TripleDirections { sid := t.Get(dir) if dir == "c" && sid == "" { continue } id, ok := ts.idMap[sid] // If we've never heard about a node, it most not exist if !ok { return false, 0 } index, exists := ts.index.Get(dir, id) if !exists { // If it's never been indexed in this direction, it can't exist. return false, 0 } if smallest == -1 || index.Len() < smallest { smallest = index.Len() smallest_tree = index } } it := NewLlrbIterator(smallest_tree, "") for { val, ok := it.Next() if !ok { break } if t.Equals(&ts.triples[val.(int64)]) { return true, val.(int64) } } return false, 0 }
func (ts *MemTripleStore) RemoveTriple(t *graph.Triple) { var tripleID int64 var exists bool tripleID = 0 if exists, tripleID = ts.tripleExists(t); !exists { return } ts.triples[tripleID] = graph.Triple{} ts.size-- for _, dir := range graph.TripleDirections { if dir == "c" && t.Get(dir) == "" { continue } id := ts.idMap[t.Get(dir)] tree := ts.index.GetOrCreate(dir, id) tree.Delete(Int64(tripleID)) } for _, dir := range graph.TripleDirections { if dir == "c" && t.Get(dir) == "" { continue } id, ok := ts.idMap[t.Get(dir)] if !ok { continue } stillExists := false for _, dir := range graph.TripleDirections { if dir == "c" && t.Get(dir) == "" { continue } nodeTree := ts.index.GetOrCreate(dir, id) if nodeTree.Len() != 0 { stillExists = true break } } if !stillExists { delete(ts.idMap, t.Get(dir)) delete(ts.revIdMap, id) } } }