Hi Sabine, I'll check, but you shouldn't have that problem, so is probably a bug :) Esteban On Mon, Dec 2, 2013 at 12:51 PM, Sabine Knöfel <sabine.knoefel@gmail.com>wrote:
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.