Class: Taskinator::Persistence::RedisSerializationVisitor

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

Instance Method Summary collapse

Constructor Details

#initialize(conn, instance, parent = nil) ⇒ RedisSerializationVisitor

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



115
116
117
118
119
120
# File 'lib/taskinator/persistence.rb', line 115

def initialize(conn, instance, parent=nil)
  @conn = conn
  @instance = instance
  @key = instance.key
  # @parent = parent        # not using this yet
end

Instance Method Details

#visitObject

the starting point for serializing the instance



123
124
125
126
127
128
129
130
131
132
# File 'lib/taskinator/persistence.rb', line 123

def visit
  @hmset = []
  @hmset << @key
  @hmset += [:type, @instance.class.name]

  @instance.accept(self)

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

#visit_args(attribute) ⇒ Object



170
171
172
173
# File 'lib/taskinator/persistence.rb', line 170

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

#visit_attribute(attribute) ⇒ Object



150
151
152
153
# File 'lib/taskinator/persistence.rb', line 150

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

#visit_process(attribute) ⇒ Object



134
135
136
137
138
139
140
# File 'lib/taskinator/persistence.rb', line 134

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

#visit_process_reference(attribute) ⇒ Object



155
156
157
158
# File 'lib/taskinator/persistence.rb', line 155

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

#visit_task_reference(attribute) ⇒ Object



160
161
162
163
# File 'lib/taskinator/persistence.rb', line 160

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

#visit_tasks(tasks) ⇒ Object



142
143
144
145
146
147
148
# File 'lib/taskinator/persistence.rb', line 142

def visit_tasks(tasks)
  @hmset += [:task_count, tasks.count]
  tasks.each do |task|
    RedisSerializationVisitor.new(@conn, task, @instance).visit
    @conn.rpush "#{@key}:tasks", task.uuid
  end
end

#visit_type(attribute) ⇒ Object



165
166
167
168
# File 'lib/taskinator/persistence.rb', line 165

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