privatize morphism

This commit is contained in:
Barak Michener 2014-09-02 18:33:28 -04:00
parent 7b8b72dc54
commit cb2caad603
2 changed files with 57 additions and 27 deletions

View file

@ -20,9 +20,9 @@ import (
"github.com/google/cayley/quad" "github.com/google/cayley/quad"
) )
type Morphism struct { type morphism struct {
Name string Name string
Reversal func() Morphism Reversal func() morphism
Apply graph.MorphismFunc Apply graph.MorphismFunc
} }
@ -31,14 +31,14 @@ type iteratorMorphism interface {
} }
type Path struct { type Path struct {
stack []Morphism stack []morphism
qs graph.QuadStore qs graph.QuadStore
} }
func V(qs graph.QuadStore, nodes ...string) *Path { func V(qs graph.QuadStore, nodes ...string) *Path {
return &Path{ return &Path{
stack: []Morphism{ stack: []morphism{
IsMorphism(qs, nodes...), isMorphism(qs, nodes...),
}, },
qs: qs, qs: qs,
} }
@ -46,7 +46,7 @@ func V(qs graph.QuadStore, nodes ...string) *Path {
func PathFromIterator(qs graph.QuadStore, it graph.Iterator) *Path { func PathFromIterator(qs graph.QuadStore, it graph.Iterator) *Path {
return &Path{ return &Path{
stack: []Morphism{ stack: []morphism{
intersectIteratorMorphism(it), intersectIteratorMorphism(it),
}, },
qs: qs, qs: qs,
@ -68,16 +68,26 @@ func (p *Path) Reverse() *Path {
} }
func (p *Path) Tag(tags ...string) *Path { func (p *Path) Tag(tags ...string) *Path {
p.stack = append(p.stack, TagMorphism(tags...)) p.stack = append(p.stack, tagMorphism(tags...))
return p return p
} }
func (p *Path) Out(via ...interface{}) *Path { func (p *Path) Out(via ...interface{}) *Path {
p.stack = append(p.stack, OutMorphism(p.qs, via...)) p.stack = append(p.stack, outMorphism(p.qs, via...))
return p return p
} }
func (p *Path) In(via ...interface{}) *Path { func (p *Path) In(via ...interface{}) *Path {
p.stack = append(p.stack, InMorphism(p.qs, via...)) p.stack = append(p.stack, inMorphism(p.qs, via...))
return p
}
func (p *Path) And(path *Path) *Path {
p.stack = append(p.stack, andMorphism(path))
return p
}
func (p *Path) Or(path *Path) *Path {
p.stack = append(p.stack, orMorphism(path))
return p return p
} }
@ -96,10 +106,10 @@ func (p *Path) MorphismFunc() graph.MorphismFunc {
} }
} }
func IsMorphism(qs graph.QuadStore, nodes ...string) Morphism { func isMorphism(qs graph.QuadStore, nodes ...string) morphism {
return Morphism{ return morphism{
"is", "is",
func() Morphism { return IsMorphism(qs, nodes...) }, func() morphism { return isMorphism(qs, nodes...) },
func(it graph.Iterator) graph.Iterator { func(it graph.Iterator) graph.Iterator {
fixed := qs.FixedIterator() fixed := qs.FixedIterator()
for _, n := range nodes { for _, n := range nodes {
@ -113,10 +123,10 @@ func IsMorphism(qs graph.QuadStore, nodes ...string) Morphism {
} }
} }
func TagMorphism(tags ...string) Morphism { func tagMorphism(tags ...string) morphism {
return Morphism{ return morphism{
"tag", "tag",
func() Morphism { return TagMorphism(tags...) }, func() morphism { return tagMorphism(tags...) },
func(it graph.Iterator) graph.Iterator { func(it graph.Iterator) graph.Iterator {
for _, t := range tags { for _, t := range tags {
it.Tagger().Add(t) it.Tagger().Add(t)
@ -125,28 +135,28 @@ func TagMorphism(tags ...string) Morphism {
}} }}
} }
func OutMorphism(qs graph.QuadStore, via ...interface{}) Morphism { func outMorphism(qs graph.QuadStore, via ...interface{}) morphism {
path := buildViaPath(qs, via...) path := buildViaPath(qs, via...)
return Morphism{ return morphism{
"out", "out",
func() Morphism { return InMorphism(qs, via...) }, func() morphism { return inMorphism(qs, via...) },
inOutIterator(path, false), inOutIterator(path, false),
} }
} }
func InMorphism(qs graph.QuadStore, via ...interface{}) Morphism { func inMorphism(qs graph.QuadStore, via ...interface{}) morphism {
path := buildViaPath(qs, via...) path := buildViaPath(qs, via...)
return Morphism{ return morphism{
"in", "in",
func() Morphism { return OutMorphism(qs, via...) }, func() morphism { return outMorphism(qs, via...) },
inOutIterator(path, true), inOutIterator(path, true),
} }
} }
func intersectIteratorMorphism(it graph.Iterator) Morphism { func intersectIteratorMorphism(it graph.Iterator) morphism {
return Morphism{ return morphism{
"iterator", "iterator",
func() Morphism { return intersectIteratorMorphism(it) }, func() morphism { return intersectIteratorMorphism(it) },
func(subIt graph.Iterator) graph.Iterator { func(subIt graph.Iterator) graph.Iterator {
and := iterator.NewAnd() and := iterator.NewAnd()
and.AddSubIterator(it) and.AddSubIterator(it)
@ -156,10 +166,10 @@ func intersectIteratorMorphism(it graph.Iterator) Morphism {
} }
} }
func AndMorphism(path *Path) Morphism { func andMorphism(path *Path) morphism {
return Morphism{ return morphism{
"and", "and",
func() Morphism { return AndMorphism(path) }, func() morphism { return andMorphism(path) },
func(it graph.Iterator) graph.Iterator { func(it graph.Iterator) graph.Iterator {
subIt := path.BuildIterator() subIt := path.BuildIterator()
and := iterator.NewAnd() and := iterator.NewAnd()
@ -170,6 +180,20 @@ func AndMorphism(path *Path) Morphism {
} }
} }
func orMorphism(path *Path) morphism {
return morphism{
"or",
func() morphism { return orMorphism(path) },
func(it graph.Iterator) graph.Iterator {
subIt := path.BuildIterator()
and := iterator.NewOr()
and.AddSubIterator(it)
and.AddSubIterator(subIt)
return and
},
}
}
func inOutIterator(viaPath *Path, reverse bool) graph.MorphismFunc { func inOutIterator(viaPath *Path, reverse bool) graph.MorphismFunc {
return func(base graph.Iterator) graph.Iterator { return func(base graph.Iterator) graph.Iterator {
in, out := quad.Subject, quad.Object in, out := quad.Subject, quad.Object

View file

@ -85,6 +85,12 @@ func testSet(qs graph.QuadStore) []test {
path: V(qs, "B").Out(V(qs, "predicates").Out("are")), path: V(qs, "B").Out(V(qs, "predicates").Out("are")),
expect: []string{"F", "cool"}, expect: []string{"F", "cool"},
}, },
{
message: "in",
path: V(qs, "D").Out("follows").And(
V(qs, "C").Out("follows")),
expect: []string{"B"},
},
} }
} }