diff --git a/expanders.go b/expanders.go index 35c736d..fa2fa9c 100644 --- a/expanders.go +++ b/expanders.go @@ -6,23 +6,17 @@ import ( ) type Expander func(e roots.Event, s *EventSubgraph) -type ExpanderRegistry []Expander +type ExpanderPipeline []Expander -func NewExpanderRegistry() ExpanderRegistry { - return []Expander{} +func NewExpanderPipeline(expanders ...Expander) ExpanderPipeline { + return ExpanderPipeline(expanders) } -func GetDefaultExpanderRegistry() ExpanderRegistry { - registry := NewExpanderRegistry() - - registry.Add(ExpandTaggedEvents) - registry.Add(ExpandTaggedUsers) - - return registry -} - -func (r *ExpanderRegistry) Add(m Expander) { - *r = append(*r, m) +func DefaultExpanders() []Expander { + return []Expander{ + ExpandTaggedEvents, + ExpandTaggedUsers, + } } // Default Expander Functions diff --git a/subgraph.go b/subgraph.go index bd34327..8556f37 100644 --- a/subgraph.go +++ b/subgraph.go @@ -45,56 +45,7 @@ func (s *EventSubgraph) NodesByLabel(label string) []*graph.Node { return nodes } -// Event to subgraph conversion - -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 -} +// Helpers func isValidTag(t roots.Tag) bool { if len(t) < 2 { @@ -107,3 +58,69 @@ func isValidTag(t roots.Tag) bool { } 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 +} diff --git a/subgraph_test.go b/subgraph_test.go index af13902..23a5f59 100644 --- a/subgraph_test.go +++ b/subgraph_test.go @@ -152,7 +152,7 @@ func TestEventToSubgraph(t *testing.T) { }, } - expanders := GetDefaultExpanderRegistry() + expanders := NewExpanderPipeline(DefaultExpanders()...) for _, tc := range cases { t.Run(tc.name, func(t *testing.T) {