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 27
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 45
def alpha_activate(wme)
  # p alpha_activate: {class: self.class, object_id:, wme:}
  assignments = collect_assignments(wme)

  tokens.each do |token|
    next unless matches?(token, wme)

    children.each do |beta|
      beta.beta_activate Token.new(beta, token, wme, assignments)
    end
  end
end
alpha_deactivate(wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 58
def alpha_deactivate(wme)
  beta_deactivate_children(wme: wme)
end
beta_activate(token) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 62
def beta_activate(token)
  # p beta_activate: {class: self.class, object_id:, token:}
  return if tokens.find { |t| t.duplicate? token }

  overlay.add_token(token)

  template = specialize(alpha.template, tests, token)
  select_wmes(template).each do |wme|
    next unless matches?(token, wme)

    assignments = collect_assignments(wme)
    children.each do |beta|
      beta.beta_activate Token.new(beta, token, wme, assignments)
    end
  end
end
beta_deactivate(token) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 79
def beta_deactivate(token)
  # p beta_deactivate: {class: self.class, object_id:, token:}
  overlay.remove_token(token)
  beta_deactivate_children(token: token)
end
equivalent?(alpha, tests, assignment_pattern) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 33
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 85
def refresh_child(child)
  select_wmes(alpha.template).each do |wme|
    assignments = collect_assignments(wme)
    tokens.each do |token|
      child.beta_activate Token.new(child, token, wme, assignments) if matches?(token, wme)
    end
  end
end

Protected Instance Methods

collect_assignments(wme) click to toggle source
# File lib/wongi-engine/beta/join_node.rb, line 103
def collect_assignments(wme)
  assignments = {}
  return assignments if assignment_pattern.nil?

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