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
|
# frozen_string_literal: true
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)
left_value > right_value if comparable?(left_value, right_value)
end
end
class Gte < Comparator
def check(left_value, right_value)
left_value >= right_value if comparable?(left_value, right_value)
end
end
class Lt < Comparator
def check(left_value, right_value)
left_value < right_value if comparable?(left_value, right_value)
end
end
class Lte < Comparator
def check(left_value, right_value)
left_value <= right_value if comparable?(left_value, right_value)
end
end
end
end
end
|