Hi Guillermo, thanks for that. I'm using DBX for legacy reasons but there's no 
reason why it couldn't use native.

I managed to get it working by looking at how some other DatabaseTypes worked 
but am not sure whether I'm doing it completely right. It won't perform a full 
toManyMapping so I'm just making do with directly mapping the id's and then 
doing another read in the post fetch to get at the joined objects.

On a similar note, I noticed that Glorp isn't retrieving two objects with a 
composite SQL statement when you specify a one to one mapping in the 
descriptor. It is fetching the first and then leaving a Proxy in the second; 
which will only go to the database with a separate query when you actually ask 
for it. I have a few cases where having the objects fully resolved at startup 
might be better than doing each one on demand. Is there any better way to do 
this than a loop in the post fetch? It also caused me a little confusion 
because as soon as you do something such as put them into a Set, the = matching 
of a real Object against a new Proxy that comes along won't work unless you've 
explicity defined equality (Proxy = Object does in fact work because it does a 
getValue first) I was trusting Glorp to only allow one instance of a particular 
object and therefore expecting identity equality to be sufficient 

!PostgreSQLPlatform methodsFor: '*glorp-extensions' stamp: 'user 3/19/2013 
05:13'!
arrayConverter
    ^DelegatingDatabaseConverter
        named: #array
        hostedBy: self
        fromStToDb: #toArray:for:
        fromDbToSt: #readArray:for:.! !

!PostgreSQLPlatform methodsFor: '*glorp-extensions' stamp: 'user 3/19/2013 
05:14'!
arrayOf: elementType
    ^self typeNamed: #arrayOf, elementType asString ifAbsentPut: 
[GlorpPGArrayType new elementType: elementType ].! !

!PostgreSQLPlatform methodsFor: '*glorp-extensions' stamp: 'user 3/19/2013 
05:13'!
readArray: anObject for: aType
    anObject ifNil: [^nil].
    ^((anObject copyFrom: 2 to: anObject size - 1) subStrings: ',') collect: 
[:each | aType elementType fromString: each]! !

!PostgreSQLPlatform methodsFor: '*glorp-extensions' stamp: 'user 3/19/2013 
05:13'!
toArray: anObject for: aType
    anObject ifNil: [^nil].
    ^'{', anObject asCommaString, '}'! !
    
GlorpDatabaseType subclass: #GlorpPGArrayType
    instanceVariableNames: 'elementType'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Glorp-Extensions'!

!GlorpPGArrayType methodsFor: 'as yet unclassified' stamp: 'user 3/19/2013 
05:03'!
converterForStType: aClass
    ^self platform converterNamed: #array.! !


!GlorpPGArrayType methodsFor: 'accessing' stamp: 'user 3/19/2013 05:05'!
elementType
    ^ elementType! !

!GlorpPGArrayType methodsFor: 'accessing' stamp: 'user 3/19/2013 05:05'!
elementType: anObject
    elementType := anObject! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!

GlorpPGArrayType class
    instanceVariableNames: ''!

!GlorpPGArrayType class methodsFor: 'as yet unclassified' stamp: 'user 
3/19/2013 05:05'!
of: elementType
    ^self new elementType: elementType! !
 

--- On Mon, 18/3/13, Guillermo Polito <[email protected]> wrote:

From: Guillermo Polito <[email protected]>
Subject: Re: [Pharo-users] Glorp + Postgres array type
To: "A friendly place where any question about pharo is welcome" 
<[email protected]>
Cc: [email protected], [email protected]
Date: Monday, 18 March, 2013, 11:41

Hi Chris, I'm not really sure Glorp supports that... but at least I can try to 
give a look at how the driver responds to it, so:
- Which driver are you using? OpenDBX or the native postgres one? 
- can you provide me some script to setup the problem? I'm not really an expert 
on postgresql specifics :)

On Sun, Mar 17, 2013 at 11:46 AM, Chris <[email protected]> wrote:

Hi, does anyone know if Glorp supports the array type in Postgres? I did a 
basicExecuteSQLString: and it came back with '{1,2,3}' so as if it might not be 
too complicated to make work for my scenario at least. I really want to do a 
toManyMapping using these integers in the array as a join to another table and 
have it resolve their objects, but wouldn't know where to start!




I'll forward this question to the glorp and DBXtalk lists also, probably 
someone else has more idea. 

Thanks

Chris



Tx,Guille

Reply via email to