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



128
129
130
131
132
133
# File 'lib/taskinator/persistence.rb', line 128

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



136
137
138
139
140
141
142
143
144
145
# File 'lib/taskinator/persistence.rb', line 136

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

  @instance.accept(self)

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

#visit_args(attribute) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/taskinator/persistence.rb', line 183

def visit_args(attribute)
  values = @instance.send(attribute)

  # special case, convert models to global id's
  if values.is_a?(Array)

    values = values.collect {|value|
      value.respond_to?(:global_id) ? value.global_id : value
    }

  elsif values.is_a?(Hash)

    values.each {|key, value|
      values[key] = value.global_id if value.respond_to?(:global_id)
    }

  end

  @hmset += [attribute, YAML.dump(values)]
end

#visit_attribute(attribute) ⇒ Object



163
164
165
166
# File 'lib/taskinator/persistence.rb', line 163

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

#visit_process(attribute) ⇒ Object



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

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



168
169
170
171
# File 'lib/taskinator/persistence.rb', line 168

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

#visit_task_reference(attribute) ⇒ Object



173
174
175
176
# File 'lib/taskinator/persistence.rb', line 173

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

#visit_tasks(tasks) ⇒ Object



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

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



178
179
180
181
# File 'lib/taskinator/persistence.rb', line 178

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