mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add Regexp and NotRegexp nodes for PostgreSQL
This commit is contained in:
parent
7515445966
commit
6296617c15
6 changed files with 74 additions and 0 deletions
|
@ -40,7 +40,9 @@ module Arel
|
|||
Matches
|
||||
NotEqual
|
||||
NotIn
|
||||
NotRegexp
|
||||
Or
|
||||
Regexp
|
||||
Union
|
||||
UnionAll
|
||||
Intersect
|
||||
|
|
|
@ -79,8 +79,10 @@ module Arel
|
|||
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 @@ module Arel
|
|||
"#{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 @@ module Arel
|
|||
"#{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 Arel
|
|||
}
|
||||
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 @@ module Arel
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue