Files
query-orchestration/internal/document/text/childElements.go
T

100 lines
2.2 KiB
Go
Raw Normal View History

2025-04-25 17:02:50 +00:00
package documenttext
import (
"log/slog"
"github.com/aws/aws-sdk-go-v2/service/textract/types"
"github.com/google/uuid"
)
func (s *Service) GetDirectChildren(id uuid.UUID, blockMap map[uuid.UUID]types.Block) []uuid.UUID {
2025-04-25 17:02:50 +00:00
lines := []uuid.UUID{}
found := map[uuid.UUID]*bool{}
for _, id := range s.getRelationshipIds(blockMap[id]) {
2025-04-25 17:02:50 +00:00
if found[id] != nil && !*found[id] {
continue
}
lines = append(lines, id)
f := true
found[id] = &f
s.removeChildren(id, blockMap, &found)
2025-04-25 17:02:50 +00:00
}
output := []uuid.UUID{}
for _, id := range lines {
if found[id] == nil || !*found[id] {
continue
}
output = append(output, id)
}
return output
}
func (s *Service) removeChildren(id uuid.UUID, blockMap map[uuid.UUID]types.Block, found *map[uuid.UUID]*bool) {
for _, childId := range s.getRelationshipIds(blockMap[id]) {
2025-04-25 17:02:50 +00:00
f := false
(*found)[childId] = &f
s.removeChildren(childId, blockMap, found)
2025-04-25 17:02:50 +00:00
}
}
func (s *Service) GetBlockMap(blocksList []types.Block) map[uuid.UUID]types.Block {
2025-04-25 17:02:50 +00:00
blocks := make(map[uuid.UUID]types.Block, len(blocksList))
for _, block := range blocksList {
if block.Id == nil {
continue
}
id, err := uuid.Parse(*block.Id)
if err != nil {
slog.Warn("error parsing block id for block map", "error", err, "id", *block.Id)
2025-04-25 17:02:50 +00:00
continue
}
blocks[id] = block
}
return blocks
}
func (s *Service) getRelationshipIds(block types.Block) []uuid.UUID {
2025-04-25 17:02:50 +00:00
childIds := []uuid.UUID{}
for _, relationship := range block.Relationships {
for _, idStr := range relationship.Ids {
id, err := uuid.Parse(idStr)
if err != nil {
slog.Error("invalid child uuid", "id", id, "error", err)
continue
}
childIds = append(childIds, id)
}
}
return childIds
}
func (s *Service) getRelationshipIdsByRel(block types.Block, relType types.RelationshipType) []uuid.UUID {
childIds := []uuid.UUID{}
for _, relationship := range block.Relationships {
if relationship.Type != relType {
continue
}
for _, idStr := range relationship.Ids {
id, err := uuid.Parse(idStr)
if err != nil {
slog.Error("invalid child uuid", "id", id, "error", err)
continue
}
childIds = append(childIds, id)
}
}
return childIds
}