From 7b8b72dc549e68e3d97d1dc1d21b433997518827 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Tue, 2 Sep 2014 17:15:07 -0400 Subject: [PATCH] unify morphisms and paths --- graph/api/api.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/graph/api/api.go b/graph/api/api.go index 4ddc5e3..a48e666 100644 --- a/graph/api/api.go +++ b/graph/api/api.go @@ -32,31 +32,29 @@ type iteratorMorphism interface { type Path struct { stack []Morphism - it graph.Iterator qs graph.QuadStore } func V(qs graph.QuadStore, nodes ...string) *Path { - fixed := qs.FixedIterator() - for _, n := range nodes { - fixed.Add(qs.ValueOf(n)) - } return &Path{ - it: fixed, + stack: []Morphism{ + IsMorphism(qs, nodes...), + }, qs: qs, } } func PathFromIterator(qs graph.QuadStore, it graph.Iterator) *Path { return &Path{ - it: it, + stack: []Morphism{ + intersectIteratorMorphism(it), + }, qs: qs, } } func M(qs graph.QuadStore) *Path { return &Path{ - it: nil, qs: qs, } } @@ -69,8 +67,6 @@ func (p *Path) Reverse() *Path { return newPath } -func (p *Path) IsConcrete() bool { return p.it != nil } - func (p *Path) Tag(tags ...string) *Path { p.stack = append(p.stack, TagMorphism(tags...)) return p @@ -87,7 +83,7 @@ func (p *Path) In(via ...interface{}) *Path { func (p *Path) BuildIterator() graph.Iterator { f := p.MorphismFunc() - return f(p.it) + return f(p.qs.NodesAllIterator()) } func (p *Path) MorphismFunc() graph.MorphismFunc { @@ -100,6 +96,23 @@ func (p *Path) MorphismFunc() graph.MorphismFunc { } } +func IsMorphism(qs graph.QuadStore, nodes ...string) Morphism { + return Morphism{ + "is", + func() Morphism { return IsMorphism(qs, nodes...) }, + func(it graph.Iterator) graph.Iterator { + fixed := qs.FixedIterator() + for _, n := range nodes { + fixed.Add(qs.ValueOf(n)) + } + and := iterator.NewAnd() + and.AddSubIterator(fixed) + and.AddSubIterator(it) + return and + }, + } +} + func TagMorphism(tags ...string) Morphism { return Morphism{ "tag", @@ -130,6 +143,33 @@ func InMorphism(qs graph.QuadStore, via ...interface{}) Morphism { } } +func intersectIteratorMorphism(it graph.Iterator) Morphism { + return Morphism{ + "iterator", + func() Morphism { return intersectIteratorMorphism(it) }, + func(subIt graph.Iterator) graph.Iterator { + and := iterator.NewAnd() + and.AddSubIterator(it) + and.AddSubIterator(subIt) + return and + }, + } +} + +func AndMorphism(path *Path) Morphism { + return Morphism{ + "and", + func() Morphism { return AndMorphism(path) }, + func(it graph.Iterator) graph.Iterator { + subIt := path.BuildIterator() + and := iterator.NewAnd() + and.AddSubIterator(it) + and.AddSubIterator(subIt) + return and + }, + } +} + func inOutIterator(viaPath *Path, reverse bool) graph.MorphismFunc { return func(base graph.Iterator) graph.Iterator { in, out := quad.Subject, quad.Object