Class: Taskinator::Persistence::RedisDeserializationVisitor

Inherits:
Visitor::Base
  • Object
show all
Defined in:
lib/taskinator/persistence.rb

Instance Method Summary collapse

Methods inherited from Visitor::Base

#task_count

Constructor Details

#initialize(key, instance_cache = {}) ⇒ RedisDeserializationVisitor

initialize with the store key for the instance to deserialize

optionally, pass in a hash which is used to cache the deserialized instances for the given key



312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'lib/taskinator/persistence.rb', line 312

def initialize(key, instance_cache={})
  @key = key
  @instance_cache = instance_cache

  # pre-load all the attributes to reduce redis hits
  Taskinator.redis do |conn|
    keys, values = conn.multi do
      conn.hkeys(@key)
      conn.hvals(@key)
    end
    @attribute_values = Hash[keys.collect(&:to_sym).zip(values)]
  end
end

Instance Method Details

#visitObject

the starting point for deserializing the instance



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
# File 'lib/taskinator/persistence.rb', line 327

def visit
  return unless @attribute_values.key?(:type)

  type = @attribute_values[:type]
  klass = Kernel.const_get(type)

  #
  # NOTE:
  #  using Class#allocate here so that the
  #  instance is created without the need to
  #  call the Class#new method which has constructor
  #  arguments which are unknown at this stage
  #
  @instance = klass.allocate
  @instance.accept(self)
  @instance
end

#visit_args(attribute) ⇒ Object

deserializes the arguments using YAML#load method



405
406
407
408
409
410
411
# File 'lib/taskinator/persistence.rb', line 405

def visit_args(attribute)
  yaml = @attribute_values[attribute]
  if yaml
    values = Taskinator::Persistence.deserialize(yaml)
    @instance.instance_variable_set("@#{attribute}", values)
  end
end

#visit_attribute(attribute) ⇒ Object



368
369
370
371
372
373
374
375
376
377
378
# File 'lib/taskinator/persistence.rb', line 368

def visit_attribute(attribute)
  value = @attribute_values[attribute]
  if value
    # converted block given?
    if block_given?
      @instance.instance_variable_set("@#{attribute}", yield(value))
    else
      @instance.instance_variable_set("@#{attribute}", value)
    end
  end
end

#visit_attribute_enum(attribute, type) ⇒ Object

NB: assumes the enum type’s members have integer values!



387
388
389
390
391
392
393
394
# File 'lib/taskinator/persistence.rb', line 387

def visit_attribute_enum(attribute, type)
  visit_attribute(attribute) do |value|
    const_value = type.constants.select {|c| type.const_get(c) == value.to_i }.first
    const_value ?
      type.const_get(const_value) :
      (defined?(type::Default) ? type::Default : nil)
  end
end

#visit_attribute_time(attribute) ⇒ Object



380
381
382
383
384
# File 'lib/taskinator/persistence.rb', line 380

def visit_attribute_time(attribute)
  visit_attribute(attribute) do |value|
    Time.parse(value)
  end
end

#visit_process(attribute) ⇒ Object



345
346
347
348
# File 'lib/taskinator/persistence.rb', line 345

def visit_process(attribute)
  uuid = @attribute_values[attribute]
  @instance.instance_variable_set("@#{attribute}", lazy_instance_for(Process, uuid)) if uuid
end

#visit_process_reference(attribute) ⇒ Object



358
359
360
361
# File 'lib/taskinator/persistence.rb', line 358

def visit_process_reference(attribute)
  uuid = @attribute_values[attribute]
  @instance.instance_variable_set("@#{attribute}", lazy_instance_for(Process, uuid)) if uuid
end

#visit_task_reference(attribute) ⇒ Object



363
364
365
366
# File 'lib/taskinator/persistence.rb', line 363

def visit_task_reference(attribute)
  uuid = @attribute_values[attribute]
  @instance.instance_variable_set("@#{attribute}", lazy_instance_for(Task, uuid)) if uuid
end

#visit_tasks(tasks) ⇒ Object



350
351
352
353
354
355
356
# File 'lib/taskinator/persistence.rb', line 350

def visit_tasks(tasks)
  # tasks are a linked list, so just get the first one
  Taskinator.redis do |conn|
    uuid = conn.lindex("#{@key}:tasks", 0)
    tasks << lazy_instance_for(Task, uuid) if uuid
  end
end

#visit_type(attribute) ⇒ Object



396
397
398
399
400
401
402
# File 'lib/taskinator/persistence.rb', line 396

def visit_type(attribute)
  value = @attribute_values[attribute]
  if value
    type = Kernel.const_get(value)
    @instance.instance_variable_set("@#{attribute}", type)
  end
end