I will try to test this later but I can tell you now how "IN" relates to 
"BELONGS".

GAE does not have "belongs" and web2py solves this by using "IN". Also you 
must realize that GAE performs a separate subquery for every item with a IN 
clause. So this is very inefficient. You're also limited to 30 subqueries 
and thus 30  items in a "IN".

def BELONGS(self, first, second=None):
 if not isinstance(second, (list, tuple, set)):
  raise SyntaxError("Not supported")
 if not self.use_ndb:
  if isinstance(second, set):
   second = list(second)
 if first.type == 'id':
  second = [self.keyfunc(first._tablename, int(i)) for i in second]
 return [GAEF(first.name, 'in', second, lambda a, b:a in b)] 



On Tuesday, September 2, 2014 12:04:05 AM UTC+2, Russ King wrote:

> Many thanks for reply however this doesn't seem to be a complete fix - 
> code is failing on the 'in'  piece of this filter function and I am not 
> clear how this relates to the belongs code up above.  
>
> Regards
> Russ
>
>
>     GAE_FILTER_OPTIONS = {
>         '=': lambda q, t, p, v: q.filter(getattr(t,p) == v),
>         '>': lambda q, t, p, v: q.filter(getattr(t,p) > v),
>         '<': lambda q, t, p, v: q.filter(getattr(t,p) < v),
>         '<=': lambda q, t, p, v: q.filter(getattr(t,p) <= v),
>         '>=': lambda q, t, p, v: q.filter(getattr(t,p) >= v),
>         '!=': lambda q, t, p, v: q.filter(getattr(t,p) != v),
>         'in': lambda q, t, p, v: q.filter(getattr(t,p).IN(v)),
>         }
>
>     def filter(self, query, tableobj, prop, op, value):
>         return self.GAE_FILTER_OPTIONS[op](query, tableobj, prop, value)
>
>
> On Mon, Sep 1, 2014 at 12:32 PM, Quint <muijse...@gmail.com <javascript:>> 
> wrote:
>
>> Ok,
>>
>> I did not test this but from what can see from here the line below needs 
>> to be changed. (This line does not yet consider NDB.)
>>
>> def BELONGS(self, first, second=None):
>>  if not isinstance(second, (list, tuple, set)):
>>    raise SyntaxError("Not supported")
>>  if not self.use_ndb:
>>    if isinstance(second, set):
>>      second = list(second)
>>  if first.type == 'id':
>>    second = [Key.from_path(first._tablename, int(i)) for i in second]
>>    second = [self.keyfunc(first._tablename, int(i)) for i in second]
>>
>>  return [GAEF(first.name, 'in', second, lambda a, b:a in b)]
>>
>> Quint
>>
>>
>> On Saturday, August 30, 2014 1:37:07 AM UTC+2, Russ King wrote:
>>
>>>
>>> I am struggling to use belongs on GAE+NDB it appears that:
>>>
>>>     quests = db(db.question.level.belongs([1])).select(db.question.id
>>> ,db.question.level)  is valid  however
>>>
>>>     quests = db(db.question.id.belongs([1])).select(db.question.id, 
>>> db.question.level) generates an error along the lines of 
>>>
>>> <type 'exceptions.AttributeError'> type object 'question' has no 
>>> attribute '__key__' 
>>>
>>> is this because the key field is different from the other fields and is 
>>> there some sort of workaround to retrieve a set of records from a list of 
>>> keys or am I missing something
>>>
>>> Regards
>>> Russ
>>>
>>  -- 
>> Resources:
>> - http://web2py.com
>> - http://web2py.com/book (Documentation)
>> - http://github.com/web2py/web2py (Source code)
>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "web2py-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/web2py/_Od_UkKW05w/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> web2py+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to