diff options
Diffstat (limited to '')
| -rw-r--r-- | lib/relation.ml | 111 |
1 files changed, 49 insertions, 62 deletions
diff --git a/lib/relation.ml b/lib/relation.ml index bba70b3..863316b 100644 --- a/lib/relation.ml +++ b/lib/relation.ml @@ -28,57 +28,51 @@ module Lineage = struct end module Provenance = struct - type source = { relation : Conventions.Name.t; attribute : string } (** Tracks which base relation each attribute originates from. Lives on the relation and refers to the `entity group`. *) + type source = {relation: Conventions.Name.t; attribute: string} type t = | Undefined | Base of Conventions.Name.t | Sources of source list BatMap.String.t - (** Maps attribute name -> list of sources (multiple after joins) *) + (** Maps attribute name -> list of sources (multiple after joins) *) let base ~relation ~attributes : t = Sources (List.fold_left - (fun acc attr -> - BatMap.String.add attr [ { relation; attribute = attr } ] acc) - BatMap.String.empty attributes) + (fun acc attr -> BatMap.String.add attr [{relation; attribute= attr}] acc) + BatMap.String.empty attributes ) let empty : t = Sources BatMap.String.empty - let undefined : t = Undefined end type producer = (string * Conventions.AbstractValue.t) list -> Generator.t +type kind = [`Stored | `Ephemeral | `Pseudo | `Domain] + +class virtual relation = + object (_self) + method virtual kind : kind + method virtual name : Conventions.Name.t + method virtual schema : Schema.t + method virtual hash : Conventions.Hash.t + method virtual constraints : RelationConstraint.t option + method virtual cardinality : Conventions.Cardinality.t + method virtual lineage : Lineage.t + method virtual provenance : Provenance.t + method virtual membership_criteria : Tuple.t -> bool + method virtual timestamp : float + method virtual serialize : unit -> Storable.Relation.t + end -type kind = [ `Stored | `Ephemeral | `Pseudo | `Domain ] - -class virtual relation = object (_self) - method virtual kind : kind - method virtual name : Conventions.Name.t - method virtual schema : Schema.t - method virtual hash : Conventions.Hash.t - method virtual constraints : RelationConstraint.t option - method virtual cardinality : Conventions.Cardinality.t - method virtual lineage : Lineage.t - method virtual provenance : Provenance.t - method virtual membership_criteria : Tuple.t -> bool - method virtual timestamp : float - method virtual serialize : unit -> Storable.Relation.t -end - -class stored - ~name:(init_name : Conventions.Name.t) - ~schema:(init_schema : Schema.t) +class stored ~name:(init_name : Conventions.Name.t) ~schema:(init_schema : Schema.t) ~constraints:(init_constraints : RelationConstraint.t option) ~cardinality:(init_cardinality : Conventions.Cardinality.t) ~membership_criteria:(init_membership : Tuple.t -> bool) - ~lineage:(init_lineage : Lineage.t option) - ~provenance:(init_provenance : Provenance.t option) = + ~lineage:(init_lineage : Lineage.t option) ~provenance:(init_provenance : Provenance.t option) = object inherit relation - val name = init_name val schema = init_schema val tree_pointer : Conventions.Hash.t option = None @@ -87,7 +81,9 @@ class stored val membership_criteria = init_membership val timestamp = Unix.gettimeofday () val lineage = Option.value init_lineage ~default:(Lineage.Base init_name) - val provenance = Option.value init_provenance + + val provenance = + Option.value init_provenance ~default:(Provenance.base ~relation:init_name ~attributes:(Schema.attributes init_schema)) method name = name @@ -101,24 +97,16 @@ class stored method timestamp = timestamp method lineage = lineage method provenance = provenance + method set_tree_pointer tp = {<tree_pointer = tp; timestamp = Unix.gettimeofday ()>} + method set_cardinality c = {<cardinality = c>} + method set_constraints c = {<constraints = c>} - method set_tree_pointer tp = {< tree_pointer = tp; timestamp = Unix.gettimeofday () >} - method set_cardinality c = {< cardinality = c >} - method set_constraints c = {< constraints = c >} method serialize () = - { Storable.Relation.name; - schema; - tree_pointer = Option.value tree_pointer ~default:"" } -end + {Storable.Relation.name; schema; tree_pointer= Option.value tree_pointer ~default:""} + end -class ephemeral - ~name:(init_name : Conventions.Name.t) - ~schema - ~constraints - ~cardinality ~membership_criteria - ~lineage - ~provenance - ~generator:(init_generator : Generator.t) = +class ephemeral ~name:(init_name : Conventions.Name.t) ~schema ~constraints ~cardinality + ~membership_criteria ~lineage ~provenance ~generator:(init_generator : Generator.t) = object inherit relation val name : Conventions.Name.t = init_name @@ -130,7 +118,6 @@ class ephemeral val lineage = Option.value lineage ~default:(Lineage.Base init_name) val provenance = Option.value provenance ~default:(Provenance.Base init_name) val timestamp = Unix.gettimeofday () - method name = name method kind = `Ephemeral method schema = schema @@ -142,13 +129,11 @@ class ephemeral method lineage = lineage method provenance = provenance method timestamp = timestamp - method serialize () = failwith "Ephemeral relations cannot be serialized directly" -end + end -class pseudo - ~name:(init_name : Conventions.Name.t) ~schema ~constraints ~cardinality ~membership_criteria ~lineage ~provenance - ~producer:(init_producer : producer) = +class pseudo ~name:(init_name : Conventions.Name.t) ~schema ~constraints ~cardinality + ~membership_criteria ~lineage ~provenance ~producer:(init_producer : producer) = object inherit relation val name = init_name @@ -160,12 +145,14 @@ class pseudo val lineage = Option.value lineage ~default:(Lineage.Base init_name) val provenance = provenance val timestamp = Unix.gettimeofday () - method name = name method kind = `Pseudo method schema = schema method producer = producer - method as_generator (bindings : (string * Conventions.AbstractValue.t) list) : Generator.t = producer bindings + + method as_generator (bindings : (string * Conventions.AbstractValue.t) list) : Generator.t = + producer bindings + method hash = Conventions.Hash.hash_text (name ^ "pseudo") method constraints = constraints method cardinality = cardinality @@ -176,7 +163,7 @@ class pseudo (* TODO: Remove this from the virtual definition *) method serialize () = failwith "Pseudo relations are procedural" -end + end let deserialize_stored (_bytes : bytes) : (stored, string) result = try @@ -185,18 +172,18 @@ let deserialize_stored (_bytes : bytes) : (stored, string) result = Constraint.build_membership_criteria ~_name:stored.name ~schema:stored.schema in Ok - (new stored ~name:stored.name ~schema:stored.schema ~constraints:None - ~cardinality:Conventions.Cardinality.ConstrainedFinite - ~membership_criteria ~lineage:None ~provenance:None) + (new stored + ~name:stored.name ~schema:stored.schema ~constraints:None + ~cardinality:Conventions.Cardinality.ConstrainedFinite ~membership_criteria ~lineage:None + ~provenance:None ) with Invalid_argument message -> Error message -class domain ~name ~schema ~constraints ~cardinality ~membership_criteria - ~lineage ~provenance ~generator = +class domain ~name ~schema ~constraints ~cardinality ~membership_criteria ~lineage ~provenance + ~generator = object - inherit ephemeral - ~name ~schema ~constraints ~cardinality - ~membership_criteria ~lineage - ~provenance ~generator + inherit + ephemeral + ~name ~schema ~constraints ~cardinality ~membership_criteria ~lineage ~provenance ~generator method! kind = `Domain end |
