Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions internal/engine/query_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,19 @@ import (
"github.com/dencyuinc/layerdraw/internal/engine/internal/compiler/semantic/definition"
)

// validatedStateQuerySnapshot is the immutable projection needed by direct
// View state reads after the Query evaluator has validated the wire snapshot.
type validatedStateQuerySnapshot struct {
input QueryStateInputRef
subjects map[string]validatedStateSubject
inaccessible map[query.StateFieldPath]bool
currentHashes map[string]string
}

// validateStateQuerySnapshotForDefinition reuses the Query evaluator's closed
// snapshot validation for direct View state reads. It performs no Query
// traversal and returns the canonical StateInputRef only after full validation.
func validateStateQuerySnapshotForDefinition(ctx context.Context, identity QueryDefinitionIdentity, graphValue TypedMasterGraph, snapshot StateQuerySnapshot) (QueryStateInputRef, []Diagnostic, error) {
// traversal and exposes only validated, normalized state records.
func validateStateQuerySnapshotForDefinition(ctx context.Context, identity QueryDefinitionIdentity, graphValue TypedMasterGraph, snapshot StateQuerySnapshot) (validatedStateQuerySnapshot, []Diagnostic, error) {
limits := DefaultQueryExecutionLimits()
validator := &queryExecutor{
ctx: ctx, limits: limits, graph: graphValue, definition: identity,
Expand All @@ -25,9 +34,12 @@ func validateStateQuerySnapshotForDefinition(ctx context.Context, identity Query
currentStateHashes: map[string]string{}, staleStateSubjects: map[string]bool{},
}
if !validator.validateStateSnapshot(snapshot) {
return QueryStateInputRef{}, sortedDiagnostics(validator.diagnostics), validator.err
return validatedStateQuerySnapshot{}, sortedDiagnostics(validator.diagnostics), validator.err
}
return validator.stateInput, nil, validator.err
return validatedStateQuerySnapshot{
input: validator.stateInput, subjects: validator.stateSubjects,
inaccessible: validator.stateInaccessible, currentHashes: validator.currentStateHashes,
}, nil, validator.err
}

const (
Expand Down
17 changes: 12 additions & 5 deletions internal/engine/view_materialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@ func (e Engine) MaterializeView(ctx context.Context, input ViewMaterializationIn
result.Diagram = m.diagram(base)
case view.ShapeTable:
result.Table = m.table(base)
case view.ShapeMatrix:
result.Matrix = m.matrix(base)
case view.ShapeContext:
result.Context = m.contextView(base)
case view.ShapeMatrix, view.ShapeTree, view.ShapeFlow, view.ShapeDiff:
case view.ShapeTree, view.ShapeFlow, view.ShapeDiff:
m.addDiag("LDL1701", "unsupported_view_shape_or_export", "View shape materialization is not implemented", input.Recipe.Address, "")
return rejectedView(m.diagnostics...)
default:
Expand Down Expand Up @@ -83,14 +85,18 @@ type viewMaterializer struct {
incoming map[string][]string
diagnostics []Diagnostic
directStateReads map[StateReadRef]bool
validatedState *validatedStateQuerySnapshot
staleState map[string]bool
deniedStateReads map[StateReadRef]bool
missingStateWarn bool
}

func newViewMaterializer(ctx context.Context, input ViewMaterializationInput) *viewMaterializer {
return &viewMaterializer{
ctx: ctx, input: input, entities: map[string]graph.Entity{}, relations: map[string]graph.Relation{},
entityTypes: map[string]definition.EntityType{}, relationTypes: map[string]definition.RelationType{},
layers: map[string]definition.Layer{}, outgoing: map[string][]string{}, incoming: map[string][]string{},
directStateReads: map[StateReadRef]bool{},
directStateReads: map[StateReadRef]bool{}, staleState: map[string]bool{}, deniedStateReads: map[StateReadRef]bool{},
}
}

Expand Down Expand Up @@ -178,7 +184,7 @@ func (m *viewMaterializer) validateQueryState(input QueryViewMaterializationInpu
m.stateInput = QueryStateInputRef{Kind: "none"}
return
}
ref, diagnostics, err := validateStateQuerySnapshotForDefinition(m.ctx, input.Snapshot.QueryDefinitionIdentity(), *input.Snapshot.TypedAST.Graph, *input.StateSnapshot)
validated, diagnostics, err := validateStateQuerySnapshotForDefinition(m.ctx, input.Snapshot.QueryDefinitionIdentity(), *input.Snapshot.TypedAST.Graph, *input.StateSnapshot)
if err != nil {
m.addDiag("LDL1801", "stale_revision_or_semantic_hash", err.Error(), m.input.Recipe.Address, "")
return
Expand All @@ -187,11 +193,12 @@ func (m *viewMaterializer) validateQueryState(input QueryViewMaterializationInpu
m.diagnostics = append(m.diagnostics, diagnostics...)
return
}
if queryPolicy != query.StateNone && input.QueryResult.StateInput != ref {
if queryPolicy != query.StateNone && input.QueryResult.StateInput != validated.input {
m.addDiag("LDL1801", "stale_revision_or_semantic_hash", "QueryResult and View do not reference the same StateQuerySnapshot", m.input.Recipe.Address, "")
return
}
m.stateInput = ref
m.stateInput = validated.input
m.validatedState = &validated
}

func (m *viewMaterializer) validateDiffInput(input DiffViewMaterializationInput) {
Expand Down
Loading