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



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

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



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

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
    fact_to_manifest(project, dataset, c, mode)
  when :date_fact
    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



61
62
63
64
65
66
67
68
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 61

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



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 77

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



98
99
100
101
102
103
104
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 98

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



109
110
111
112
113
114
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 109

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



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 123

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



172
173
174
175
176
177
178
179
180
181
182
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 172

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



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/gooddata/models/blueprint/to_manifest.rb', line 146

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