Class: Google::Cloud::Spanner::Data

Inherits:
Object
  • Object
show all
Defined in:
lib/google/cloud/spanner/data.rb

Overview

# Data

Represents a row in a result from Cloud Spanner. Provides access to data in a hash-like structure. Values can be retrieved by name (String), or in cases in which values are unnamed, by zero-based index position (Integer).

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

results = db.execute "SELECT * FROM users"

results.rows.each do |row|
  puts "User #{row[:id]} is #{row[:name]}"
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.from_grpc(grpc_values, grpc_fields) ⇒ Object

Spanner values and fields.



190
191
192
193
194
195
# File 'lib/google/cloud/spanner/data.rb', line 190

def self.from_grpc grpc_values, grpc_fields
  new.tap do |d|
    d.instance_variable_set :@grpc_values, grpc_values
    d.instance_variable_set :@grpc_fields, grpc_fields
  end
end

Instance Method Details

#==(other) ⇒ Object



165
166
167
168
# File 'lib/google/cloud/spanner/data.rb', line 165

def == other
  return false unless other.is_a? Data
  pairs == other.pairs
end

#[](key) ⇒ Object?

Returns the value object for the provided name (String) or index (Integer). Do not pass a name to this method if the data has more than one member with the same name.

Parameters:

  • key (String, Integer)

    The name (String) or zero-based index position (Integer) of the value.

Returns:

  • (Object, nil)

    The value, or nil if no value is found.

Raises:



110
111
112
113
114
115
116
117
118
119
120
# File 'lib/google/cloud/spanner/data.rb', line 110

def [] key
  if key.is_a? Integer
    return Convert.value_to_raw(@grpc_values[key],
                                @grpc_fields[key].type)
  end
  name_count = @grpc_fields.find_all { |f| f.name == String(key) }.count
  return nil if name_count == 0
  fail DuplicateNameError if name_count > 1
  index = @grpc_fields.find_index { |f| f.name == String(key) }
  Convert.value_to_raw(@grpc_values[index], @grpc_fields[index].type)
end

#fieldsArray<Array>

Returns the names and values of the data as an array of field objects.

Returns:

  • (Array<Array>)

    An array containing name and value pairs.



49
50
51
# File 'lib/google/cloud/spanner/data.rb', line 49

def fields
  @fields ||= Fields.from_grpc @grpc_fields
end

#inspectObject



183
184
185
# File 'lib/google/cloud/spanner/data.rb', line 183

def inspect
  "#<#{self.class.name} #{self}>"
end

#keysArray<(String,Integer)>

Returns the names of values, or in cases in which values are unnamed, the zero-based index position of values.

Returns:

  • (Array<(String,Integer)>)

    An array containing the names (String) or position (Integer) for the corresponding values of the data.



73
74
75
# File 'lib/google/cloud/spanner/data.rb', line 73

def keys
  fields.keys
end

#pairsArray<Array>

Returns the names or positions and their corresponding values as an array of arrays.

Returns:

  • (Array<Array>)

    An array containing name/position and value pairs.



93
94
95
# File 'lib/google/cloud/spanner/data.rb', line 93

def pairs
  keys.zip values
end

#to_aArray<Object>

Returns the values as an array.

Returns:

  • (Array<Object>)

    An array containing the values of the data.



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/google/cloud/spanner/data.rb', line 127

def to_a
  values.map do |value|
    if value.is_a? Data
      value.to_h
    elsif value.is_a? Array
      value.map { |v| v.is_a?(Data) ? v.to_h : v }
    else
      value
    end
  end
end

#to_hHash<(String,Integer)=>Object>

Returns the names or indexes and corresponding values of the data as a hash. Do not use this method if the data has more than one member with the same name.

Returns:

  • (Hash<(String,Integer)=>Object>)

    A hash containing the names or indexes and corresponding values.

Raises:



150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/google/cloud/spanner/data.rb', line 150

def to_h
  fail DuplicateNameError if fields.duplicate_names?
  hashified_pairs = pairs.map do |key, value|
    if value.is_a? Data
      [key, value.to_h]
    elsif value.is_a? Array
      [key, value.map { |v| v.is_a?(Data) ? v.to_h : v }]
    else
      [key, value]
    end
  end
  Hash[hashified_pairs]
end

#to_sObject



171
172
173
174
175
176
177
178
179
180
# File 'lib/google/cloud/spanner/data.rb', line 171

def to_s
  named_values = pairs.map do |key, value|
    if key.is_a? Integer
      "#{value.inspect}"
    else
      "(#{key})#{value.inspect}"
    end
  end
  "(#{named_values.join ', '})"
end

#typesArray<Symbol>

Returns the types of the data.

See [Data types](cloud.google.com/spanner/docs/data-definition-language#data_types).

Returns:

  • (Array<Symbol>)

    An array containing the types of the values.



61
62
63
# File 'lib/google/cloud/spanner/data.rb', line 61

def types
  fields.types
end

#valuesArray<Object>

Returns the values of the data.

Returns:

  • (Array<Object>)

    An array containing the values.



82
83
84
# File 'lib/google/cloud/spanner/data.rb', line 82

def values
  keys.count.times.map { |i| self[i] }
end