class GoodData::DataSource

Constants

ADS
BIGQUERY
DATA_SOURCES_URL
ERROR_MESSAGE_NO_SCHEMA
GENERIC
REDSHIFT
S3
SNOWFLAKE

Attributes

connection_info[RW]

Public Class Methods

[](id = :all, options = { client: GoodData.client }) click to toggle source

Get all data sources or get a specify data source from data source identify Expected parameter value:

  • :all return all data sources

  • :data_source_id return a data source with the specify data source identify

# File lib/gooddata/models/data_source.rb, line 28
def [](id = :all, options = { client: GoodData.client })
  c = GoodData.get_client(options)

  if id == :all
    data = c.get(DATA_SOURCES_URL)
    data['dataSources']['items'].map do |ds_data|
      c.create(DataSource, ds_data)
    end
  else
    c.create(DataSource, c.get(DATA_SOURCES_URL + '/' + id))
  end
end
all(options = { client: GoodData.client }) click to toggle source

Get all data sources

# File lib/gooddata/models/data_source.rb, line 64
def all(options = { client: GoodData.client })
  DataSource[:all, options]
end
create(opts) click to toggle source

Create data source from json Expected keys:

  • :name (mandatory)

  • :alias (optional)

  • :prefix (optional)

  • :connectionInfo (mandatory)

  • :client (mandatory)

# File lib/gooddata/models/data_source.rb, line 75
def create(opts)
  ds_name = opts[:name]
  ds_alias = opts[:alias]
  ds_prefix = opts[:prefix]
  ds_connection_info = opts[:connectionInfo]

  GoodData.logger.info "Creating data source '#{ds_name}'"
  fail ArgumentError, 'Data source name has to be provided' if ds_name.nil? || ds_name.blank?
  fail ArgumentError, 'Data source connection info has to be provided' if ds_connection_info.nil?

  json = {
    'dataSource' => {
      'name' => ds_name,
      'connectionInfo' => ds_connection_info
    }
  }
  json['dataSource']['alias'] = ds_alias if ds_alias
  json['dataSource']['prefix'] = ds_prefix if ds_prefix

  # Create data source
  c = GoodData.get_client(opts)
  res = c.post(DATA_SOURCES_URL, json)

  # create the public facing object
  c.create(DataSource, res)
end
from_alias(data_source_alias, options = { client: GoodData.client }) click to toggle source

Get a specify data source from data source alias

@param [String] data_source_alias Data source alias @return [DataSource] Data source corresponding in backend or throw exception if the data source alias doesn’t exist

# File lib/gooddata/models/data_source.rb, line 53
def from_alias(data_source_alias, options = { client: GoodData.client })
  data_sources = all(options)
  result = data_sources.find do |data_source|
    data_source.alias == data_source_alias
  end
  fail "Data source alias '#{data_source_alias}' has not found" unless result

  result
end
from_id(id, options = { client: GoodData.client }) click to toggle source

Get a specify data source from data source identify

@param [String] id Data source identify @return [DataSource] Data source corresponding in backend or throw exception if the data source identify doesn’t exist

# File lib/gooddata/models/data_source.rb, line 45
def from_id(id, options = { client: GoodData.client })
  DataSource[id, options]
end
new(json) click to toggle source
Calls superclass method
# File lib/gooddata/models/data_source.rb, line 133
def initialize(json)
  super
  @json = json
  validate
  @connection_info = build_connection_info
end

Public Instance Methods

alias() click to toggle source
# File lib/gooddata/models/data_source.rb, line 152
def alias
  @json['dataSource']['alias']
end
alias=(new_alias) click to toggle source
# File lib/gooddata/models/data_source.rb, line 156
def alias=(new_alias)
  @json['dataSource']['alias'] = new_alias
end
delete() click to toggle source
# File lib/gooddata/models/data_source.rb, line 129
def delete
  saved? ? client.delete(uri) : nil
end
id() click to toggle source
# File lib/gooddata/models/data_source.rb, line 172
def id
  uri.split('/')[-1]
end
is(type) click to toggle source
# File lib/gooddata/models/data_source.rb, line 176
def is(type)
  @json['dataSource']['connectionInfo'][type]
end
name() click to toggle source
# File lib/gooddata/models/data_source.rb, line 144
def name
  @json['dataSource']['name']
end
name=(new_name) click to toggle source
# File lib/gooddata/models/data_source.rb, line 148
def name=(new_name)
  @json['dataSource']['name'] = new_name
end
prefix() click to toggle source
# File lib/gooddata/models/data_source.rb, line 160
def prefix
  @json['dataSource']['prefix']
end
prefix=(new_prefix) click to toggle source
# File lib/gooddata/models/data_source.rb, line 164
def prefix=(new_prefix)
  @json['dataSource']['prefix'] = new_prefix
end
save() click to toggle source

Save data source to backend. The saving will validate existing data source name and connection info. So need set values for them.

Input info:

  • :name (mandatory)

  • :alias (optional)

  • :prefix (optional)

  • :connectionInfo (mandatory)

Return: create data source in backend and return data source object corresponding with data source in backend.

# File lib/gooddata/models/data_source.rb, line 113
def save
  validate
  validate_connection_info
  if saved?
    update_obj_json = client.put(uri, to_update_payload)
    @json = update_obj_json
  else
    res = client.post(DATA_SOURCES_URL, to_update_payload)
    fail 'Unable to create new Data Source' if res.nil?

    @json = res
  end
  @connection_info = build_connection_info
  self
end
saved?() click to toggle source
# File lib/gooddata/models/data_source.rb, line 140
def saved?
  !uri.blank?
end
type() click to toggle source
# File lib/gooddata/models/data_source.rb, line 180
def type
  @json['dataSource']['connectionInfo'].first[0].upcase
end
uri() click to toggle source
# File lib/gooddata/models/data_source.rb, line 168
def uri
  @json['dataSource']['links']['self'] if @json && @json['dataSource'] && @json['dataSource']['links']
end

Private Instance Methods

ads_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 233
def ads_connection_info
  return nil unless is(ADS)

  AdsConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
bigquery_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 215
def bigquery_connection_info
  return nil unless is(BIGQUERY)

  BigQueryConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
build_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 186
def build_connection_info
  return snowflake_connection_info if is(SNOWFLAKE)
  return redshift_connection_info if is(REDSHIFT)
  return bigquery_connection_info if is(BIGQUERY)
  return generic_connection_info if is(GENERIC)
  return s3_connection_info if is(S3)
  return ads_connection_info if is(ADS)

  # In case don't know data source type then support get or set directly json data for connection info
  ConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
generic_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 221
def generic_connection_info
  return nil unless is(GENERIC)

  GenericConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
redshift_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 209
def redshift_connection_info
  return nil unless is(REDSHIFT)

  RedshiftConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
s3_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 227
def s3_connection_info
  return nil unless is(S3)

  S3ConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
snowflake_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 203
def snowflake_connection_info
  return nil unless is(SNOWFLAKE)

  SnowflakeConnectionInfo.new(@json['dataSource']['connectionInfo'])
end
support_connection_info(connection_info) click to toggle source
# File lib/gooddata/models/data_source.rb, line 198
def support_connection_info(connection_info)
  [SnowflakeConnectionInfo, RedshiftConnectionInfo, BigQueryConnectionInfo,
   GenericConnectionInfo, S3ConnectionInfo, AdsConnectionInfo].include? connection_info.class
end
to_update_payload() click to toggle source
# File lib/gooddata/models/data_source.rb, line 239
def to_update_payload
  json_data = {
    'dataSource' => {
      'name' => name,
      'connectionInfo' => @connection_info.to_update_payload
    }
  }
  json_data['dataSource']['alias'] = self.alias if self.alias
  json_data['dataSource']['prefix'] = prefix if prefix
  json_data
end
validate() click to toggle source
# File lib/gooddata/models/data_source.rb, line 251
def validate
  fail 'Invalid data source json data' unless @json['dataSource']
  fail 'Data source connection info has to be provided' unless @json['dataSource']['connectionInfo']
  fail 'Data source name has to be provided' if name.nil? || name.blank?
end
validate_connection_info() click to toggle source
# File lib/gooddata/models/data_source.rb, line 257
def validate_connection_info
  @connection_info.validate
end