graph/sql: Use an IN clause when optimizing a fixed iterator

This commit is contained in:
Barak Michener 2015-11-12 14:46:31 -05:00
parent 7a5e206539
commit 831b14c23e
2 changed files with 42 additions and 2 deletions

View file

@ -169,6 +169,36 @@ func (qs *QuadStore) optimizeLinksTo(it *iterator.LinksTo) (graph.Iterator, bool
}
it.Close()
return newIt, true
} else if size > 1 {
var vals []string
for graph.Next(primary) {
vals = append(vals, qs.NameOf(primary.Result()))
}
lsql := &SQLLinkIterator{
constraints: []constraint{
constraint{
dir: it.Direction(),
vals: vals,
},
},
tableName: newTableName(),
size: 0,
}
l := &SQLIterator{
uid: iterator.NextUID(),
qs: qs,
sql: lsql,
}
nt := l.Tagger()
nt.CopyFrom(it)
for _, t := range primary.Tagger().Tags() {
lsql.tagdirs = append(lsql.tagdirs, tagDir{
dir: it.Direction(),
tag: t,
})
}
it.Close()
return l, true
}
case sqlType:
p := primary.(*SQLIterator)

View file

@ -220,8 +220,18 @@ func (l *SQLLinkIterator) buildWhere() (string, []string) {
var q []string
var vals []string
for _, c := range l.constraints {
q = append(q, fmt.Sprintf("%s.%s_hash = ?", l.tableName, c.dir))
vals = append(vals, hashOf(c.vals[0]))
if len(c.vals) == 1 {
q = append(q, fmt.Sprintf("%s.%s_hash = ?", l.tableName, c.dir))
vals = append(vals, hashOf(c.vals[0]))
} else if len(c.vals) > 1 {
subq := fmt.Sprintf("%s.%s_hash IN ", l.tableName, c.dir)
valslots := strings.Join(strings.Split(strings.Repeat("?", len(c.vals)), ""), ", ")
subq += fmt.Sprintf("(%s)", valslots)
q = append(q, subq)
for _, v := range c.vals {
vals = append(vals, hashOf(v))
}
}
}
for _, i := range l.nodeIts {
t := i.it.tableID()