graph/sql: Use an IN clause when optimizing a fixed iterator
This commit is contained in:
parent
7a5e206539
commit
831b14c23e
2 changed files with 42 additions and 2 deletions
|
|
@ -169,6 +169,36 @@ func (qs *QuadStore) optimizeLinksTo(it *iterator.LinksTo) (graph.Iterator, bool
|
||||||
}
|
}
|
||||||
it.Close()
|
it.Close()
|
||||||
return newIt, true
|
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:
|
case sqlType:
|
||||||
p := primary.(*SQLIterator)
|
p := primary.(*SQLIterator)
|
||||||
|
|
|
||||||
|
|
@ -220,8 +220,18 @@ func (l *SQLLinkIterator) buildWhere() (string, []string) {
|
||||||
var q []string
|
var q []string
|
||||||
var vals []string
|
var vals []string
|
||||||
for _, c := range l.constraints {
|
for _, c := range l.constraints {
|
||||||
q = append(q, fmt.Sprintf("%s.%s_hash = ?", l.tableName, c.dir))
|
if len(c.vals) == 1 {
|
||||||
vals = append(vals, hashOf(c.vals[0]))
|
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 {
|
for _, i := range l.nodeIts {
|
||||||
t := i.it.tableID()
|
t := i.it.tableID()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue