提交 6296617c 编写于 作者: J James Le Cuirot 提交者: James Le Cuirot

Add Regexp and NotRegexp nodes for PostgreSQL

上级 75154459
......@@ -40,7 +40,9 @@ def eql? other
Matches
NotEqual
NotIn
NotRegexp
Or
Regexp
Union
UnionAll
Intersect
......
......@@ -79,8 +79,10 @@ def binary o
alias :visit_Arel_Nodes_Matches :binary
alias :visit_Arel_Nodes_NotEqual :binary
alias :visit_Arel_Nodes_NotIn :binary
alias :visit_Arel_Nodes_NotRegexp :binary
alias :visit_Arel_Nodes_Or :binary
alias :visit_Arel_Nodes_OuterJoin :binary
alias :visit_Arel_Nodes_Regexp :binary
alias :visit_Arel_Nodes_RightOuterJoin :binary
alias :visit_Arel_Nodes_TableAlias :binary
alias :visit_Arel_Nodes_Values :binary
......
......@@ -11,6 +11,14 @@ def visit_Arel_Nodes_DoesNotMatch o
"#{visit o.left} NOT ILIKE #{visit o.right}"
end
def visit_Arel_Nodes_Regexp o
"#{visit o.left} ~ #{visit o.right}"
end
def visit_Arel_Nodes_NotRegexp o
"#{visit o.left} !~ #{visit o.right}"
end
def visit_Arel_Nodes_DistinctOn o
"DISTINCT ON ( #{visit o.expr} )"
end
......
......@@ -435,6 +435,14 @@ def visit_Arel_Nodes_DoesNotMatch o
"#{visit o.left} NOT LIKE #{visit o.right}"
end
def visit_Arel_Nodes_Regexp o
raise NotImplementedError, '~ not implemented for this db'
end
def visit_Arel_Nodes_NotRegexp o
raise NotImplementedError, '!~ not implemented for this db'
end
def visit_Arel_Nodes_JoinSource o
[
(visit(o.left) if o.left),
......
......@@ -79,6 +79,40 @@ module Visitors
}
end
end
describe "Nodes::Regexp" do
it "should know how to visit" do
node = Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%'))
@visitor.accept(node).must_be_like %{
"users"."name" ~ 'foo%'
}
end
it 'can handle subqueries' do
subquery = @table.project(:id).where(Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%')))
node = @attr.in subquery
@visitor.accept(node).must_be_like %{
"users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo%')
}
end
end
describe "Nodes::NotRegexp" do
it "should know how to visit" do
node = Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%'))
@visitor.accept(node).must_be_like %{
"users"."name" !~ 'foo%'
}
end
it 'can handle subqueries' do
subquery = @table.project(:id).where(Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%')))
node = @attr.in subquery
@visitor.accept(node).must_be_like %{
"users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo%')
}
end
end
end
end
end
......@@ -526,6 +526,26 @@ def quote value, column = nil
end
end
end
describe 'Nodes::Regexp' do
it 'raises not implemented error' do
node = Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%'))
assert_raises(NotImplementedError) do
@visitor.accept(node)
end
end
end
describe 'Nodes::NotRegexp' do
it 'raises not implemented error' do
node = Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%'))
assert_raises(NotImplementedError) do
@visitor.accept(node)
end
end
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册