# encoding: UTF-8 module GoodData module Model module FromWire # Converts anchor from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_anchor(stuff) attribute = stuff['dataset']['anchor']['attribute'] if !attribute.key?('labels') [] else labels = attribute['labels'] || [] default_label = attribute['defaultLabel'] primary_label_name = attribute['identifier'].split('.').last dataset_name = attribute['identifier'].split('.')[1] primary_label_identifier = GoodData::Model.identifier_for({ name: dataset_name }, type: :primary_label, name: primary_label_name) primary_labels, regular_labels = labels.partition { |x| x['label']['identifier'] == primary_label_identifier } dl = primary_labels.map do |label| parse_label(attribute, label, 'anchor', default_label) end rl = regular_labels.map do |label| parse_label(attribute, label, 'label', default_label) end dl + rl end end # Converts attrbutes from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_attributes(stuff) dataset = stuff['dataset'] attributes = dataset['attributes'] || [] attributes.mapcat do |a| attribute = a['attribute'] labels = attribute['labels'] || [] default_label = attribute['defaultLabel'] primary_label_name = attribute['identifier'].split('.').last dataset_name = attribute['identifier'].split('.')[1] primary_label_identifier = GoodData::Model.identifier_for({ name: dataset_name }, type: :primary_label, name: primary_label_name) primary_labels, regular_labels = labels.partition { |x| x['label']['identifier'] == primary_label_identifier } dl = primary_labels.map do |label| parse_label(attribute, label, 'attribute', default_label) end rl = regular_labels.map do |label| parse_label(attribute, label, 'label', default_label) end dl + rl end end # Converts date dimensions from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_date_dimensions(stuff) {}.tap do |d| d[:type] = :date_dimension # d[:urn] = :date_dimension d[:name] = stuff['dateDimension']['name'] d[:title] = stuff['dateDimension']['title'] if stuff['dateDimension']['title'] != d[:name].titleize end end # Converts facts from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_facts(stuff) facts = stuff['dataset']['facts'] || [] facts.map do |fact| {}.tap do |f| f[:type] = fact['fact']['identifier'] =~ /^dt\./ ? :date_fact : :fact f[:name] = fact['fact']['identifier'].split('.').last f[:title] = fact['fact']['title'] if fact['fact']['title'] != fact['fact']['identifier'].split('.').last.titleize f[:gd_data_type] = fact['fact']['dataType'] if fact['fact'].key?('dataType') end end end # Converts label from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_label(attribute, label, type, default_label = nil) {}.tap do |l| l[:type] = type l[:reference] = attribute['identifier'].split('.').last if type == 'label' l[:name] = label['label']['identifier'].split('.').last l[:title] = label['label']['title'] if label['label']['title'] != label['label']['identifier'].split('.').last.titleize l[:gd_data_type] = label['label']['dataType'] if label['label'].key?('dataType') l[:gd_type] = label['label']['type'] if label['label'].key?('type') l[:default_label] = true if default_label == label['label']['identifier'] end end # Converts label from wire format into an internal blueprint representation # # @param stuff [Hash] Whatever comes from wire # @return [Hash] Manifest for a particular reference def self.parse_references(stuff) references = stuff['dataset']['references'] || [] references.map do |ref| if ref =~ /^dataset\./ { :type => :reference, :name => ref.gsub(/^dataset\./, ''), :dataset => ref.gsub(/^dataset\./, '') } else { :type => :date, :name => ref.gsub(/^dataset\./, ''), :dataset => ref.gsub(/^dataset\./, '') } end end end end end end