示例#1
0
    def __init__(self, sourceClass, clause, clauseTables=None,
                 **ops):
        self.sourceClass = sourceClass
        if clause is None or isinstance(clause, str) and clause == 'all':
            clause = sqlbuilder.SQLTrueClause
        if not isinstance(clause, sqlbuilder.SQLExpression):
            clause = sqlbuilder.SQLConstant(clause)
        self.clause = clause
        self.ops = ops
        if ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
            ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
        orderBy = ops['orderBy']
        if isinstance(orderBy, (tuple, list)):
            orderBy = map(self._mungeOrderBy, orderBy)
        else:
            orderBy = self._mungeOrderBy(orderBy)
        ops['dbOrderBy'] = orderBy
        if 'connection' in ops and ops['connection'] is None:
            del ops['connection']
        if ops.get('limit', None):
            assert not ops.get('start', None) and not ops.get('end', None), \
               "'limit' cannot be used with 'start' or 'end'"
            ops["start"] = 0
            ops["end"] = ops.pop("limit")

        tablesSet = sqlbuilder.tablesUsedSet(self.clause, self._getConnection().dbName)
        if clauseTables:
            for table in clauseTables:
                tablesSet.add(table)
        self.clauseTables = clauseTables
        # Explicitly post-adding-in sqlmeta.table, sqlbuilder.Select will handle sqlrepr'ing and dupes
        self.tables = list(tablesSet) + [sourceClass.sqlmeta.table]
示例#2
0
 def filter(self, filter_clause):
     if filter_clause is None:
         # None doesn't filter anything, it's just a no-op:
         return self
     clause = self.clause
     if isinstance(clause, basestring):
         clause = sqlbuilder.SQLConstant('(%s)' % clause)
     return self.newClause(sqlbuilder.AND(clause, filter_clause))
示例#3
0
 def _SO_selectOneAlt(self, so, columnNames, condition):
     if columnNames:
         columns = [isinstance(x, basestring) and sqlbuilder.SQLConstant(x) or x for x in columnNames]
     else:
         columns = None
     return self.queryOne(self.sqlrepr(sqlbuilder.Select(columns,
                                                         staticTables=[so.sqlmeta.table],
                                                         clause=condition)))
示例#4
0
 def accumulate(self, *expressions):
     """ Use accumulate expression(s) to select result
         using another SQL select through current
         connection.
         Return the accumulate result
     """
     conn = self._getConnection()
     exprs = []
     for expr in expressions:
         if not isinstance(expr, sqlbuilder.SQLExpression):
             expr = sqlbuilder.SQLConstant(expr)
         exprs.append(expr)
     return conn.accumulateSelect(self, *exprs)
示例#5
0
 def _mungeOrderBy(self, orderBy):
     if isinstance(orderBy, basestring) and orderBy.startswith('-'):
         orderBy = orderBy[1:]
         desc = True
     else:
         desc = False
     if isinstance(orderBy, basestring):
         if orderBy in self.sourceClass.sqlmeta.columns:
             val = getattr(self.sourceClass.q, self.sourceClass.sqlmeta.columns[orderBy].name)
             if desc:
                 return sqlbuilder.DESC(val)
             else:
                 return val
         else:
             orderBy = sqlbuilder.SQLConstant(orderBy)
             if desc:
                 return sqlbuilder.DESC(orderBy)
             else:
                 return orderBy
     else:
         return orderBy