message: Implement ast_builder binary operations (modulo, like, ilike, not_like, not_ilike)
  Add more binary operators support to AST builder.
  modulo, like, ilike, not_like and not_ilike
diff: @@ -29,6 +29,10 @@ impl ExprNode {
  self.binary_op(BinaryOperator::Divide, other)
  }
  + pub fn modulo<T: Into<Self>>(self, other: T) -> Self {
  + self.binary_op(BinaryOperator::Modulo, other)
  + }
  +
  pub fn concat<T: Into<Self>>(self, other: T) -> Self {
  self.binary_op(BinaryOperator::StringConcat, other)
  }
  @@ -64,6 +68,22 @@ impl ExprNode {
  pub fn or<T: Into<Self>>(self, other: T) -> Self {
  self.binary_op(BinaryOperator::Or, other)
  }
  +
  + pub fn like<T: Into<Self>>(self, other: T) -> Self {
  + self.binary_op(BinaryOperator::Like, other)
  + }
  +
  + pub fn ilike<T: Into<Self>>(self, other: T) -> Self {
  + self.binary_op(BinaryOperator::ILike, other)
  + }
  +
  + pub fn not_like<T: Into<Self>>(self, other: T) -> Self {
  + self.binary_op(BinaryOperator::NotLike, other)
  + }
  +
  + pub fn not_ilike<T: Into<Self>>(self, other: T) -> Self {
  + self.binary_op(BinaryOperator::NotILike, other)
  + }
  }
  #[cfg(test)]
  @@ -88,6 +108,10 @@ mod tests {
  let expected = "amount / 30";
  test_expr(actual, expected);
  + let actual = col("amount").modulo(30);
  + let expected = "amount % 30";
  + test_expr(actual, expected);
  +
  let actual = text("hello").concat(r#""world""#);
  let expected = "'hello' || 'world'";
  test_expr(actual, expected);
  @@ -123,5 +147,21 @@ mod tests {
  let actual = (col("id").gt(num(10))).or(col("id").lt(num(20)));
  let expected = "id > 10 OR id < 20";
  test_expr(actual, expected);
  +
  + let actual = col("name").like(text("a%"));
  + let expected = "name LIKE 'a%'";
  + test_expr(actual, expected);
  +
  + let actual = col("name").ilike(text("a%"));
  + let expected = "name ILIKE 'a%'";
  + test_expr(actual, expected);
  +
  + let actual = col("name").not_like(text("a%"));
  + let expected = "name NOT LIKE 'a%'";
  + test_expr(actual, expected);
  +
  + let actual = col("name").not_ilike(text("a%"));
  + let expected = "name NOT ILIKE 'a%'";
  + test_expr(actual, expected);
  }
  }
  