lib/vertica/result.rb in vertica-1.0.0.rc1 vs lib/vertica/result.rb in vertica-1.0.0.rc2

- old
+ new

@@ -1,46 +1,110 @@ +# Class that represents a buffered resultset. +# +# This class implements the Enumerable interface for easy iteration through +# the rows. You can also address specific values in the result using {#fetch}. +# To leanr more about the shape of the result {#row_description} will give you +# an ordered list of all the {Vertica::Column}s in this result. +# +# @example Iterating over the rows +# result = connection.query("SELECT name, id") +# result.each do |row| +# puts "#{row[:id]}: #{row[:name]}" +# end +# +# @example Fetching specific values in the result +# result = connection.query('SELECT id, name FROM people WHERE id = 1') +# name = result.fetch(0, 'name') +# id = result[0,0] +# +# @example Retrieving the only value in a result +# average_salery = connection.query("SELECT AVG(salery) FROM employees").the_value +# +# @attr_reader [Vertica::RowDescription] row_description The columns in the result. +# @attr_reader [String] tag The kind of SQL command that produced this reuslt. +# +# @see Vertica::Connection#query class Vertica::Result include Enumerable - attr_reader :row_description - attr_reader :rows - attr_reader :tag + attr_reader :row_description, :tag + # Initializes a new Vertica::Result instance. + # + # The constructor assumes that the row description, and the list of rows match up. + # If you're unsure, use {Vertica::Result.build} which will assert this is the case. + # + # @param row_description [Vertica::RowDescription] The description of the rows + # @param rows [Array<Vertica::Row>] The array of rows + # @param tag [String] The kind of command that returned this result. + # @see Vertica::Result.build def initialize(row_description: nil, rows: nil, tag: nil) @row_description, @rows, @tag = row_description, rows, tag end + # Iterates through the resultset. This class also includes the `Enumerable` + # interface, which means you can use all the `Enumerable` methods like `map` + # and `inject` as well. + # @yield The provided block will be called for every row in the resutset. + # @yieldparam row [Vertica::Row] + # @return [void] def each(&block) @rows.each(&block) end + # @return [Boolean] Returns `true` if the result has no rows. def empty? @rows.empty? end + # @return [Integer] The number of rows in this result def size @rows.length end alias_method :count, :size alias_method :length, :size - def fetch(row_index, col = nil) - row = rows.fetch(row_index) + # Retrieves a row or value from the result. + # @return [Vertica::Row, Object] + # + # @overload fetch(row) + # Returns a row from the result. + # @param row [Integer] The 0-indexed row number. + # @raise [IndexError] if the row index is out of bounds. + # @return [Vertica::Row] + # @overload fetch(row, column) + # Returns a singular value from the result. + # @param row [Integer] The 0-indexed row number. + # @param col [Symbol, String, Integer] The name or index of the column. + # @raise [IndexError] if the row index is out of bounds. + # @raise [KeyError] if the requested column is not part of the result + # @return The value at the given row and column in the result. + def fetch(row, col = nil) + row = @rows.fetch(row) return row if col.nil? row.fetch(col) end alias_method :[], :fetch + # Shorthand to return the value of a query that only returns a single value. + # @return The first value of the first row, i.e. `fetch(0, 0)`. def value fetch(0, 0) end alias_method :the_value, :value alias_method :columns, :row_description + # Builds a {Vertica::Result} from a row description and a list of compatible rows. + # @param row_description An object that can be built into a {Vertica::RowDescription}. + # See {Vertica::RowDescription.build} for more info + # @param rows [Array] An array of objects that can be turned into a {Vertica::Row}. + # See {Vertica::RowDescription#build_row} for more info + # @param tag [String] The type of SQL command that yielded the result. + # @return [Vertica::Result] def self.build(row_description: nil, rows: [], tag: nil) row_description = Vertica::RowDescription.build(row_description) rows = rows.map { |values| row_description.build_row(values) } new(row_description: row_description, rows: rows, tag: tag) end