SlideShare una empresa de Scribd logo
1 de 70
1
Eurydike
(Εὐρυδίκη)
Schemaless
Object Relational
SQL Mapper
Georg Heeg eK
2
Eurydike
• Easily
• Usable
• Relational
• Yobbish
• Database
• Intuitive
• Keymappingless
• Environment
3
Objects
• Smalltalk Objects live
• Objects respond to messages
• Objects have identity
4
Persistence
• Long time
• Sharing
– multiple users
– concurrent changes
5
Objects and Persistence
• Save the image
– long term
– multiple users have copies
– no concurrent changes
• Serialize Objects
• Use GemStone/S
– Huge image on disk
– multi-user
– transaction bases synchronization
6
Serialize Objects
• Timestamp now storeString
– '(Timestamp readFrom: ''06/09/2013
14:38:53.432'' readStream)'
– Issue: cyclic structures
• solved by Hubert Baumeister 1988 using
keys and IdentityDictionaries
• BOSS
– Binary Object Storage System
• Parcels
– Special serializer for code
• Others
– VOSS, XML, JSON, ODMG
7
–Store all or nothing
–No concurrency

–Desire for databases
Serialize Objects
8
A few Pictures
9
Relational databases
• Finite sets of typed values
– Numbers, strings, …
• Equality
– of values
• Cross products
– called tables
10
Relations  Objects
• Table rows as objects
– easy as Objects can describe everyting
– tables are mapped onto classes
– columns are mapped onto instance variables
• ObjectStudio database support
• EXDI (VisualWorks)
• GemConnect
• VA Database support
11
Objects  Relations
• Much more interesting
• Much more difficult
– due to lack of flexibilty on the relation side
• Typical solution
– OR Mapping
– Objects Networks map onto Entity
Relationship Models
12
Object Lens
• 'the industry's first Object Relational
Mapping (ORM) technology, providing
seamless integration between Smalltalk-
80 applications and RDBMSs'
– Richard Steiger
• Parc, ParcPlace and Ensemble
• Invented Object Relational Mapping (ORM)
• Smalltalk Type System, providing strong typing,
data entry validation, and program
transformation inferencing
13
TOPLink
• TOPLink is an application framework
• allows Smalltalk applications to access
relational databases
• provides a high degree of integration
between the Smalltalk objects and the
relational database tables
• relational database can be made to
behave like an object database
14
GLORP
• Generic Lightweight Object-Relational Persistence
– open-source
– object-relational mapping layer for Smalltalk
• Camp Smalltalk Project
– led by Alan Knight
• goal is
– to provide a simple, powerful framework for reading and
writing objects from relational databases
• originally sponsored by The Object People
• concepts are reminiscent of TOPLink
– though noticably different in some respects.
15
Properties
• Class structures
map to ER models
• Change is difficult
– change classes
– change tables
• schema migration
• data migration
– change mapping
16
Orpheus
• Goal: Easy change
– No more database schema migrations
– No more data migrations
• Designed and developed for
Component Studio (ERP)
• Way: universal database schema
– one schema for all objects
• Based upon Object Lens
– Mapping is reduced to typing
17
CREATE TABLE domainmodel(
domainmodelclass character varying(64),
objectid integer)
Orpheus object table
18
CREATE TABLE objectreference(
attribute character varying(40),
basevalue numeric,
myinstance integer)
Object attribute table
19
Integer attributes table
CREATE TABLE integervalue(
attribute character varying(40),
basevalue integer,
myinstance integer)
20
Many more basic type tables
• Examples
– ARBITRARYSTRING
– BINARYVALUE
– BOOLEANVALUE
– LARGESTRING
– TINYSTRING
– TIMESTAMPVALUE
– …
21
Our Dream
• Persistance without pain
• Intuitive for Smalltalkers
• Easy to use
• A Smalltalk …
– as Arden Thomas would say
22
Can we use the existing ORMs?
• Let us look at
– Glorp
– Orpheus
GLORP
• Explicit description in methods
– #classModelForXXX:
– #tableForXXX:
– #descriptorForXXX:
• Subclasses need special considerations
23
Orpheus
• Every object class needs
– a Lens description method
• Relationship classes required for N:M
relationships
All OR-Mappings
• require typed Smalltalk
25
Eurydike – Wishlist
• EASY
– We want to store any object
– We do not want to write any mapping
26
Eurydike – Timeline
• Start of the research project
– 28 February 2013
• Project task
– “Build schema-less system for storage of any
object in a SQL DB”
• STIC 2013: Presentation
• Since STIC 2013:
– Used internally at Heeg
– Used in GH seaMS
– Experience starts floats back
27
Eurydike – Tasks
• Which tables in the database?
• How to do the (invisibe) mapping object
access to SQL?
• What about (invisible) proxies?
• What about concurrency?
• What about garbage collection in the
database?
28
Research Strategy
• Bottom up
– Database Tables and Mappings first
– Garbage Collection last
• Try out multiple ideas
29
Idea A
• Take the Orpheus Model and make it
flexible
• One table per type
– makes queries unworkable
• Thus
– One table for all the types
30
Idea A - Table
CREATE TABLE fields(
objectid integer,
rowid integer,
objectclass character varying,
stringfieldkey character varying,
stringfieldvalue character varying,
integerfieldkey character varying,
integerfieldvalue integer,
referencefieldkey character varying,
referencefieldvalue integer)
31
Eurydike – Idea A – Example 1
association := 'KeyA' -> 1.
32
objectid rowid owner
class
string field
key
string field
value
integer field
key
integer field
value
reference field
key
reference field
value
1 1 Association 'key' 'KeyA' 'value' 1
Eurydike – Idea A – Example 2
association := 'KeyB' -> nil.
33
objectid rowid owner
class
string field
key
string field
value
integer field
key
integer field
value
reference field
key
reference field
value
1 1 Association 'key' 'KeyA' 'value' 1
2 1 Association 'key' 'KeyB'
Eurydike – Idea A – Example 3
association := 'KeyC' -> 'ValueC'.
34
objectid rowid owner
class
string field
key
string field
value
integer field
key
integer field
value
reference field
key
reference field
value
1 1 Association 'key' 'KeyA' 'value' 1
2 1 Association 'key' 'KeyB'
3 1 Association 'key' 'KeyC'
3 2 Association 'value' 'ValueC'
Eurydike – Idea A – Self References
association := 'KeyD' -> nil.
assocation value: association
association := session detect: [:each | each value = each]
35
objectid rowid owner
class
string field
key
string field
value
integer field
key
integer field
value
reference field
key
reference field
value
1 1 Association 'key' 'KeyA' 'value' 1
2 1 Association 'key' 'KeyB'
3 1 Association 'key' 'KeyC'
3 2 Association 'value' 'ValueC'
4 1 Association 'key' 'KeyD' 'value' 4
Eurydike – Idea A – Sequenceables
array := Array with: 'elementA' with: 200 with: 'elementC' with: 400.
array := session detect: [:each | (each at: 1) = 'elementA']]
array := session detect: [:each | (each at: 2) = 200]
The same happens for all other sequenceable collections.
Unordered collections like Set are stored with fictive index as key.
36
groupid rowid owner
class
string field
key
string field
value
integer field
key
integer field
value
…
1 1 Array '1' 'elementA' '2' 200
1 2 Array '3' 'elementC' '4' 400
Eurydike – Idea A – Dictionaries
• Dictionaries
• are collections of associations
• are stored as collections of associations
37
Eurydike – Idea A – SQL
[:base | base name = 'hello']
SELECT fields.groupid 'baseid', embedded.filterid 'filterid'
FROM
fields,
(SELECT base.groupid 'baseid', base.groupid 'filterid'
FROM fields base) embedded
WHERE
fields.groupid = embedded.filterid AND
fields.stringfieldkey = 'name' AND
fields.stringfieldvalue = 'hello'
38
Eurydike – Idea A - SQL
• SQL generation is complicated
– double dispatching
• for each possible datatype in table
• New expressions need new code paths for all
datatypes
39
Eurydike – Idea A - Summary
• Easy to use
– Almost any Object can be stored
– Our world is a sequence of 'Object allInstances'
– we can search with #select:, #detect: and #reject:
• Not quite excellent enough
– SQL generation is complex because of primitive datatypes and
unknown object type
– One column pair per type makes queries complicated
40
Idea B
• Take Idea A and make it simpler
• Thus
– Unifiy all types as string pairs
– Store every object as a dictionary
41
Idea B - Table
• CREATE TABLE fields(
objectid character varying,
keybasetype character varying,
keytype character varying,
keymajor character varying,
keyminor character varying,
valuebasetype character varying,
valuetype character varying,
valuemajor character varying,
valueminor character varying)
42
Eurydike – Idea B
• #baseType is like a class hierarchy filter for
comparing. Only things with same #baseType
are compared in SQL queries
• #type is the real class of object for
instantiation
• #major is the primary value, e.g. the
nominator for Number
• #minor is the secondary value, e.g. the
denominator for Number
Eurydike – Idea B – Example 1
association := 'KeyA' -> 1.
44
objectid keybasetype keytype Keymajor keyminor valuebasetype valuetype valuemajor valueminor
1 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyA'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Number' 'Core.SmallI
nteger'
'1' '1'
Eurydike – Idea B – Example 2
association := 'KeyB' -> nil.
45
objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor
1 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyA'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Number' 'Core.SmallI
nteger'
'1' '1'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyB'
Eurydike – Idea B – Example 3
association := 'KeyC' -> 'ValueC'.
46
objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor
1 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyA'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Number' 'Core.SmallI
nteger'
'1' '1'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyB'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyC'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Character
Array'
‚Core.ByteSt
ring'
'ValueC'
Eurydike – Idea B – Self References
association := 'KeyD' -> nil.
assocation value: association
association := session detect: [:each | each value = each]
47
objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor
1 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyA'
1 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Number' 'Core.SmallI
nteger'
'1' '1'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
2 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyB'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyC'
3 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Character
Array'
‚Core.ByteSt
ring'
'ValueC'
4 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Associ
ation'
4 'Core.Symbol' 'Core.ByteS
ymbol'
'key' 'Core.Character
Array'
‚Core.ByteSt
ring'
'KeyD'
4 'Core.Symbol' 'Core.ByteS
ymbol'
'value' 'Core.Object' 'Core.Object
'
'4'
Eurydike – Idea B - Dictionaries
• In Idea A Dictionaries are collections of Associations
• In Idea B there is native implemantation of Dictionaries
d := Dictionary new
d at: 'KeyA' put: 1.
d at: 'KeyC' put: 'ValueC'
objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor
5 'Core.Symbol' 'Core.ByteS
ymbol'
'class' 'Core.Character
Array'
'Core.ByteSt
ring'
'Core.Diction
ary'
5 'Core.Charact
erArray
'Core.ByteS
tring'
'KeyA' 'Core.Number' 'Core.SmallI
nteger'
'1' '1'
5 'Core.Charact
erArray'
'Core.ByteS
tring'
'KeyC' 'Core.Character
Array'
'Core.ByteSt
ring'
'ValueC'
• As we store dictionaries we need only expressions for the
primitive dictionary access like:
#at:, #keyAtValue:, #keys, #values, #size, #select:
The rest can be compound by these primitives.
includes: aValue
^self values select: [:each | each = aValue]
includesKey: aKey
^self keys select: [:each | each = aKey]
49
Eurydike – Idea B - Expressions
• As we return uniform data
– leads to simpler SQL-generation
– no need for context information
– Special expression combinations can be
optimized later
• when “make it fast” gets important
Special Objects
• ByteArrays
– Base 64 encoded strings
• Compiled Methods
– as source code or
– as byte array of compiled code
• BlockContexts
– same consirations needed as for OpenTalk
STST
51
Eurydike – Idea B - Summary
• Same advantages as Idea A
• Simple SQL generation
– Expressions can be compound by primitives
– Uniform data -> easier expression and SQL generation
– Uniform data -> different Numbers like double, fraction,
integer can be compared in queries
• Most of the collection protocol is possible like
#includes:, #includesKey:, #anySatisfy:, #allSatisfy:
• But
– …
Eurydike - ObjectSpace
• It is not the Smalltalk-way to store and
retrieve big unstructured collections of
instances
• Smalltalk wants a root objects and
navigates from object to object
• Eurydike implements abstract class
ObjectSpace
ObjectSpace – Example
• create a class for the objects
Smalltalk.Eurydike defineClass: #Person
superclass: #{Core.Object}
instanceVariableNames: 'name lastName address '
One ObjectSpace Subclass
Smalltalk.Eurydike defineClass: #PersonSpace
superclass: #{Eurydike.ObjectSpace}
instanceVariableNames: 'persons '
55
One instance method
initialize
super initialize.
persons := OrderedCollection new
56
One class method
connectionProfile
^(ConnectionProfile new)
platform: PostgreSQLPlatform new;
environment: 'localhost:5432_postgres';
username: 'postgres';
password: 'postgres';
yourself
57
Create the objects
p := PersonSpace default.
p persons add: ((Person new)
name: 'Jörg'; lastName: 'Belger'; address: 'Köthen').
p persons add: ((Person new)
name: 'Karsten'; lastName: 'Kusche'; address: 'Köthen').
p persons add: ((Person new)
name: 'Magnus'; lastName: 'Schwarz'; address: 'Dortmund').
p commit
58
PGAdmin shows the result
59
Eurydike – Schema migration
p := PersonSpace default.
d := Dictionary new.
p persons do: [:person |
d at: person lastName put: person].
p persons: d.
p commit
Result
61
Getting rid of garbage
PersonSpace default garbageCollect
62
Cleaned up database
63
Incremental GarbageCollect
DELETE FROM fields
WHERE fields.id NOT IN (
SELECT DISTINCT reffields.id FROM fields "reffields", fields
WHERE
(reffields.keymajor = 'class' AND
reffields.valuemajor = 'Eurydike.PersonSpace')
OR (fields.keybasetype = 'Core.Object' AND
fields.keymajor = reffields.id)
OR (fields.valuebasetype = 'Core.Object' AND
fields.valuemajor = reffields.id))
64
Global GarbageCollect
DELETE FROM fields
WHERE
fields.id NOT IN
((WITH RECURSIVE refs(id) AS
(
SELECT fields.id FROM fields
WHERE fields.keymajor = 'class' AND fields.valuemajor = 'Eurydike.PersonSpace'
UNION ALL
SELECT fields.valuemajor FROM fields, refs
WHERE fields.valuebasetype = 'Core.Object' AND fields.id = refs.id
)
SELECT * FROM refs)
UNION ALL
(WITH RECURSIVE refs(id) AS
(
SELECT fields.id FROM fields
WHERE fields.keymajor = 'class' AND fields.valuemajor = 'Eurydike.PersonSpace'
UNION ALL
SELECT fields.keymajor FROM fields, refs
WHERE fields.keybasetype = 'Core.Object' AND fields.id = refs.id
)
SELECT * FROM refs))
65
Eurydike – Current Status
• Used in GH seaMS
– new content management system based on
seaBreeze, seaBreeze Mobile and Seaside
– currently in initial use internally
– planned to be available on Cincom
Marketplace when released
66
Eurydike – Future – Multi User
• Life connections
• GlobalLock
– semaphore like object
– SELECT … FOR UPDATE
• single object lock
• ongoing research
Market of Eurydike
• Easy object based persistancy in medium
size projects
68
69
Our Team made the dream come true
Georg Heeg eK
Georg Heeg eK
Baroper Str. 337
44227 Dortmund
Germany
Tel: +49 (0)231 - 97599 - 0
Fax: +49 (0)231 - 97599-20
Email: georg@heeg.de
http://www.heeg.de
Georg Heeg AG
Seestraße 135
8027 Zürich
Switzerland
Tel: +41 (848) 43 34 24
Georg Heeg eK
Wallstraße 22
06366 Köthen
Germany
Tel: +49 (0)3496 - 214 328
Fax: +49 (0)3496 - 214 712

