Hi Norbert,

     this reminds me of something IIRC that Alan Knight did in TopLink, a 
commercial OR mapping tool.  Alan allowed one to write queries in conventional 
Smalltalk such as 

     db select: [:obj| obj name = 'foo' or: [obj feature isSomething]]

but under the covers compiling this block into a query that the database could 
execute by evaluating the block once, passing in a "compiling" object that 
implements doesNotUnderstand: to catch the messages sent in the block.

That technique could work in this context and avoid introducing the (excuse me 
for saying, /horrible/) tuple syntax.

Eliot (phone)

On Jan 5, 2015, at 4:41 AM, Norbert Hartl <[email protected]> wrote:

> 
>> Am 05.01.2015 um 04:59 schrieb Yanni Chiu <[email protected]>:
>> 
>> 
>> On Jan 4, 2015, at 4:38 AM, Norbert Hartl <[email protected]> wrote:
>> 
>>> someCollection select: { 
>>>    '$or' -> { 
>>>        { 'name' -> { 
>>>            '$regex' -> 'test' . 
>>>            '$options' -> 'i' } asDictionary } asDictionary.
>>>        { 'description' -> { 
>>>            '$regex' -> 'test' . 
>>>            '$options' -> 'i' } asDictionary } asDictionary
>>>    } 
>>> } asDictionary
>> 
>> That worked. I was close, but I was using $or: instead of $or, and I was 
>> missing one level of asDictionary.
>> 
>> Just for the archive, there’s one more query I needed, which was to find an 
>> object based on it’s object id. I ended up using:
>> 
>>    voyageId := Integer readFrom: (request at: #voyageId) base: 16.
>>    someModel := SomeModel selectOne: { '_id' -> (OID value: voyageId) } 
>> asDictionary.
>> 
>> This is a web app using Teapot and Mustache, so I write the voyageId out 
>> using:
>> 
>>    self voyageId value printStringHex
> 
> Sounds cool. If you have anything to publish I'm interested what you've done. 
> Especially if you have some nice tricks doing form handling in teapot.
> 
> Btw. for the archive. A common use case I encounter is to query objects that 
> are being referenced by another object. It works like this
> 
> AnyClass>>#referencedBy: anObject
>    ^ AnyClass selectMany: {
>        'reference.__id' -> anObject voyageId } asDictionary
> 
> Norbert
> 
> 

Reply via email to