Class: Taskinator::Persistence::RedisDeserializationVisitor

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

Instance Method Summary collapse

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

#visitObject

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