Good day all,
I am looking at the Magritte/Pier "bible" (Reng06a.pdf) Sec 2.3.2 (page 8) Object Relational Mapping. I decided I would take a stab at implementing: "In a very similar way, we are able to automatically create SQL statements to store, load and query objects from a relational database". Any one care to offer hints? I am very much a novice at all these patterns and things, so I am guessing a Visitor pattern of sorts (I HAVE been studying the Gang of Four bible tho ;)....
Here is what I have so far:
MADescription:
added methods:
>> toSql: anObject ^self toSql: anObject writer: self sqlWriter.
>>sqlWriter ^self propertyAt: #sqlWriter ifAbsent: self class defaultSqlWriter.
class>>defaultSqlWriter ^SQLWriter
And I have created MAWriter subclass SQLWriter with one instance variable 'sql'
SQLWriter>>defaultWriteStream
^((sql isNil ifTrue: [ sql := String new]) writeStream).
SQLWriter>>write: anObject description: aDescription to: aStream
anObject isNil ifTrue: [ ^ aDescription undefined ].
^ super write: anObject description: aDescription to: aStream which, looking at it now, I really shouldn't need to override
Then there are the visiting method which are going to be the reall tricky part.
SQLWriter>>visitContainer: aDescription
aDescription memento model isNil "we have a NEW model object so INSERT" will this work????? heh
ifTrue: [ stream nextPutAll: 'INSERT INTO '; nextPutAll: aDescription table; nextPutAll: ' VALUES ('; cr ] where does the table method come in? hmmm
ifFalse: [ stream nextPutAll: 'UPDATE '; nextPutAll aDescription table; cr; nextPutAll: 'SET ' ].
And then I will need to add something like:
aDescription do: [ :desc | self write: something description: desc stream: stream ] What something goes here I am still scratching my head about...
Any help/suggetions with this last part would be greatly appreciated.
Also, I have started to get used to looking at the unit tests to figure out what things are supposed to do, then I noticed that there are NO tests for MAVisitor and subclasses. Why is that? (Or am I missing something?)
Thanks in advance for any advice
John McKeon