Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding:utf-8
- import operator
- ops = (
- 'lt',
- 'lte',
- 'gt',
- 'gte',
- )
- class Table:
- def __init__(self, name, schema, rows=None):
- self.name = name
- self.schema = schema
- self.rows = rows or []
- class Query:
- def __init__(self, table):
- self.tables = [table]
- self.filters = []
- def select(self, *columns):
- ci = [self.column_index(c) for c in columns]
- for row in self._rows():
- yield tuple(row[i] for i in ci)
- def select_all(self):
- return self._filter()
- def _rows(self):
- return self.tables[0].rows
- def column_index(self, name):
- return self.tables[0].schema.index(name)
- def _filter(self):
- def _rows(filter_, column, rows):
- ci = self.column_index(column)
- for row in rows:
- if filter_(row[ci]):
- yield row
- rows = self._rows()
- for filter_, column in self.filters:
- rows = _rows(filter_, column, rows)
- return rows
- def where(self, **kwargs):
- for column, value in kwargs.items():
- self._where(column, value)
- return self
- def _where(self, column, value):
- def make_filter(predicate, value):
- def _filter(x):
- if x is not None and predicate(x, value):
- return True
- return False
- return _filter
- tmp = column.rsplit('__', 1)
- if len(tmp) == 2:
- column, op = tmp
- if op not in ops:
- raise ValueError('Invalid operator: %s' % op)
- predicate = getattr(operator, op)
- else:
- predicate = operator.eq
- filter_ = make_filter(predicate, value)
- self.filters.append((filter_, column))
- def print_list(l):
- print(list(l))
- Items = Table(
- 'items',
- ('id', 'name', 'category', 'price'),
- [
- (1, "りんご", 1, 300),
- (2, "みかん", 1, 130),
- (3, "キャベツ", 2, 200),
- (4, "わかめ", None, 250),
- (5, "しいたけ", 3, 180),
- ],
- )
- print_list(Query(Items).select_all())
- print_list(Query(Items).where(id__gt=1, category=2).select_all())
- print_list(Query(Items).select('id', 'name'))
- print_list(Query(Items).where(category__gt=1).select_all())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement