Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

86 lines (64 sloc) 1.977 kb
Querying using an "ISBL"-like syntax, inspired by
Example ISBL:
(t1 * t2) : c1 = v1, c2 = v2 % projection
(t1 * t2) ** (c1 == v1, c2 == v2) % (t1.f1, t1.f2, t2.f1)
from peewee import *
from peewee import BaseModel
_Model = Model
class T(object):
def __init__(self, *models):
self.models = list(models)
self.query = None
self.projection = None
self.ordering = None
def __mul__(self, rhs):
if isinstance(rhs, T):
return self
def __pow__(self, rhs):
self.query = rhs
return self
def __mod__(self, rhs):
if not isinstance(rhs, (list, tuple)):
rhs = [rhs]
self.projection = rhs
return self
def __lshift__(self, rhs):
self.ordering = rhs
return self
def q(self):
if self.projection:
select = {}
for field in self.projection:
select.setdefault(field.model, [])
select = dict((m, ['*']) for m in self.models)
sq = self.models[0].select(select)
if self.ordering:
sq = sq.order_by(self.ordering)
for model in self.models[1:]:
sq = sq.join(model)
if self.query:
sq = sq.where(self.query)
return sq.naive()
def __iter__(self):
return iter(self.q())
class ISBLBaseModel(BaseModel):
def __mul__(cls, rhs):
return T(cls) * rhs
def __pow__(cls, rhs):
return T(cls) ** rhs
def __mod__(cls, rhs):
return T(cls) % rhs
def __lshift__(cls, rhs):
return T(cls) << rhs
class Model(_Model):
__metaclass__ = ISBLBaseModel
Jump to Line
Something went wrong with that request. Please try again.