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_process(attribute) ⇒ Object
- #visit_process_reference(attribute) ⇒ Object
- #visit_task_reference(attribute) ⇒ Object
- #visit_tasks(tasks) ⇒ Object
- #visit_type(attribute) ⇒ Object
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
190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/taskinator/persistence.rb', line 190 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
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
# File 'lib/taskinator/persistence.rb', line 205 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
260 261 262 263 264 265 266 |
# File 'lib/taskinator/persistence.rb', line 260 def visit_args(attribute) value = @attribute_values[attribute] if value args = YAML.load(value) @instance.instance_variable_set("@#{attribute}", args) end end |
#visit_attribute(attribute) ⇒ Object
246 247 248 249 |
# File 'lib/taskinator/persistence.rb', line 246 def visit_attribute(attribute) value = @attribute_values[attribute] @instance.instance_variable_set("@#{attribute}", value) if value end |
#visit_process(attribute) ⇒ Object
223 224 225 226 |
# File 'lib/taskinator/persistence.rb', line 223 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
236 237 238 239 |
# File 'lib/taskinator/persistence.rb', line 236 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
241 242 243 244 |
# File 'lib/taskinator/persistence.rb', line 241 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
228 229 230 231 232 233 234 |
# File 'lib/taskinator/persistence.rb', line 228 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
251 252 253 254 255 256 257 |
# File 'lib/taskinator/persistence.rb', line 251 def visit_type(attribute) value = @attribute_values[attribute] if value type = Kernel.const_get(value) @instance.instance_variable_set("@#{attribute}", type) end end |