Class: Ddr::Index::CSVQueryResult

Inherits:
AbstractQueryResult show all
Defined in:
lib/ddr/index/csv_query_result.rb

Constant Summary collapse

MAX_ROWS =

Just set to a really high number :)

10**8
CSV_MV_SEPARATOR =
";"
DEFAULT_CSV_OPTIONS =
{
  headers:        :first_row,
  return_headers: false,
  write_headers:  true,
  converters:     [
    # convert semicolons
    lambda { |f| f.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR) rescue f },
    # convert escaped newlines
    lambda { |f| f.gsub(/\\r/, "\r").gsub(/\\n/, "\n") rescue f }
  ],
}.freeze

Instance Attribute Summary collapse

Attributes inherited from AbstractQueryResult

#query

Instance Method Summary collapse

Methods inherited from AbstractQueryResult

#count

Constructor Details

#initialize(query, csv_opts: {}) ⇒ CSVQueryResult

See Ruby docs on CSV::new for details on available keys and values for the optional ‘csv_options’ Hash parameter.

N.B. If you want to add a converter and retain the default converters, append DEFAULT_CSV_OPTIONS to your Array of converters.



33
34
35
36
# File 'lib/ddr/index/csv_query_result.rb', line 33

def initialize(query, csv_opts: {})
  super(query)
  @csv_opts = DEFAULT_CSV_OPTIONS.merge(csv_opts)
end

Instance Attribute Details

#csv_optsObject (readonly)

Returns the value of attribute csv_opts.



23
24
25
# File 'lib/ddr/index/csv_query_result.rb', line 23

def csv_opts
  @csv_opts
end

Instance Method Details

#[](index_or_header) ⇒ Object



46
47
48
# File 'lib/ddr/index/csv_query_result.rb', line 46

def [](index_or_header)
  table.by_col_or_row![index_or_header]
end

#dataObject



78
79
80
81
82
83
84
# File 'lib/ddr/index/csv_query_result.rb', line 78

def data
  if solr_csv_header?
    solr_data
  else
    [ query_field_headings.join(","), solr_data ].join("\n")
  end
end

#delete_empty_columns!Object



38
39
40
# File 'lib/ddr/index/csv_query_result.rb', line 38

def delete_empty_columns!
  table.by_col!.delete_if { |c, vals| vals.all?(&:nil?) }
end

#each(&block) ⇒ Object



42
43
44
# File 'lib/ddr/index/csv_query_result.rb', line 42

def each(&block)
  table.by_row!.each(&block)
end

#query_field_headingsObject



62
63
64
# File 'lib/ddr/index/csv_query_result.rb', line 62

def query_field_headings
  query.fields.map { |f| f.respond_to?(:heading) ? f.heading : f.to_s }
end

#solr_csv_header?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/ddr/index/csv_query_result.rb', line 66

def solr_csv_header?
  query.fields.empty?
end

#solr_csv_optsObject



54
55
56
57
58
59
60
# File 'lib/ddr/index/csv_query_result.rb', line 54

def solr_csv_opts
  { "csv.mv.separator" => CSV_MV_SEPARATOR,
    "csv.header"       => solr_csv_header?,
    "rows"             => solr_csv_rows,
    "wt"               => "csv",
  }
end

#solr_csv_paramsObject



74
75
76
# File 'lib/ddr/index/csv_query_result.rb', line 74

def solr_csv_params
  params.merge(solr_csv_opts)
end

#solr_csv_rowsObject



70
71
72
# File 'lib/ddr/index/csv_query_result.rb', line 70

def solr_csv_rows
  query.rows || MAX_ROWS
end

#solr_dataObject



86
87
88
# File 'lib/ddr/index/csv_query_result.rb', line 86

def solr_data
  Connection.get("select", params: solr_csv_params)
end

#tableObject



50
51
52
# File 'lib/ddr/index/csv_query_result.rb', line 50

def table
  @table ||= CSV.parse(data, csv_opts)
end