Skip to content

Commit 4b8773a

Browse files
authored
Allow string comparison (#49)
1 parent 9655aa9 commit 4b8773a

File tree

4 files changed

+57
-8
lines changed

4 files changed

+57
-8
lines changed

lib/jmespath/nodes/comparator.rb

+12-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module JMESPath
22
# @api private
33
module Nodes
44
class Comparator < Node
5+
COMPARABLE_TYPES = [Numeric, String].freeze
6+
57
attr_reader :left, :right
68

79
def initialize(left, right)
@@ -36,6 +38,12 @@ def optimize
3638
def check(left_value, right_value)
3739
nil
3840
end
41+
42+
def comparable?(left_value, right_value)
43+
COMPARABLE_TYPES.any? do |type|
44+
left_value.is_a?(type) && right_value.is_a?(type)
45+
end
46+
end
3947
end
4048

4149
module Comparators
@@ -54,7 +62,7 @@ def check(left_value, right_value)
5462

5563
class Gt < Comparator
5664
def check(left_value, right_value)
57-
if left_value.is_a?(Numeric) && right_value.is_a?(Numeric)
65+
if comparable?(left_value, right_value)
5866
left_value > right_value
5967
else
6068
nil
@@ -64,7 +72,7 @@ def check(left_value, right_value)
6472

6573
class Gte < Comparator
6674
def check(left_value, right_value)
67-
if left_value.is_a?(Numeric) && right_value.is_a?(Numeric)
75+
if comparable?(left_value, right_value)
6876
left_value >= right_value
6977
else
7078
nil
@@ -74,7 +82,7 @@ def check(left_value, right_value)
7482

7583
class Lt < Comparator
7684
def check(left_value, right_value)
77-
if left_value.is_a?(Numeric) && right_value.is_a?(Numeric)
85+
if comparable?(left_value, right_value)
7886
left_value < right_value
7987
else
8088
nil
@@ -84,7 +92,7 @@ def check(left_value, right_value)
8492

8593
class Lte < Comparator
8694
def check(left_value, right_value)
87-
if left_value.is_a?(Numeric) && right_value.is_a?(Numeric)
95+
if comparable?(left_value, right_value)
8896
left_value <= right_value
8997
else
9098
nil

lib/jmespath/nodes/condition.rb

+13-4
Original file line numberDiff line numberDiff line change
@@ -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

spec/compliance/boolean.json

+8
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,14 @@
286286
{
287287
"expression": "two < one || three < one",
288288
"result": false
289+
},
290+
{
291+
"expression": "'2010-02-01' > '2011-05-01'",
292+
"result": false
293+
},
294+
{
295+
"expression": "'2010-02-01' <= '2011-05-01'",
296+
"result": true
289297
}
290298
]
291299
}

spec/compliance/filters.json

+24
Original file line numberDiff line numberDiff line change
@@ -464,5 +464,29 @@
464464
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
465465
}
466466
]
467+
},
468+
{
469+
"given": {
470+
"foo": ["2010-02-01", "2011-05-01"]
471+
},
472+
"cases": [
473+
{
474+
"comment": "Greater than with ISO 8601 date string",
475+
"expression": "foo[?@ > '2010-06-01']",
476+
"result": ["2011-05-01"]
477+
}
478+
]
479+
},
480+
{
481+
"given": {
482+
"foo": [{"date": "2010-02-01"}, {"date": "2011-05-01"}]
483+
},
484+
"cases": [
485+
{
486+
"comment": "Greater than with ISO 8601 date string",
487+
"expression": "foo[?date > '2010-06-01'].date",
488+
"result": ["2011-05-01"]
489+
}
490+
]
467491
}
468492
]

0 commit comments

Comments
 (0)