class Taskinator::Persistence::RedisSerializationVisitor

Attributes

instance[R]

the redis connection is passed in since it is in the multi statement mode in order to produce one roundtrip to the redis server

Public Class Methods

new(conn, instance, base_visitor=self) click to toggle source
# File lib/taskinator/persistence.rb, line 238
def initialize(conn, instance, base_visitor=self)
  @conn         = conn
  @instance     = instance
  @key          = instance.key
  @root         = base_visitor.instance
  @base_visitor = base_visitor
  @task_count   = 0
end

Public Instance Methods

incr_task_count() click to toggle source
# File lib/taskinator/persistence.rb, line 333
def incr_task_count
  @task_count += 1
end
task_count() click to toggle source
# File lib/taskinator/persistence.rb, line 329
def task_count
  @task_count
end
visit() click to toggle source

the starting point for serializing the instance

# File lib/taskinator/persistence.rb, line 248
def visit
  @hmset = []
  @hmset << @key

  @hmset += [:type, @instance.class.name]

  @instance.accept(self)

  # add the process uuid and root key, for easy access later!
  @hmset += [:process_uuid, @root.uuid]

  # add the default state
  @hmset += [:state, :initial]

  # NB: splat args
  @conn.hmset(*@hmset)

  self
end
visit_args(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 317
def visit_args(attribute)
  values = @instance.send(attribute)
  yaml = Taskinator::Persistence.serialize(values)

  # greater than 2 MB?
  if (yaml.bytesize / (1024.0**2)) > 2
    Taskinator.logger.warn("Large argument data detected for '#{self.to_s}'. Consider using intrinsic types instead, or try to reduce the amount of data provided.")
  end

  @hmset += [attribute, yaml]
end
visit_attribute(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 289
def visit_attribute(attribute)
  value = @instance.send(attribute)
  @hmset += [attribute, value] if value
end
visit_attribute_enum(attribute, type) click to toggle source
# File lib/taskinator/persistence.rb, line 298
def visit_attribute_enum(attribute, type)
  visit_attribute(attribute)
end
visit_attribute_time(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 294
def visit_attribute_time(attribute)
  visit_attribute(attribute)
end
visit_process(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 268
def visit_process(attribute)
  process = @instance.send(attribute)
  if process
    @hmset += [attribute, process.uuid]
    RedisSerializationVisitor.new(@conn, process, @base_visitor).visit
  end
end
visit_process_reference(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 302
def visit_process_reference(attribute)
  process = @instance.send(attribute)
  @hmset += [attribute, process.uuid] if process
end
visit_task_reference(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 307
def visit_task_reference(attribute)
  task = @instance.send(attribute)
  @hmset += [attribute, task.uuid] if task
end
visit_tasks(tasks) click to toggle source
# File lib/taskinator/persistence.rb, line 276
def visit_tasks(tasks)
  tasks.each do |task|
    RedisSerializationVisitor.new(@conn, task, @base_visitor).visit
    @conn.rpush "#{@key}:tasks", task.uuid
    unless task.is_a?(Task::SubProcess)
      incr_task_count unless self == @base_visitor
      @base_visitor.incr_task_count
    end
  end
  @conn.set("#{@key}.count", tasks.count)
  @conn.set("#{@key}.pending", tasks.count)
end
visit_type(attribute) click to toggle source
# File lib/taskinator/persistence.rb, line 312
def visit_type(attribute)
  type = @instance.send(attribute)
  @hmset += [attribute, type.name] if type
end