class SurveyorWarehouse::ResponseBin

Constants

DEFAULT_RESPONSE_GROUP

Groups responses into “bins” using the 'access_code.response_group' as the bin key.

See below for an example how the binning behavior works:

responses = []
responses.push( 
  [Response access_code:'abc' response_group:0 string_value:'Jeff'],
  [Response access_code:'abc' response_group:0 string_value:'Bezos'],
  [Response access_code:'xyz' response_group:0 string_value:'Kindle'],
  [Response access_code:'xyz' response_group:1 string_value:'EC2'])

ResponseBinner.new(responses).bins # => Results in the three bins below

[ResponseBin key:'abc:0' responses: [
    [Response access_code:'abc' response_group:0 string_value:'Jeff'],
    [Response access_code:'abc' response_group:0 string_value:'Bezos']]
[ResponseBin key:'xyz:0' responses: [
    [Response access_code:'xyz' response_group:0 string_value:'Kindle']]
[ResponseBin key:'xyz:1' responses: [
    [Response access_code:'xyz' response_group:1 string_value:'EC2']]

Public Class Methods

bins(responses) click to toggle source
# File lib/surveyor_warehouse/response_bin.rb, line 43
def self.bins(responses)
  bins = {}
  responses.each do |r|
    ac = r.response_set.access_code
    rg = r.response_group || DEFAULT_RESPONSE_GROUP
    key = "#{ac}.#{rg}"
    bin = bins[key] || ResponseBin.new(key, ac, rg)
    bin << r
    bins.merge!(key => bin)
  end
  bins.values
end

Public Instance Methods

<<(response) click to toggle source
# File lib/surveyor_warehouse/response_bin.rb, line 5
def <<(response)
  q = response.question
  Question.send(:include, SurveyorWarehouse::Extensions::Question)
  if q.valid_data_export_identifier?
    (@responses ||= []) << response
  else
    puts "Ignoring response with data_export_identifier: #{q.data_export_identifier}"
  end
  self
end
responses() click to toggle source
# File lib/surveyor_warehouse/response_bin.rb, line 16
def responses
  (@responses || []).dup.freeze
end
rows() click to toggle source
# File lib/surveyor_warehouse/response_bin.rb, line 56
def rows
  rows = {}
  @responses.each do |r|
    table_name = r.question.data_export_identifier.split('.')[0]
    table = rows[table_name] || ResponseRow.new(table_name, key, access_code)
    table.responses << r
    rows.merge!(table_name => table)
  end
  rows.values
end