class MSFLVisitors::Visitor::TermFilterVisitor

Constants

BINARY_OPERATORS
ITERATOR_OPERATORS

Attributes

visitor[R]

Public Class Methods

new(visitor) click to toggle source
# File lib/msfl_visitors/visitor.rb, line 80
def initialize(visitor)
  @visitor = visitor
end

Public Instance Methods

visit(node) click to toggle source
# File lib/msfl_visitors/visitor.rb, line 99
def visit(node)
  case node
    when  Nodes::Field
      node.value.to_s
    when Nodes::Regex
      regex_escape node.value.to_s
    when  Nodes::Word
      "\"#{node.value}\""
    when Nodes::Date, Nodes::Time
      "\"#{node.value.iso8601}\""
    when  Nodes::Number, Nodes::Boolean
      node.value

    when  Nodes::QueryString
      %(q(query_string:{default_field:"#{node.left.accept(visitor)}", query:#{node.right.accept(visitor)}}))

    when  Nodes::Match
      if node.right.is_a? Nodes::Set
        escaped_str_frags = node.right.contents.map { |right_child| composable_expr_for(MSFLVisitors::Nodes::Regex.new(right_child.value.to_s).accept(visitor).inspect) }
        escaped_str = "(" + escaped_str_frags.join('|') + ")"
        "#{node.left.accept(visitor)} #{BINARY_OPERATORS[node.class]} " + %r[.*#{escaped_str}.*].inspect
      else
        "#{node.left.accept(visitor)} #{BINARY_OPERATORS[node.class]} " + MSFLVisitors::Nodes::Regex.new(node.right.value.to_s).accept(visitor).inspect
      end
    when  Nodes::Containment,
          Nodes::GreaterThan,
          Nodes::GreaterThanEqual,
          Nodes::Equal,
          Nodes::LessThan,
          Nodes::LessThanEqual
      "#{node.left.accept(visitor)} #{BINARY_OPERATORS[node.class]} #{node.right.accept(visitor)}"
    when  Nodes::Set
      "[ " + node.contents.map { |n| n.accept(visitor) }.join(" , ") + " ]"
    when Nodes::Filter
      if node.contents.count == 1
        node.contents.first.accept(visitor)
      else
        node.contents.map { |n| "( " + n.accept(visitor) + " )" }.join(" & ")
      end

    when Nodes::Iterator
      if node.set.contents.count == 1
        node.set.contents.first.accept(visitor)
      else
        node.set.contents.map { |n| "( " + n.accept(visitor) + " )" }.join(" #{ITERATOR_OPERATORS[node.class]} ")
      end

    when Nodes::Foreign
      "#{node.left.accept visitor}.filter { #{node.right.accept visitor} }"

    when Nodes::Dataset
      "has_child( :#{node.value} )"

    else
      fail ArgumentError, "TERMFILTER cannot visit: #{node.class.name}"
  end
end