Voyage Mongo and Serialization anomalies?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Voyage Mongo and Serialization anomalies?

Holger Freyther
Hi all,

it is the first time I notice this and I am not sure that this has been written down somewhere
and if it is known to others (and then what to do about it).

I had an Object with a ByteArray and then tried to find this object using the ByteArray and
it wasn’t found. It looks like the ByteArray will be converted to an “array”. When searching
the ByteArray would not match it, an Array matches it. When using anArray to find the object
and using a “getter” to get the value and comparing it will not lead to equality. I understand
that Mongo doesn’t have same types (Array, OrderedCollection, ByteArray) as Smalltalk but
I wonder if there can be done something to improve the situation?

Is this known? Can we improve it? I can of course workaround it by converting it to an
array/orderedcollection before comparing it.

holger


Example:

| data repository test res |
repository := VOMongoRepository database: 'dbtest'.
data := #[1 2 3 4].
test := ZEByteArrayVoyage new.
test byteArray: data.
repository save: test.

res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data ].
res. "---> UndefinedObject"
       
res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data asArray].
res. "---> ZEByteArrayVoyage"
       
res byteArray = data. “false.. OrderedCollection = ByteArray"
res byteArray = data asArray. “OrderedCollection = Array"
res byteArray = data asOrderedCollection. "true"
Reply | Threaded
Open this post in threaded view
|

Re: Voyage Mongo and Serialization anomalies?

EstebanLM
Hi Holger,

by default, BSON should be decoding a ByteArray (if persisted as is) with data type “binary data”, and you should be receiving a ByteArray as expected when reading.
This is how SmalltalkHub works so I suspect there is something else going on (otherwise, there would be many, many people angry :P).
Can you confirm the code is being persisted as binary data? (just check in the database).

A simple workaround is to define an accessor:

MyClass class>>#myByteArray
        <mongoDescription>

        ^ VOMongoToOneDescription new
                attributeName: ‘byteArray';
                accessor: (MAPluggableAccessor
                         read: [ :anObject | anObject byteArray  ]
                         write: [ :anObject :value | anObject byteArray: value asByteArray ]);
                yourself

cheers,
Esteban

> On 04 Sep 2015, at 19:51, Holger Freyther <[hidden email]> wrote:
>
> Hi all,
>
> it is the first time I notice this and I am not sure that this has been written down somewhere
> and if it is known to others (and then what to do about it).
>
> I had an Object with a ByteArray and then tried to find this object using the ByteArray and
> it wasn’t found. It looks like the ByteArray will be converted to an “array”. When searching
> the ByteArray would not match it, an Array matches it. When using anArray to find the object
> and using a “getter” to get the value and comparing it will not lead to equality. I understand
> that Mongo doesn’t have same types (Array, OrderedCollection, ByteArray) as Smalltalk but
> I wonder if there can be done something to improve the situation?
>
> Is this known? Can we improve it? I can of course workaround it by converting it to an
> array/orderedcollection before comparing it.
>
> holger
>
>
> Example:
>
> | data repository test res |
> repository := VOMongoRepository database: 'dbtest'.
> data := #[1 2 3 4].
> test := ZEByteArrayVoyage new.
> test byteArray: data.
> repository save: test.
>
> res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data ].
> res. "---> UndefinedObject"
>
> res := repository selectOne: ZEByteArrayVoyage where: [:each | each byteArray = data asArray].
> res. "---> ZEByteArrayVoyage"
>
> res byteArray = data. “false.. OrderedCollection = ByteArray"
> res byteArray = data asArray. “OrderedCollection = Array"
> res byteArray = data asOrderedCollection. "true"