Class: ScopedSearch::QueryLanguage::AST::OperatorNode

Inherits:
Node
  • Object
show all
Defined in:
lib/scoped_search/query_language/ast.rb

Overview

AST class for representing operators in the query. An operator node has an operator and operands that are represented as AST child nodes. Usually, operator nodes have one or two children. For logical operators, a distinct subclass exists to implement some tree simplification rules.

Direct Known Subclasses

LogicalOperatorNode

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Node

#compatible_with, #inspect

Constructor Details

#initialize(operator, children) ⇒ OperatorNode

:nodoc



67
68
69
70
# File 'lib/scoped_search/query_language/ast.rb', line 67

def initialize(operator, children) # :nodoc
  @operator = operator
  @children = children
end

Instance Attribute Details

#childrenObject (readonly)

Returns the value of attribute children.



65
66
67
# File 'lib/scoped_search/query_language/ast.rb', line 65

def children
  @children
end

#operatorObject (readonly)

Returns the value of attribute operator.



64
65
66
# File 'lib/scoped_search/query_language/ast.rb', line 64

def operator
  @operator
end

Instance Method Details

#[](child_nr) ⇒ Object

Returns a child node by index, starting with 0.



111
112
113
# File 'lib/scoped_search/query_language/ast.rb', line 111

def [](child_nr)
  children[child_nr]
end

#eql?(node) ⇒ Boolean

:nodoc

Returns:

  • (Boolean)


83
84
85
# File 'lib/scoped_search/query_language/ast.rb', line 83

def eql?(node) # :nodoc
  node.kind_of?(OperatorNode) && node.operator == operator && node.children.eql?(children)
end

#infix?Boolean

Returns true if this is an infix operator

Returns:

  • (Boolean)


101
102
103
# File 'lib/scoped_search/query_language/ast.rb', line 101

def infix?
  children.length > 1
end

#lhsObject

Return the left-hand side (LHS) operand for this operator.



88
89
90
91
92
# File 'lib/scoped_search/query_language/ast.rb', line 88

def lhs
  raise ScopedSearch::Exception, "Operator does not have a LHS" if prefix?
  raise ScopedSearch::Exception, "Operators with more than 2 children do not have LHS/RHS" if children.length > 2
  children[0]
end

#prefix?Boolean

Returns true if this is a prefix operator

Returns:

  • (Boolean)


106
107
108
# File 'lib/scoped_search/query_language/ast.rb', line 106

def prefix?
  children.length == 1
end

#rhsObject

Return the right-hand side (RHS) operand for this operator.



95
96
97
98
# File 'lib/scoped_search/query_language/ast.rb', line 95

def rhs
  raise ScopedSearch::Exception, "Operators with more than 2 children do not have LHS/RHS" if children.length > 2      
  children.length == 1 ? children[0] : children[1]
end

#simplifyObject

Tree simplicication: returns itself after simpifying its children



73
74
75
76
# File 'lib/scoped_search/query_language/ast.rb', line 73

def simplify
  @children = children.map { |c| c.simplify }
  return self
end

#to_aObject

Return an array representation for the node



79
80
81
# File 'lib/scoped_search/query_language/ast.rb', line 79

def to_a
  [@operator] + @children.map { |c| c.to_a }
end