lib/datasets/table.rb in red-datasets-0.0.8 vs lib/datasets/table.rb in red-datasets-0.0.9

- old
+ new

@@ -1,21 +1,101 @@ require "datasets/dictionary" module Datasets class Table + class Record + include Enumerable + + def initialize(table, index) + @table = table + @index = index + end + + def [](column_name_or_column_index) + @table[column_name_or_column_index][@index] + end + + def each + return to_enum(__method__) unless block_given? + @table.each_column.each do |column_name, column_values| + yield(column_name, column_values[@index]) + end + end + + def values + @table.each_column.collect do |_column_name, column_values| + column_values[@index] + end + end + + def to_h + hash = {} + each do |column_name, column_value| + hash[column_name] = column_value + end + hash + end + + def inspect + "#<#{self.class.name} #{@table.dataset.metadata.name}[#{@index}] #{to_h.inspect}>" + end + end + include Enumerable + attr_reader :dataset def initialize(dataset) @dataset = dataset @dictionaries = {} end - def each(&block) + def n_columns + columner_data.size + end + alias_method :size, :n_columns + alias_method :length, :n_columns + + def n_rows + first_column = columner_data.first + return 0 if first_column.nil? + first_column[1].size + end + + def column_names + columner_data.keys + end + + def each_column(&block) columner_data.each(&block) end + alias_method :each, :each_column - def [](name) - columner_data[normalize_name(name)] + def each_record + return to_enum(__method__) unless block_given? + n_rows.times do |i| + yield(Record.new(self, i)) + end + end + + def find_record(row) + row += n_rows if row < 0 + return nil if row < 0 + return nil if row >= n_rows + Record.new(self, row) + end + + def [](name_or_index) + case name_or_index + when Integer + index = name_or_index + columner_data.each_with_index do |(_name, values), i| + return values if i == index + end + nil + else + name = name_or_index + columner_data[normalize_name(name)] + end end def dictionary_encode(name) @dictionaries[normalize_name(name)] ||= Dictionary.new(self[name]) end