1 import Base 2 import ./ordinary_check_declaration.bend as D 3 import ./ordinary_inspector_relation.bend as Decl 4 import ./ordinary_check_query.bend as CQ 5 import ./relation_types.bend as G 6 import ./relation_query.bend as RQ 7 import ./relation_commands.bend as A 8 import ./check.bend as K 9 import ./inspector_query.bend as Query 10 import ./inspector_query_projection.bend as Select 11 12 # All metadata comes from the same closed operational declaration. 13 def kind(value:G.RelationKind) -> D.RelationKind: 14 match value: 15 case G.Ordinary{}:D.Ordinary{} 16 case G.Hierarchy{}:D.Hierarchy{} 17 def identity(~S:Data,value:G.Descriptor) -> D.RelationIdentity: 18 match value: 19 case G.Descriptor{id,name,inverseName,relationKind}:D.RelationIdentity{id,name,inverseName,kind(relationKind)} 20 def category(value:D.RelationIdentity,mode:Decl.Mode) -> D.Category: 21 match mode: 22 case Decl.RequiredOut{key}:D.Relation{value,D.Outgoing{},D.RelationRequired{},Some{key}} 23 case Decl.OptionalOut{key}:D.Relation{value,D.Outgoing{},D.RelationOptional{},Some{key}} 24 case Decl.PresentOut{}:D.Relation{value,D.Outgoing{},D.RelationPresent{},None{}} 25 case Decl.AbsentOut{}:D.Relation{value,D.Outgoing{},D.RelationAbsent{},None{}} 26 case Decl.RequiredIn{key}:D.Relation{value,D.Incoming{},D.RelationRequired{},Some{key}} 27 case Decl.OptionalIn{key}:D.Relation{value,D.Incoming{},D.RelationOptional{},Some{key}} 28 case Decl.PresentIn{}:D.Relation{value,D.Incoming{},D.RelationPresent{},None{}} 29 case Decl.AbsentIn{}:D.Relation{value,D.Incoming{},D.RelationAbsent{},None{}} 30 def use_named(value:D.RelationIdentity,mode:Decl.Mode) -> D.Use: 31 match value: 32 case D.RelationIdentity{id,+name,inverseName,kind}:D.Use{category(D.RelationIdentity{id,name,inverseName,kind},mode),name,D.Read{},False{}} 33 def use(~S:Data,value:Decl.Declaration) -> D.Use: 34 match value: 35 case Decl.Declaration{source,mode}:use_named(identity(~S,Decl.descriptor(~S,source)),mode) 36 # Structural graph storage is already present in A.Store. No extra World-owned 37 # parameter is admitted here; required relation clauses retain row membership. 38 def declaration(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~component:CQ.Selection,R,A.Notice>,S,V>,~relation:Decl.Declaration) -> D.Declaration,R,A.Notice,CQ.Ops(~S,~Select.Product>>)>: 39 D.Declaration{K.Plan{D.provided(~S,~A.Store,~R,~A.Notice),CQ.Read{Decl.condition(~S,~C,~R,~E,~V,~CQ.selected(~K.Frame,R,A.Notice>,~S,~V,component),~relation)}},List.append(&2,D.Use,CQ.uses(~K.Frame,R,A.Notice>,~S,~V,component),[use(~S,relation)])}