aboutsummaryrefslogtreecommitdiffstats
path: root/lib/relation.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/relation.ml')
-rw-r--r--lib/relation.ml111
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