SqueakSave
SqueakSave
SqueakSave
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
lundi 31 août 2009<br />
<strong>SqueakSave</strong><br />
An Automatic Object-Relational Mapping Framework<br />
Thomas Kowark<br />
Robert Hirschfeld<br />
Michael Haupt<br />
Software Architecture Group<br />
Hasso-Plattner-Institut Potsdam<br />
www.hpi.uni-potsdam.de/swa
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
• motivation<br />
• basic usage<br />
• framework architecture<br />
• performance<br />
• summary & outlook<br />
Outline<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
2
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Available Persistence Approaches<br />
• image storing<br />
• object databases<br />
• (object-)relational persistence<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
3
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
<strong>SqueakSave</strong> – Project Goals<br />
• automatic mapping deduction<br />
• simplistic API<br />
• seamless integration into existing applications<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
4
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
al Paradigm for UML Community Edition [not for commercial use]<br />
User<br />
-email : string<br />
-username : string<br />
-password : string<br />
Author<br />
Admin<br />
Guiding Example<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
0..* +followers<br />
1<br />
1<br />
1..*<br />
+blog<br />
+administeredBlogs<br />
1<br />
0..*<br />
Blog<br />
-title : string<br />
-lastUpdate : dateTime<br />
1<br />
0..*<br />
BlogPost<br />
-title : string<br />
-text : string<br />
1<br />
0..*<br />
Comment<br />
-author : string<br />
-title : string<br />
-text : string<br />
+blogPosts<br />
+comments<br />
5
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
API – Configuration<br />
• configuration based on naming conventions<br />
SqsConfig subclass: #BlogExampleSqsConfig<br />
instanceVariableNames: ''<br />
classVariableNames: ''<br />
poolDictionaries: ''<br />
category: 'BlogExample'<br />
BlogExampleSqsConfig<br />
class>>#connectionSpecification<br />
^ SqsMySQLConnectionSpecification<br />
user: 'admin'<br />
password: 'password'<br />
database: 'blog_example_db'<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 6<br />
lundi 31 août 2009
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
author := Author new<br />
password: 'password';<br />
username: 'testuser';<br />
email: 'user@example.org'.<br />
author blog: (Blog new title: 'My Blog').<br />
author save.<br />
...<br />
author destroy.<br />
API – Basic Operations<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 7<br />
lundi 31 août 2009
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
API – Queries<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
(SqsSearch for: Author) select: [:anAuthor |<br />
anAuthor blog blogPosts size > 10 ]<br />
(SqsSearch for: Blog) anySatisfy: [:aBlog |<br />
aBlog blogPosts noneSatisfy: [:aBlogPost |<br />
aBlogPost comments isEmpty ] ]<br />
(SqsSearch for: Blog) findByTitle: 'testblog'<br />
(SqsSearch for: Comment)<br />
findByAuthor: 'author' andTitle: 'comment'.<br />
8
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
currentClass<br />
1<br />
<strong>SqueakSave</strong> – Architecture<br />
instVarValue<br />
1<br />
1<br />
<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
currentClass<br />
1<br />
<strong>SqueakSave</strong> – Architecture<br />
instVarValue<br />
anObject save<br />
1<br />
1<br />
<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession 1<br />
Creation or fetching of<br />
SqsTableStructureHandler<br />
currentClass<br />
1<br />
<strong>SqueakSave</strong> – Architecture<br />
instVarValue<br />
1<br />
unique SqsStorage<br />
wrapper instance<br />
<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
currentClass<br />
1<br />
<strong>SqueakSave</strong> – Architecture<br />
instVarValue<br />
1<br />
1<br />
<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
Creation or update of<br />
mapping descriptions<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
1<br />
instVarValue<br />
1<br />
1<br />
<br />
currentClass<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
Calculation of changes to<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e intothe the relational separatedatabase sub words and connects them with an underscore. A<br />
schema<br />
<strong>SqueakSave</strong> – Architecture<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
1<br />
instVarValue<br />
1<br />
1<br />
<br />
currentClass<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009<br />
<strong>SqueakSave</strong> – Architecture<br />
Connection pooling
commercial use]<br />
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
er<br />
1<br />
Class<br />
SqsBase 0..*<br />
SqsConnection<br />
ctureHandler<br />
SqsDescriptionHandler<br />
1<br />
class<br />
1<br />
+classInfo<br />
1<br />
+session<br />
1<br />
SqsProxy<br />
SqsClassInfo<br />
SqsSession<br />
SqsTableStructureHandler<br />
1<br />
instVarValue<br />
1<br />
1<br />
<br />
currentClass<br />
SqsConnectionManager<br />
dbAdapter<br />
re 4.1: Overview of <strong>SqueakSave</strong> System Classes.<br />
SqsDatabaseAdapter<br />
SqsDatabaseConnection<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 9<br />
0..1<br />
1<br />
0..*<br />
<br />
connection<br />
e into the separate sub words and connects them with an underscore. A<br />
e’, for example, is thereby converted to the column name ‘user name’.<br />
ide simple compatibility with most other O/R mappers for dynamic<br />
lundi 31 août 2009<br />
<strong>SqueakSave</strong> – Architecture<br />
Schema update and<br />
object insertion or update
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
queryObject := SqsQueryObject new<br />
depictedClass: User.<br />
result := aBlock value: queryObject.<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
The query object does not know what #username<br />
does, but generates the SQL to scope to the<br />
respective column.<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
WHERE users.username<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
The result of the first call is an SqsQueryString.<br />
It knows how to map the #= to SQL properly.<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
WHERE users.username =<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Query Analysis<br />
• SQL statement generation through block execution<br />
with placeholder objects<br />
• one placeholder class per ‘simple type’,<br />
SqsQueryObject and SqsQueryCollection for<br />
complex cases<br />
WHERE users.username = ‘testuser’<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
(SqsSearch for: User) detect: [:aUser |<br />
aUser username = 'testuser']<br />
10
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Evaluation<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
• evaluation based on OO7 benchmark<br />
– CAD application data structure<br />
– complex object model with many cyclic dependencies<br />
• set of queries with increasing complexity<br />
• number of traversals of an object graph<br />
• comparison with GLORP<br />
11
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Evaluation – Query Performance<br />
• approx. 20% slower than GLORP<br />
• two exceptions<br />
– caching mechanism (10x slower)<br />
(SqsSearch for: SqsAtomicPart) detect:<br />
[:ap | ap oid = id].<br />
– query creation with joins (1/3x faster)<br />
(SqsSearch for: SqsBaseAssembly) select: [:ba |<br />
ba unsharedParts anySatisfy: [:part |<br />
part document = id ]].<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 12<br />
lundi 31 août 2009
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Traversal 1<br />
<strong>SqueakSave</strong> GLORP<br />
Traversal 2b<br />
– missing eager loading<br />
(n+1 queries problem)<br />
<strong>SqueakSave</strong> GLORP<br />
Evaluation – Traversal Performance<br />
6s<br />
5s<br />
3s<br />
2s<br />
0s<br />
24s<br />
18s<br />
12s<br />
6s<br />
0s<br />
Traversal 2a<br />
<strong>SqueakSave</strong> GLORP<br />
Traversal 2c<br />
– minimal intrusion into object<br />
models (only collection proxies)<br />
<strong>SqueakSave</strong> GLORP<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009 13<br />
lundi 31 août 2009
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Summary and Outlook<br />
• simple usage & setup<br />
– integration into existing applications almost seamless<br />
• automatic deduction of database structures<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
14
<strong>SqueakSave</strong>: An Automatic Object-Relational Mapping Framework<br />
Summary and Outlook<br />
• simple usage & setup<br />
– integration into existing applications almost seamless<br />
• automatic deduction of database structures<br />
• possible extensions<br />
– SqueakDBX usage<br />
– eager loading<br />
– performance optimizations<br />
Thomas Kowark, Robert Hirschfeld, Michael Haupt (www.hpi.uni-potsdam.de/swa) 2009<br />
lundi 31 août 2009<br />
14