class MSFLVisitors::Visitor::ESTermFilterVisitor

ESTermFilterVisitor is not currently used and so not all node types are implemented

Constants

RANGE_OPERATORS

Attributes

visitor[R]

Public Class Methods

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

Public Instance Methods

visit(node) click to toggle source
# File lib/msfl_visitors/visitor.rb, line 269
def visit(node)
  case node
    when Nodes::Partial
      { given: Hash[[node.left.accept(visitor), node.right.accept(visitor)]] }

    when Nodes::Equal
      { term: { node.left.accept(visitor) => node.right.accept(visitor) } }

    when Nodes::QueryString
      { query: { query_string: { default_field: node.left.accept(visitor).to_s, query: node.right.accept(visitor).to_s }}}

    when Nodes::Field
      node.value.to_sym
    when Nodes::Date, Nodes::Time
      node.value.iso8601
    when  Nodes::Word,
        Nodes::Number,
        Nodes::Boolean,
        Nodes::Dataset
      node.value
    when  Nodes::GreaterThan,
        Nodes::GreaterThanEqual,
        Nodes::LessThan,
        Nodes::LessThanEqual
      { range: { node.left.accept(visitor) => { RANGE_OPERATORS[node.class] =>  node.right.accept(visitor) } } }
    when Nodes::Given
      [:filter, node.contents.first.accept(visitor)]
    when Nodes::ExplicitFilter
      [:filter, node.contents.map { |n| n.accept(visitor) }.reduce({}) { |hsh, x| hsh.merge!(x); hsh } ]
    when Nodes::NamedValue
      [:aggs, {node.name.accept(visitor).to_sym => Hash[[node.value.accept(visitor)]]}]
    when Nodes::Containment
      { terms: {node.left.accept(visitor).to_sym => node.right.accept(visitor)} }
    when Nodes::Set
      node.contents.map { |n| n.accept(visitor) }
    when Nodes::Filter
      if node.contents.count == 1
        node.contents.first.accept visitor
      else
        { and: node.contents.map { |n| n.accept(visitor) } }
      end
    when Nodes::And
      { and: node.set.accept(visitor) }

    when Nodes::Foreign
      { has_child: Hash[[[:type, node.left.accept(visitor)], node.right.accept(visitor)]] }

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