arel-compat 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +25 -0
- data/README.markdown +182 -0
- data/lib/arel.rb +13 -0
- data/lib/arel/algebra.rb +10 -0
- data/lib/arel/algebra/attributes.rb +7 -0
- data/lib/arel/algebra/attributes/attribute.rb +270 -0
- data/lib/arel/algebra/attributes/boolean.rb +21 -0
- data/lib/arel/algebra/attributes/decimal.rb +9 -0
- data/lib/arel/algebra/attributes/float.rb +9 -0
- data/lib/arel/algebra/attributes/integer.rb +10 -0
- data/lib/arel/algebra/attributes/string.rb +10 -0
- data/lib/arel/algebra/attributes/time.rb +6 -0
- data/lib/arel/algebra/core_extensions.rb +4 -0
- data/lib/arel/algebra/core_extensions/class.rb +32 -0
- data/lib/arel/algebra/core_extensions/hash.rb +11 -0
- data/lib/arel/algebra/core_extensions/object.rb +30 -0
- data/lib/arel/algebra/core_extensions/symbol.rb +9 -0
- data/lib/arel/algebra/expression.rb +43 -0
- data/lib/arel/algebra/header.rb +67 -0
- data/lib/arel/algebra/ordering.rb +23 -0
- data/lib/arel/algebra/predicates.rb +190 -0
- data/lib/arel/algebra/relations.rb +17 -0
- data/lib/arel/algebra/relations/operations/alias.rb +7 -0
- data/lib/arel/algebra/relations/operations/from.rb +6 -0
- data/lib/arel/algebra/relations/operations/group.rb +12 -0
- data/lib/arel/algebra/relations/operations/having.rb +17 -0
- data/lib/arel/algebra/relations/operations/join.rb +69 -0
- data/lib/arel/algebra/relations/operations/lock.rb +12 -0
- data/lib/arel/algebra/relations/operations/order.rb +19 -0
- data/lib/arel/algebra/relations/operations/project.rb +20 -0
- data/lib/arel/algebra/relations/operations/skip.rb +7 -0
- data/lib/arel/algebra/relations/operations/take.rb +11 -0
- data/lib/arel/algebra/relations/operations/where.rb +17 -0
- data/lib/arel/algebra/relations/relation.rb +136 -0
- data/lib/arel/algebra/relations/row.rb +26 -0
- data/lib/arel/algebra/relations/utilities/compound.rb +54 -0
- data/lib/arel/algebra/relations/utilities/externalization.rb +24 -0
- data/lib/arel/algebra/relations/utilities/nil.rb +7 -0
- data/lib/arel/algebra/relations/writes.rb +36 -0
- data/lib/arel/algebra/value.rb +14 -0
- data/lib/arel/engines.rb +2 -0
- data/lib/arel/engines/memory.rb +4 -0
- data/lib/arel/engines/memory/engine.rb +16 -0
- data/lib/arel/engines/memory/predicates.rb +99 -0
- data/lib/arel/engines/memory/primitives.rb +27 -0
- data/lib/arel/engines/memory/relations.rb +5 -0
- data/lib/arel/engines/memory/relations/array.rb +35 -0
- data/lib/arel/engines/memory/relations/compound.rb +9 -0
- data/lib/arel/engines/memory/relations/operations.rb +67 -0
- data/lib/arel/engines/memory/relations/writes.rb +7 -0
- data/lib/arel/engines/sql.rb +8 -0
- data/lib/arel/engines/sql/attributes.rb +40 -0
- data/lib/arel/engines/sql/christener.rb +14 -0
- data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +48 -0
- data/lib/arel/engines/sql/compilers/mysql_compiler.rb +11 -0
- data/lib/arel/engines/sql/compilers/oracle_compiler.rb +95 -0
- data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +42 -0
- data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +9 -0
- data/lib/arel/engines/sql/core_extensions.rb +4 -0
- data/lib/arel/engines/sql/core_extensions/array.rb +24 -0
- data/lib/arel/engines/sql/core_extensions/nil_class.rb +15 -0
- data/lib/arel/engines/sql/core_extensions/object.rb +19 -0
- data/lib/arel/engines/sql/core_extensions/range.rb +19 -0
- data/lib/arel/engines/sql/engine.rb +55 -0
- data/lib/arel/engines/sql/formatters.rb +122 -0
- data/lib/arel/engines/sql/predicates.rb +103 -0
- data/lib/arel/engines/sql/primitives.rb +97 -0
- data/lib/arel/engines/sql/relations.rb +10 -0
- data/lib/arel/engines/sql/relations/compiler.rb +118 -0
- data/lib/arel/engines/sql/relations/operations/alias.rb +5 -0
- data/lib/arel/engines/sql/relations/operations/join.rb +33 -0
- data/lib/arel/engines/sql/relations/relation.rb +65 -0
- data/lib/arel/engines/sql/relations/table.rb +88 -0
- data/lib/arel/engines/sql/relations/utilities/compound.rb +10 -0
- data/lib/arel/engines/sql/relations/utilities/externalization.rb +14 -0
- data/lib/arel/engines/sql/relations/utilities/nil.rb +6 -0
- data/lib/arel/engines/sql/relations/utilities/recursion.rb +13 -0
- data/lib/arel/engines/sql/relations/writes.rb +19 -0
- data/lib/arel/session.rb +51 -0
- data/lib/arel/version.rb +3 -0
- data/spec/algebra/unit/predicates/binary_spec.rb +35 -0
- data/spec/algebra/unit/predicates/equality_spec.rb +29 -0
- data/spec/algebra/unit/predicates/in_spec.rb +12 -0
- data/spec/algebra/unit/primitives/attribute_spec.rb +181 -0
- data/spec/algebra/unit/primitives/expression_spec.rb +45 -0
- data/spec/algebra/unit/primitives/value_spec.rb +15 -0
- data/spec/algebra/unit/relations/alias_spec.rb +16 -0
- data/spec/algebra/unit/relations/delete_spec.rb +9 -0
- data/spec/algebra/unit/relations/group_spec.rb +10 -0
- data/spec/algebra/unit/relations/insert_spec.rb +9 -0
- data/spec/algebra/unit/relations/join_spec.rb +25 -0
- data/spec/algebra/unit/relations/order_spec.rb +21 -0
- data/spec/algebra/unit/relations/project_spec.rb +34 -0
- data/spec/algebra/unit/relations/relation_spec.rb +187 -0
- data/spec/algebra/unit/relations/skip_spec.rb +10 -0
- data/spec/algebra/unit/relations/table_spec.rb +38 -0
- data/spec/algebra/unit/relations/take_spec.rb +10 -0
- data/spec/algebra/unit/relations/update_spec.rb +9 -0
- data/spec/algebra/unit/relations/where_spec.rb +19 -0
- data/spec/algebra/unit/session/session_spec.rb +84 -0
- data/spec/attributes/boolean_spec.rb +57 -0
- data/spec/attributes/float_spec.rb +119 -0
- data/spec/attributes/header_spec.rb +42 -0
- data/spec/attributes/integer_spec.rb +119 -0
- data/spec/attributes/string_spec.rb +43 -0
- data/spec/attributes/time_spec.rb +24 -0
- data/spec/engines/memory/integration/joins/cross_engine_spec.rb +51 -0
- data/spec/engines/memory/unit/relations/array_spec.rb +32 -0
- data/spec/engines/memory/unit/relations/insert_spec.rb +28 -0
- data/spec/engines/memory/unit/relations/join_spec.rb +31 -0
- data/spec/engines/memory/unit/relations/order_spec.rb +27 -0
- data/spec/engines/memory/unit/relations/project_spec.rb +27 -0
- data/spec/engines/memory/unit/relations/skip_spec.rb +26 -0
- data/spec/engines/memory/unit/relations/take_spec.rb +26 -0
- data/spec/engines/memory/unit/relations/where_spec.rb +39 -0
- data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +258 -0
- data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +221 -0
- data/spec/engines/sql/integration/joins/with_compounds_spec.rb +137 -0
- data/spec/engines/sql/unit/engine_spec.rb +45 -0
- data/spec/engines/sql/unit/predicates/binary_spec.rb +140 -0
- data/spec/engines/sql/unit/predicates/equality_spec.rb +75 -0
- data/spec/engines/sql/unit/predicates/in_spec.rb +179 -0
- data/spec/engines/sql/unit/predicates/noteq_spec.rb +75 -0
- data/spec/engines/sql/unit/predicates/predicates_spec.rb +79 -0
- data/spec/engines/sql/unit/primitives/attribute_spec.rb +36 -0
- data/spec/engines/sql/unit/primitives/expression_spec.rb +28 -0
- data/spec/engines/sql/unit/primitives/literal_spec.rb +43 -0
- data/spec/engines/sql/unit/primitives/value_spec.rb +29 -0
- data/spec/engines/sql/unit/relations/alias_spec.rb +53 -0
- data/spec/engines/sql/unit/relations/delete_spec.rb +83 -0
- data/spec/engines/sql/unit/relations/from_spec.rb +64 -0
- data/spec/engines/sql/unit/relations/group_spec.rb +72 -0
- data/spec/engines/sql/unit/relations/having_spec.rb +78 -0
- data/spec/engines/sql/unit/relations/insert_spec.rb +143 -0
- data/spec/engines/sql/unit/relations/join_spec.rb +180 -0
- data/spec/engines/sql/unit/relations/lock_spec.rb +86 -0
- data/spec/engines/sql/unit/relations/order_spec.rb +161 -0
- data/spec/engines/sql/unit/relations/project_spec.rb +143 -0
- data/spec/engines/sql/unit/relations/skip_spec.rb +41 -0
- data/spec/engines/sql/unit/relations/table_spec.rb +129 -0
- data/spec/engines/sql/unit/relations/take_spec.rb +49 -0
- data/spec/engines/sql/unit/relations/update_spec.rb +203 -0
- data/spec/engines/sql/unit/relations/where_spec.rb +72 -0
- data/spec/relations/join_spec.rb +42 -0
- data/spec/relations/relation_spec.rb +31 -0
- data/spec/shared/relation_spec.rb +255 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/support/check.rb +6 -0
- data/spec/support/connections/mysql_connection.rb +14 -0
- data/spec/support/connections/oracle_connection.rb +17 -0
- data/spec/support/connections/postgresql_connection.rb +13 -0
- data/spec/support/connections/sqlite3_connection.rb +24 -0
- data/spec/support/guards.rb +28 -0
- data/spec/support/matchers.rb +4 -0
- data/spec/support/matchers/be_like.rb +24 -0
- data/spec/support/matchers/disambiguate_attributes.rb +28 -0
- data/spec/support/matchers/hash_the_same_as.rb +26 -0
- data/spec/support/matchers/have_rows.rb +18 -0
- data/spec/support/model.rb +62 -0
- data/spec/support/schemas/mysql_schema.rb +26 -0
- data/spec/support/schemas/oracle_schema.rb +20 -0
- data/spec/support/schemas/postgresql_schema.rb +26 -0
- data/spec/support/schemas/sqlite3_schema.rb +26 -0
- metadata +258 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module Arel
|
2
|
+
module Attributes
|
3
|
+
class Boolean < Attribute
|
4
|
+
def type_cast(value)
|
5
|
+
case value
|
6
|
+
when true, false then value
|
7
|
+
# when nil then options[:allow_nil] ? nil : false
|
8
|
+
when nil then false
|
9
|
+
when 1 then true
|
10
|
+
when 0 then false
|
11
|
+
else
|
12
|
+
case value.to_s.downcase.strip
|
13
|
+
when 'true' then true
|
14
|
+
when 'false' then false
|
15
|
+
else raise typecast_error(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Arel
|
2
|
+
module ClassExtensions
|
3
|
+
def attributes(*attrs)
|
4
|
+
@attributes = attrs
|
5
|
+
attr_reader(*attrs)
|
6
|
+
end
|
7
|
+
|
8
|
+
def deriving(*methods)
|
9
|
+
methods.each { |m| derive m }
|
10
|
+
end
|
11
|
+
|
12
|
+
def derive(method_name)
|
13
|
+
methods = {
|
14
|
+
:initialize => "
|
15
|
+
def #{method_name}(#{@attributes.join(',')})
|
16
|
+
#{@attributes.collect { |a| "@#{a} = #{a}" }.join("\n")}
|
17
|
+
end
|
18
|
+
",
|
19
|
+
:== => "
|
20
|
+
def ==(other)
|
21
|
+
#{name} === other &&
|
22
|
+
#{@attributes.collect { |a| "@#{a} == other.#{a}" }.join(" &&\n")}
|
23
|
+
end
|
24
|
+
"
|
25
|
+
}
|
26
|
+
class_eval methods[method_name], __FILE__, __LINE__
|
27
|
+
end
|
28
|
+
|
29
|
+
Class.send(:include, self)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Arel
|
2
|
+
module ObjectExtensions
|
3
|
+
def bind(relation)
|
4
|
+
Arel::Value.new(self, relation)
|
5
|
+
end
|
6
|
+
|
7
|
+
def find_correlate_in(relation)
|
8
|
+
bind(relation)
|
9
|
+
end
|
10
|
+
|
11
|
+
def let
|
12
|
+
yield(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
# TODO remove this when ActiveSupport beta1 is out.
|
16
|
+
# Returns the object's singleton class.
|
17
|
+
def singleton_class
|
18
|
+
class << self
|
19
|
+
self
|
20
|
+
end
|
21
|
+
end unless respond_to?(:singleton_class)
|
22
|
+
|
23
|
+
# class_eval on an object acts like singleton_class_eval.
|
24
|
+
def class_eval(*args, &block)
|
25
|
+
singleton_class.class_eval(*args, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
Object.send(:include, self)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Arel
|
2
|
+
class Expression < Attribute
|
3
|
+
attributes :attribute, :alias, :ancestor
|
4
|
+
deriving :==
|
5
|
+
delegate :relation, :to => :attribute
|
6
|
+
alias_method :name, :alias
|
7
|
+
|
8
|
+
def initialize(attribute, aliaz = nil, ancestor = nil)
|
9
|
+
@attribute, @alias, @ancestor = attribute, aliaz, ancestor
|
10
|
+
end
|
11
|
+
|
12
|
+
def aggregation?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def inspect
|
17
|
+
"<#{self.class.name} #{attribute.inspect}>"
|
18
|
+
end
|
19
|
+
|
20
|
+
module Transformations
|
21
|
+
def as(aliaz)
|
22
|
+
self.class.new(attribute, aliaz, self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def bind(new_relation)
|
26
|
+
new_relation == relation ? self : self.class.new(attribute.bind(new_relation), @alias, self)
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_attribute(relation)
|
30
|
+
Attribute.new(relation, @alias, :ancestor => self)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
include Transformations
|
34
|
+
end
|
35
|
+
|
36
|
+
class Count < Expression; end
|
37
|
+
class Distinct < Expression; end
|
38
|
+
class Sum < Expression; end
|
39
|
+
class Maximum < Expression; end
|
40
|
+
class Minimum < Expression; end
|
41
|
+
class Average < Expression; end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Arel
|
2
|
+
class Header
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(attrs = [])
|
6
|
+
@attributes = attrs.to_ary
|
7
|
+
@names = Hash.new do |h,k|
|
8
|
+
h[k] = @attributes.detect { |a| a.named?(k) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
to_ary.each(&block)
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](key)
|
18
|
+
case key
|
19
|
+
when String, Symbol then find_by_name(key)
|
20
|
+
when Attribute then find_by_attribute(key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ==(other)
|
25
|
+
to_set == other.to_set
|
26
|
+
end
|
27
|
+
|
28
|
+
def union(other)
|
29
|
+
new(to_ary | other)
|
30
|
+
end
|
31
|
+
|
32
|
+
alias | union
|
33
|
+
|
34
|
+
def to_ary
|
35
|
+
@attributes
|
36
|
+
end
|
37
|
+
|
38
|
+
def bind(relation)
|
39
|
+
Header.new(map { |a| a.bind(relation) })
|
40
|
+
end
|
41
|
+
|
42
|
+
# TMP
|
43
|
+
def index(i)
|
44
|
+
to_ary.index(i)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def new(attrs)
|
50
|
+
self.class.new(attrs)
|
51
|
+
end
|
52
|
+
|
53
|
+
def matching(attribute)
|
54
|
+
select { |a| !a.is_a?(Value) && a.root == attribute.root }
|
55
|
+
end
|
56
|
+
|
57
|
+
def find_by_name(name)
|
58
|
+
@names[name.to_sym]
|
59
|
+
end
|
60
|
+
|
61
|
+
def find_by_attribute(attr)
|
62
|
+
matching(attr).max do |a, b|
|
63
|
+
(a.original_attribute / attr) <=> (b.original_attribute / attr)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Arel
|
2
|
+
class Ordering
|
3
|
+
delegate :relation, :to => :attribute
|
4
|
+
|
5
|
+
def bind(relation)
|
6
|
+
self.class.new(attribute.bind(relation))
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_ordering
|
10
|
+
self
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Ascending < Ordering
|
15
|
+
attributes :attribute
|
16
|
+
deriving :initialize, :==
|
17
|
+
end
|
18
|
+
|
19
|
+
class Descending < Ordering
|
20
|
+
attributes :attribute
|
21
|
+
deriving :initialize, :==
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
module Arel
|
2
|
+
module Predicates
|
3
|
+
class Predicate
|
4
|
+
def or(other_predicate)
|
5
|
+
Or.new(self, other_predicate)
|
6
|
+
end
|
7
|
+
|
8
|
+
def and(other_predicate)
|
9
|
+
And.new(self, other_predicate)
|
10
|
+
end
|
11
|
+
|
12
|
+
def complement
|
13
|
+
Not.new(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def not
|
17
|
+
self.complement
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Polyadic < Predicate
|
22
|
+
attributes :predicates
|
23
|
+
|
24
|
+
def initialize(*predicates)
|
25
|
+
@predicates = predicates
|
26
|
+
end
|
27
|
+
|
28
|
+
# Build a Polyadic predicate based on:
|
29
|
+
# * <tt>operator</tt> - The Predicate subclass that defines the type of operation
|
30
|
+
# (LessThan, Equality, etc)
|
31
|
+
# * <tt>operand1</tt> - The left-hand operand (normally an Arel::Attribute)
|
32
|
+
# * <tt>additional_operands</tt> - All possible right-hand operands
|
33
|
+
def self.build(operator, operand1, *additional_operands)
|
34
|
+
new(
|
35
|
+
*additional_operands.uniq.inject([]) do |predicates, operand|
|
36
|
+
predicates << operator.new(operand1, operand)
|
37
|
+
end
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def ==(other)
|
42
|
+
same_elements?(@predicates, other.predicates)
|
43
|
+
end
|
44
|
+
|
45
|
+
def bind(relation)
|
46
|
+
self.class.new(
|
47
|
+
*predicates.map {|p| p.find_correlate_in(relation)}
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def same_elements?(a1, a2)
|
54
|
+
[:select, :inject, :size].each do |m|
|
55
|
+
return false unless [a1, a2].each {|a| a.respond_to?(m) }
|
56
|
+
end
|
57
|
+
a1.inject({}) { |h,e| h[e] = a1.select { |i| i == e }.size; h } ==
|
58
|
+
a2.inject({}) { |h,e| h[e] = a2.select { |i| i == e }.size; h }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class Any < Polyadic
|
63
|
+
def complement
|
64
|
+
All.new(*predicates.map {|p| p.complement})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class All < Polyadic
|
69
|
+
def complement
|
70
|
+
Any.new(*predicates.map {|p| p.complement})
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class Unary < Predicate
|
75
|
+
attributes :operand
|
76
|
+
deriving :initialize, :==
|
77
|
+
|
78
|
+
def bind(relation)
|
79
|
+
self.class.new(operand.find_correlate_in(relation))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Not < Unary
|
84
|
+
def complement
|
85
|
+
operand
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class Binary < Predicate
|
90
|
+
attributes :operand1, :operand2
|
91
|
+
deriving :initialize
|
92
|
+
|
93
|
+
def ==(other)
|
94
|
+
self.class === other and
|
95
|
+
@operand1 == other.operand1 and
|
96
|
+
@operand2 == other.operand2
|
97
|
+
end
|
98
|
+
|
99
|
+
def bind(relation)
|
100
|
+
self.class.new(operand1.find_correlate_in(relation), operand2.find_correlate_in(relation))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class CompoundPredicate < Binary; end
|
105
|
+
|
106
|
+
class And < CompoundPredicate
|
107
|
+
def complement
|
108
|
+
Or.new(operand1.complement, operand2.complement)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class Or < CompoundPredicate
|
113
|
+
def complement
|
114
|
+
And.new(operand1.complement, operand2.complement)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Equality < Binary
|
119
|
+
def ==(other)
|
120
|
+
Equality === other and
|
121
|
+
((operand1 == other.operand1 and operand2 == other.operand2) or
|
122
|
+
(operand1 == other.operand2 and operand2 == other.operand1))
|
123
|
+
end
|
124
|
+
|
125
|
+
def complement
|
126
|
+
Inequality.new(operand1, operand2)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class Inequality < Binary
|
131
|
+
def ==(other)
|
132
|
+
Equality === other and
|
133
|
+
((operand1 == other.operand1 and operand2 == other.operand2) or
|
134
|
+
(operand1 == other.operand2 and operand2 == other.operand1))
|
135
|
+
end
|
136
|
+
|
137
|
+
def complement
|
138
|
+
Equality.new(operand1, operand2)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class GreaterThanOrEqualTo < Binary
|
143
|
+
def complement
|
144
|
+
LessThan.new(operand1, operand2)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class GreaterThan < Binary
|
149
|
+
def complement
|
150
|
+
LessThanOrEqualTo.new(operand1, operand2)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class LessThanOrEqualTo < Binary
|
155
|
+
def complement
|
156
|
+
GreaterThan.new(operand1, operand2)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
class LessThan < Binary
|
161
|
+
def complement
|
162
|
+
GreaterThanOrEqualTo.new(operand1, operand2)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
class Match < Binary
|
167
|
+
def complement
|
168
|
+
NotMatch.new(operand1, operand2)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class NotMatch < Binary
|
173
|
+
def complement
|
174
|
+
Match.new(operand1, operand2)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class In < Binary
|
179
|
+
def complement
|
180
|
+
NotIn.new(operand1, operand2)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
class NotIn < Binary
|
185
|
+
def complement
|
186
|
+
In.new(operand1, operand2)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|