Thread: [SQLObject] Enhanced IN Operator, interest in patch?
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Gregor H. <gh...@gr...> - 2011-03-22 08:27:26
|
Hi, I've made an enhanced sqlbuilder IN Operator for my own purpose and would like to ask if there is any interest in a patch for the sqlbuilder IN operator. It's enhancement is the ability to deal with SelectResults in addition to the standard sqlbuilder.Select. The motivation is the need to create subqueries using previously acquired SelectResults. def IN_(item, list_): if isinstance(list_, SelectResults): list_ = Select([list_.sourceClass.q.id], where=list_.clause, join=list_.ops.get('join', NoDefault), distinct=list_.ops.get('distinct',False), lazyColumns=list_.ops.get('lazyColumns', False), start=list_.ops.get('start', 0), end=list_.ops.get('end', None), orderBy=list_.ops.get('dbOrderBy', NoDefault), reversed=list_.ops.get('reversed', False), staticTables=list_.tables, forUpdate=list_.ops.get('forUpdate', False)) return IN(item, list_) -- Greg |
From: Oleg B. <ph...@ph...> - 2011-03-22 09:02:05
|
Hi! On Tue, Mar 22, 2011 at 09:27:04AM +0100, Gregor Horvath wrote: > def IN_(item, list_): > if isinstance(list_, SelectResults): > list_ = Select([list_.sourceClass.q.id], > where=list_.clause, > join=list_.ops.get('join', NoDefault), > distinct=list_.ops.get('distinct',False), > lazyColumns=list_.ops.get('lazyColumns', False), > start=list_.ops.get('start', 0), > end=list_.ops.get('end', None), > orderBy=list_.ops.get('dbOrderBy', NoDefault), > reversed=list_.ops.get('reversed', False), > staticTables=list_.tables, > forUpdate=list_.ops.get('forUpdate', False)) Isn't this just query = list_.queryForSelect() query.ops['items'] = [list_.sourceClass.q.id] ? > return IN(item, query) Oleg. -- Oleg Broytman http://phdru.name/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Oleg B. <ph...@ph...> - 2011-03-24 14:23:20
|
On Tue, Mar 22, 2011 at 12:01:54PM +0300, Oleg Broytman wrote: > query = list_.queryForSelect() > query.ops['items'] = [list_.sourceClass.q.id] I added a test and committed in the revsion 4371: http://sourceforge.net/mailarchive/forum.php?thread_name=E1Q2l8p-0002iI-Nr%40webwareforpython.org&forum_name=sqlobject-cvs Thank you! Oleg. -- Oleg Broytman http://phdru.name/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Gregor H. <gh...@gr...> - 2011-03-22 09:26:36
|
Hi, On Tue, 22 Mar 2011 12:01:54 +0300 Oleg Broytman <ph...@ph...> wrote: > Hi! > > On Tue, Mar 22, 2011 at 09:27:04AM +0100, Gregor Horvath wrote: > > def IN_(item, list_): > > if isinstance(list_, SelectResults): > > list_ = Select([list_.sourceClass.q.id], > > where=list_.clause, > > join=list_.ops.get('join', NoDefault), > > distinct=list_.ops.get('distinct',False), > > lazyColumns=list_.ops.get('lazyColumns', > > False), start=list_.ops.get('start', 0), > > end=list_.ops.get('end', None), > > orderBy=list_.ops.get('dbOrderBy', > > NoDefault), reversed=list_.ops.get('reversed', False), > > staticTables=list_.tables, > > forUpdate=list_.ops.get('forUpdate', False)) > > Isn't this just > > query = list_.queryForSelect() > query.ops['items'] = [list_.sourceClass.q.id] > > Thank You. Yes this is equivalent and more compact. But I would prefer to make an optional argument 'columns' to queryForSelect, because it is not obvious that the columns / items can be changed after initialisation. so it would be list_ = list_.queryForSelect(columns=[list_.sourceClass.q.id]) -- Gregor |
From: Oleg B. <ph...@ph...> - 2011-03-22 09:39:02
|
On Tue, Mar 22, 2011 at 10:26:22AM +0100, Gregor Horvath wrote: > But I would prefer to make an optional argument 'columns' to > queryForSelect, because it is not obvious that the columns / items can > be changed after initialisation. > > so it would be > > list_ = list_.queryForSelect(columns=[list_.sourceClass.q.id]) Hmm... I don't like this approach, at least at the first glance. I have to think about it, but now I'd rather split queryForSelect into two functions. Something like this: def queryForSelect(self): columns = [self.sourceClass.q.id] + [getattr(self.sourceClass.q, x.name) for x in self.sourceClass.sqlmeta.columnList] return self.makeQuery(columns) def makeQuery(self, columns): query = sqlbuilder.Select(columns, ... Oleg. -- Oleg Broytman http://phdru.name/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |