Refactor event to subgraph pipeline.
This commit is contained in:
22
expanders.go
22
expanders.go
@@ -6,23 +6,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Expander func(e roots.Event, s *EventSubgraph)
|
type Expander func(e roots.Event, s *EventSubgraph)
|
||||||
type ExpanderRegistry []Expander
|
type ExpanderPipeline []Expander
|
||||||
|
|
||||||
func NewExpanderRegistry() ExpanderRegistry {
|
func NewExpanderPipeline(expanders ...Expander) ExpanderPipeline {
|
||||||
return []Expander{}
|
return ExpanderPipeline(expanders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDefaultExpanderRegistry() ExpanderRegistry {
|
func DefaultExpanders() []Expander {
|
||||||
registry := NewExpanderRegistry()
|
return []Expander{
|
||||||
|
ExpandTaggedEvents,
|
||||||
registry.Add(ExpandTaggedEvents)
|
ExpandTaggedUsers,
|
||||||
registry.Add(ExpandTaggedUsers)
|
}
|
||||||
|
|
||||||
return registry
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *ExpanderRegistry) Add(m Expander) {
|
|
||||||
*r = append(*r, m)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default Expander Functions
|
// Default Expander Functions
|
||||||
|
|||||||
117
subgraph.go
117
subgraph.go
@@ -45,56 +45,7 @@ func (s *EventSubgraph) NodesByLabel(label string) []*graph.Node {
|
|||||||
return nodes
|
return nodes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event to subgraph conversion
|
// Helpers
|
||||||
|
|
||||||
func EventToSubgraph(e roots.Event, exp ExpanderRegistry) *EventSubgraph {
|
|
||||||
subgraph := NewEventSubgraph()
|
|
||||||
|
|
||||||
// Create Event node
|
|
||||||
eventNode := graph.NewEventNode(e.ID)
|
|
||||||
eventNode.Props["created_at"] = e.CreatedAt
|
|
||||||
eventNode.Props["kind"] = e.Kind
|
|
||||||
eventNode.Props["content"] = e.Content
|
|
||||||
|
|
||||||
// Create User node
|
|
||||||
userNode := graph.NewUserNode(e.PubKey)
|
|
||||||
|
|
||||||
// Create SIGNED rel
|
|
||||||
signedRel := graph.NewSignedRel(userNode, eventNode, nil)
|
|
||||||
|
|
||||||
// Create Tag nodes
|
|
||||||
tagNodes := []*graph.Node{}
|
|
||||||
for _, tag := range e.Tags {
|
|
||||||
if !isValidTag(tag) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
tagNodes = append(tagNodes, graph.NewTagNode(tag[0], tag[1]))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create Tag rels
|
|
||||||
tagRels := []*graph.Relationship{}
|
|
||||||
for _, tagNode := range tagNodes {
|
|
||||||
tagRels = append(tagRels, graph.NewTaggedRel(eventNode, tagNode, nil))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Populate subgraph
|
|
||||||
subgraph.AddNode(eventNode)
|
|
||||||
subgraph.AddNode(userNode)
|
|
||||||
subgraph.AddRel(signedRel)
|
|
||||||
for _, node := range tagNodes {
|
|
||||||
subgraph.AddNode(node)
|
|
||||||
}
|
|
||||||
for _, rel := range tagRels {
|
|
||||||
subgraph.AddRel(rel)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run expanders
|
|
||||||
for _, expander := range exp {
|
|
||||||
expander(e, subgraph)
|
|
||||||
}
|
|
||||||
|
|
||||||
return subgraph
|
|
||||||
}
|
|
||||||
|
|
||||||
func isValidTag(t roots.Tag) bool {
|
func isValidTag(t roots.Tag) bool {
|
||||||
if len(t) < 2 {
|
if len(t) < 2 {
|
||||||
@@ -107,3 +58,69 @@ func isValidTag(t roots.Tag) bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Event to subgraph conversion
|
||||||
|
|
||||||
|
func EventToSubgraph(e roots.Event, p ExpanderPipeline) *EventSubgraph {
|
||||||
|
s := NewEventSubgraph()
|
||||||
|
|
||||||
|
// Create core entities
|
||||||
|
eventNode := newEventNode(e)
|
||||||
|
userNode := newUserNode(e)
|
||||||
|
signedRel := newSignedRel(userNode, eventNode)
|
||||||
|
tagNodes := newTagNodes(e)
|
||||||
|
tagRels := newTagRels(eventNode, tagNodes)
|
||||||
|
|
||||||
|
// Populate subgraph
|
||||||
|
s.AddNode(eventNode)
|
||||||
|
s.AddNode(userNode)
|
||||||
|
s.AddRel(signedRel)
|
||||||
|
for _, node := range tagNodes {
|
||||||
|
s.AddNode(node)
|
||||||
|
}
|
||||||
|
for _, rel := range tagRels {
|
||||||
|
s.AddRel(rel)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run expanders
|
||||||
|
for _, expander := range p {
|
||||||
|
expander(e, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func newEventNode(e roots.Event) *graph.Node {
|
||||||
|
eventNode := graph.NewEventNode(e.ID)
|
||||||
|
eventNode.Props["created_at"] = e.CreatedAt
|
||||||
|
eventNode.Props["kind"] = e.Kind
|
||||||
|
eventNode.Props["content"] = e.Content
|
||||||
|
return eventNode
|
||||||
|
}
|
||||||
|
|
||||||
|
func newUserNode(e roots.Event) *graph.Node {
|
||||||
|
return graph.NewUserNode(e.PubKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSignedRel(user, event *graph.Node) *graph.Relationship {
|
||||||
|
return graph.NewSignedRel(user, event, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTagNodes(e roots.Event) []*graph.Node {
|
||||||
|
nodes := []*graph.Node{}
|
||||||
|
for _, tag := range e.Tags {
|
||||||
|
if !isValidTag(tag) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
nodes = append(nodes, graph.NewTagNode(tag[0], tag[1]))
|
||||||
|
}
|
||||||
|
return nodes
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTagRels(event *graph.Node, tags []*graph.Node) []*graph.Relationship {
|
||||||
|
rels := []*graph.Relationship{}
|
||||||
|
for _, tag := range tags {
|
||||||
|
rels = append(rels, graph.NewTaggedRel(event, tag, nil))
|
||||||
|
}
|
||||||
|
return rels
|
||||||
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ func TestEventToSubgraph(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
expanders := GetDefaultExpanderRegistry()
|
expanders := NewExpanderPipeline(DefaultExpanders()...)
|
||||||
|
|
||||||
for _, tc := range cases {
|
for _, tc := range cases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user