Class: Taskinator::Persistence::RedisSerializationVisitor

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(conn, instance, base_visitor = self) ⇒ RedisSerializationVisitor

Returns a new instance of RedisSerializationVisitor.



209
210
211
212
213
214
215
216
# File 'lib/taskinator/persistence.rb', line 209

def initialize(conn, instance, base_visitor=self)
  @conn         = conn
  @instance     = instance
  @key          = instance.key
  @root         = base_visitor.instance
  @base_visitor = base_visitor
  @task_count   = 0
end

Instance Attribute Details

#instanceObject (readonly)

the redis connection is passed in since it is in the multi statement mode in order to produce one roundtrip to the redis server



207
208
209
# File 'lib/taskinator/persistence.rb', line 207

def instance
  @instance
end

Instance Method Details

#incr_task_countObject



293
294
295
# File 'lib/taskinator/persistence.rb', line 293

def incr_task_count
  @task_count += 1
end

#task_countObject



289
290
291
# File 'lib/taskinator/persistence.rb', line 289

def task_count
  @task_count
end

#visitObject

the starting point for serializing the instance



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/taskinator/persistence.rb', line 219

def visit
  @hmset = []
  @hmset << @key

  @hmset += [:type, @instance.class.name]

  @instance.accept(self)

  # add the process uuid and root key, for easy access later!
  @hmset += [:process_uuid, @root.uuid]

  # add the default state
  @hmset += [:state, :initial]

  # NB: splat args
  @conn.hmset(*@hmset)

  self
end

#visit_args(attribute) ⇒ Object



283
284
285
286
287
# File 'lib/taskinator/persistence.rb', line 283

def visit_args(attribute)
  values = @instance.send(attribute)
  yaml = Taskinator::Persistence.serialize(values)
  @hmset += [attribute, yaml]
end

#visit_attribute(attribute) ⇒ Object



255
256
257
258
# File 'lib/taskinator/persistence.rb', line 255

def visit_attribute(attribute)
  value = @instance.send(attribute)
  @hmset += [attribute, value] if value
end

#visit_attribute_enum(attribute, type) ⇒ Object



264
265
266
# File 'lib/taskinator/persistence.rb', line 264

def visit_attribute_enum(attribute, type)
  visit_attribute(attribute)
end

#visit_attribute_time(attribute) ⇒ Object



260
261
262
# File 'lib/taskinator/persistence.rb', line 260

def visit_attribute_time(attribute)
  visit_attribute(attribute)
end

#visit_process(attribute) ⇒ Object



239
240
241
242
243
244
245
# File 'lib/taskinator/persistence.rb', line 239

def visit_process(attribute)
  process = @instance.send(attribute)
  if process
    @hmset += [attribute, process.uuid]
    RedisSerializationVisitor.new(@conn, process, @base_visitor).visit
  end
end

#visit_process_reference(attribute) ⇒ Object



268
269
270
271
# File 'lib/taskinator/persistence.rb', line 268

def visit_process_reference(attribute)
  process = @instance.send(attribute)
  @hmset += [attribute, process.uuid] if process
end

#visit_task_reference(attribute) ⇒ Object



273
274
275
276
# File 'lib/taskinator/persistence.rb', line 273

def visit_task_reference(attribute)
  task = @instance.send(attribute)
  @hmset += [attribute, task.uuid] if task
end

#visit_tasks(tasks) ⇒ Object



247
248
249
250
251
252
253
# File 'lib/taskinator/persistence.rb', line 247

def visit_tasks(tasks)
  tasks.each do |task|
    RedisSerializationVisitor.new(@conn, task, @base_visitor).visit
    @conn.rpush "#{@key}:tasks", task.uuid
    @base_visitor.incr_task_count unless task.is_a?(Task::SubProcess)
  end
end

#visit_type(attribute) ⇒ Object



278
279
280
281
# File 'lib/taskinator/persistence.rb', line 278

def visit_type(attribute)
  type = @instance.send(attribute)
  @hmset += [attribute, type.name] if type
end