Más contenido relacionado

La actualidad más candente

Responsive Facets with Apache Solr
Responsive Facets with Apache SolrResponsive Facets with Apache Solr
Responsive Facets with Apache SolrBrent Lemons
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to ScalaRahul Jain
 
Scala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud FoundryScala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud FoundryPray Desai
 
Battle of the giants: Apache Solr vs ElasticSearch
Battle of the giants: Apache Solr vs ElasticSearchBattle of the giants: Apache Solr vs ElasticSearch
Battle of the giants: Apache Solr vs ElasticSearchRafał Kuć
 
Java Collection framework
Java Collection frameworkJava Collection framework
Java Collection frameworkankitgarg_er
 
Illuminating Lucene.Net
Illuminating Lucene.NetIlluminating Lucene.Net
Illuminating Lucene.NetDean Thrasher
 
Introduction to Simple.Data
Introduction to Simple.DataIntroduction to Simple.Data
Introduction to Simple.DataTim Bourguignon
 
Miles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java DevelopersMiles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java DevelopersSkills Matter
 
Martin Odersky - Evolution of Scala
Martin Odersky - Evolution of ScalaMartin Odersky - Evolution of Scala
Martin Odersky - Evolution of ScalaScala Italy
 
Umbraco OktoberFest 2014
Umbraco OktoberFest 2014Umbraco OktoberFest 2014
Umbraco OktoberFest 2014Jeavon Leopold
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to ScalaSaleem Ansari
 

