lib/ddr/index/csv_query_result.rb in ddr-models-3.0.0.rc5 vs lib/ddr/index/csv_query_result.rb in ddr-models-3.0.0.rc6
- old
+ new
@@ -1,60 +1,77 @@
require "csv"
module Ddr::Index
class CSVQueryResult < AbstractQueryResult
- delegate :[], :to_s, :to_csv, to: :table
+ MAX_ROWS = 10**8
+ CSV_MV_SEPARATOR = ";"
+ DESCMD_HEADER_CONVERTER = lambda { |header|
+ if term = Ddr::Models::DescriptiveMetadata.mapping[header.to_sym]
+ term.unqualified_name.to_s
+ else
+ header
+ end
+ }
+
+ delegate :headers, :to_s, :to_csv, to: :table
+
def delete_empty_columns!
- mode = table.mode
table.by_col!.delete_if { |c, vals| vals.all?(&:nil?) }
- table.send("by_#{mode}!")
end
def each(&block)
table.by_row!.each(&block)
end
+ def [](index_or_header)
+ table.by_col_or_row![index_or_header]
+ end
+
def table
- @table ||= CSV.parse(data, csv_opts.to_h)
+ @table ||= CSV.parse(data, csv_opts)
end
def csv_opts
- @csv_opts ||= CSVOptions.new(headers: csv_headers)
+ { headers: csv_headers,
+ return_headers: false,
+ write_headers: true,
+ header_converters: [ DESCMD_HEADER_CONVERTER ],
+ }
end
def solr_csv_opts
- @solr_csv_opts ||= SolrCSVOptions.new(col_sep: csv_opts.col_sep,
- quote_char: csv_opts.quote_char,
- header: solr_csv_header,
- rows: query.rows)
+ { "csv.mv.separator" => CSV_MV_SEPARATOR,
+ "csv.header" => solr_csv_header?,
+ "rows" => solr_csv_rows,
+ "wt" => "csv",
+ }
end
- def headers
- @headers ||= query.fields.map { |f| f.respond_to?(:heading) ? f.heading : f.to_s }
+ def query_field_headings
+ query.fields.map { |f| f.respond_to?(:heading) ? f.heading : f.to_s }
end
def csv_headers
- if headers.empty?
- :first_row
- else
- headers
- end
+ query.fields.empty? ? :first_row : query_field_headings
end
- def solr_csv_header
+ def solr_csv_header?
csv_headers == :first_row
end
+ def solr_csv_rows
+ query.rows || MAX_ROWS
+ end
+
def solr_csv_params
- params.merge(solr_csv_opts.params)
+ params.merge(solr_csv_opts)
end
def data
raw = conn.get("select", params: solr_csv_params)
- mv_sep = solr_csv_opts["csv.mv.separator"]
- raw.gsub(/\\#{mv_sep}/, mv_sep)
+ raw.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR)
end
end
end