Module: ActiveFacts::Generators::OOTraits::Role

Defined in:
lib/activefacts/generators/traits/oo.rb

Instance Method Summary collapse

Instance Method Details

#oo_role_definitionObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/activefacts/generators/traits/oo.rb', line 23

def oo_role_definition
  return if fact_type.entity_type

  if fact_type.all_role.size == 1
    return "    maybe :#{preferred_role_name}\n"
  elsif fact_type.all_role.size != 2
    # Shouldn't come here, except perhaps for an invalid model
    return  # ternaries and higher are always objectified
  end

  # REVISIT: TypeInheritance
  if fact_type.is_a?(ActiveFacts::Metamodel::TypeInheritance)
    # trace "Ignoring role #{self} in #{fact_type}, subtype fact type"
    # REVISIT: What about secondary subtypes?
    # REVISIT: What about dumping the relational mapping when using separate tables?
    return
  end

  return unless is_functional

  counterpart_role = fact_type.all_role.select{|r| r != self}[0]
  counterpart_type = counterpart_role.object_type
  counterpart_role_name = counterpart_role.preferred_role_name
  counterpart_type_default_role_name = counterpart_type.oo_default_role_name

  # It's a one_to_one if there's a uniqueness constraint on the other role:
  one_to_one = counterpart_role.is_functional
  return if one_to_one &&
      false # REVISIT: !@object_types_dumped[counterpart_role.object_type]

  # Find role name:
  role_method = preferred_role_name
  counterpart_role_method = one_to_one ? role_method : "all_"+role_method
  # puts "---"+role.role_name if role.role_name
  if counterpart_role_name != counterpart_type.oo_default_role_name and
      role_method == self.object_type.oo_default_role_name
#           debugger
    counterpart_role_method += "_as_#{counterpart_role_name}"
  end

  role_name = role_method
  role_name = nil if role_name == object_type.oo_default_role_name

  as_binary(counterpart_role_name, counterpart_type, is_mandatory, one_to_one, nil, role_name, counterpart_role_method)
end