Harden item occurrence grounding
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package itemoccurrences
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
|
||||
@@ -15,12 +16,15 @@ type orderedItemOccurrenceResponse struct {
|
||||
hasEvidence bool
|
||||
}
|
||||
|
||||
func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOrder, sourceID string) {
|
||||
func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOrder, sourceID string, registry *itemregistry.Registry) error {
|
||||
if response == nil {
|
||||
return
|
||||
return nil
|
||||
}
|
||||
ordered := make([]orderedItemOccurrenceResponse, len(response.Occurrences))
|
||||
for index := range response.Occurrences {
|
||||
if err := validateRegistryPair(index, response.Occurrences[index], registry); err != nil {
|
||||
return err
|
||||
}
|
||||
earliest, hasEvidence := canonicalizeItemOccurrence(&response.Occurrences[index], order, sourceID)
|
||||
ordered[index] = orderedItemOccurrenceResponse{
|
||||
value: response.Occurrences[index],
|
||||
@@ -40,6 +44,7 @@ func canonicalizeResponse(response *extractionResponse, order shared.SourceRefOr
|
||||
for index := range ordered {
|
||||
response.Occurrences[index] = ordered[index].value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func canonicalizeItemOccurrence(occurrence *itemOccurrenceResponse, order shared.SourceRefOrder, sourceID string) (int, bool) {
|
||||
@@ -51,16 +56,23 @@ func canonicalizeItemOccurrence(occurrence *itemOccurrenceResponse, order shared
|
||||
return order.EarliestValid(refs)
|
||||
}
|
||||
|
||||
func canonicalItemOccurrenceList(response extractionResponse, sourceID string, registry *itemregistry.Registry) dnd.ItemOccurrenceList {
|
||||
func validateRegistryPair(index int, occurrence itemOccurrenceResponse, registry *itemregistry.Registry) error {
|
||||
item, found := registry.LookupID(occurrence.ItemID)
|
||||
if !found {
|
||||
return fmt.Errorf("occurrences[%d].item_id is not in the item registry", index)
|
||||
}
|
||||
if item.Name != occurrence.Name {
|
||||
return fmt.Errorf("occurrences[%d].name does not match item_id", index)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func canonicalItemOccurrenceList(response extractionResponse, sourceID string) dnd.ItemOccurrenceList {
|
||||
if response.Occurrences == nil {
|
||||
return dnd.ItemOccurrenceList{}
|
||||
}
|
||||
occurrences := make([]dnd.ItemOccurrence, 0, len(response.Occurrences))
|
||||
for _, occurrence := range response.Occurrences {
|
||||
item, found := registry.LookupID(occurrence.ItemID)
|
||||
if !found || item.Name != occurrence.Name {
|
||||
continue
|
||||
}
|
||||
occurrences = append(occurrences, dnd.ItemOccurrence{
|
||||
ItemID: occurrence.ItemID,
|
||||
Name: occurrence.Name,
|
||||
|
||||
Reference in New Issue
Block a user