Refactor event to subgraph pipeline.

This commit is contained in:
Jay
2026-03-03 16:33:30 -05:00
parent c4cc7115b3
commit 4fddf849d0
3 changed files with 76 additions and 65 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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) {