lib/activefacts/compositions/names.rb in activefacts-compositions-1.9.6 vs lib/activefacts/compositions/names.rb in activefacts-compositions-1.9.8
- old
+ new
@@ -1,80 +1,80 @@
#
# ActiveFacts Compositions, Metamodel aspect to build compacted column names for (leaf) Components
#
-# Compresses the names arising from absorption paths into usable column names
+# Compresses the names arising from absorption paths into usable column names
#
# Copyright (c) 2016 Clifford Heath. Read the LICENSE file.
#
require "activefacts/compositions"
module ActiveFacts
module Metamodel
class Component
def column_name
- column_path = path[1..-1]
- prev_words = []
- String::Words.new(
- column_path.
- inject([]) do |na, member|
- is_absorption = member.is_a?(Absorption)
- is_type_inheritance = is_absorption && member.parent_role.fact_type.is_a?(TypeInheritance)
- fact_type = is_absorption && member.parent_role.fact_type
+ column_path = path[1..-1]
+ prev_words = []
+ String::Words.new(
+ column_path.
+ inject([]) do |na, member|
+ is_absorption = member.is_a?(Absorption)
+ is_type_inheritance = is_absorption && member.parent_role.fact_type.is_a?(TypeInheritance)
+ fact_type = is_absorption && member.parent_role.fact_type
- # If the parent object identifies the child via this absorption, skip it.
- if member != column_path.first and
- is_absorption and
- !is_type_inheritance and
- member.parent_role.base_role.is_identifying
- trace :names, "Skipping #{member}, identifies non-initial object"
- next na
- end
+ # If the parent object identifies the child via this absorption, skip it.
+ if member != column_path.first and
+ is_absorption and
+ !is_type_inheritance and
+ member.parent_role.base_role.is_identifying
+ trace :names, "Skipping #{member}, identifies non-initial object"
+ next na
+ end
- words = member.name.words
+ words = member.name.words
- if na.size > 0 && is_type_inheritance
- # When traversing type inheritances, keep the subtype name, not the supertype names as well:
- if member.child_role != fact_type.subtype_role
- trace :names, "Skipping supertype #{member}"
- next na
- end
- trace :names, "Eliding supertype in #{member}"
- prev_words.size.times{na.pop}
+ if na.size > 0 && is_type_inheritance
+ # When traversing type inheritances, keep the subtype name, not the supertype names as well:
+ if member.child_role != fact_type.subtype_role
+ trace :names, "Skipping supertype #{member}"
+ next na
+ end
+ trace :names, "Eliding supertype in #{member}"
+ prev_words.size.times{na.pop}
- elsif member.parent && member != column_path.first && is_absorption && member.child_role.base_role.is_identifying
- # When Xyz is followed by identifying XyzID (even if we skipped the Xyz), truncate that to just ID
- pnames = member.parent.name.words
- if pnames == words[0, pnames.size]
- pnames.size.times do
- pnames.shift
- words.shift
- end
- end
- end
+ elsif member.parent && member != column_path.first && is_absorption && member.child_role.base_role.is_identifying
+ # When Xyz is followed by identifying XyzID (even if we skipped the Xyz), truncate that to just ID
+ pnames = member.parent.name.words
+ if pnames == words[0, pnames.size]
+ pnames.size.times do
+ pnames.shift
+ words.shift
+ end
+ end
+ end
- # If the reference is to the single identifying role of the object_type making the reference,
- # strip the object_type name from the start of the reference role
- if na.size > 0 and
- is_absorption and
- member.child_role.base_role.is_identifying and
- (et = member.object_type).is_a?(EntityType) and
- et.preferred_identifier.role_sequence.all_role_ref.size == 0 and
- et.name.downcase == words[0][0...et.name.size].downcase
- trace :columns, "truncating transitive identifying role #{words.inspect}"
- words[0] = words[0][et.name.size..-1]
- words.shift if words[0] == ''
- end
+ # If the reference is to the single identifying role of the object_type making the reference,
+ # strip the object_type name from the start of the reference role
+ if na.size > 0 and
+ is_absorption and
+ member.child_role.base_role.is_identifying and
+ (et = member.object_type).is_a?(EntityType) and
+ et.preferred_identifier.role_sequence.all_role_ref.size == 0 and
+ et.name.downcase == words[0][0...et.name.size].downcase
+ trace :columns, "truncating transitive identifying role #{words.inspect}"
+ words[0] = words[0][et.name.size..-1]
+ words.shift if words[0] == ''
+ end
- prev_words = words
- na += words.to_a
- end.elide_repeated_subsequences do |a, b|
- if a.is_a?(Array)
- a.map{|e| e.downcase} == b.map{|e| e.downcase}
- else
- a.downcase == b.downcase
- end
- end
- )
+ prev_words = words
+ na += words.to_a
+ end.elide_repeated_subsequences do |a, b|
+ if a.is_a?(Array)
+ a.map{|e| e.downcase} == b.map{|e| e.downcase}
+ else
+ a.downcase == b.downcase
+ end
+ end
+ )
end
end
end
end