Skip to main content

internal/infra/pg/citationstore.go

internal/infra/pg · 236 lines · 10 declarations · source

Declarations

const MaxCitationEvidence, DefaultCitationEvidence, MaxCitationTextBytes and 1 more

const (
MaxCitationEvidence = 32
DefaultCitationEvidence = 8
MaxCitationTextBytes = 256 << 10
MaxCitationStatementBytes = 64 << 10
)

source

var ErrCitationNotFound, ErrCitationLimit, ErrCitationIntegrity and 1 more

var (
ErrCitationNotFound = errors.New("citation not found")
ErrCitationLimit = errors.New("citation source exceeds supported text bounds; use the subject export")
ErrCitationIntegrity = errors.New("citation evidence does not match its source")
ErrInvalidCitation = errors.New("invalid citation identifier or page")
)

source

type CitationCursor

type CitationCursor struct {
ObservationID string `json:"source_observation_id"`
Ordinal int `json:"source_ordinal"`
ByteStart int `json:"byte_start"`
}

source

type CitationInterval

type CitationInterval struct {
From *time.Time `json:"from"`
Until *time.Time `json:"until"`
FromInclusive bool `json:"from_inclusive"`
UntilInclusive bool `json:"until_inclusive"`
}

source

type CitationSource

type CitationSource struct {
AuthoredBy *string `json:"authored_by,omitempty"`
ObservationID string `json:"source_observation_id"`
Ordinal int `json:"source_ordinal"`
LogOffset int64 `json:"log_offset"`
Role string `json:"role"`
OccurredAt time.Time `json:"occurred_at"`
Quote string `json:"quote"`
ByteStart int `json:"byte_start"`
ByteEnd int `json:"byte_end"`
ExtractorVersion string `json:"extractor_version"`
Context string `json:"context"`
ContextStart int `json:"context_byte_start"`
ContextEnd int `json:"context_byte_end"`
ContextComplete bool `json:"context_complete"`
}

source

type Citation

type Citation struct {
Generation *GenerationLink `json:"generation,omitempty"`
ReinterpretedBy *GenerationLink `json:"reinterpreted_by,omitempty"`
Version string `json:"version"`
Retraction *RetractionDetails `json:"retraction,omitempty"`
ID string `json:"id"`
SupersededBy *string `json:"superseded_by,omitempty"`
SupersessionSource *string `json:"supersession_source_observation_id,omitempty"`
Scope string `json:"scope"`
SubjectID *string `json:"subject_entity_id"`
ObjectID *string `json:"object_entity_id"`
Predicate string `json:"predicate"`
Statement string `json:"statement"`
Confidence float32 `json:"confidence"`
SourceRole string `json:"source_role"`
RecordedAt time.Time `json:"recorded_at"`
Valid CitationInterval `json:"valid"`
Known CitationInterval `json:"known"`
Status string `json:"status"`
Evidence []CitationSource `json:"evidence"`
Next *CitationCursor `json:"next,omitempty"`
}

Citation is the currently retained record and one page of exact supporting sources. The stored intervals describe the retained state; historical recall selects earlier versions.

source

type CitationStore

type CitationStore struct {
pool *pgxpool.Pool
schema Schema
}

source

func NewCitationStore

func NewCitationStore(pool *pgxpool.Pool, schema Schema) *CitationStore

source

method CitationStore.Resolve

func (s *CitationStore) Resolve(ctx context.Context, scope, id string, after *CitationCursor, limit int) (Citation, error)

source

const citationEvidenceSQL

const citationEvidenceSQL = `SELECT e.source_observation_id::text,e.source_ordinal,e.byte_start,e.byte_end,
octet_length(e.quote),octet_length(m.content),octet_length(e.extractor_version),
CASE WHEN octet_length(e.quote)<=$4 THEN e.quote END,
CASE WHEN octet_length(e.extractor_version)<=$6 THEN e.extractor_version END,
m.role,m.occurred_at,o.log_offset,
CASE WHEN octet_length(m.content)<=$5 AND e.byte_start>=0 AND e.byte_end<=octet_length(m.content)
THEN substring(convert_to(m.content,'UTF8') from e.byte_start+1 for e.byte_end-e.byte_start) END,
CASE WHEN octet_length(m.content)<=$5 AND e.byte_start>=0 AND e.byte_end<=octet_length(m.content)
THEN substring(convert_to(m.content,'UTF8') from greatest(0,e.byte_start-$7)+1 for e.byte_end+$7-greatest(0,e.byte_start-$7)) END,
greatest(0,e.byte_start-$7),c.principal_id::text
FROM {schema}.fact_evidence e
LEFT JOIN {schema}.observation o ON o.observation_id=e.source_observation_id AND o.scope=e.scope
LEFT JOIN {schema}.turn_message m ON m.observation_id=o.observation_id AND m.ordinal=e.source_ordinal
LEFT JOIN {schema}.curated_claim c ON c.scope=e.scope AND c.source_observation_id=e.source_observation_id
WHERE e.scope=$1 AND e.fact_id=$2 {cursor}
ORDER BY e.source_observation_id,e.source_ordinal,e.byte_start LIMIT $3`

source