Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. # coding:utf-8
  2. import operator
  3.  
  4. ops = (
  5. 'lt',
  6. 'lte',
  7. 'gt',
  8. 'gte',
  9. )
  10.  
  11.  
  12. class Table:
  13. def __init__(self, name, schema, rows=None):
  14. self.name = name
  15. self.schema = schema
  16. self.rows = rows or []
  17.  
  18.  
  19. class Query:
  20. def __init__(self, table):
  21. self.tables = [table]
  22. self.filters = []
  23.  
  24. def select(self, *columns):
  25. ci = [self.column_index(c) for c in columns]
  26. for row in self._rows():
  27. yield tuple(row[i] for i in ci)
  28.  
  29. def select_all(self):
  30. return self._filter()
  31.  
  32. def _rows(self):
  33. return self.tables[0].rows
  34.  
  35. def column_index(self, name):
  36. return self.tables[0].schema.index(name)
  37.  
  38. def _filter(self):
  39. def _rows(filter_, column, rows):
  40. ci = self.column_index(column)
  41. for row in rows:
  42. if filter_(row[ci]):
  43. yield row
  44.  
  45. rows = self._rows()
  46. for filter_, column in self.filters:
  47. rows = _rows(filter_, column, rows)
  48. return rows
  49.  
  50. def where(self, **kwargs):
  51. for column, value in kwargs.items():
  52. self._where(column, value)
  53. return self
  54.  
  55. def _where(self, column, value):
  56. def make_filter(predicate, value):
  57. def _filter(x):
  58. if x is not None and predicate(x, value):
  59. return True
  60. return False
  61. return _filter
  62.  
  63. tmp = column.rsplit('__', 1)
  64. if len(tmp) == 2:
  65. column, op = tmp
  66. if op not in ops:
  67. raise ValueError('Invalid operator: %s' % op)
  68. predicate = getattr(operator, op)
  69. else:
  70. predicate = operator.eq
  71. filter_ = make_filter(predicate, value)
  72. self.filters.append((filter_, column))
  73.  
  74.  
  75. def print_list(l):
  76. print(list(l))
  77.  
  78.  
  79. Items = Table(
  80. 'items',
  81. ('id', 'name', 'category', 'price'),
  82. [
  83. (1, "りんご", 1, 300),
  84. (2, "みかん", 1, 130),
  85. (3, "キャベツ", 2, 200),
  86. (4, "わかめ", None, 250),
  87. (5, "しいたけ", 3, 180),
  88. ],
  89. )
  90.  
  91. print_list(Query(Items).select_all())
  92. print_list(Query(Items).where(id__gt=1, category=2).select_all())
  93. print_list(Query(Items).select('id', 'name'))
  94. print_list(Query(Items).where(category__gt=1).select_all())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement