aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arel')
-rw-r--r--lib/arel/nodes.rb1
-rw-r--r--lib/arel/nodes/node.rb7
-rw-r--r--lib/arel/nodes/not.rb11
-rw-r--r--lib/arel/visitors/to_sql.rb4
4 files changed, 23 insertions, 0 deletions
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb
index 47cbd64eb5..2affd01fa8 100644
--- a/lib/arel/nodes.rb
+++ b/lib/arel/nodes.rb
@@ -6,6 +6,7 @@ require 'arel/nodes/not_equal'
require 'arel/nodes/assignment'
require 'arel/nodes/or'
require 'arel/nodes/and'
+require 'arel/nodes/not'
require 'arel/nodes/greater_than'
require 'arel/nodes/greater_than_or_equal'
require 'arel/nodes/less_than'
diff --git a/lib/arel/nodes/node.rb b/lib/arel/nodes/node.rb
index 43bad19488..841b954db9 100644
--- a/lib/arel/nodes/node.rb
+++ b/lib/arel/nodes/node.rb
@@ -4,6 +4,13 @@ module Arel
# Abstract base class for all AST nodes
class Node
###
+ # Factory method to create a Nodes::Not node that has the recipient of
+ # the caller as a child.
+ def not
+ Nodes::Not.new self
+ end
+
+ ###
# Factory method to create a Nodes::Grouping node that has an Nodes::Or
# node as a child.
def or right
diff --git a/lib/arel/nodes/not.rb b/lib/arel/nodes/not.rb
new file mode 100644
index 0000000000..d463ae9d08
--- /dev/null
+++ b/lib/arel/nodes/not.rb
@@ -0,0 +1,11 @@
+module Arel
+ module Nodes
+ class Not < Arel::Nodes::Node
+ attr_reader :expr
+
+ def initialize expr
+ @expr = expr
+ end
+ end
+ end
+end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 528c5f6ced..bbc1eb3105 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -191,6 +191,10 @@ module Arel
"ON #{visit o.expr}"
end
+ def visit_Arel_Nodes_Not o
+ "NOT #{visit o.expr}"
+ end
+
def visit_Arel_Table o
if o.table_alias
"#{quote_table_name o.name} #{quote_table_name o.table_alias}"