@jcredding can we add a private `def add_query_expression(type, *args, &block)` method that reduces all the duplication here?