1 import Base 2 import ./relation_failure_reader.bend as Ord 3 import ./relation_types.bend as G 4 import ./relation_query.bend as RQ 5 import ./relation_commands.bend as A 6 import ./inspector.bend as I 7 import ./check.bend as K 8 import ./inspector_query.bend as Query 9 import ./inspector_query_projection.bend as Select 10 import ./inspector_relation_projection.bend as IR 11 import ./check_relation_projection.bend as CR 12 13 # A closed ordinary relation declaration selects every relation clause. 14 # Traversal, liveness and owner preservation remain in the existing projections. 15 type Mode is Data: 16 RequiredOut{key:String} 17 OptionalOut{key:String} 18 PresentOut{} 19 AbsentOut{} 20 RequiredIn{key:String} 21 OptionalIn{key:String} 22 PresentIn{} 23 AbsentIn{} 24 type Declaration is Data: 25 Declaration{source:Ord.Declaration,mode:Mode} 26 def descriptor(~S:Data,declaration:Ord.Declaration) -> G.Descriptor: 27 match declaration: 28 case Ord.Declaration{value}:value 29 def selected_spec(~S:Data,source:Ord.Declaration,mode:Mode) -> RQ.Spec: 30 match mode: 31 case RequiredOut{key}:RQ.Spec{[RQ.read_relation(~S,key,descriptor(~S,source))]} 32 case OptionalOut{key}:RQ.Spec{[RQ.optional_relation(~S,key,descriptor(~S,source))]} 33 case PresentOut{}:RQ.Spec{[RQ.with_relation(~S,descriptor(~S,source))]} 34 case AbsentOut{}:RQ.Spec{[RQ.without_relation(~S,descriptor(~S,source))]} 35 case RequiredIn{key}:RQ.Spec{[RQ.read_related(~S,key,descriptor(~S,source))]} 36 case OptionalIn{key}:RQ.Spec{[RQ.optional_related(~S,key,descriptor(~S,source))]} 37 case PresentIn{}:RQ.Spec{[RQ.with_related(~S,descriptor(~S,source))]} 38 case AbsentIn{}:RQ.Spec{[RQ.without_related(~S,descriptor(~S,source))]} 39 def spec(~S:Data,declaration:Declaration) -> RQ.Spec: 40 match declaration: 41 case Declaration{source,mode}:selected_spec(~S,source,mode) 42 def required_out(~S:Data,key:String,declaration:Ord.Declaration) -> Declaration: 43 Declaration{declaration,RequiredOut{key}} 44 def optional_out(~S:Data,key:String,declaration:Ord.Declaration) -> Declaration: 45 Declaration{declaration,OptionalOut{key}} 46 def present_out(~S:Data,declaration:Ord.Declaration) -> Declaration: 47 Declaration{declaration,PresentOut{}} 48 def absent_out(~S:Data,declaration:Ord.Declaration) -> Declaration: 49 Declaration{declaration,AbsentOut{}} 50 def required_in(~S:Data,key:String,declaration:Ord.Declaration) -> Declaration: 51 Declaration{declaration,RequiredIn{key}} 52 def optional_in(~S:Data,key:String,declaration:Ord.Declaration) -> Declaration: 53 Declaration{declaration,OptionalIn{key}} 54 def present_in(~S:Data,declaration:Ord.Declaration) -> Declaration: 55 Declaration{declaration,PresentIn{}} 56 def absent_in(~S:Data,declaration:Ord.Declaration) -> Declaration: 57 Declaration{declaration,AbsentIn{}} 58 def inspect(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~component:Select.DeclaredSelection,R,A.Notice>,S,V>,~declaration:Declaration) -> Query.ComposedReadQuery,R,A.Notice>,S,Select.Product>>>: 59 IR.grant(~S,~C,~R,~E,~V,~component,~spec(~S,declaration)) 60 def condition(~S:Data,~C:Type,~R:Type,~E:Data,~V:Data,~component:Select.DeclaredSelection,R,A.Notice>,S,V>,~declaration:Declaration) -> Query.ComposedReadQuery,R,A.Notice>,S,Select.Product>>>: 61 CR.grant(~S,~C,~R,~E,~V,~component,~spec(~S,declaration))