From f2fd9f9c0ab0056cba61961abb62c8d9dcebc634 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Fri, 3 Jan 2025 23:01:34 +0100 Subject: [PATCH] BUGFIX: Reverse Lookups working --- providers/xmlprovider/xmlprovider.go | 9 ++-- viewmodels/agent_view.go | 61 +++++++------------------- views/routes/components/_akteur.gohtml | 6 +-- 3 files changed, 26 insertions(+), 50 deletions(-) diff --git a/providers/xmlprovider/xmlprovider.go b/providers/xmlprovider/xmlprovider.go index 2e82b54..c48bd80 100644 --- a/providers/xmlprovider/xmlprovider.go +++ b/providers/xmlprovider/xmlprovider.go @@ -142,14 +142,17 @@ func (p *XMLProvider[T]) ReverseLookup(item XMLItem) ([]Resolved[T], error) { return nil, fmt.Errorf("Item has no keys") } + // INFO: this runs just once for the first key + ret := make([]Resolved[T], 0) for _, key := range keys { - ret, err := p.Resolver.Get(item.Name(), key) + r, err := p.Resolver.Get(item.Name(), key) if err != nil { - return ret, nil + return ret, err } + ret = append(ret, r...) } - return []Resolved[T]{}, nil + return ret, nil } func (a *XMLProvider[T]) String() string { diff --git a/viewmodels/agent_view.go b/viewmodels/agent_view.go index 753dcaa..151fa6f 100644 --- a/viewmodels/agent_view.go +++ b/viewmodels/agent_view.go @@ -5,6 +5,7 @@ import ( "slices" "strings" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider" "github.com/Theodor-Springmann-Stiftung/kgpz_web/xmlmodels" ) @@ -18,23 +19,12 @@ type AgentsListView struct { type AgentView struct { xmlmodels.Agent Works []WorkByAgent - Pieces []PieceByAgent + Pieces []xmlprovider.Resolved[xmlmodels.Piece] } type WorkByAgent struct { - xmlmodels.Work - Pieces []PieceByWork - Reference xmlmodels.AgentRef -} - -type PieceByAgent struct { - xmlmodels.Piece - Reference xmlmodels.AgentRef -} - -type PieceByWork struct { - xmlmodels.Piece - Reference xmlmodels.WorkRef + xmlprovider.Resolved[xmlmodels.Work] + Pieces []xmlprovider.Resolved[xmlmodels.Piece] } func AgentsView(letterorid string, lib *xmlmodels.Library) *AgentsListView { @@ -62,40 +52,23 @@ func AgentsView(letterorid string, lib *xmlmodels.Library) *AgentsListView { } } - // TODO: We won't need to lock the library if we take down the server during parsing - lib.Works.Lock() - // for _, a := range res.Agents { - // - // } - // for _, w := range lib.Works.Array { - // if ref, ok := w.ReferencesAgent(letterorid); ok { - // if entry, ok := res.Agents[ref.Ref]; ok { - // entry.Works = append(entry.Works, WorkByAgent{Work: w, Reference: *ref}) - // res.Agents[ref.Ref] = entry - // } - // } - // } - lib.Works.Unlock() - - lib.Pieces.Lock() - for _, p := range lib.Pieces.Array { - if ref, ok := p.ReferencesAgent(letterorid); ok { - if entry, ok := res.Agents[ref.Ref]; ok { - entry.Pieces = append(entry.Pieces, PieceByAgent{Piece: p, Reference: *ref}) - res.Agents[ref.Ref] = entry - } - } - - // PERF: This is really slow: resolve all backlinks after parse? - for _, a := range res.Agents { - for _, w := range a.Works { - if ref, ok := p.ReferencesWork(w.ID); ok { - w.Pieces = append(w.Pieces, PieceByWork{Piece: p, Reference: *ref}) + // INFO: All lookups are O(1) + for _, a := range res.Agents { + if works, err := lib.Works.ReverseLookup(a); err == nil { + for _, w := range works { + if pieces, err := lib.Pieces.ReverseLookup(w.Item); err == nil { + a.Works = append(a.Works, WorkByAgent{Resolved: w, Pieces: pieces}) } } } + + if pieces, err := lib.Pieces.ReverseLookup(a.Agent); err == nil { + a.Pieces = pieces + } + + // TODO: sort the things, also for works and pieces above + res.Agents[a.ID] = a } - lib.Pieces.Unlock() res.AvailableLetters = slices.Collect(maps.Keys(av)) slices.Sort(res.AvailableLetters) diff --git a/views/routes/components/_akteur.gohtml b/views/routes/components/_akteur.gohtml index c65d889..1312499 100644 --- a/views/routes/components/_akteur.gohtml +++ b/views/routes/components/_akteur.gohtml @@ -45,10 +45,10 @@ {{- if ne (len $a.Works) 0 -}}
{{ range $_, $w := $a.Works }} - {{- if ne (len $w.Citation.InnerXML ) 0 -}} + {{- if ne (len $w.Item.Citation.InnerXML ) 0 -}} {{- end -}} @@ -59,7 +59,7 @@ {{- if ne (len $a.Pieces) 0 -}}
{{ range $_, $p := $a.Pieces }} - {{- range $_, $i := $p.IssueRefs -}} + {{- range $_, $i := $p.Item.IssueRefs -}}
{{ $i.Nr }}/{{ $i.When }}