def make_predicate expr, rel
expr_list = list expr
comparison = make_comparison_predicate expr, rel
group_comparison = sequence(expr_list, Comparators, expr_list, &ctor(GroupComparisonPredicate))
bool = nil
lazy_bool = lazy{bool}
bool_term = keyword[:true] >> true | keyword[:false] >> false |
comparison | group_comparison | paren(lazy_bool) |
make_exists(rel) | make_not_exists(rel)
bool_table = OperatorTable.new.
infixl(keyword[:or] >> logical_operator(:or), 20).
infixl(keyword[:and] >> logical_operator(:and), 30).
prefix(keyword[:not] >> ctor(NotPredicate), 40)
bool = Expressions.build(bool_term, bool_table)
end