This repository has been archived by the owner on Dec 7, 2022. It is now read-only.
forked from jmespath/jmespath.rb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
comparator.rb
104 lines (89 loc) · 2.3 KB
/
comparator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
module JMESPath
# @api private
module Nodes
class Comparator < Node
COMPARABLE_TYPES = [Numeric, String].freeze
attr_reader :left, :right
def initialize(left, right)
@left = left
@right = right
end
def self.create(relation, left, right)
type = begin
case relation
when '==' then Comparators::Eq
when '!=' then Comparators::Neq
when '>' then Comparators::Gt
when '>=' then Comparators::Gte
when '<' then Comparators::Lt
when '<=' then Comparators::Lte
end
end
type.new(left, right)
end
def visit(value)
check(@left.visit(value), @right.visit(value))
end
def optimize
self.class.new(@left.optimize, @right.optimize)
end
private
def check(left_value, right_value)
nil
end
def comparable?(left_value, right_value)
COMPARABLE_TYPES.any? do |type|
left_value.is_a?(type) && right_value.is_a?(type)
end
end
end
module Comparators
class Eq < Comparator
def check(left_value, right_value)
Util.as_json(left_value) == Util.as_json(right_value)
end
end
class Neq < Comparator
def check(left_value, right_value)
Util.as_json(left_value) != Util.as_json(right_value)
end
end
class Gt < Comparator
def check(left_value, right_value)
if comparable?(left_value, right_value)
left_value > right_value
else
nil
end
end
end
class Gte < Comparator
def check(left_value, right_value)
if comparable?(left_value, right_value)
left_value >= right_value
else
nil
end
end
end
class Lt < Comparator
def check(left_value, right_value)
if comparable?(left_value, right_value)
left_value < right_value
else
nil
end
end
end
class Lte < Comparator
def check(left_value, right_value)
if comparable?(left_value, right_value)
left_value <= right_value
else
nil
end
end
end
end
end
end