La actualidad más candente (17)

Responsive Facets with Apache Solr
Responsive Facets with Apache SolrResponsive Facets with Apache Solr
Responsive Facets with Apache Solr
 
Java util
Java utilJava util
Java util
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Scala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud FoundryScala, Play 2.0 & Cloud Foundry
Scala, Play 2.0 & Cloud Foundry
 
Open Source Search FTW
Open Source Search FTWOpen Source Search FTW
Open Source Search FTW
 
Scala basic
Scala basicScala basic
Scala basic
 
Battle of the giants: Apache Solr vs ElasticSearch
Battle of the giants: Apache Solr vs ElasticSearchBattle of the giants: Apache Solr vs ElasticSearch
Battle of the giants: Apache Solr vs ElasticSearch
 
Apache Lucene 4
Apache Lucene 4Apache Lucene 4
Apache Lucene 4
 
Java Collection framework
Java Collection frameworkJava Collection framework
Java Collection framework
 
Java collection
Java collectionJava collection
Java collection
 
Illuminating Lucene.Net
Illuminating Lucene.NetIlluminating Lucene.Net
Illuminating Lucene.Net
 
Introduction to Simple.Data
Introduction to Simple.DataIntroduction to Simple.Data
Introduction to Simple.Data
 
Javasession6
Javasession6Javasession6
Javasession6
 
