From 000e7f2ae26e5aeac9d8ce988e18db2331af655a Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Tue, 21 Nov 2017 13:58:29 +0100 Subject: [PATCH] Map (binary) logic operators to AND and OR --- lib/rebel/sql.rb | 2 ++ test/test_raw.rb | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/rebel/sql.rb b/lib/rebel/sql.rb index 3deaccd..a64fc3b 100644 --- a/lib/rebel/sql.rb +++ b/lib/rebel/sql.rb @@ -105,10 +105,12 @@ module Rebel::SQL def and(*clause) Raw.new("#{self.parens?} AND #{Rebel::SQL.and_clause(*clause)}") end + alias & and def or(*clause) Raw.new("#{self} OR #{Rebel::SQL.and_clause(*clause)}").wants_parens! end + alias | or def eq(n) case n diff --git a/test/test_raw.rb b/test/test_raw.rb index 438adf2..1909f79 100644 --- a/test/test_raw.rb +++ b/test/test_raw.rb @@ -9,18 +9,29 @@ class TestRaw < Minitest::Test def test_and assert_sql('"foo" = 1 AND "bar" = 2') { name(:foo).eq(1).and(name(:bar).eq(2)) } + assert_sql('"foo" = 1 AND "bar" = 2') { name(:foo).eq(1) & name(:bar).eq(2) } + assert_sql('"foo" = 1 AND "bar" = 2') { (name(:foo) == 1) & (name(:bar) == 2) } end def test_or assert_sql('"foo" = 1 OR "bar" = 2') { name(:foo).eq(1).or(name(:bar).eq(2)) } + assert_sql('"foo" = 1 OR "bar" = 2') { name(:foo).eq(1) | name(:bar).eq(2) } + assert_sql('"foo" = 1 OR "bar" = 2') { (name(:foo) == 1) | (name(:bar) == 2) } end def test_and_or assert_sql('"foo" = 0 AND ("foo" = 1 OR "bar" = 2)') { name(:foo).eq(0).and(name(:foo).eq(1).or(name(:bar).eq(2))) } + assert_sql('"foo" = 0 AND ("foo" = 1 OR "bar" = 2)') { name(:foo).eq(0) & (name(:foo).eq(1) | name(:bar).eq(2)) } end def test_or_and_or assert_sql('("foo" = 1 OR "bar" = 2) AND ("foo" = 3 OR "bar" = 4)') { name(:foo).eq(1).or(name(:bar).eq(2)).and(name(:foo).eq(3).or(name(:bar).eq(4))) } + assert_sql('("foo" = 1 OR "bar" = 2) AND ("foo" = 3 OR "bar" = 4)') { (name(:foo).eq(1) | name(:bar).eq(2)) & (name(:foo).eq(3) | name(:bar).eq(4)) } + end + + def test_and_or_and + assert_sql('"foo" = 1 AND "bar" = 2 OR "foo" = 3 AND "bar" = 4') { name(:foo).eq(1).and(name(:bar).eq(2)).or(name(:foo).eq(3).and(name(:bar).eq(4))) } + assert_sql('"foo" = 1 AND "bar" = 2 OR "foo" = 3 AND "bar" = 4') { name(:foo).eq(1) & name(:bar).eq(2) | name(:foo).eq(3) & name(:bar).eq(4) } end def test_is