Index sequence assembly and history lookups
This commit is contained in:
@@ -59,6 +59,7 @@ func cloneComposedDocument(base *composedDocument) *composedDocument {
|
||||
}
|
||||
|
||||
type compositionClaim struct {
|
||||
node *document.Node // borrowed immutable contribution, not the assembly tree
|
||||
path Path
|
||||
kind document.Kind
|
||||
location Location
|
||||
@@ -121,7 +122,7 @@ func composeDocumentsWithPolicy(policy sequencePolicy, inputs ...*document.Node)
|
||||
return nil, []Diagnostic{compositionConflictDiagnostic(claim.path, claims)}
|
||||
}
|
||||
|
||||
validated, ranges, diagnostics := validateRegisteredSequences(inputs, collected.ordered, policy)
|
||||
validated, ranges, diagnostics := validateRegisteredSequences(collected.ordered, policy)
|
||||
if len(diagnostics) != 0 {
|
||||
return nil, diagnostics
|
||||
}
|
||||
@@ -133,12 +134,13 @@ func composeDocumentsWithPolicy(policy sequencePolicy, inputs ...*document.Node)
|
||||
}
|
||||
applications := make([]historyApplication, 0, len(inputs))
|
||||
seenSequences := make(map[string]bool)
|
||||
rangesBySource := make([][]sequenceRange, len(inputs))
|
||||
for _, assigned := range ranges {
|
||||
rangesBySource[assigned.sourceIndex] = append(rangesBySource[assigned.sourceIndex], assigned)
|
||||
}
|
||||
for sourceIndex, input := range inputs {
|
||||
application := historyApplication{layer: LayerBase, value: input}
|
||||
for _, assigned := range ranges {
|
||||
if assigned.sourceIndex != sourceIndex {
|
||||
continue
|
||||
}
|
||||
for _, assigned := range rangesBySource[sourceIndex] {
|
||||
pointer := assigned.path.String()
|
||||
mode := sequenceHistoryAppend
|
||||
if !seenSequences[pointer] {
|
||||
@@ -149,6 +151,7 @@ func composeDocumentsWithPolicy(policy sequencePolicy, inputs ...*document.Node)
|
||||
path: assigned.path.clone(), mode: mode, offset: assigned.start, length: assigned.end - assigned.start,
|
||||
})
|
||||
}
|
||||
application.sequencesByPath = indexSequenceHistoryContributions(application.sequences)
|
||||
applications = append(applications, application)
|
||||
}
|
||||
origins := projectedCompositionOrigins(inputs, ranges)
|
||||
@@ -183,6 +186,7 @@ func completeCompositionOrigins(node *document.Node, path Path, origins map[stri
|
||||
|
||||
func (c *compositionClaims) append(node *document.Node, path Path, sourceIndex int) {
|
||||
claim := compositionClaim{
|
||||
node: node,
|
||||
path: path.clone(),
|
||||
kind: node.Kind,
|
||||
location: publicLocation(node.Location),
|
||||
@@ -213,7 +217,7 @@ type validatedSequence struct {
|
||||
items []*document.Node
|
||||
}
|
||||
|
||||
func validateRegisteredSequences(inputs []*document.Node, claims []compositionClaim, policy sequencePolicy) (map[string]map[int]validatedSequence, []sequenceRange, []Diagnostic) {
|
||||
func validateRegisteredSequences(claims []compositionClaim, policy sequencePolicy) (map[string]map[int]validatedSequence, []sequenceRange, []Diagnostic) {
|
||||
itemsByPath := make(map[string]map[int]validatedSequence)
|
||||
identitiesByPath := make(map[string]map[string]Location)
|
||||
lengthsByPath := make(map[string]int)
|
||||
@@ -226,10 +230,7 @@ func validateRegisteredSequences(inputs []*document.Node, claims []compositionCl
|
||||
if !registered {
|
||||
continue
|
||||
}
|
||||
node, ok := documentAtPath(inputs[claim.sourceIndex], claim.path)
|
||||
if !ok || node.Kind != document.Sequence {
|
||||
continue
|
||||
}
|
||||
node := claim.node
|
||||
pathKey := claim.path.String()
|
||||
identities := identitiesByPath[pathKey]
|
||||
if identities == nil {
|
||||
@@ -389,6 +390,19 @@ type sequenceRangeKey struct {
|
||||
path string
|
||||
}
|
||||
|
||||
type sequenceRangeIndex map[sequenceRangeKey]sequenceRange
|
||||
|
||||
func indexSequenceRanges(ranges []sequenceRange) sequenceRangeIndex {
|
||||
if len(ranges) == 0 {
|
||||
return nil
|
||||
}
|
||||
index := make(sequenceRangeIndex, len(ranges))
|
||||
for _, assigned := range ranges {
|
||||
index[sequenceRangeKey{sourceIndex: assigned.sourceIndex, path: assigned.path.String()}] = assigned
|
||||
}
|
||||
return index
|
||||
}
|
||||
|
||||
// Keep local paths for matching Stage 2 ranges and effective paths for emitted
|
||||
// evidence. The paths are transformed segment by segment; pointer strings are
|
||||
// only used as map keys after projection is complete.
|
||||
|
||||
Reference in New Issue
Block a user