example PharmaColim2
schema S1 = literal : sql {
entities
Observation Person Gender ObsType
foreign_keys
f: Observation -> Person
h: Person -> Gender
g: Observation -> ObsType
attributes
att: Person -> String
att: Gender -> String
att: ObsType -> String
}
schema S2 = literal : sql {
entities
Observation Patient Method Type
foreign_keys
f : Observation -> Patient
g1: Observation -> Method
g2: Method -> Type
attributes
att: Patient -> String
att: Type -> String
}
#####################################/
#compute the canonical schema colimit
schema_colimit ColimAuto = quotient S1 + S2 : sql {
entity_equations
S1.Observation = S2.Observation
S1.Person = S2.Patient
S1.ObsType = S2.Type
path_equations
S1_Observation.S1_Observation_f = S1_Observation.S2_Observation_f
S1_Observation.g = S1_Observation.g1.g2
options
simplify_names = true
}
#just for fun
schema_colimit Coproduct = coproduct S1 + S2 : sql
#####################################/
#use a different, less verbose colimit constructed manually
schema_colimit Colim = modify ColimAuto {
rename entities
S1_Observation -> O
Person -> P
ObsType -> T
S1_Gender -> G
S2_Method -> M
rename foreign_keys
O.S1_Observation_f -> f
rename attributes
T.ObsType_att -> T_att1
#G.Gender_att -> G_att
P.Person_att -> P_att1
T.Type_att -> T_att2
P.Patient_att -> P_att2
remove foreign_keys
O.S2_Observation_f -> f
O.g -> g1.g2
# e.g. remove attributes
# B_att -> lambda x. x.T_att1
}
#####################################/
instance I1 = literal : S1 {
generators
one two three : Observation
Peter Paul : Person
M F :Gender
BloodPressure BodyWeight HeartRate: ObsType
equations
Peter.att = xPeter Paul.att = xPaul
M.att = xM F.att = xF
BloodPressure.att = xBloodPressure
BodyWeight.att = xBodyWeight
HeartRate.att = xHeartRate
one.f = Peter two.f = Peter three.f = Paul
Peter.h = M Paul.h = M
one.g = BloodPressure two.g = BodyWeight three.g = HeartRate
}
instance I2 = literal : S2 {
generators
o1 o2 o3 o4 : Observation
Pete Jane : Patient
m1 m2 m3 m4 : Method
BP Wt : Type
equations
Pete.att = xPete Jane.att = xJane
BP.att = xBloodPressure Wt.att = xBodyWeight
o1.f = Pete o2.f = Pete o3.f = Jane o4.f = Jane
o1.g1 = m1 o2.g1 = m2 o3.g1 = m3 o4.g1 = m1
m1.g2 = BP m2.g2 = BP m3.g2 = Wt m4.g2 = Wt
}
instance I1Fwd = sigma (getMapping Colim S1) I1
instance I2Fwd = sigma (getMapping Colim S2) I2
instance CoProd = literal : getSchema Colim {
imports I1Fwd I2Fwd
}
instance E = literal : getSchema Colim {
generators
P : P
B W : T
}
transform a1 = literal : E -> CoProd {
generators
P -> Peter
B -> BloodPressure
W -> BodyWeight
}
transform a2 = literal : E -> CoProd {
generators
P -> Pete
B -> BP
W -> Wt
}
instance answer = coequalize a1 a2
Keywords:
modify
schema_literal
quotient
sigma
instance_literal
coequalize
transform_literal
Options:
simplify_names
instance I2
Observation| ID | f | g1 |
|---|
| 4 | 8 | 0 |
| 5 | 8 | 1 |
| 6 | 9 | 2 |
| 7 | 9 | 0 |
Type| ID | att |
|---|
| 10 | xBloodPressure |
| 11 | xBodyWeight |
instance I1
ObsType| ID | att |
|---|
| 2 | xBloodPressure |
| 3 | xBodyWeight |
| 4 | xHeartRate |
Person| ID | att | h |
|---|
| 8 | xPeter | 0 |
| 9 | xPaul | 0 |
instance I1Fwd
P| ID | P_att1 | P_att2 | h |
|---|
| 8 | xPeter | ?0 | 0 |
| 9 | xPaul | ?1 | 0 |
T| ID | T_att2 | T_att1 |
|---|
| 10 | ?2 | xBloodPressure |
| 11 | ?3 | xBodyWeight |
| 12 | ?4 | xHeartRate |
instance I2Fwd
P| ID | P_att1 | P_att2 | h |
|---|
| 10 | ?2 | xPete | 0 |
| 11 | ?3 | xJane | 1 |
T| ID | T_att2 | T_att1 |
|---|
| 12 | xBloodPressure | ?4 |
| 13 | xBodyWeight | ?5 |
instance CoProd
M| ID | g2 |
|---|
| 4 | 22 |
| 5 | 22 |
| 6 | 23 |
| 7 | 23 |
| 8 | 24 |
| 9 | 25 |
| 10 | 26 |
O| ID | f | g1 |
|---|
| 11 | 18 | 4 |
| 12 | 18 | 5 |
| 13 | 19 | 6 |
| 14 | 19 | 4 |
| 15 | 20 | 8 |
| 16 | 20 | 9 |
| 17 | 21 | 10 |
P| ID | P_att1 | P_att2 | h |
|---|
| 18 | ?2 | xPete | 0 |
| 19 | ?3 | xJane | 1 |
| 20 | xPeter | ?4 | 2 |
| 21 | xPaul | ?5 | 2 |
T| ID | T_att2 | T_att1 |
|---|
| 22 | xBloodPressure | ?6 |
| 23 | xBodyWeight | ?7 |
| 24 | ?8 | xBloodPressure |
| 25 | ?9 | xBodyWeight |
| 26 | ?10 | xHeartRate |
instance E
T| ID | T_att2 | T_att1 |
|---|
| 2 | ?3 | ?4 |
| 3 | ?5 | ?6 |
instance answer
M| ID | g2 |
|---|
| 3 | 20 |
| 4 | 20 |
| 5 | 21 |
| 6 | 21 |
| 7 | 20 |
| 8 | 21 |
| 9 | 22 |
O| ID | f | g1 |
|---|
| 10 | 17 | 3 |
| 11 | 17 | 4 |
| 12 | 18 | 5 |
| 13 | 18 | 3 |
| 14 | 17 | 7 |
| 15 | 17 | 8 |
| 16 | 19 | 9 |
P| ID | P_att1 | P_att2 | h |
|---|
| 17 | xPeter | xPete | 0 |
| 18 | ?1 | xJane | 1 |
| 19 | xPaul | ?2 | 0 |
T| ID | T_att2 | T_att1 |
|---|
| 20 | xBloodPressure | xBloodPressure |
| 21 | xBodyWeight | xBodyWeight |
| 22 | ?3 | xHeartRate |