Miles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java DevelopersMiles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java Developers
 
Martin Odersky - Evolution of Scala
Martin Odersky - Evolution of ScalaMartin Odersky - Evolution of Scala
Martin Odersky - Evolution of Scala
 
Umbraco OktoberFest 2014
Umbraco OktoberFest 2014Umbraco OktoberFest 2014
Umbraco OktoberFest 2014
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 

Destacado

Seaside Esug 2008
Seaside Esug 2008Seaside Esug 2008
Seaside Esug 2008ESUG
 
ESUG 2011 Welcome
ESUG 2011 WelcomeESUG 2011 Welcome
ESUG 2011 WelcomeESUG
 
Representing Code History with Development Environment Events
Representing Code History with Development Environment EventsRepresenting Code History with Development Environment Events
Representing Code History with Development Environment EventsESUG
 
FAMOOSr 2011
FAMOOSr 2011FAMOOSr 2011
FAMOOSr 2011ESUG
 
Language-side Foreign Function Interfaces with NativeBoost
Language-side Foreign Function Interfaces with NativeBoostLanguage-side Foreign Function Interfaces with NativeBoost
Language-side Foreign Function Interfaces with NativeBoostESUG
 
iBizLog. Smalltalking the Web
iBizLog. Smalltalking the WebiBizLog. Smalltalking the Web
iBizLog. Smalltalking the WebESUG
 
OOSCM. Object Oriented SCM
OOSCM. Object Oriented SCMOOSCM. Object Oriented SCM
OOSCM. Object Oriented SCMESUG
 

Destacado (7)

Seaside Esug 2008
Seaside Esug 2008Seaside Esug 2008
Seaside Esug 2008
 
ESUG 2011 Welcome
ESUG 2011 WelcomeESUG 2011 Welcome
ESUG 2011 Welcome
 
Representing Code History with Development Environment Events
Representing Code History with Development Environment EventsRepresenting Code History with Development Environment Events
Representing Code History with Development Environment Events
 
FAMOOSr 2011
FAMOOSr 2011FAMOOSr 2011
FAMOOSr 2011
 
Language-side Foreign Function Interfaces with NativeBoost
Language-side Foreign Function Interfaces with NativeBoostLanguage-side Foreign Function Interfaces with NativeBoost
Language-side Foreign Function Interfaces with NativeBoost
 
iBizLog. Smalltalking the Web
iBizLog. Smalltalking the WebiBizLog. Smalltalking the Web
iBizLog. Smalltalking the Web
 
OOSCM. Object Oriented SCM
OOSCM. Object Oriented SCMOOSCM. Object Oriented SCM
OOSCM. Object Oriented SCM
 

Similar a Eurydike: Schemaless Object Relational SQL Mapper

