Incremental Checking ofOCL Constraints through
SQL queries
Xavier Oriol and Ernest Teniente{xoriol,teniente}@essi.upc.edu
Motivation
1
creationT: Date
Group phone: Stringstate: StringlastConnect: Date
User
body: StringcreationT: Date
MessageMember
Owner
Sendsgroup user
owned owner
*
*
2..*
1
1 *
sender msg
IsSentTo1
*msg
receiver
ConversationGroup
Pair
{disjoint, complete}
2
*IsFormedBy
Motivation
2
ConversationGroup
Pair
creationT: Date
Group phone: Stringstate: StringlastConnect: Date
User
body: StringcreationT: Date
Message
{disjoint, complete}
Member
Owner
Sends
IsSentTo
group user
owned owner
*
*
2..*
1
1 *
1
*
sender msg
msg
receiver
2
*IsFormedBy
context User inv MemberOfOwned:self.group->includesAll(self.owned)
Motivation
3
ConversationGroup
Pair
creationT: Date
Group phone: Stringstate: StringlastConnect: Date
User
body: StringcreationT: Date
Message
{disjoint, complete}
Member
Owner
Sends
IsSentTo
group user
owned owner
*
*
2..*
1
1 *
1
*
sender msg
msg
receiver
2
*IsFormedBy
context User inv MemberOfOwned:self.group->includesAll(self.owned)
context Group inv MessagesAfterCreation:self.msg->forAll(e| e.creationT > self.creationT)
Motivation
3
context User inv MemberOfOwned:self.group->includesAll(self.owned)
context Group inv MessagesAfterCreation:self.msg->forAll(e| e.creationT > self.creationT)
Motivation
4
How can we check OCL constraints?context User inv MemberOfOwned:self.group->includesAll(self.owned)
context Group inv MessagesAfterCreation:self.msg->forAll(e| e.creationT > self.creationT)
Translating OCL constraints to SQL queriesIdea: Query for the instances violating the constraint
SELECT *FROM Group JOIN IsSentTo JOIN MessageWHERE Group.createT >= Message.creationT
Motivation
5
There are some automatic OCL to SQL translators:
• OCL2SQL from OCLDresden
• MySQL4OCL
None of them is incremental
Motivation
6
ConversationGroup
Pair
creationT: DateGroup phone: String
state: StringlastConn: Date
User
body: StringcreationT: Date
Message
{disjoint, complete}
Member
Owner
Sends
IsSentTo
group user
owned owner
*
*
2..*
11 *
1
*
sender msg
msg
receiver
2* IsFormedBy SELECT *
FROM Group JOIN IsSentTo JOIN MessageWHERE Group.createT <= Message.creationT
SELECT *FROM Owner EXCEPT Member
Hello!
We need to compute the whole queries again
DATA INSERT INTO Messages VALUES(‘Hello!’, ...)
Our approach
Translate OCL constraints into incremental SQL queries
Goal
7
Our approach
8
IncrementalOnly check the potentially violated constraints
Only check for the new updated values
context User inv MemberOfOwned:self.group->includesAll(self.owned)
context Group inv MessagesAfterCreation:self.msg->forAll(e| e.creationT > self.creationT)
Hello!
New Message
Only check whether the new message “Hello!” has been created after the receiver’s group creation
Our approach
Translate OCL constraints into EDCsand EDCs to incremental SQL queries
Our approach
7
Our approach
9
Translate OCL into EDCsAn EDC is a logic rule that tells when a data updatemay cause the violation of some integrity constraint
context User inv MemberOfOwned:self.group->includesAll(self.owned)
¬Owner(u, g) ∧ ins_Owner(u, g) ∧ ¬Member(u, g) ∧ ¬ins_Member(u,g) → ⏊¬Owner(u, g) ins_Owner(u, g) Member(u, g) del_Member(u,g) ∧ ∧ ∧ → ⏊ Owner(u, g) ¬del_Owner(u, g) Member(u, g) del_Member(u,g) ∧ ∧ ∧ → ⏊
Our approach
10
Translate EDCs into SQLIdea: Join the columns of the bound variables
ins_Owner(u, g) ¬Owner(u, g) ∧ ∧ Member(u, g) ∧ del_Member(u,g) → ⏊
SELECT *FROM ins_Owner
ANTI JOIN Owner ON (user, group)JOIN Member ON (user, group) JOIN del_Member ON (user, group)
Our approach
10
SELECT *FROM ins_Owner
ANTI JOIN Owner ON (user, group)JOIN Member ON (user, group) JOIN del_Member ON (user, group)
Translate EDCs into SQL
Our approach
11
SELECT *FROM ins_Owner
ANTI JOIN Owner ON (user, group)JOIN Member ON (user, group) JOIN del_Member ON (user, group)
The translation never uses subqueriesDBMS query planners can fully optimize the query
Hello!
New Message
|| ins_Owner || = 0Query returns
empty set practicallyin constant time
context User inv MemberOfOwned:self.group->includesAll(self.owned)Translate EDCs into SQL
Our approach
12
SELECT *FROM Group
ANTI JOIN del_Group ON (group)JOIN ins_SendsTo ON (group) ANTI JOIN SendsTo ON (group)JOIN ins_Message ON (message)ANTI JOIN Message ON (message)
WHERE Group.creationT >= ins_Message.creationT
Hello!
New Message
|| ins_Message || = 1Query only looks for
data joining the unique new message
Translate EDCs into SQLcontext Group inv MssgsAfterCreation:self.msg->forAll(e| e.cT > self.cT)
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
N = #Messages N/10 = #UsersN/100 = #ins_Messages
MemberOfOwned
MsgsAfterCreation
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
Our approach
13
Some experiments
N = 5.000 N = 50.000 N = 500.000 N = 5.000.000
MySQL4OCL 0,60 s 2,06 s 17,0 s 223 s
OCL2SQL 0,11 s 0,17 s 0,51 s 42,15 s
Our Approach 0,09 s 0,09 s 0,10 s 0,10 s
MySQL4OCL 1,94 s 15,0 s 126 s > 1 h
OCL2SQL 0,11 s 0,25 s 1,72 s > 1h
Our Approach 0,09 s 0,09 s 0,24 s 1,63 s
MemberOfOwned
MsgsAfterCreation
N = #Messages N/10 = #UsersN/100 = #ins_Messages
14
ConclusionsWe translate OCL into incremental SQL
Translate from OCL to EDCsTranslate from EDCs to SQL
Our translation is incremental When an update is performed:
Only constraints that might be violated are checkedOnly for the rellevant values
Future WorkEnhance the subset of OCL translatable to EDCsUse triggers to avoid auxiliar tables
Thank you Questions?
Incremental Checking ofOCL Constraints through
SQL queries
Xavier Oriol and Ernest Teniente{xoriol,teniente}@essi.upc.edu
Top Related