Incremental Checking of OCL Constraints through SQL queries

Preview:

DESCRIPTION

Incremental Checking of OCL Constraints through SQL queries. Xavier Oriol and Ernest Teniente {xoriol,teniente}@essi.upc.edu. Motivation. IsSentTo. 1. receiver. {disjoint, complete}. Group. User. Message. Pair. ConversationGroup. phone: String state: String lastConnect : Date. - PowerPoint PPT Presentation

Citation preview

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

Recommended