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
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
#visit ⇒ Object
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 |