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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/taskinator/persistence.rb', line 170

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



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