Because every setter returns self, an entire query can be written as one uninterrupted chain: select, then from_, then any wheres, then order_by, then limit, then build. That readability is the whole point of the Builder pattern.
A reusable builder also needs a way to start over. Implement reset(). Return every field to its initial empty value - columns to an empty list, table to None, wheres to an empty list, order to None, and the limit slot to None - then return self so a fresh chain can begin immediately.
class QueryBuilder:
def __init__(self):
self.columns = []
self.table = None
self.wheres = []
self.order = None
self._limit = None
def select(self, *cols):
self.columns = list(cols)
return self
def from_(self, table):
self.table = table
return self
def where(self, condition):
self.wheres.append(condition)
return self
def order_by(self, col):
self.order = col
return self
def limit(self, n):
self._limit = n
return self
def reset(self):
"""Clear all builder state back to empty and return self."""
# TODO: reset columns, table, wheres, order, limit to their initial values
# TODO: return self
pass
def build(self):
cols = ", ".join(self.columns) if self.columns else "*"
sql = "SELECT " + cols + " FROM " + self.table
if self.wheres:
sql += " WHERE " + " AND ".join(self.wheres)
if self.order is not None:
sql += " ORDER BY " + self.order
if self._limit is not None:
sql += " LIMIT " + str(self._limit)
return sql
The editor and the test runner need a wide screen. Open this page on a desktop browser and your progress will be waiting.
Because every setter returns self, an entire query can be written as one uninterrupted chain: select, then from_, then any wheres, then order_by, then limit, then build. That readability is the whole point of the Builder pattern.
A reusable builder also needs a way to start over. Implement reset(). Return every field to its initial empty value - columns to an empty list, table to None, wheres to an empty list, order to None, and the limit slot to None - then return self so a fresh chain can begin immediately.
Press Run Tests or ββ© to check your solution.