@@ -27,6 +27,7 @@ def optimize
2727
2828 class ComparatorCondition < Node
2929 COMPARATOR_TO_CONDITION = { }
30+ COMPARABLE_TYPES = [ Integer , String ] . freeze
3031
3132 def initialize ( left , right , child )
3233 @left = left
@@ -37,6 +38,14 @@ def initialize(left, right, child)
3738 def visit ( value )
3839 nil
3940 end
41+
42+ private
43+
44+ def comparable? ( left_value , right_value )
45+ COMPARABLE_TYPES . any? do |type |
46+ left_value . is_a? ( type ) && right_value . is_a? ( type )
47+ end
48+ end
4049 end
4150
4251 class EqCondition < ComparatorCondition
@@ -99,7 +108,7 @@ class GtCondition < ComparatorCondition
99108 def visit ( value )
100109 left_value = @left . visit ( value )
101110 right_value = @right . visit ( value )
102- left_value . is_a? ( Integer ) && right_value . is_a? ( Integer ) && left_value > right_value ? @child . visit ( value ) : nil
111+ comparable? ( left_value , right_value ) && left_value > right_value ? @child . visit ( value ) : nil
103112 end
104113 end
105114
@@ -109,7 +118,7 @@ class GteCondition < ComparatorCondition
109118 def visit ( value )
110119 left_value = @left . visit ( value )
111120 right_value = @right . visit ( value )
112- left_value . is_a? ( Integer ) && right_value . is_a? ( Integer ) && left_value >= right_value ? @child . visit ( value ) : nil
121+ comparable? ( left_value , right_value ) && left_value >= right_value ? @child . visit ( value ) : nil
113122 end
114123 end
115124
@@ -119,7 +128,7 @@ class LtCondition < ComparatorCondition
119128 def visit ( value )
120129 left_value = @left . visit ( value )
121130 right_value = @right . visit ( value )
122- left_value . is_a? ( Integer ) && right_value . is_a? ( Integer ) && left_value < right_value ? @child . visit ( value ) : nil
131+ comparable? ( left_value , right_value ) && left_value < right_value ? @child . visit ( value ) : nil
123132 end
124133 end
125134
@@ -129,7 +138,7 @@ class LteCondition < ComparatorCondition
129138 def visit ( value )
130139 left_value = @left . visit ( value )
131140 right_value = @right . visit ( value )
132- left_value . is_a? ( Integer ) && right_value . is_a? ( Integer ) && left_value <= right_value ? @child . visit ( value ) : nil
141+ comparable? ( left_value , right_value ) && left_value <= right_value ? @child . visit ( value ) : nil
133142 end
134143 end
135144 end
0 commit comments