Hi Esteban,
I found a problem in mongo/voyage and I have reduced and extracted it for
repro.
I ask for your opinion if this is a bug.
If you file in the code below, the method >>testDemo creates a simple model:
Paper has 1:1 reference to Planet.
Paper has 1:1 reference to Star.
Star has 1:N reference to Planet.
Star has 1:1 reference to Paper.
Planet has 1:1 reference to Paper.
If you run >>testDemo, you see that the model which was created is ok with
all its references.
(self assert: thePaper planet = thePaper star planets first.) ==> ok
If you reset the repository and load Paper from database with
Paper select all
and make the same check, the references are lost.
VORepository current reset.
theReloadedPaper := Paper selectAll first.
self assert: theReloadedPaper planet = theReloadedPaper star planets first
==>not ok
But if you remove the comment within >>mongoPlanets
which leads to sending a message to the newly loaded object, then it works.
write: [ :star :planets | star planets: (planets "select: [:each | each
someMethod]") ]);
Do I have to send a message to each of the instances after loading? I think
no.
If I did not understand correctly how to use voyage, please tell me.
Regards
Sabine
Object subclass: #Planet
instanceVariableNames: 'planetname star paper'
classVariableNames: ''
poolDictionaries: ''
category: 'RKA24-Demo'!
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 12:05'!
paper
^ paper! !
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 12:05'!
paper: anObject
paper := anObject! !
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:17'!
planetname
^ planetname! !
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:17'!
planetname: anObject
planetname := anObject! !
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:53'!
star
^ star! !
!Planet methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:53'!
star: anObject
star := anObject! !
!Planet methodsFor: 'testing' stamp: 'sabineknoefel 12/2/2013 12:25'!
someMethod
^true! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
Planet class
instanceVariableNames: ''!
!Planet class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
7/18/2013 16:16'!
isVoyageRoot
^true! !
!Planet class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 12:23'!
mongoStar
<mongoDescription>
^ VOMongoToOneDescription new
attributeName: 'star';
kind: Star;
accessor: (MAPluggableAccessor read: [ :planet | planet star ]
write: [
:planet :star | planet star: star ]);
yourself! !
!Planet class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 12:30'!
testDemo
"self testDemo"
| thePlanet theStar thePaper theReloadedPaper |
"create simple model"
thePaper := Paper new theme: 'a paper about 42'.
thePlanet := Planet new planetname: 'Orion'; paper: thePaper.
theStar := Star new starname: 'Betelgeuse'; paper: thePaper.
theStar addPlanet: thePlanet.
thePaper star: theStar.
thePaper planet: thePlanet.
thePaper save.
"check references - ok"
self assert: thePaper planet = thePaper star planets first.
VORepository current reset.
theReloadedPaper := Paper selectAll first.
"references are lost now"
self assert: theReloadedPaper planet = theReloadedPaper star planets
first!
!
Object subclass: #Star
instanceVariableNames: 'starname planets paper'
classVariableNames: ''
poolDictionaries: ''
category: 'RKA24-Demo'!
!Star methodsFor: 'api' stamp: 'sabineknoefel 7/18/2013 16:21'!
addPlanet: aPlanet
self planets add: aPlanet.
aPlanet star: self! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 12:05'!
paper
^ paper! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 12:05'!
paper: anObject
paper := anObject! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:20'!
planets
planets ifNil: [ self planets: OrderedCollection new ].
^ planets! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:20'!
planets: anObject
planets := anObject! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:18'!
starname
^ starname! !
!Star methodsFor: 'accessing' stamp: 'sabineknoefel 7/18/2013 16:18'!
starname: anObject
starname := anObject! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
Star class
instanceVariableNames: ''!
!Star class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
7/18/2013 16:16'!
isVoyageRoot
^true! !
!Star class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 12:31'!
mongoPlanets
"remove comment below then references are not lost anymore"
<mongoDescription>
^ VOMongoToManyDescription new
attributeName: 'planets';
kind: Planet;
accessor:
(MAPluggableAccessor
read: [ :star | star planets ]
write: [ :star :planets | star
planets: (planets "select: [:each |
each someMethod]") ]);
yourself ! !
Object subclass: #Paper
instanceVariableNames: 'star planet theme'
classVariableNames: ''
poolDictionaries: ''
category: 'RKA24-Demo'!
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
planet
^ planet! !
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
planet: anObject
planet := anObject! !
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
star
^ star! !
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
star: anObject
star := anObject! !
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
theme
^ theme! !
!Paper methodsFor: 'accessing' stamp: 'sabineknoefel 12/2/2013 11:54'!
theme: anObject
theme := anObject! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
Paper class
instanceVariableNames: ''!
!Paper class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 11:48'!
isVoyageRoot
^true! !
!Paper class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 12:23'!
mongoPlanet
<mongoDescription>
^ VOMongoToOneDescription new
attributeName: 'planet';
accessor: (MAPluggableAccessor
read: [ :paper | paper planet ]
write: [ :paper :planet | paper planet: planet ]);
yourself! !
!Paper class methodsFor: 'as yet unclassified' stamp: 'sabineknoefel
12/2/2013 12:23'!
mongoStar
<mongoDescription>
^ VOMongoToOneDescription new
attributeName: 'star';
accessor: (MAPluggableAccessor
read: [ :paper | paper star ]
write: [ :paper :star | paper star: star ]);
yourself! !
--
View this message in context:
http://forum.world.st/Mongo-lost-references-bug-tp4726673.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.