privatize morphism
This commit is contained in:
parent
7b8b72dc54
commit
cb2caad603
2 changed files with 57 additions and 27 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue