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