class ActiveFacts::Generators::TransGen

Constants

INDENT

Public Class Methods

compatibility() click to toggle source
# File lib/activefacts/generator/transgen.rb, line 22
def self.compatibility
  # REVISIT: This should accept 2 compositions
  [1, %i{relational}]
end
new(constellation, composition, options = {}) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 27
def initialize constellation, composition, options = {}
  @constellation = constellation
  @composition = composition
  @options = options
end
options() click to toggle source
# File lib/activefacts/generator/transgen.rb, line 17
def self.options
  {
  }
end

Public Instance Methods

full_role_name(mapping) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 96
def full_role_name mapping
  if mapping.is_a?(ActiveFacts::Metamodel::Absorption)
    la = mapping.child_role.all_role_ref.to_a[0].leading_adjective
    ta = mapping.child_role.all_role_ref.to_a[0].trailing_adjective
    (la ? leading_hyphenate(la) + ' ' : '') + mapping.object_type.name + (ta ? ' ' + trailing_hyphenate(ta) : '')
  else
    mapping.object_type.name
  end
end
generate() click to toggle source
# File lib/activefacts/generator/transgen.rb, line 33
def generate
  @constellation = @composition.constellation
  @transform_topic = @constellation.Topic.values.select{|t| t.all_import_as_precursor_topic.size == 0}.first
  if !@constellation.Vocabulary.values.to_a[0].is_transform
    raise "Expected input file to be transform"
  end

  source_imports = @constellation.Import.values.select{|imp| imp.topic == @transform_topic && imp.import_role == "source"}
  target_imports = @constellation.Import.values.select{|imp| imp.topic == @transform_topic && imp.import_role == "target"}

  composite_list = @composition.all_composite.select do |composite|
    target_imports.detect do |imp|
      imp.precursor_topic.all_concept.detect{|c| c.object_type == composite.mapping.object_type}
    end
  end.sort_by{|composite| composite.mapping.name}

  generate_header(source_imports, target_imports) +
  composite_list.map{|composite| generate_transform_rule composite}*"\n" + "\n"
end
generate_compound_matching(mapping, level, prefix) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 127
def generate_compound_matching mapping, level, prefix
  members = mapping.all_member.sort_by(&:ordinal).flatten
  prefixed_name = (prefix.size > 0 ? prefix + ' . ' : '') + full_role_name(mapping)
  if members.size == 1
    generate_transform_matching(members[0], level, prefixed_name)
  else
    indent("#{prefixed_name} <== /* OBJECT TYPE or QUERY */ {\n", level) +
    members.map do |m|
      generate_transform_matching(m, level + 1, '')
    end * ",\n" + "\n" +
    indent("}", level)
  end
end
generate_header(source_imports, target_imports) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 53
def generate_header source_imports, target_imports
  "transform #{@transform_topic.topic_name};\n" +
  "\n" +
  source_imports.map{|imp| "import source #{imp.precursor_topic.topic_name};"} * "\n" + "\n" +
  target_imports.map{|imp| "import target #{imp.precursor_topic.topic_name};"} * "\n" + "\n" +
  "\n"
end
generate_new_transform_rule(composite) click to toggle source

New transform rule

# File lib/activefacts/generator/transgen.rb, line 109
def generate_new_transform_rule composite
  generate_compound_matching(composite.mapping, 0, '') + ";\n"
end
generate_simple_matching(mapping, level, prefix) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 121
def generate_simple_matching mapping, level, prefix
  full_name = full_role_name(mapping)
  prefixed_name = (prefix.size > 0 ? prefix + ' . ' : '') + full_name
  indent("#{prefixed_name} <-- /* EXPR */", level)
end
generate_transform_matching(mapping, level, prefix) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 113
def generate_transform_matching mapping, level, prefix
  if mapping.object_type.is_a?(ActiveFacts::Metamodel::ValueType)
    generate_simple_matching(mapping, level, prefix)
  else
    generate_compound_matching(mapping, level, prefix)
  end
end
generate_transform_rule(composite) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 61
def generate_transform_rule composite
  existing_rules = @transform_topic.all_concept.select do |concept|
    tr = concept.transform_rule and
      tr.compound_matching.all_transform_target_ref.to_a[0].object_type == composite.mapping.object_type
  end.map {|concept| concept.transform_rule}

  if existing_rules.size > 0
    existing_rules.map{|tr| regenerate_transform_rule(composite, tr)} * "\n\n"
  else
    generate_new_transform_rule(composite)
  end
end
indent(text, level) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 74
def indent text, level
  INDENT * level + text
end
leading_hyphenate(leading_adjective) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 78
def leading_hyphenate leading_adjective
  words = leading_adjective.words
  if words.size == 1
    leading_adjective + '-'
  else
    words[0] + '- ' + words[1..-1].join(' ')
  end
end
regenerate_transform_rule(composite, transform_rule) click to toggle source

Regenerate existing transform rule

# File lib/activefacts/generator/transgen.rb, line 144
def regenerate_transform_rule(composite, transform_rule)
  # regenerate_compound_matching(composite.mapping, 0, '') + ";\n"
end
trailing_hyphenate(trailing_adjective) click to toggle source
# File lib/activefacts/generator/transgen.rb, line 87
def trailing_hyphenate trailing_adjective
  words = trailing_adjective.words
  if words.size == 1
    '-' + trailing_adjective
  else
    words[0...-1].join(' ') + ' -' + words[-1]
  end
end