voyage by example

35
Voyage by example tips and tricks on persisting object models

Upload: esteban-lorenzano

Post on 01-Dec-2014

449 views

Category:

Documents


4 download

DESCRIPTION

Tips and trips on persisting object models

TRANSCRIPT

Page 1: Voyage by example

Voyage by exampletips and tricks on persisting object models

Page 2: Voyage by example

Esteban Lorenzano Pharo core developer

INRIA - RMoD http://smallworks.eu

Page 3: Voyage by example

Why?• You already know about Voyage

• You already attended to a tutorial last year

• But there are some recurrent problems people find when trying to use it

• And I’m still seeing a lot of people that could be using it and they chose other solutions

Page 4: Voyage by example

What is Voyage? (1)• Simple abstraction layer to map objects into a database

- Very well suited for document databases, but in theory, the approach will work for other kind of repositories

‣ There was (long time ago) a Voyage-GLORP backend

‣ There was (even more time ago) a Voyage-ImageSegment backend

- Voyage-Memory, Voyage-Mongo

Page 5: Voyage by example

What is Voyage? (2)

• Did I said is simple?

• it ensures object identity

• it provides error handling

• it implements a connection pool

Page 6: Voyage by example

Voyage principles• Behavioural complete (for common usage), but

decoupled approach also possible.

• Same design for different backends, but not a common abstraction

- There is no such thing as a “voyage query language”, etc.

- is a bit more work for users who want to switch, but a lot more happiness for the program itself

Page 7: Voyage by example

Voyage ultimate goal

To be the GLORP for NoSQL databases

Page 8: Voyage by example

The problem to solve

Page 9: Voyage by example

Impedance mistmatch

Table BTable A Table C

Class A Class B Class C

1..*

*..*

Ideal relational model

Page 10: Voyage by example

Impedance mistmatch

anObject otherObject

aColection

firstObject

secondObject

thirdObject

Real object model

Page 11: Voyage by example

Impedance mistmatch

Real object model

anObject otherObject

aColection

firstObject

secondObject

thirdObject

Page 12: Voyage by example

Impedance mistmatch

Real object model

anObject otherObject

aColection

firstObject

secondObject

thirdObject

Page 13: Voyage by example

So, what about those tips?

Page 14: Voyage by example

Think in objects

Page 15: Voyage by example

A simple model

Hero Power*..*

Page 16: Voyage by example

Persist

(Hero named: ‘Groot’) addPower: ((Power named: ‘Plant Control’) level: #epic; yourself); save.

Page 17: Voyage by example

Persist{ _id: OID(…), #version: …, #instanceOf: ‘Hero’, name: ‘Groot’, powers: [ { #collection: ‘Power’, __id: OID(…) } ] } !{ _id: OID(…), #version: …, #instanceOf: ‘Power’, name: ‘Plant Control’, level: #epic, heroes: [ #collection: ‘Hero’, __id: OID(…) ] }

Page 18: Voyage by example

Take control

Page 19: Voyage by example

A simple model (a bit more complete)

Hero Power*..*

Equipment

1..*

Container Pistol

1..*

Page 20: Voyage by example

Persist

(Hero named: ‘Star-lord’) addEquipment: (Container addItem: Pistol new; yourself); save.

Page 21: Voyage by example

Persist (1)

{ _id: OID(…), #version: …, #instanceOf: ‘Hero’, name: ‘Star-lord’, powers: [], equipment: [ { #instanceOf: ‘Container’, ‘items’, [ { #instanceOf: ‘Pistol’ } ] } ] }

Page 22: Voyage by example

Persist (2){ _id: OID(1), #version: …, #instanceOf: ‘Hero’, name: ‘Star-lord’, powers: [], equipment: [ { #collection: ‘Equipment’, __id: OID(2) } ] } !{ _id: OID(2), #version: …, #instanceOf: ‘Container’, items: [ { #collection: ‘Equipment’, __id: OID(3) } ] } !{ _id: OID(3), #version: …, #instanceOf: ‘Pistol’, }

Page 23: Voyage by example

Integrity is a consequence

Page 24: Voyage by example

Allowing missing content

• We do not have foreign keys

- So we cannot do things like “ON DELETE CASCADE”

- Even delete validations are difficult

‣ Imagine “hero” has a “power”,and I remove the “power”. How can the hero notice it?

Page 25: Voyage by example

Persist

mongoContainer <mongoContainer> ! ^ VOMongoContainer new collectionName: ‘powers’; enableMissingContent; yourself

Page 26: Voyage by example

Querying smart

Page 27: Voyage by example

Query (1)

Hero selectMany: [ :each | … ] sortBy: { #name -> VOOrder ascending } asDictionary limit: 100 offset: 100

Page 28: Voyage by example

Query (2)

Hero selectMany: { ‘name’ -> { ‘$regexp’ -> ‘^G.*’. ‘$options’ -> ‘i’ } asDictionary } asDictionary

Page 29: Voyage by example

Adapt schemes

Page 30: Voyage by example

The “scheme is not mine” problem

• You can move meta-information to your program

• Magritte-Voyage gives you a lot of power

• You can extend/modify parts of the updating system too (like versioning)

Page 31: Voyage by example

Meta-information

{ _id: OID(…), #version: …, #instanceOf: ‘Hero’, name: ‘Star-lord’, powers: [], equipment: [ { #instanceOf: ‘Container’, ‘items’, [ { #instanceOf: ‘Pistol’ } ] } ] }

Page 32: Voyage by example

Meta-information

{ _id: OID(…), #version: …, #instanceOf: ‘Hero’, name: ‘Star-lord’, powers: [], equipment: [ { #instanceOf: ‘Container’, ‘items’, [ { #instanceOf: ‘Pistol’ } ] } ] }

Page 33: Voyage by example

Meta-information

{ _id: OID(…), name: ‘Star-lord’, powers: [], equipment: [ { ‘items’, [ {} ] } ] }

Page 34: Voyage by example

Voyage 2.0• Root detection (enhance save & update)

• Cyclic detection

- Add strategy to persist cycles even without roots (It has some consequences (in querying, etc.), so it will be optional)

• integrity validations

- #removeWithDependencies

• Materialisation customisations

- #readRaw

• Add backend: Riak

Page 35: Voyage by example

Use it today!

Gofer it smalltalkhubUser: ‘Pharo’ project: ’MetaRepoForPharo30’; configurationOf: ‘VoyageMongo’; loadStable.

Thanks!!Esteban Lorenzano - 2014