initial mongo indexed linksto
This commit is contained in:
parent
6764ea0295
commit
5be1df3be3
9 changed files with 362 additions and 18 deletions
|
|
@ -15,6 +15,8 @@
|
|||
package mongo
|
||||
|
||||
import (
|
||||
"github.com/barakmich/glog"
|
||||
|
||||
"github.com/google/cayley/graph"
|
||||
"github.com/google/cayley/graph/iterator"
|
||||
)
|
||||
|
|
@ -23,11 +25,68 @@ func (qs *QuadStore) OptimizeIterator(it graph.Iterator) (graph.Iterator, bool)
|
|||
switch it.Type() {
|
||||
case graph.LinksTo:
|
||||
return qs.optimizeLinksTo(it.(*iterator.LinksTo))
|
||||
case graph.And:
|
||||
return qs.optimizeAndIterator(it.(*iterator.And))
|
||||
|
||||
}
|
||||
return it, false
|
||||
}
|
||||
|
||||
func (qs *QuadStore) optimizeAndIterator(it *iterator.And) (graph.Iterator, bool) {
|
||||
// Fail fast if nothing can happen
|
||||
glog.V(4).Infoln("Entering optimizeAndIterator", it.UID())
|
||||
found := false
|
||||
for _, it := range it.SubIterators() {
|
||||
glog.V(4).Infoln(it.Type())
|
||||
if it.Type() == mongoType {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
glog.V(4).Infoln("Aborting optimizeAndIterator")
|
||||
return it, false
|
||||
}
|
||||
|
||||
newAnd := iterator.NewAnd(qs)
|
||||
var firstmongo *Iterator
|
||||
for _, it := range it.SubIterators() {
|
||||
switch it.Type() {
|
||||
case mongoType:
|
||||
if firstmongo == nil {
|
||||
firstmongo = it.(*Iterator)
|
||||
} else {
|
||||
newAnd.AddSubIterator(it)
|
||||
}
|
||||
case graph.LinksTo:
|
||||
continue
|
||||
default:
|
||||
newAnd.AddSubIterator(it)
|
||||
}
|
||||
}
|
||||
|
||||
lset := []graph.LinkageSet{
|
||||
{
|
||||
Dir: firstmongo.dir,
|
||||
Values: []graph.Value{qs.ValueOf(firstmongo.name)},
|
||||
},
|
||||
}
|
||||
|
||||
ltocount := 0
|
||||
for _, it := range it.SubIterators() {
|
||||
if it.Type() == graph.LinksTo {
|
||||
lto := it.(*iterator.LinksTo)
|
||||
newLto := NewLinksTo(qs, lto.SubIterators()[0], "quads", lto.Direction(), lset)
|
||||
newAnd.AddSubIterator(newLto)
|
||||
ltocount++
|
||||
}
|
||||
}
|
||||
if ltocount == 0 {
|
||||
return it, false
|
||||
}
|
||||
|
||||
return newAnd.Optimize()
|
||||
}
|
||||
|
||||
func (qs *QuadStore) optimizeLinksTo(it *iterator.LinksTo) (graph.Iterator, bool) {
|
||||
subs := it.SubIterators()
|
||||
if len(subs) != 1 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue