From fab8cd64b3addd6a38bcd588325d7d45a2e20465 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Mon, 10 Aug 2015 16:28:16 -0400 Subject: [PATCH] Option to remove size calls Fix permutations of optimization intersections Return empty string as per bolt fix case sensitivity and memstore panic --- graph/memstore/quadstore.go | 3 +++ graph/sql/optimizers.go | 17 +++++++++++++++++ graph/sql/quadstore.go | 11 +++++++++++ graph/sql/sql_link_iterator.go | 6 +++--- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/graph/memstore/quadstore.go b/graph/memstore/quadstore.go index 5605437..a2db9db 100644 --- a/graph/memstore/quadstore.go +++ b/graph/memstore/quadstore.go @@ -249,6 +249,9 @@ func (qs *QuadStore) ValueOf(name string) graph.Value { } func (qs *QuadStore) NameOf(id graph.Value) string { + if id == nil { + return "" + } return qs.revIDMap[id.(int64)] } diff --git a/graph/sql/optimizers.go b/graph/sql/optimizers.go index c46c600..538ddd7 100644 --- a/graph/sql/optimizers.go +++ b/graph/sql/optimizers.go @@ -28,10 +28,16 @@ func intersect(a sqlIterator, b sqlIterator, qs *QuadStore) (*SQLIterator, error if bnew, ok := b.(*SQLNodeIterator); ok { return intersectNode(anew, bnew, qs) } + if bnew, ok := b.(*SQLNodeIntersection); ok { + return appendNodeIntersection(bnew, anew, qs) + } } else if anew, ok := a.(*SQLNodeIntersection); ok { if bnew, ok := b.(*SQLNodeIterator); ok { return appendNodeIntersection(anew, bnew, qs) } + if bnew, ok := b.(*SQLNodeIntersection); ok { + return combineNodeIntersection(anew, bnew, qs) + } } else if anew, ok := a.(*SQLLinkIterator); ok { if bnew, ok := b.(*SQLLinkIterator); ok { return intersectLink(anew, bnew, qs) @@ -65,6 +71,17 @@ func appendNodeIntersection(a *SQLNodeIntersection, b *SQLNodeIterator, qs *Quad return it, nil } +func combineNodeIntersection(a *SQLNodeIntersection, b *SQLNodeIntersection, qs *QuadStore) (*SQLIterator, error) { + m := &SQLNodeIntersection{ + tableName: newTableName(), + nodeIts: append(a.nodeIts, b.nodeIts...), + } + m.Tagger().CopyFromTagger(a.Tagger()) + m.Tagger().CopyFromTagger(b.Tagger()) + it := NewSQLIterator(qs, m) + return it, nil +} + func intersectLink(a *SQLLinkIterator, b *SQLLinkIterator, qs *QuadStore) (*SQLIterator, error) { m := &SQLLinkIterator{ tableName: newTableName(), diff --git a/graph/sql/quadstore.go b/graph/sql/quadstore.go index 4c708cb..61dfbb9 100644 --- a/graph/sql/quadstore.go +++ b/graph/sql/quadstore.go @@ -34,6 +34,7 @@ type QuadStore struct { sqlFlavor string size int64 lru *cache + noSizes bool } func connectSQLTables(addr string, _ graph.Options) (*sql.DB, error) { @@ -257,6 +258,10 @@ func (qs *QuadStore) ValueOf(s string) graph.Value { } func (qs *QuadStore) NameOf(v graph.Value) string { + if v == nil { + glog.V(2).Info("NameOf was nil") + return "" + } return v.(string) } @@ -306,6 +311,12 @@ func (qs *QuadStore) sizeForIterator(isAll bool, dir quad.Direction, val string) if isAll { return qs.Size() } + if qs.noSizes { + if dir == quad.Predicate { + return (qs.Size() / 100) + 1 + } + return (qs.Size() / 1000) + 1 + } if val, ok := qs.lru.Get(val + string(dir.Prefix())); ok { return val } diff --git a/graph/sql/sql_link_iterator.go b/graph/sql/sql_link_iterator.go index 338ce00..dea3243 100644 --- a/graph/sql/sql_link_iterator.go +++ b/graph/sql/sql_link_iterator.go @@ -50,11 +50,11 @@ type tagDir struct { func (t tagDir) String() string { if t.dir == quad.Any { if t.justLocal { - return fmt.Sprintf("%s.__execd as %s, %s.__execd_hash as %s_hash", t.table, t.tag, t.table, t.tag) + return fmt.Sprintf("%s.__execd as \"%s\", %s.__execd_hash as %s_hash", t.table, t.tag, t.table, t.tag) } - return fmt.Sprintf("%s.%s as %s, %s.%s_hash as %s_hash", t.table, t.tag, t.tag, t.table, t.tag, t.tag) + return fmt.Sprintf("%s.\"%s\" as \"%s\", %s.%s_hash as %s_hash", t.table, t.tag, t.tag, t.table, t.tag, t.tag) } - return fmt.Sprintf("%s.%s as %s, %s.%s_hash as %s_hash", t.table, t.dir, t.tag, t.table, t.dir, t.tag) + return fmt.Sprintf("%s.%s as \"%s\", %s.%s_hash as %s_hash", t.table, t.dir, t.tag, t.table, t.dir, t.tag) } type tableDef struct {