From aedd0401e29c27cd19a8f84d67fa5a85e08f9a6d Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Mon, 10 Aug 2015 15:41:22 -0400 Subject: [PATCH] Fix up hash interface and speed up save queries 10x Fix all optimizer --- graph/sql/optimizers.go | 3 ++- graph/sql/sql_iterator.go | 2 +- graph/sql/sql_link_iterator.go | 17 ++++++++++++----- graph/sql/sql_node_intersection.go | 9 ++++++--- graph/sql/sql_node_iterator.go | 7 +++++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/graph/sql/optimizers.go b/graph/sql/optimizers.go index f04543e..c46c600 100644 --- a/graph/sql/optimizers.go +++ b/graph/sql/optimizers.go @@ -164,7 +164,8 @@ func (qs *QuadStore) optimizeLinksTo(it *iterator.LinksTo) (graph.Iterator, bool return newit, true case graph.All: linkit := &SQLLinkIterator{ - size: qs.Size(), + tableName: newTableName(), + size: qs.Size(), } for _, t := range primary.Tagger().Tags() { linkit.tagdirs = append(linkit.tagdirs, tagDir{ diff --git a/graph/sql/sql_iterator.go b/graph/sql/sql_iterator.go index 3f2d758..35a062f 100644 --- a/graph/sql/sql_iterator.go +++ b/graph/sql/sql_iterator.go @@ -290,7 +290,7 @@ func (it *SQLIterator) makeCursor(next bool, value graph.Value) error { } var q string var values []string - q, values = it.sql.buildSQL(next, value, false) + q, values = it.sql.buildSQL(next, value, true) q = convertToPostgres(q, values) ivalues := make([]interface{}, 0, len(values)) for _, v := range values { diff --git a/graph/sql/sql_link_iterator.go b/graph/sql/sql_link_iterator.go index fc6d02e..338ce00 100644 --- a/graph/sql/sql_link_iterator.go +++ b/graph/sql/sql_link_iterator.go @@ -71,7 +71,7 @@ type sqlItDir struct { type sqlIterator interface { sqlClone() sqlIterator - buildSQL(next bool, val graph.Value, hash bool) (string, []string) + buildSQL(next bool, val graph.Value, topLevel bool) (string, []string) getTables() []tableDef getTags() []tagDir buildWhere() (string, []string) @@ -246,10 +246,13 @@ func (l *SQLLinkIterator) tableID() tagDir { } } -func (l *SQLLinkIterator) buildSQL(next bool, val graph.Value, hash bool) (string, []string) { - query := "SELECT DISTINCT " +func (l *SQLLinkIterator) buildSQL(next bool, val graph.Value, topLevel bool) (string, []string) { + query := "SELECT " + if topLevel { + query += "DISTINCT " + } hashs := "" - if hash { + if !topLevel { hashs = "_hash" } t := []string{ @@ -270,14 +273,18 @@ func (l *SQLLinkIterator) buildSQL(next bool, val graph.Value, hash bool) (strin t = append(t, fmt.Sprintf("%s as %s", k.table, k.name)) } query += strings.Join(t, ", ") - query += " WHERE " constraint, wherevalues := l.buildWhere() + if constraint != "" { + query += " WHERE " + } values = append(values, wherevalues...) if !next { v := val.(quad.Quad) if constraint != "" { constraint += " AND " + } else { + constraint += " WHERE " } t = []string{ fmt.Sprintf("%s.subject_hash = ?", l.tableName), diff --git a/graph/sql/sql_node_intersection.go b/graph/sql/sql_node_intersection.go index 807df72..9c0434e 100644 --- a/graph/sql/sql_node_intersection.go +++ b/graph/sql/sql_node_intersection.go @@ -103,7 +103,7 @@ func (n *SQLNodeIntersection) buildSubqueries() []tableDef { for i, it := range n.nodeIts { var td tableDef var table string - table, td.values = it.buildSQL(true, nil, true) + table, td.values = it.buildSQL(true, nil, false) td.table = fmt.Sprintf("\n(%s)", table[:len(table)-1]) td.name = n.nodetables[i] out = append(out, td) @@ -159,11 +159,14 @@ func (n *SQLNodeIntersection) buildWhere() (string, []string) { return query, vals } -func (n *SQLNodeIntersection) buildSQL(next bool, val graph.Value, _ bool) (string, []string) { +func (n *SQLNodeIntersection) buildSQL(next bool, val graph.Value, topLevel bool) (string, []string) { topData := n.tableID() tags := []tagDir{topData} tags = append(tags, n.getTags()...) - query := "SELECT DISTINCT " + query := "SELECT " + if topLevel { + query += "DISTINCT " + } var t []string for _, v := range tags { t = append(t, v.String()) diff --git a/graph/sql/sql_node_iterator.go b/graph/sql/sql_node_iterator.go index 55eb211..abe89f4 100644 --- a/graph/sql/sql_node_iterator.go +++ b/graph/sql/sql_node_iterator.go @@ -160,11 +160,14 @@ func (n *SQLNodeIterator) buildWhere() (string, []string) { return query, vals } -func (n *SQLNodeIterator) buildSQL(next bool, val graph.Value, _ bool) (string, []string) { +func (n *SQLNodeIterator) buildSQL(next bool, val graph.Value, topLevel bool) (string, []string) { topData := n.tableID() tags := []tagDir{topData} tags = append(tags, n.getTags()...) - query := "SELECT DISTINCT " + query := "SELECT " + if topLevel { + query += "DISTINCT " + } var t []string for _, v := range tags { t = append(t, v.String())