module Pione::RuleEngine::UpdateCriteria

Constants

FORCE_UPDATE

force update criteria

WEAK_UPDATE

update criteria

Public Class Methods

exist_newer_input_data?(env, rule_condition, inputs, outputs, data_null_tuples) click to toggle source

Return true if newer input data exist.

# File lib/pione/rule-engine/update-criteria.rb, line 64
def exist_newer_input_data?(env, rule_condition, inputs, outputs, data_null_tuples)
  # get output oldest time
  outputs = outputs.select.with_index do |output, i|
    rule_condition.outputs[i].eval(env).update_criteria == :care
  end
  output_oldest_time = outputs.flatten.map{|output| output.time}.sort.first

  # get input last time
  inputs = inputs.select.with_index do |input, i|
    rule_condition.inputs[i].eval(env).update_criteria == :care
  end
  input_last_time = inputs.flatten.map{|input| input.time}.sort.last

  # special touch criterion
  rule_condition.outputs.each_with_index do |condition, i|
    _condition = condition.eval(env)
    if _condition.operation == :touch
      if inputs.flatten.select{|t| _condition.match(t.name)}.size > 0
        return true
      end
    end
  end

  # criteria
  return false unless output_oldest_time
  return false unless input_last_time
  return output_oldest_time < input_last_time
end
exist_output_data?(env, rule_condition, inputs, outputs, data_null_tuples) click to toggle source

Return true if data tuples exist against output conditions with remove or touch operation.

# File lib/pione/rule-engine/update-criteria.rb, line 41
def exist_output_data?(env, rule_condition, inputs, outputs, data_null_tuples)
  result = false
  rule_condition.outputs.each_with_index do |condition, i|
    _condition = condition.eval(env)
    # remove
    if _condition.operation == :remove
      case _condition.distribution
      when :all
        if not(outputs[i].nil? or outputs[i].select{|data| _condition.match(data.name)}.empty?)
          result = true
        end
      when :each
        if not(outputs[i].nil?) and _condition.match(outputs[i].first.name)
          result = true
        end
      end
    end
    break if result
  end
  return result
end
no_output_conditions?(env, rule_condition, inputs, outputs, data_null_tuples) click to toggle source

Return true if the rule has no output conditions.

# File lib/pione/rule-engine/update-criteria.rb, line 7
def no_output_conditions?(env, rule_condition, inputs, outputs, data_null_tuples)
  rule_condition.outputs.empty?
end
not_exist_output_data?(env, rule_condition, inputs, outputs, data_null_tuples) click to toggle source

Return true if data tuples don’t exist against output conditions with write operation.

# File lib/pione/rule-engine/update-criteria.rb, line 13
def not_exist_output_data?(env, rule_condition, inputs, outputs, data_null_tuples)
  result = false
  rule_condition.outputs.each_with_index do |condition, i|
    _condition = condition.eval(env)
    if _condition.operation == :write or _condition.operation == :touch
      # FIXME : each tuples are empty or single data tuple, this is confusing
      case _condition.distribution
      when :all
        if outputs[i].nil? or outputs[i].select{|data| _condition.match(data.name)}.empty?
          unless _condition.accept_nonexistence? and data_null_tuples.any?{|tuple| tuple.position == i}
            result = true
          end
        end
      when :each
        if outputs[i].nil? or (outputs[i].kind_of?(Array) and outputs[i].empty?) or not(_condition.match(outputs[i][0].name))
          unless _condition.accept_nonexistence? and data_null_tuples.any?{|tuple| tuple.position == i}
            result = true
          end
        end
      end
    end
    break if result
  end
  return result
end
order(env, rule_condition, inputs, outputs, data_null_tuples) click to toggle source

Return update order name if we need to update.

# File lib/pione/rule-engine/update-criteria.rb, line 94
def order(env, rule_condition, inputs, outputs, data_null_tuples)
  if FORCE_UPDATE.any? {|name| self.send(name, env, rule_condition, inputs, outputs, data_null_tuples)}
    return :force
  end
  if WEAK_UPDATE.any? {|name| self.send(name, env, rule_condition, inputs, outputs, data_null_tuples)}
    return :weak
  end
end