JCR - Java Content Repositories
JCR - Java Content RepositoriesJCR - Java Content Repositories
JCR - Java Content RepositoriesCarsten Ziegeler
 
ElasticSearch AJUG 2013
ElasticSearch AJUG 2013ElasticSearch AJUG 2013
ElasticSearch AJUG 2013Roy Russo
 
Scaling with Riak at Showyou
Scaling with Riak at ShowyouScaling with Riak at Showyou
Scaling with Riak at ShowyouJohn Muellerleile
 
Skillwise - Enhancing dotnet app
Skillwise - Enhancing dotnet appSkillwise - Enhancing dotnet app
Skillwise - Enhancing dotnet appSkillwise Group
 
Using JPA applications in the era of NoSQL: Introducing Hibernate OGM
Using JPA applications in the era of NoSQL: Introducing Hibernate OGMUsing JPA applications in the era of NoSQL: Introducing Hibernate OGM
Using JPA applications in the era of NoSQL: Introducing Hibernate OGMPT.JUG
 
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...Jose Quesada (hiring)
 
Hibernate in XPages
Hibernate in XPagesHibernate in XPages
Hibernate in XPagesToby Samples
 
Intro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and ArrayIntro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and ArrayJeongbae Oh
 
Combine Spring Data Neo4j and Spring Boot to quickl
Combine Spring Data Neo4j and Spring Boot to quicklCombine Spring Data Neo4j and Spring Boot to quickl
Combine Spring Data Neo4j and Spring Boot to quicklNeo4j
 
SE2016 - Java EE revisits design patterns 2016
SE2016 - Java EE revisits design patterns 2016SE2016 - Java EE revisits design patterns 2016
SE2016 - Java EE revisits design patterns 2016Alex Theedom
 
OSGi, Scripting and REST, Building Webapps With Apache Sling
OSGi, Scripting and REST, Building Webapps With Apache SlingOSGi, Scripting and REST, Building Webapps With Apache Sling
OSGi, Scripting and REST, Building Webapps With Apache SlingCarsten Ziegeler
 
Search api d8
Search api d8Search api d8
Search api d8Dropsolid
 
Clojure - An Introduction for Lisp Programmers
Clojure - An Introduction for Lisp ProgrammersClojure - An Introduction for Lisp Programmers
Clojure - An Introduction for Lisp Programmerselliando dias
 
Introduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesIntroduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesMichael Redlich
 
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...OpenBlend society
 
Introduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesIntroduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesMichael Redlich
 
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search Engine
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search EngineElasticSearch: Distributed Multitenant NoSQL Datastore and Search Engine
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search EngineDaniel N
 

Similar a Eurydike: Schemaless Object Relational SQL Mapper (20)

JCR - Java Content Repositories
JCR - Java Content RepositoriesJCR - Java Content Repositories
JCR - Java Content Repositories
 
Tthornton code4lib
Tthornton code4libTthornton code4lib
Tthornton code4lib
 
ElasticSearch AJUG 2013
ElasticSearch AJUG 2013ElasticSearch AJUG 2013
ElasticSearch AJUG 2013
 
Scaling with Riak at Showyou
Scaling with Riak at ShowyouScaling with Riak at Showyou
Scaling with Riak at Showyou
 
Skillwise - Enhancing dotnet app
Skillwise - Enhancing dotnet appSkillwise - Enhancing dotnet app
Skillwise - Enhancing dotnet app
 
Using JPA applications in the era of NoSQL: Introducing Hibernate OGM
Using JPA applications in the era of NoSQL: Introducing Hibernate OGMUsing JPA applications in the era of NoSQL: Introducing Hibernate OGM
Using JPA applications in the era of NoSQL: Introducing Hibernate OGM
 
GraphDb in XPages
GraphDb in XPagesGraphDb in XPages
GraphDb in XPages
 
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...
A full Machine learning pipeline in Scikit-learn vs in scala-Spark: pros and ...
 
Hibernate in XPages
Hibernate in XPagesHibernate in XPages
Hibernate in XPages
 
Intro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and ArrayIntro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and Array
 
Combine Spring Data Neo4j and Spring Boot to quickl
Combine Spring Data Neo4j and Spring Boot to quicklCombine Spring Data Neo4j and Spring Boot to quickl
Combine Spring Data Neo4j and Spring Boot to quickl
 
Android Database
Android DatabaseAndroid Database
Android Database
 
SE2016 - Java EE revisits design patterns 2016
SE2016 - Java EE revisits design patterns 2016SE2016 - Java EE revisits design patterns 2016
SE2016 - Java EE revisits design patterns 2016
 
OSGi, Scripting and REST, Building Webapps With Apache Sling
OSGi, Scripting and REST, Building Webapps With Apache SlingOSGi, Scripting and REST, Building Webapps With Apache Sling
OSGi, Scripting and REST, Building Webapps With Apache Sling
 
Search api d8
Search api d8Search api d8
Search api d8
 
Clojure - An Introduction for Lisp Programmers
Clojure - An Introduction for Lisp ProgrammersClojure - An Introduction for Lisp Programmers
Clojure - An Introduction for Lisp Programmers
 
Introduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesIntroduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design Principles
 
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...
Introducing Hibernate OGM: porting JPA applications to NoSQL, Sanne Grinovero...
 
Introduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design PrinciplesIntroduction to Object Oriented Programming & Design Principles
Introduction to Object Oriented Programming & Design Principles
 
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search Engine
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search EngineElasticSearch: Distributed Multitenant NoSQL Datastore and Search Engine
ElasticSearch: Distributed Multitenant NoSQL Datastore and Search Engine
 

Más de ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsESUG
 

Más de ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Último

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 

Último (20)

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 

Eurydike: Schemaless Object Relational SQL Mapper

  • 2. 2 Eurydike • Easily • Usable • Relational • Yobbish • Database • Intuitive • Keymappingless • Environment
  • 3. 3 Objects • Smalltalk Objects live • Objects respond to messages • Objects have identity
  • 4. 4 Persistence • Long time • Sharing – multiple users – concurrent changes
  • 5. 5 Objects and Persistence • Save the image – long term – multiple users have copies – no concurrent changes • Serialize Objects • Use GemStone/S – Huge image on disk – multi-user – transaction bases synchronization
  • 6. 6 Serialize Objects • Timestamp now storeString – '(Timestamp readFrom: ''06/09/2013 14:38:53.432'' readStream)' – Issue: cyclic structures • solved by Hubert Baumeister 1988 using keys and IdentityDictionaries • BOSS – Binary Object Storage System • Parcels – Special serializer for code • Others – VOSS, XML, JSON, ODMG
  • 7. 7 –Store all or nothing –No concurrency  –Desire for databases Serialize Objects
  • 9. 9 Relational databases • Finite sets of typed values – Numbers, strings, … • Equality – of values • Cross products – called tables
  • 10. 10 Relations  Objects • Table rows as objects – easy as Objects can describe everyting – tables are mapped onto classes – columns are mapped onto instance variables • ObjectStudio database support • EXDI (VisualWorks) • GemConnect • VA Database support
  • 11. 11 Objects  Relations • Much more interesting • Much more difficult – due to lack of flexibilty on the relation side • Typical solution – OR Mapping – Objects Networks map onto Entity Relationship Models
  • 12. 12 Object Lens • 'the industry's first Object Relational Mapping (ORM) technology, providing seamless integration between Smalltalk- 80 applications and RDBMSs' – Richard Steiger • Parc, ParcPlace and Ensemble • Invented Object Relational Mapping (ORM) • Smalltalk Type System, providing strong typing, data entry validation, and program transformation inferencing
  • 13. 13 TOPLink • TOPLink is an application framework • allows Smalltalk applications to access relational databases • provides a high degree of integration between the Smalltalk objects and the relational database tables • relational database can be made to behave like an object database
  • 14. 14 GLORP • Generic Lightweight Object-Relational Persistence – open-source – object-relational mapping layer for Smalltalk • Camp Smalltalk Project – led by Alan Knight • goal is – to provide a simple, powerful framework for reading and writing objects from relational databases • originally sponsored by The Object People • concepts are reminiscent of TOPLink – though noticably different in some respects.
  • 15. 15 Properties • Class structures map to ER models • Change is difficult – change classes – change tables • schema migration • data migration – change mapping
  • 16. 16 Orpheus • Goal: Easy change – No more database schema migrations – No more data migrations • Designed and developed for Component Studio (ERP) • Way: universal database schema – one schema for all objects • Based upon Object Lens – Mapping is reduced to typing
  • 17. 17 CREATE TABLE domainmodel( domainmodelclass character varying(64), objectid integer) Orpheus object table
  • 18. 18 CREATE TABLE objectreference( attribute character varying(40), basevalue numeric, myinstance integer) Object attribute table
  • 19. 19 Integer attributes table CREATE TABLE integervalue( attribute character varying(40), basevalue integer, myinstance integer)
  • 20. 20 Many more basic type tables • Examples – ARBITRARYSTRING – BINARYVALUE – BOOLEANVALUE – LARGESTRING – TINYSTRING – TIMESTAMPVALUE – …
  • 21. 21 Our Dream • Persistance without pain • Intuitive for Smalltalkers • Easy to use • A Smalltalk … – as Arden Thomas would say
  • 22. 22 Can we use the existing ORMs? • Let us look at – Glorp – Orpheus
  • 23. GLORP • Explicit description in methods – #classModelForXXX: – #tableForXXX: – #descriptorForXXX: • Subclasses need special considerations 23
  • 24. Orpheus • Every object class needs – a Lens description method • Relationship classes required for N:M relationships
  • 25. All OR-Mappings • require typed Smalltalk 25
  • 26. Eurydike – Wishlist • EASY – We want to store any object – We do not want to write any mapping 26
  • 27. Eurydike – Timeline • Start of the research project – 28 February 2013 • Project task – “Build schema-less system for storage of any object in a SQL DB” • STIC 2013: Presentation • Since STIC 2013: – Used internally at Heeg – Used in GH seaMS – Experience starts floats back 27
  • 28. Eurydike – Tasks • Which tables in the database? • How to do the (invisibe) mapping object access to SQL? • What about (invisible) proxies? • What about concurrency? • What about garbage collection in the database? 28
  • 29. Research Strategy • Bottom up – Database Tables and Mappings first – Garbage Collection last • Try out multiple ideas 29
  • 30. Idea A • Take the Orpheus Model and make it flexible • One table per type – makes queries unworkable • Thus – One table for all the types 30
  • 31. Idea A - Table CREATE TABLE fields( objectid integer, rowid integer, objectclass character varying, stringfieldkey character varying, stringfieldvalue character varying, integerfieldkey character varying, integerfieldvalue integer, referencefieldkey character varying, referencefieldvalue integer) 31
  • 32. Eurydike – Idea A – Example 1 association := 'KeyA' -> 1. 32 objectid rowid owner class string field key string field value integer field key integer field value reference field key reference field value 1 1 Association 'key' 'KeyA' 'value' 1
  • 33. Eurydike – Idea A – Example 2 association := 'KeyB' -> nil. 33 objectid rowid owner class string field key string field value integer field key integer field value reference field key reference field value 1 1 Association 'key' 'KeyA' 'value' 1 2 1 Association 'key' 'KeyB'
  • 34. Eurydike – Idea A – Example 3 association := 'KeyC' -> 'ValueC'. 34 objectid rowid owner class string field key string field value integer field key integer field value reference field key reference field value 1 1 Association 'key' 'KeyA' 'value' 1 2 1 Association 'key' 'KeyB' 3 1 Association 'key' 'KeyC' 3 2 Association 'value' 'ValueC'
  • 35. Eurydike – Idea A – Self References association := 'KeyD' -> nil. assocation value: association association := session detect: [:each | each value = each] 35 objectid rowid owner class string field key string field value integer field key integer field value reference field key reference field value 1 1 Association 'key' 'KeyA' 'value' 1 2 1 Association 'key' 'KeyB' 3 1 Association 'key' 'KeyC' 3 2 Association 'value' 'ValueC' 4 1 Association 'key' 'KeyD' 'value' 4
  • 36. Eurydike – Idea A – Sequenceables array := Array with: 'elementA' with: 200 with: 'elementC' with: 400. array := session detect: [:each | (each at: 1) = 'elementA']] array := session detect: [:each | (each at: 2) = 200] The same happens for all other sequenceable collections. Unordered collections like Set are stored with fictive index as key. 36 groupid rowid owner class string field key string field value integer field key integer field value … 1 1 Array '1' 'elementA' '2' 200 1 2 Array '3' 'elementC' '4' 400
  • 37. Eurydike – Idea A – Dictionaries • Dictionaries • are collections of associations • are stored as collections of associations 37
  • 38. Eurydike – Idea A – SQL [:base | base name = 'hello'] SELECT fields.groupid 'baseid', embedded.filterid 'filterid' FROM fields, (SELECT base.groupid 'baseid', base.groupid 'filterid' FROM fields base) embedded WHERE fields.groupid = embedded.filterid AND fields.stringfieldkey = 'name' AND fields.stringfieldvalue = 'hello' 38
  • 39. Eurydike – Idea A - SQL • SQL generation is complicated – double dispatching • for each possible datatype in table • New expressions need new code paths for all datatypes 39
  • 40. Eurydike – Idea A - Summary • Easy to use – Almost any Object can be stored – Our world is a sequence of 'Object allInstances' – we can search with #select:, #detect: and #reject: • Not quite excellent enough – SQL generation is complex because of primitive datatypes and unknown object type – One column pair per type makes queries complicated 40
  • 41. Idea B • Take Idea A and make it simpler • Thus – Unifiy all types as string pairs – Store every object as a dictionary 41
  • 42. Idea B - Table • CREATE TABLE fields( objectid character varying, keybasetype character varying, keytype character varying, keymajor character varying, keyminor character varying, valuebasetype character varying, valuetype character varying, valuemajor character varying, valueminor character varying) 42
  • 43. Eurydike – Idea B • #baseType is like a class hierarchy filter for comparing. Only things with same #baseType are compared in SQL queries • #type is the real class of object for instantiation • #major is the primary value, e.g. the nominator for Number • #minor is the secondary value, e.g. the denominator for Number
  • 44. Eurydike – Idea B – Example 1 association := 'KeyA' -> 1. 44 objectid keybasetype keytype Keymajor keyminor valuebasetype valuetype valuemajor valueminor 1 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 1 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyA' 1 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Number' 'Core.SmallI nteger' '1' '1'
  • 45. Eurydike – Idea B – Example 2 association := 'KeyB' -> nil. 45 objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor 1 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 1 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyA' 1 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Number' 'Core.SmallI nteger' '1' '1' 2 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 2 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyB'
  • 46. Eurydike – Idea B – Example 3 association := 'KeyC' -> 'ValueC'. 46 objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor 1 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 1 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyA' 1 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Number' 'Core.SmallI nteger' '1' '1' 2 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 2 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyB' 3 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 3 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyC' 3 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Character Array' ‚Core.ByteSt ring' 'ValueC'
  • 47. Eurydike – Idea B – Self References association := 'KeyD' -> nil. assocation value: association association := session detect: [:each | each value = each] 47 objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor 1 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 1 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyA' 1 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Number' 'Core.SmallI nteger' '1' '1' 2 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 2 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyB' 3 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 3 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyC' 3 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Character Array' ‚Core.ByteSt ring' 'ValueC' 4 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Associ ation' 4 'Core.Symbol' 'Core.ByteS ymbol' 'key' 'Core.Character Array' ‚Core.ByteSt ring' 'KeyD' 4 'Core.Symbol' 'Core.ByteS ymbol' 'value' 'Core.Object' 'Core.Object ' '4'
  • 48. Eurydike – Idea B - Dictionaries • In Idea A Dictionaries are collections of Associations • In Idea B there is native implemantation of Dictionaries d := Dictionary new d at: 'KeyA' put: 1. d at: 'KeyC' put: 'ValueC' objectid keybasetype keytype keymajor keyminor valuebasetype valuetype valuemajor valueminor 5 'Core.Symbol' 'Core.ByteS ymbol' 'class' 'Core.Character Array' 'Core.ByteSt ring' 'Core.Diction ary' 5 'Core.Charact erArray 'Core.ByteS tring' 'KeyA' 'Core.Number' 'Core.SmallI nteger' '1' '1' 5 'Core.Charact erArray' 'Core.ByteS tring' 'KeyC' 'Core.Character Array' 'Core.ByteSt ring' 'ValueC'
  • 49. • As we store dictionaries we need only expressions for the primitive dictionary access like: #at:, #keyAtValue:, #keys, #values, #size, #select: The rest can be compound by these primitives. includes: aValue ^self values select: [:each | each = aValue] includesKey: aKey ^self keys select: [:each | each = aKey] 49
  • 50. Eurydike – Idea B - Expressions • As we return uniform data – leads to simpler SQL-generation – no need for context information – Special expression combinations can be optimized later • when “make it fast” gets important
  • 51. Special Objects • ByteArrays – Base 64 encoded strings • Compiled Methods – as source code or – as byte array of compiled code • BlockContexts – same consirations needed as for OpenTalk STST 51
  • 52. Eurydike – Idea B - Summary • Same advantages as Idea A • Simple SQL generation – Expressions can be compound by primitives – Uniform data -> easier expression and SQL generation – Uniform data -> different Numbers like double, fraction, integer can be compared in queries • Most of the collection protocol is possible like #includes:, #includesKey:, #anySatisfy:, #allSatisfy: • But – …
  • 53. Eurydike - ObjectSpace • It is not the Smalltalk-way to store and retrieve big unstructured collections of instances • Smalltalk wants a root objects and navigates from object to object • Eurydike implements abstract class ObjectSpace
  • 54. ObjectSpace – Example • create a class for the objects Smalltalk.Eurydike defineClass: #Person superclass: #{Core.Object} instanceVariableNames: 'name lastName address '
  • 55. One ObjectSpace Subclass Smalltalk.Eurydike defineClass: #PersonSpace superclass: #{Eurydike.ObjectSpace} instanceVariableNames: 'persons ' 55
  • 56. One instance method initialize super initialize. persons := OrderedCollection new 56
  • 57. One class method connectionProfile ^(ConnectionProfile new) platform: PostgreSQLPlatform new; environment: 'localhost:5432_postgres'; username: 'postgres'; password: 'postgres'; yourself 57
  • 58. Create the objects p := PersonSpace default. p persons add: ((Person new) name: 'Jörg'; lastName: 'Belger'; address: 'Köthen'). p persons add: ((Person new) name: 'Karsten'; lastName: 'Kusche'; address: 'Köthen'). p persons add: ((Person new) name: 'Magnus'; lastName: 'Schwarz'; address: 'Dortmund'). p commit 58
  • 59. PGAdmin shows the result 59
  • 60. Eurydike – Schema migration p := PersonSpace default. d := Dictionary new. p persons do: [:person | d at: person lastName put: person]. p persons: d. p commit
  • 62. Getting rid of garbage PersonSpace default garbageCollect 62
  • 64. Incremental GarbageCollect DELETE FROM fields WHERE fields.id NOT IN ( SELECT DISTINCT reffields.id FROM fields "reffields", fields WHERE (reffields.keymajor = 'class' AND reffields.valuemajor = 'Eurydike.PersonSpace') OR (fields.keybasetype = 'Core.Object' AND fields.keymajor = reffields.id) OR (fields.valuebasetype = 'Core.Object' AND fields.valuemajor = reffields.id)) 64
  • 65. Global GarbageCollect DELETE FROM fields WHERE fields.id NOT IN ((WITH RECURSIVE refs(id) AS ( SELECT fields.id FROM fields WHERE fields.keymajor = 'class' AND fields.valuemajor = 'Eurydike.PersonSpace' UNION ALL SELECT fields.valuemajor FROM fields, refs WHERE fields.valuebasetype = 'Core.Object' AND fields.id = refs.id ) SELECT * FROM refs) UNION ALL (WITH RECURSIVE refs(id) AS ( SELECT fields.id FROM fields WHERE fields.keymajor = 'class' AND fields.valuemajor = 'Eurydike.PersonSpace' UNION ALL SELECT fields.keymajor FROM fields, refs WHERE fields.keybasetype = 'Core.Object' AND fields.id = refs.id ) SELECT * FROM refs)) 65
  • 66. Eurydike – Current Status • Used in GH seaMS – new content management system based on seaBreeze, seaBreeze Mobile and Seaside – currently in initial use internally – planned to be available on Cincom Marketplace when released 66
  • 67. Eurydike – Future – Multi User • Life connections • GlobalLock – semaphore like object – SELECT … FOR UPDATE • single object lock • ongoing research
  • 68. Market of Eurydike • Easy object based persistancy in medium size projects 68
  • 69. 69 Our Team made the dream come true
  • 70. Georg Heeg eK Georg Heeg eK Baroper Str. 337 44227 Dortmund Germany Tel: +49 (0)231 - 97599 - 0 Fax: +49 (0)231 - 97599-20 Email: georg@heeg.de http://www.heeg.de Georg Heeg AG Seestraße 135 8027 Zürich Switzerland Tel: +41 (848) 43 34 24 Georg Heeg eK Wallstraße 22 06366 Köthen Germany Tel: +49 (0)3496 - 214 328 Fax: +49 (0)3496 - 214 712