mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
build expression not(nil) as IS NOT NULL
This commit is contained in:
parent
233ee77f45
commit
a7a5027f4f
5 changed files with 90 additions and 1 deletions
|
@ -5,6 +5,10 @@ module Arel
|
|||
'IS'
|
||||
end
|
||||
|
||||
def not_predicate_sql
|
||||
'IS NOT'
|
||||
end
|
||||
|
||||
NilClass.send(:include, self)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,6 +9,10 @@ module Arel
|
|||
'='
|
||||
end
|
||||
|
||||
def not_predicate_sql
|
||||
'!='
|
||||
end
|
||||
|
||||
Object.send(:include, self)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -27,7 +27,9 @@ module Arel
|
|||
end
|
||||
|
||||
class Not < Binary
|
||||
def predicate_sql; '!=' end
|
||||
def predicate_sql
|
||||
operand2.not_predicate_sql
|
||||
end
|
||||
end
|
||||
|
||||
class GreaterThanOrEqualTo < Binary
|
||||
|
|
|
@ -34,6 +34,10 @@ module Arel
|
|||
value.equality_predicate_sql
|
||||
end
|
||||
|
||||
def not_predicate_sql
|
||||
value.not_predicate_sql
|
||||
end
|
||||
|
||||
def to_sql(formatter = Sql::WhereCondition.new(relation))
|
||||
formatter.value value
|
||||
end
|
||||
|
|
75
spec/engines/sql/unit/predicates/not_spec.rb
Normal file
75
spec/engines/sql/unit/predicates/not_spec.rb
Normal file
|
@ -0,0 +1,75 @@
|
|||
require 'spec_helper'
|
||||
|
||||
module Arel
|
||||
module Predicates
|
||||
describe Equality do
|
||||
before do
|
||||
@relation1 = Arel::Table.new(:users)
|
||||
@relation2 = Arel::Table.new(:photos)
|
||||
@attribute1 = @relation1[:id]
|
||||
@attribute2 = @relation2[:user_id]
|
||||
end
|
||||
|
||||
describe '#to_sql' do
|
||||
describe 'when relating to a non-nil value' do
|
||||
it "manufactures a not predicate" do
|
||||
sql = Not.new(@attribute1, @attribute2).to_sql
|
||||
|
||||
adapter_is :mysql do
|
||||
sql.should be_like(%Q{`users`.`id` != `photos`.`user_id`})
|
||||
end
|
||||
|
||||
adapter_is :oracle do
|
||||
sql.should be_like(%Q{"USERS"."ID" != "PHOTOS"."USER_ID"})
|
||||
end
|
||||
|
||||
adapter_is_not :mysql, :oracle do
|
||||
sql.should be_like(%Q{"users"."id" != "photos"."user_id"})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'when relation to a nil value' do
|
||||
before do
|
||||
@nil = nil
|
||||
end
|
||||
|
||||
it "manufactures an is null predicate" do
|
||||
sql = Not.new(@attribute1, @nil).to_sql
|
||||
|
||||
adapter_is :mysql do
|
||||
sql.should be_like(%Q{`users`.`id` IS NOT NULL})
|
||||
end
|
||||
|
||||
adapter_is :oracle do
|
||||
sql.should be_like(%Q{"USERS"."ID" IS NOT NULL})
|
||||
end
|
||||
|
||||
adapter_is_not :mysql, :oracle do
|
||||
sql.should be_like(%Q{"users"."id" IS NOT NULL})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "when relating to a nil Value" do
|
||||
it "manufactures an IS NULL predicate" do
|
||||
value = nil.bind(@relation1)
|
||||
sql = Not.new(@attribute1, value).to_sql
|
||||
|
||||
adapter_is :mysql do
|
||||
sql.should be_like(%Q{`users`.`id` IS NOT NULL})
|
||||
end
|
||||
|
||||
adapter_is :oracle do
|
||||
sql.should be_like(%Q{"USERS"."ID" IS NOT NULL})
|
||||
end
|
||||
|
||||
adapter_is_not :mysql, :oracle do
|
||||
sql.should be_like(%Q{"users"."id" IS NOT NULL})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue