Module: GoodData::Model::ToManifest

Defined in:
lib/gooddata/models/blueprint/to_manifest.rb

Class Method Summary collapse

Class Method Details

.attribute_to_manifest(_project, dataset, a, mode) ⇒ Hash

Converts attribute or anchor to manifest

Parameters:

Returns:

  • (Hash)

    Manifest for a particular reference



15
16
17
18
19
20
21
22
23
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 15

def self.attribute_to_manifest(_project, dataset, a, mode)
  labels = DatasetBlueprint.labels_for_attribute(dataset, a)
  [{
    'referenceKey' => 1,
    'populates' => [labels.first[:id]],
    'mode' => mode,
    'columnName' => labels.first[:column_name] || labels.first[:id]
  }]
end

.column_to_manifest(project, dataset, c, mode) ⇒ Object

Sets the active project

Examples

The following calls are equivalent

Parameters:

  • project

    A project identifier



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 33

def self.column_to_manifest(project, dataset, c, mode)
  case c[:type].to_sym
  when :label
    label_to_manifest(project, dataset, c, mode)
  when :fact, :date_fact, :hll
    fact_to_manifest(project, dataset, c, mode)
  when :reference
    reference_to_manifest(project, dataset, c, mode)
  when :date
    date_ref_to_manifest(project, dataset, c, mode)
  else
    []
  end
end

.dataset_to_manifest(project, dataset, mode = 'FULL') ⇒ Hash

Converts dataset into manifest. Since for manifest of a dataset you need to have access to the whole project blueprint it requires both project and dataset blueprints. It generates the manifest for blueprint and then selects only the one for particular dataset

Parameters:

Returns:

  • (Hash)

    Manifest for a particular dataset



57
58
59
60
61
62
63
64
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 57

def self.dataset_to_manifest(project, dataset, mode = 'FULL')
  dataset = dataset.is_a?(String) ? Model::ProjectBlueprint.find_dataset(project, dataset) : dataset
  dataset = dataset.to_hash
  res = Model::ProjectBlueprint.datasets(project).zip(to_manifest(project, mode)).find do |ds|
    ds.first == dataset
  end
  res[1]
end

.date_ref_to_manifest(project, _dataset, reference, mode) ⇒ Hash

Converts data reference to manifest

Parameters:

Returns:

  • (Hash)

    Manifest for a particular date reference



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 73

def self.date_ref_to_manifest(project, _dataset, reference, mode)
  referenced_dataset = ProjectBlueprint.find_date_dimension(project, reference[:dataset])
  ref = "#{referenced_dataset[:id]}.date.mdyy"
  format = reference[:format] || GoodData::Model::DEFAULT_DATE_FORMAT
  GoodData.logger.info("Using date format \"#{format}\" for referencing attribute \"#{ref}\" of date dimension \"#{referenced_dataset[:id]}\"")
  [{
    'populates' => [ref],
    'mode' => mode,
    'constraints' => { 'date' => format },
    'columnName' => reference[:column_name] || reference[:dataset],
    'referenceKey' => 1
  }]
end

.fact_to_manifest(_project, _dataset, fact, mode) ⇒ Hash

Converts fact to manifest

Parameters:

Returns:

  • (Hash)

    Manifest for a particular fact



94
95
96
97
98
99
100
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 94

def self.fact_to_manifest(_project, _dataset, fact, mode)
  [{
    'populates' => [fact[:id]],
    'mode' => mode,
    'columnName' => fact[:column_name] || fact[:id]
  }]
end

.generate_upload_filename(dataset_path) ⇒ String

Generates safe name for upload

Parameters:

  • dataset_path (String)

    Input name

Returns:

  • (String)

    Generated upload filename



105
106
107
108
109
110
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 105

def self.generate_upload_filename(dataset_path)
  sanitized_name = dataset_path.gsub(/[^0-9a-z]/i, '_')
  # ts = DateTime.now.strftime('%Y%m%d%H%M%S%6N')
  # "#{sanitized_name}-#{ts}.csv"
  "#{sanitized_name}.csv"
end

.label_to_manifest(_project, dataset, label, mode) ⇒ Hash

Converts label to manifest

Parameters:

Returns:

  • (Hash)

    Manifest for a particular label



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 119

def self.label_to_manifest(_project, dataset, label, mode)
  a = DatasetBlueprint.attribute_for_label(dataset, label)
  labels = DatasetBlueprint.labels_for_attribute(dataset, a)

  label = {}.tap do |l|
    if labels.any? { |lab| lab.key?(:reference_label) } && label[:reference_label] == true
      l['referenceKey'] = 1
    elsif labels.all? { |lab| !lab.key?(:reference_label) } && labels.first == label
      l['referenceKey'] = 1
    end
    l['populates'] = [label[:id]]
    l['mode'] = mode
    l['columnName'] = label[:column_name] || label[:id]
  end
  [label]
end

.reference_to_manifest(project, _dataset, reference, mode) ⇒ Hash

Converts reference to manifest

Parameters:

Returns:

  • (Hash)

    Manifest for a particular reference



168
169
170
171
172
173
174
175
176
177
178
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 168

def self.reference_to_manifest(project, _dataset, reference, mode)
  referenced_dataset = ProjectBlueprint.find_dataset(project, reference[:dataset])
  anchor = DatasetBlueprint.anchor(referenced_dataset)
  label = DatasetBlueprint.reference_label_for_attribtue(referenced_dataset, anchor)
  [{
    'populates' => [label[:id]],
    'mode' => mode,
    'columnName' => reference[:column_name] || reference[:dataset],
    'referenceKey' => 1
  }]
end

.to_manifest(project, mode = 'FULL') ⇒ Hash

The entry function of the module. Converts the ProjectBlueprint to manifest to be used with SLI (GD loading interface).

Parameters:

Returns:

  • (Hash)

    Manifest for a particular project



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 142

def self.to_manifest(project, mode = 'FULL')
  ProjectBlueprint.datasets(project.to_hash).map do |dataset|
    columns = GoodData::Model::DatasetBlueprint.columns(dataset)
    {
      'dataSetSLIManifest' => {
        'parts' => columns.mapcat { |c| column_to_manifest(project, dataset, c, mode) },
        'dataSet' => dataset[:id],
        'file' => ToManifest.generate_upload_filename(dataset[:id]), # should be configurable
        'csvParams' => {
          'quoteChar' => '"',
          'escapeChar' => '"',
          'separatorChar' => ',',
          'endOfLine' => "\n"
        }
      }
    }
  end
end