Fluent Chaining and Reset

Step 4 - Fluent Chaining and Reset

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.

Hints
Starter code
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
Write it on a laptop

The editor and the test runner need a wide screen. Open this page on a desktop browser and your progress will be waiting.