class Wongi::Engine::JoinNode

Attributes

alpha[RW]
assignment_pattern[R]
tests[R]

Public Class Methods

new(parent, tests, assignment) click to toggle source
Calls superclass method Wongi::Engine::BetaNode::new
# File lib/wongi-engine/beta/join_node.rb, line 44
def initialize parent, tests, assignment
  super(parent)
  @tests = tests
  @assignment_pattern = assignment
end

Public Instance Methods

alpha_activate(wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 61
def alpha_activate wme
  assignments = collect_assignments( wme )
  parent.tokens.each do |token|
    if matches?( token, wme )
      children.each do |beta|
        beta.beta_activate Token.new( beta, token, wme, assignments )
      end
    end
  end
end
alpha_deactivate(wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 72
def alpha_deactivate wme
  children.each do |child|
    child.tokens.each do |token|
      if token.wme == wme
        child.beta_deactivate token
      end
    end
  end
end
beta_activate(token) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 82
def beta_activate token
  self.alpha.wmes.each do |wme|
    if matches?( token, wme )
      assignments = collect_assignments( wme )
      children.each do |beta|
        beta.beta_activate Token.new( beta, token, wme, assignments )
      end
    end
  end
end
beta_deactivate(token) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 93
def beta_deactivate token
  children.each do |child|
    child.tokens.each do |t|
      if t.parent == token
        child.beta_deactivate t
      end
    end
  end
end
equivalent?(alpha, tests, assignment_pattern) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 50
def equivalent? alpha, tests, assignment_pattern
  return false unless self.alpha == alpha
  return false unless self.assignment_pattern == assignment_pattern
  return false unless (self.tests.empty? && tests.empty?) || self.tests.length == tests.length && self.tests.all? { |my_test|
    tests.any? { |new_test|
      my_test.equivalent? new_test
    }
  }
  true
end
refresh_child(child) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 103
def refresh_child child
  alpha.wmes.each do |wme|
    assignments = collect_assignments( wme )
    parent.tokens.each do |token|
      if matches?( token, wme )
        child.beta_activate Token.new( child, token, wme, assignments )
      end
    end
  end
end

Protected Instance Methods

collect_assignments(wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 123
def collect_assignments wme
  assignments = {}
  return assignments if assignment_pattern.nil?
  if assignment_pattern.subject != :_
    assignments[ assignment_pattern.subject ] = TokenAssignment.new(wme, :subject)
  end
  if assignment_pattern.predicate != :_
    assignments[ assignment_pattern.predicate ] = TokenAssignment.new(wme, :predicate)
  end
  if assignment_pattern.object != :_
    assignments[ assignment_pattern.object ] = TokenAssignment.new(wme, :object)
  end
  assignments
end
matches?(token, wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 116
def matches? token, wme
  @tests.each do |test|
    return false unless test.matches?( token, wme )
  end
  true
end