Class: Taskinator::Persistence::RedisDeserializationVisitor
- Inherits:
- 
      Visitor::Base
      
        - Object
- Visitor::Base
- Taskinator::Persistence::RedisDeserializationVisitor
 
- Defined in:
- lib/taskinator/persistence.rb
Instance Method Summary collapse
- 
  
    
      #initialize(key, instance_cache = {})  ⇒ RedisDeserializationVisitor 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    initialize with the store key for the instance to deserialize. 
- 
  
    
      #visit  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    the starting point for deserializing the instance. 
- 
  
    
      #visit_args(attribute)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    deserializes the arguments using YAML#load method. 
- #visit_attribute(attribute) ⇒ Object
- 
  
    
      #visit_attribute_enum(attribute, type)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    NB: assumes the enum type’s members have integer values!. 
- #visit_attribute_time(attribute) ⇒ Object
- #visit_process(attribute) ⇒ Object
- #visit_process_reference(attribute) ⇒ Object
- #visit_task_reference(attribute) ⇒ Object
- #visit_tasks(tasks) ⇒ Object
- #visit_type(attribute) ⇒ Object
Methods inherited from Visitor::Base
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
| 464 465 466 467 468 469 470 471 472 473 474 475 476 | # File 'lib/taskinator/persistence.rb', line 464 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
#visit ⇒ Object
the starting point for deserializing the instance
| 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 | # File 'lib/taskinator/persistence.rb', line 479 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
| 557 558 559 560 561 562 563 | # File 'lib/taskinator/persistence.rb', line 557 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
| 520 521 522 523 524 525 526 527 528 529 530 | # File 'lib/taskinator/persistence.rb', line 520 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!
| 539 540 541 542 543 544 545 546 | # File 'lib/taskinator/persistence.rb', line 539 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
| 532 533 534 535 536 | # File 'lib/taskinator/persistence.rb', line 532 def visit_attribute_time(attribute) visit_attribute(attribute) do |value| Time.parse(value) end end | 
#visit_process(attribute) ⇒ Object
| 497 498 499 500 | # File 'lib/taskinator/persistence.rb', line 497 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
| 510 511 512 513 | # File 'lib/taskinator/persistence.rb', line 510 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
| 515 516 517 518 | # File 'lib/taskinator/persistence.rb', line 515 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
| 502 503 504 505 506 507 508 | # File 'lib/taskinator/persistence.rb', line 502 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.attach(lazy_instance_for(Task, uuid), conn.get("#{@key}.count").to_i) if uuid end end | 
#visit_type(attribute) ⇒ Object
| 548 549 550 551 552 553 554 | # File 'lib/taskinator/persistence.rb', line 548 def visit_type(attribute) value = @attribute_values[attribute] if value type = Kernel.const_get(value) @instance.instance_variable_set("@#{attribute}", type) end end |