class MARC::Spec::Queries::Condition

Attributes

left[R]

Attributes

operator[R]

Attributes

right[R]

Attributes

Public Class Methods

all_of(*conditions) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 41
def all_of(*conditions)
  conditions.inject { |cc, c| cc.and(c) }
end
any_of(*conditions) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 35
def any_of(*conditions)
  conditions.inject do |cc, c|
    cc.or(c)
  end
end
new(operator = '?', left: nil, right:) click to toggle source

rubocop:disable Style/KeywordParametersOrder

# File lib/marc/spec/queries/condition.rb, line 20
def initialize(operator = '?', left: nil, right:)
  @operator = Operator.from_str(operator)
  # TODO: verify left semantics for unary operators
  #       see: https://marcspec.github.io/MARCspec/marc-spec.html#general
  #            https://marcspec.github.io/MARCspec/marc-spec.html#subspec-interpretation

  @left = left_operand(left) if binary?
  @right = right_operand(right)
end

Public Instance Methods

and(other_condition) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 61
def and(other_condition)
  return self if other_condition == self || other_condition.nil?

  Condition.new('&&', left: self, right: other_condition)
end
met?(condition_context) click to toggle source

Instance methods

# File lib/marc/spec/queries/condition.rb, line 49
def met?(condition_context)
  # puts self

  right_val = condition_context.operand_value(right)
  # puts "\t#{right.inspect} -> #{right_val.inspect}"
  return unary_apply(right_val) unless binary?

  left_val = condition_context.operand_value(left, implicit: true)
  # puts "\t#{left.inspect} -> #{left_val.inspect}"
  binary_apply(left_val, right_val)
end
or(other_condition) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 67
def or(other_condition)
  return self if other_condition == self || other_condition.nil?

  Condition.new('||', left: self, right: other_condition)
end
to_s() click to toggle source

Object overrides

# File lib/marc/spec/queries/condition.rb, line 76
def to_s
  operator.to_expression(left, right)
end

Protected Instance Methods

equality_attrs() click to toggle source
# File lib/marc/spec/queries/condition.rb, line 93
def equality_attrs
  %i[left operator right]
end
to_s_inspect() click to toggle source

Protected methods

# File lib/marc/spec/queries/condition.rb, line 85
def to_s_inspect
  StringIO.new.tap do |out|
    out << left.inspect if left
    out << operator
    out << right.inspect
  end.string
end

Private Instance Methods

binary?() click to toggle source
# File lib/marc/spec/queries/condition.rb, line 127
def binary?
  operator.binary?
end
binary_apply(left_val, right_val) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 99
def binary_apply(left_val, right_val)
  operator.apply(left_val, right_val).tap do |_result|
    # puts "\t#{left_val} #{operator} #{right_val} => #{_result}"
  end
end
left_operand(left) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 117
def left_operand(left)
  operand(left) if left
end
operand(operand) click to toggle source

TODO: superinterface?

# File lib/marc/spec/queries/condition.rb, line 122
def operand(operand)
  return operand if operand.is_a?(Condition) || operand.is_a?(Query)
  return Query.new(tag: operand) if operand.is_a?(Tag)
end
right_operand(right) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 111
def right_operand(right)
  return right if right.is_a?(ComparisonString)

  operand(right)
end
unary_apply(right_val) click to toggle source
# File lib/marc/spec/queries/condition.rb, line 105
def unary_apply(right_val)
  operator.apply(right_val).tap do |_result|
    # puts "\t#{operator} #{right_val} => #{_result}"
  end
end