summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 60dc897)
raw | patch | inline | side by side (parent: 60dc897)
author | richard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2> | |
Fri, 30 Aug 2002 08:35:16 +0000 (08:35 +0000) | ||
committer | richard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2> | |
Fri, 30 Aug 2002 08:35:16 +0000 (08:35 +0000) |
git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@1006 57a73879-2fb5-44c3-a270-3262357dd7e2
roundup/backends/back_gadfly.py | patch | blob | history |
index d0d21106a97e1dc68bbba640cb8480bcf93cfde7..7ac724bb4fac5bd3644811d981cef3fc1f51cb9b 100644 (file)
-# $Id: back_gadfly.py,v 1.5 2002-08-23 05:33:32 richard Exp $
+# $Id: back_gadfly.py,v 1.6 2002-08-30 08:35:16 richard Exp $
__doc__ = '''
About Gadfly
============
'''
return self.db.getnodeids(self.classname, retired=0)
- def filter(self, search_matches, filterspec, sort, group,
- num_re = re.compile('^\d+$')):
+ def filter(self, search_matches, filterspec, sort, group):
''' Return a list of the ids of the active nodes in this class that
match the 'filter' spec, sorted by the group spec and then the
sort spec
+
+ "filterspec" is {propname: value(s)}
+ "sort" is ['+propname', '-propname', 'propname', ...]
+ "group is ['+propname', '-propname', 'propname', ...]
+ "search_matches" is {nodeid: marker}
'''
- raise NotImplementedError
+ cn = self.classname
+
+ # figure the WHERE clause from the filterspec
+ props = self.getprops()
+ frum = ['_'+cn]
+ where = []
+ args = []
+ for k, v in filterspec.items():
+ propclass = props[k]
+ if isinstance(propclass, Multilink):
+ tn = '%s_%s'%(cn, k)
+ frum.append(tn)
+ if isinstance(v, type([])):
+ s = ','.join(['?' for x in v])
+ where.append('id=%s.nodeid and %s.linkid in (%s)'%(tn,tn,s))
+ args = args + v
+ else:
+ where.append('id=%s.nodeid and %s.linkid = ?'%(tn, tn))
+ args.append(v)
+ else:
+ if isinstance(v, type([])):
+ s = ','.join(['?' for x in v])
+ where.append('_%s in (%s)'%(k, s))
+ args = args + v
+ else:
+ where.append('_%s=?'%k)
+ args.append(v)
+
+ # add results of full text search
+ if search_matches is not None:
+ v = search_matches.keys()
+ s = ','.join(['?' for x in v])
+ where.append('id in (%s)'%s)
+ args = args + v
+
+ # figure the order by clause
+ orderby = []
+ ordercols = []
+ if sort:
+ for entry in sort:
+ if entry[0] != '-':
+ orderby.append('_'+entry)
+ ordercols.append(entry)
+ else:
+ orderby.append('_'+entry[1:]+' desc')
+ ordercols.append(entry)
+
+ # figure the group by clause
+ groupby = []
+ groupcols = []
+ if group:
+ for entry in group:
+ if entry[0] != '-':
+ groupby.append('_'+entry)
+ groupcols.append(entry)
+ else:
+ groupby.append('_'+entry[1:]+' desc')
+ groupcols.append(entry[1:])
+
+ # construct the SQL
+ frum = ','.join(frum)
+ where = ' and '.join(where)
+ cols = ['id']
+ if orderby:
+ cols = cols + ordercols
+ order = ' order by %s'%(','.join(orderby))
+ else:
+ order = ''
+ if groupby:
+ cols = cols + groupcols
+ group = ' group by %s'%(','.join(groupby))
+ else:
+ group = ''
+ cols = ','.join(cols)
+ sql = 'select %s from %s where %s%s%s'%(cols, frum, where, order,
+ group)
+ args = tuple(args)
+ if __debug__:
+ print >>hyperdb.DEBUG, 'find', (self, sql, args)
+ cursor = self.db.conn.cursor()
+ cursor.execute(sql, args)
def count(self):
'''Get the number of nodes in this class.
#
# $Log: not supported by cvs2svn $
+# Revision 1.5 2002/08/23 05:33:32 richard
+# implemented multilink changes (and a unit test)
+#
# Revision 1.4 2002/08/23 05:00:38 richard
# fixed read-only gadfly retire()
#