activefacts 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +5 -13
  2. data/Rakefile +2 -2
  3. data/bin/afgen +1 -1
  4. data/bin/cql +118 -27
  5. data/examples/CQL/Insurance.cql +2 -2
  6. data/examples/CQL/Metamodel.cql +3 -3
  7. data/examples/CQL/SchoolActivities.cql +1 -1
  8. data/examples/CQL/Warehousing.cql +5 -4
  9. data/lib/activefacts/cql.rb +1 -1
  10. data/lib/activefacts/cql/Language/English.treetop +2 -1
  11. data/lib/activefacts/cql/compiler.rb +6 -6
  12. data/lib/activefacts/cql/compiler/clause.rb +69 -46
  13. data/lib/activefacts/cql/compiler/constraint.rb +14 -14
  14. data/lib/activefacts/cql/compiler/entity_type.rb +24 -24
  15. data/lib/activefacts/cql/compiler/fact.rb +40 -27
  16. data/lib/activefacts/cql/compiler/fact_type.rb +16 -16
  17. data/lib/activefacts/cql/compiler/query.rb +12 -12
  18. data/lib/activefacts/cql/compiler/shared.rb +9 -0
  19. data/lib/activefacts/cql/compiler/value_type.rb +4 -4
  20. data/lib/activefacts/cql/parser.rb +9 -9
  21. data/lib/activefacts/generate/cql.rb +41 -20
  22. data/lib/activefacts/generate/helpers/oo.rb +33 -70
  23. data/lib/activefacts/generate/helpers/ordered.rb +61 -87
  24. data/lib/activefacts/generate/ruby.rb +12 -72
  25. data/lib/activefacts/generate/transform/surrogate.rb +13 -13
  26. data/lib/activefacts/input/orm.rb +72 -71
  27. data/lib/activefacts/persistence/columns.rb +66 -31
  28. data/lib/activefacts/persistence/foreignkey.rb +6 -6
  29. data/lib/activefacts/persistence/index.rb +12 -12
  30. data/lib/activefacts/persistence/object_type.rb +15 -12
  31. data/lib/activefacts/persistence/reference.rb +20 -18
  32. data/lib/activefacts/persistence/tables.rb +40 -36
  33. data/lib/activefacts/support.rb +69 -123
  34. data/lib/activefacts/version.rb +2 -2
  35. data/lib/activefacts/vocabulary/extensions.rb +42 -39
  36. data/lib/activefacts/vocabulary/metamodel.rb +11 -1
  37. data/lib/activefacts/vocabulary/verbaliser.rb +28 -28
  38. data/spec/cql/contractions_spec.rb +1 -1
  39. data/spec/cql/entity_type_spec.rb +1 -1
  40. data/spec/cql/fact_type_matching_spec.rb +3 -3
  41. data/spec/cql/role_matching_spec.rb +4 -4
  42. data/spec/cql/samples_spec.rb +2 -2
  43. data/spec/cql_cql_spec.rb +1 -1
  44. data/spec/helpers/array_matcher.rb +1 -1
  45. data/spec/norma_ruby_sql_spec.rb +2 -2
  46. data/spec/norma_tables_spec.rb +3 -2
  47. metadata +47 -68
@@ -7,10 +7,12 @@
7
7
  require 'activefacts'
8
8
  require 'activefacts/vocabulary'
9
9
  require 'activefacts/generate/helpers/oo'
10
+ require 'activefacts/generate/traits/ruby'
10
11
  require 'activefacts/mapping/rails'
11
12
 
12
13
  module ActiveFacts
13
14
  module Generate
15
+
14
16
  # Generate Ruby module containing classes for an ActiveFacts vocabulary.
15
17
  # Invoke as
16
18
  # afgen --ruby[=options] <file>.cql
@@ -34,20 +36,12 @@ module ActiveFacts
34
36
  end
35
37
  end
36
38
 
37
- def vocabulary_start(vocabulary)
38
- puts "require 'activefacts/api'\n"
39
- if @mapping
40
- require 'activefacts/persistence'
41
- end
42
- if @mapping == 'sql'
43
- puts "require 'activefacts/persistence'\n"
44
- @tables = vocabulary.tables
45
- end
46
- puts "\nmodule ::#{vocabulary.name}\n\n"
39
+ def vocabulary_start
40
+ puts @vocabulary.prelude
47
41
  end
48
42
 
49
43
  def vocabulary_end
50
- puts "end"
44
+ puts @vocabulary.finale
51
45
  end
52
46
 
53
47
  def emit_mapping o
@@ -64,23 +58,7 @@ module ActiveFacts
64
58
  end
65
59
 
66
60
  def value_type_dump(o, super_type_name, facets)
67
- length = (l = o.length) && l > 0 ? ":length => #{l}" : nil
68
- scale = (s = o.scale) && s > 0 ? ":scale => #{s}" : nil
69
- params = [length,scale].compact * ", "
70
-
71
- ruby_type_name = super_type_name.gsub(/ /,'')
72
- name = o.name.sub(/^[a-z]/) {|i| i.upcase}.gsub(/ /,'')
73
- if ruby_type_name == name
74
- ruby_type_name = '::'+ruby_type_name
75
- end
76
-
77
- puts " class #{name} < #{ruby_type_name}\n" +
78
- " value_type #{params}\n"
79
- emit_mapping o if o.is_table
80
- puts " restrict #{o.value_constraint.all_allowed_range_sorted.map{|ar| ar.to_s}*", "}\n" if o.value_constraint
81
- puts " \# REVISIT: #{o.name} is in units of #{o.unit.name}\n" if o.unit
82
- roles_dump(o)
83
- puts " end\n\n"
61
+ puts o.ruby_definition
84
62
  end
85
63
 
86
64
  def subtype_dump(o, supertypes, pi = nil)
@@ -94,7 +72,7 @@ module ActiveFacts
94
72
  fact_roles_dump(o.fact_type) if o.fact_type
95
73
  roles_dump(o)
96
74
  puts " end\n\n"
97
- @constraints_used[pi] = true if pi
75
+ pi.ordered_dumped! if pi
98
76
  end
99
77
 
100
78
  def non_subtype_dump(o, pi)
@@ -106,7 +84,7 @@ module ActiveFacts
106
84
  fact_roles_dump(o.fact_type) if o.fact_type
107
85
  roles_dump(o)
108
86
  puts " end\n\n"
109
- @constraints_used[pi] = true
87
+ pi.ordered_dumped!
110
88
  end
111
89
 
112
90
  # Dump one fact type.
@@ -131,12 +109,12 @@ module ActiveFacts
131
109
  roles_dump(o)
132
110
  puts " end\n\n"
133
111
 
134
- @fact_types_dumped[fact_type] = true
112
+ fact_type.ordered_dumped!
135
113
  end
136
114
 
137
115
  def identified_by_roles_and_facts(entity_type, identifying_role_refs, identifying_facts)
138
116
  identifying_role_refs.map{|role_ref|
139
- ":"+preferred_role_name(role_ref.role, entity_type)
117
+ ":"+role_ref.role.preferred_role_name(entity_type)
140
118
  }*", "
141
119
  end
142
120
 
@@ -144,46 +122,8 @@ module ActiveFacts
144
122
  puts " maybe :"+role_name
145
123
  end
146
124
 
147
- def binary_dump(role, role_name, role_player, mandatory = nil, one_to_one = nil, readings = nil, other_role_name = nil, other_method_name = nil)
148
- ruby_role_name = ":"+role_name.gsub(/ /,'_')
149
-
150
- # Find whether we need the name of the other role player, and whether it's defined yet:
151
- implied_role_name = role_player.name.gsub(/ /,'').sub(/^[a-z]/) {|i| i.upcase}
152
- if role_name.camelcase != implied_role_name
153
- # Only use Class name if it's not implied by the rolename
154
- role_reference = ":class => "+object_type_reference(role_player)
155
- end
156
-
157
- other_role_name = ":counterpart => :"+other_role_name.gsub(/ /,'_') if other_role_name
158
-
159
- if vr = role.role_value_constraint
160
- value_restriction = ":restrict => #{vr}"
161
- end
162
-
163
- options = [
164
- ruby_role_name,
165
- role_reference,
166
- mandatory ? ":mandatory => true" : nil,
167
- readings,
168
- other_role_name,
169
- value_restriction
170
- ].compact
171
-
172
- line = " #{one_to_one ? "one_to_one" : "has_one" } #{options*', '} "
173
- if other_method_name
174
- line += " "*(48-line.length) if line.length < 48
175
- line += "\# See #{role_player.name.gsub(/ /,'')}.#{other_method_name}"
176
- end
177
- puts line
178
- #puts " \# REVISIT: #{other_role_name} has values restricted to #{role.role_value_constraint}\n" if role.role_value_constraint
179
- end
180
-
181
- def object_type_reference object_type
182
- if !@object_types_dumped[object_type]
183
- '"'+object_type.name.gsub(/ /,'')+'"'
184
- else
185
- role_reference = object_type.name.gsub(/ /,'')
186
- end
125
+ def binary_dump(role, role_name, role_player, mandatory = nil, one_to_one = nil, readings = nil, counterpart_role_name = nil, counterpart_method_name = nil)
126
+ puts role.as_binary(role_name, role_player, mandatory, one_to_one, readings, counterpart_role_name, counterpart_method_name)
187
127
  end
188
128
 
189
129
  end
@@ -71,7 +71,7 @@ module ActiveFacts
71
71
  end
72
72
 
73
73
  def inject_surrogate
74
- debug :transform_surrogate, "Adding surrogate ID to Value Type #{name}"
74
+ trace :transform_surrogate, "Adding surrogate ID to Value Type #{name}"
75
75
  add_surrogate('Auto Counter', 'ID')
76
76
  end
77
77
  end
@@ -96,22 +96,22 @@ module ActiveFacts
96
96
  def needs_surrogate
97
97
 
98
98
  # A recursive proc to replace any reference to an Entity Type by its identifying references:
99
- debug :transform_surrogate_expansion, "Expanding key for #{name}"
99
+ trace :transform_surrogate_expansion, "Expanding key for #{name}"
100
100
  substitute_identifying_refs = proc do |object|
101
101
  if ref = object.absorbed_via
102
102
  # This shouldn't be necessary, but see the absorbed_via comment above.
103
103
  absorbed_into = ref.from
104
- debug :transform_surrogate_expansion, "recursing to handle absorption of #{object.name} into #{absorbed_into.name}"
104
+ trace :transform_surrogate_expansion, "recursing to handle absorption of #{object.name} into #{absorbed_into.name}"
105
105
  [substitute_identifying_refs.call(absorbed_into)]
106
106
  else
107
107
  irf = object.identifying_refs_from
108
- debug :transform_surrogate_expansion, "Iterating for #{object.name} over #{irf.inspect}" do
108
+ trace :transform_surrogate_expansion, "Iterating for #{object.name} over #{irf.inspect}" do
109
109
  irf.each_with_index do |ref, i|
110
110
  next if ref.is_unary
111
111
  next if ref.to_role.object_type.kind_of?(ActiveFacts::Metamodel::ValueType)
112
112
  recurse_to = ref.to_role.object_type
113
113
 
114
- debug :transform_surrogate_expansion, "#{i}: recursing to expand #{recurse_to.name} key in #{ref}" do
114
+ trace :transform_surrogate_expansion, "#{i}: recursing to expand #{recurse_to.name} key in #{ref}" do
115
115
  irf[i] = substitute_identifying_refs.call(recurse_to)
116
116
  end
117
117
  end
@@ -121,7 +121,7 @@ module ActiveFacts
121
121
  end
122
122
  irf = substitute_identifying_refs.call(self)
123
123
 
124
- debug :transform_surrogate, "Does #{name} need a surrogate? it's identified by #{irf.inspect}" do
124
+ trace :transform_surrogate, "Does #{name} need a surrogate? it's identified by #{irf.inspect}" do
125
125
 
126
126
  pk_fks = identifying_refs_from.map do |ref|
127
127
  ref.to && ref.to.is_table ? ref.to : nil
@@ -132,13 +132,13 @@ module ActiveFacts
132
132
  # Multi-part identifiers are only allowed if each part is a foreign key (i.e. it's a join table) and the object is not the target of a foreign key:
133
133
  if irf.size >= 2
134
134
  if pk_fks.include?(nil)
135
- debug :transform_surrogate, "#{self.name} needs a surrogate because its multi-part key contains a non-table"
135
+ trace :transform_surrogate, "#{self.name} needs a surrogate because its multi-part key contains a non-table"
136
136
  return true
137
137
  elsif references_to.size != 0
138
- debug :transform_surrogate, "#{self.name} is a join table between #{pk_fks.map(&:name).inspect} but is also an FK target"
138
+ trace :transform_surrogate, "#{self.name} is a join table between #{pk_fks.map(&:name).inspect} but is also an FK target"
139
139
  return true
140
140
  else
141
- debug :transform_surrogate, "#{self.name} is a join table between #{pk_fks.map(&:name).inspect}"
141
+ trace :transform_surrogate, "#{self.name} is a join table between #{pk_fks.map(&:name).inspect}"
142
142
  return false
143
143
  end
144
144
  return true
@@ -148,7 +148,7 @@ module ActiveFacts
148
148
 
149
149
  identifying_type = irf[0].to
150
150
  if identifying_type.needs_surrogate
151
- debug :transform_surrogate, "#{self.name} needs a surrogate because #{irf[0].to.name} is not an AutoCounter, but #{identifying_type.supertypes_transitive.map(&:name).inspect}"
151
+ trace :transform_surrogate, "#{self.name} needs a surrogate because #{irf[0].to.name} is not an AutoCounter, but #{identifying_type.supertypes_transitive.map(&:name).inspect}"
152
152
  return true
153
153
  end
154
154
 
@@ -157,17 +157,17 @@ module ActiveFacts
157
157
  end
158
158
 
159
159
  def inject_surrogate
160
- debug :transform_surrogate, "Injecting a surrogate key into #{self.name}"
160
+ trace :transform_surrogate, "Injecting a surrogate key into #{self.name}"
161
161
 
162
162
  # Disable the preferred identifier:
163
163
  pi = preferred_identifier
164
- debug :transform_surrogate, "pi for #{name} was '#{pi.describe}'"
164
+ trace :transform_surrogate, "pi for #{name} was '#{pi.describe}'"
165
165
  pi.is_preferred_identifier = false
166
166
  @preferred_identifier = nil # Kill the cache
167
167
 
168
168
  add_surrogate
169
169
 
170
- debug :transform_surrogate, "pi for #{name} is now '#{preferred_identifier.describe}'"
170
+ trace :transform_surrogate, "pi for #{name} is now '#{preferred_identifier.describe}'"
171
171
  end
172
172
 
173
173
  end
@@ -158,7 +158,7 @@ module ActiveFacts
158
158
  name = nil if name.size == 0
159
159
  entity_type =
160
160
  @by_id[id] =
161
- debug :orm, "Asserting new EntityType #{name.inspect}" do
161
+ trace :orm, "Asserting new EntityType #{name.inspect}" do
162
162
  @vocabulary.valid_entity_type_name(name) ||
163
163
  @constellation.EntityType(@vocabulary, name, :concept => id_of(x))
164
164
  end
@@ -212,13 +212,14 @@ module ActiveFacts
212
212
  type_name = t
213
213
  end
214
214
  end
215
- debug :orm, "Using #{type_name.inspect} as supertype for new #{name}"
215
+ trace :orm, "Using #{type_name.inspect} as supertype for new #{name}"
216
216
  if !length and type_name =~ /\(([0-9]+)\)/
217
217
  length = $1.to_i
218
218
  end
219
219
  type_name = type_name.sub(/\(([0-9]*)\)/,'')
220
220
 
221
221
  subtype_roles = x.xpath("orm:PlayedRoles/orm:SubtypeMetaRole")
222
+ value_super_type = nil
222
223
  if !subtype_roles.empty?
223
224
  subtype_role_id = subtype_roles[0]['ref']
224
225
  subtype_role = @x_by_id[subtype_role_id]
@@ -230,7 +231,7 @@ module ActiveFacts
230
231
  supertype_name = x_supertype['Name']
231
232
  raise "Supertype of #{name} is post-defined but recursiving processing failed" unless supertype
232
233
  raise "Supertype #{supertype_name} of #{name} is not a value type" unless supertype.kind_of? ActiveFacts::Metamodel::ValueType
233
- debug :orm, "Asserting new ValueType #{supertype_name.inspect} for supertype" do
234
+ trace :orm, "Asserting new ValueType #{supertype_name.inspect} for supertype" do
234
235
  value_super_type =
235
236
  @vocabulary.valid_value_type_name(supertype_name) ||
236
237
  @constellation.ValueType(@vocabulary, supertype_name, :concept => id_of(x_supertype))
@@ -239,7 +240,7 @@ module ActiveFacts
239
240
  # REVISIT: Need to handle standard types better here:
240
241
  value_super_type =
241
242
  if type_name != name
242
- debug :orm, "Asserting new ValueType #{type_name.inspect} for supertype" do
243
+ trace :orm, "Asserting new ValueType #{type_name.inspect} for supertype" do
243
244
  @vocabulary.valid_value_type_name(type_name) ||
244
245
  @constellation.ValueType(@vocabulary.identifying_role_values, type_name, :concept => :new)
245
246
  end
@@ -249,7 +250,7 @@ module ActiveFacts
249
250
  end
250
251
 
251
252
  vt =
252
- debug :orm, "Asserting new ValueType #{name.inspect}" do
253
+ trace :orm, "Asserting new ValueType #{name.inspect}" do
253
254
  @by_id[id] =
254
255
  @vocabulary.valid_value_type_name(name) ||
255
256
  @constellation.ValueType(@vocabulary.identifying_role_values, name, :concept => id_of(x))
@@ -298,7 +299,7 @@ module ActiveFacts
298
299
  # Handle the fact types:
299
300
  facts = []
300
301
  @x_facts = @x_model.xpath("orm:Facts/orm:Fact")
301
- debug :orm, "Reading fact types" do
302
+ trace :orm, "Reading fact types" do
302
303
  @x_facts.each{|x|
303
304
  id = x['id']
304
305
  name = x['Name'] || x['_Name']
@@ -306,7 +307,7 @@ module ActiveFacts
306
307
  name = "" if !name || name.size == 0
307
308
  # Note that the new metamodel doesn't have a name for a facttype unless it's objectified
308
309
 
309
- debug :orm, "FactType #{name || id}"
310
+ trace :orm, "FactType #{name || id}"
310
311
  facts << @by_id[id] = fact_type = @constellation.FactType(id_of(x))
311
312
  }
312
313
  end
@@ -326,12 +327,12 @@ module ActiveFacts
326
327
  # Handle the subtype fact types:
327
328
  facts = []
328
329
 
329
- debug :orm, "Reading sub-types" do
330
+ trace :orm, "Reading sub-types" do
330
331
  @x_subtypes.each{|x|
331
332
  id = x['id']
332
333
  name = (x['Name'] || x['_Name'] || '').gsub(/\s+/,' ').gsub(/-/,'_').strip
333
334
  name = nil if name.size == 0
334
- debug :orm, "FactType #{name || id}"
335
+ trace :orm, "FactType #{name || id}"
335
336
 
336
337
  x_subtype_role = x.xpath('orm:FactRoles/orm:SubtypeMetaRole')[0]
337
338
  subtype_role_id = x_subtype_role['id']
@@ -346,7 +347,7 @@ module ActiveFacts
346
347
 
347
348
  throw "For Subtype fact #{name}, the supertype #{supertype_id} was not found" if !supertype
348
349
  throw "For Subtype fact #{name}, the subtype #{subtype_id} was not found" if !subtype
349
- debug :orm, "#{subtype.name} is a subtype of #{supertype.name}"
350
+ trace :orm, "#{subtype.name} is a subtype of #{supertype.name}"
350
351
 
351
352
  # We already handled ValueType subtyping:
352
353
  next if subtype.kind_of? ActiveFacts::Metamodel::ValueType or
@@ -355,7 +356,7 @@ module ActiveFacts
355
356
  inheritance_fact = @constellation.TypeInheritance(subtype, supertype, :concept => id_of(x))
356
357
  if x["IsPrimary"] == "true" or # Old way
357
358
  x["PreferredIdentificationPath"] == "true" # Newer
358
- debug :orm, "#{supertype.name} is primary supertype of #{subtype.name}"
359
+ trace :orm, "#{supertype.name} is primary supertype of #{subtype.name}"
359
360
  inheritance_fact.provides_identification = true
360
361
  end
361
362
  mapping = @x_mappings.detect{ |m| m['ref'] == id }
@@ -390,7 +391,7 @@ module ActiveFacts
390
391
  # This happens for all ternaries and higher order facts
391
392
  @nested_types = []
392
393
  x_nested_types = @x_model.xpath("orm:Objects/orm:ObjectifiedType")
393
- debug :orm, "Reading objectified types" do
394
+ trace :orm, "Reading objectified types" do
394
395
  x_nested_types.each{|x|
395
396
  id = x['id']
396
397
  name = (x['Name'] || "").gsub(/\s+/,' ').gsub(/-/,'_').strip
@@ -403,7 +404,7 @@ module ActiveFacts
403
404
  fact_type = @by_id[fact_id]
404
405
  next unless fact_type # "Nested fact #{fact_id} not found; objectification of a derived fact type?"
405
406
 
406
- debug :orm, "NestedType #{name} is #{id}, nests #{fact_type.concept.guid}"
407
+ trace :orm, "NestedType #{name} is #{id}, nests #{fact_type.concept.guid}"
407
408
  @nested_types <<
408
409
  @by_id[id] =
409
410
  nested_type = @vocabulary.valid_entity_type_name(name) ||
@@ -426,7 +427,7 @@ module ActiveFacts
426
427
  end
427
428
 
428
429
  def read_roles
429
- debug :orm, "Reading roles and readings" do
430
+ trace :orm, "Reading roles and readings" do
430
431
  @x_facts.each{|x|
431
432
  id = x['id']
432
433
  fact_type = @by_id[id]
@@ -437,7 +438,7 @@ module ActiveFacts
437
438
  x_fact_roles = x.xpath('orm:FactRoles/*')
438
439
 
439
440
  # Deal with FactRoles (Roles):
440
- debug :orm, "Reading fact roles" do
441
+ trace :orm, "Reading fact roles" do
441
442
  x_fact_roles.each{|x|
442
443
  name = (x['Name'] || "").gsub(/\s+/,' ').gsub(/-/,'_').strip
443
444
  name = nil if name.size == 0
@@ -462,7 +463,7 @@ module ActiveFacts
462
463
  }[0]
463
464
  other_role_id = x_other_role["id"]
464
465
  other_role = @by_id[other_role_id]
465
- debug :orm, "Indexing unary FT role #{other_role_id} by implicit boolean role #{id}"
466
+ trace :orm, "Indexing unary FT role #{other_role_id} by implicit boolean role #{id}"
466
467
  @by_id[id] = other_role
467
468
 
468
469
  # The role name of the ignored role is the one that applies:
@@ -476,14 +477,14 @@ module ActiveFacts
476
477
  throw "RolePlayer for '#{name}' #{ref} in fact type #{x.parent.parent['_Name']} was not found"
477
478
  end
478
479
 
479
- debug :orm, "#{@vocabulary.name}, RoleName=#{x['Name'].inspect} played by object_type=#{object_type.name}"
480
+ trace :orm, "#{@vocabulary.name}, RoleName=#{x['Name'].inspect} played by object_type=#{object_type.name}"
480
481
  throw "Role is played by #{object_type.class} not ObjectType" if !(@constellation.vocabulary.object_type(:ObjectType) === object_type)
481
482
 
482
- debug :orm, "Creating role #{name} nr#{fact_type.all_role.size} of #{fact_type.concept.guid} played by #{object_type.name}"
483
+ trace :orm, "Creating role #{name} nr#{fact_type.all_role.size} of #{fact_type.concept.guid} played by #{object_type.name}"
483
484
 
484
485
  role = @by_id[id] = @constellation.Role(fact_type, fact_type.all_role.size, :object_type => object_type, :concept => id_of(x))
485
486
  role.role_name = name if name && name != object_type.name
486
- debug :orm, "Fact #{fact_name} (id #{fact_type.concept.guid}) role #{x['Name']} is played by #{object_type.name}, role is #{role.concept.guid}"
487
+ trace :orm, "Fact #{fact_name} (id #{fact_type.concept.guid}) role #{x['Name']} is played by #{object_type.name}, role is #{role.concept.guid}"
487
488
 
488
489
  x_vr = x.xpath("orm:ValueRestriction/orm:RoleValueConstraint")
489
490
  x_vr.each{|vr|
@@ -496,14 +497,14 @@ module ActiveFacts
496
497
  }
497
498
  }
498
499
 
499
- debug :orm, "Adding Role #{role.role_name || role.object_type.name} to #{fact_type.describe}"
500
+ trace :orm, "Adding Role #{role.role_name || role.object_type.name} to #{fact_type.describe}"
500
501
  #fact_type.add_role(role)
501
- debug :orm, "Role #{role} is #{id}"
502
+ trace :orm, "Role #{role} is #{id}"
502
503
  }
503
504
  end
504
505
 
505
506
  # Deal with Readings:
506
- debug :orm, "Reading fact readings" do
507
+ trace :orm, "Reading fact readings" do
507
508
  x_reading_orders = x.xpath('orm:ReadingOrders/*')
508
509
  x_reading_orders.each{|x|
509
510
  x_role_sequence = x.xpath('orm:RoleSequence/*')
@@ -512,7 +513,7 @@ module ActiveFacts
512
513
  # Build an array of the Roles needed:
513
514
  role_array = x_role_sequence.map{|x| @by_id[x['ref']] }
514
515
 
515
- debug :orm, "Reading #{x_readings.map(&:text).inspect}"
516
+ trace :orm, "Reading #{x_readings.map(&:text).inspect}"
516
517
  role_sequence = get_role_sequence(role_array)
517
518
 
518
519
  #role_sequence.all_role_ref.each_with_index{|rr, i|
@@ -677,7 +678,7 @@ module ActiveFacts
677
678
  x_mandatory_constraints = @x_model.xpath("orm:Constraints/orm:MandatoryConstraint")
678
679
  @mandatory_constraints_by_rs = {}
679
680
  @mandatory_constraint_rs_by_id = {}
680
- debug :orm, "Scanning mandatory constraints" do
681
+ trace :orm, "Scanning mandatory constraints" do
681
682
  x_mandatory_constraints.each{|x|
682
683
  name = x["Name"] || ''
683
684
  name = nil if name.size == 0
@@ -689,7 +690,7 @@ module ActiveFacts
689
690
  role_sequence = map_roles(x_roles, "mandatory constraint #{name}")
690
691
  next if !role_sequence
691
692
 
692
- debug :orm, "New MC #{x['Name']} over #{role_sequence.describe}"
693
+ trace :orm, "New MC #{x['Name']} over #{role_sequence.describe}"
693
694
  @mandatory_constraints_by_rs[role_sequence] = x
694
695
  @mandatory_constraint_rs_by_id[x['id']] = role_sequence
695
696
  }
@@ -698,7 +699,7 @@ module ActiveFacts
698
699
 
699
700
  # Mandatory constraints that didn't get merged with an exclusion constraint or a uniqueness constraint are simple mandatories
700
701
  def read_residual_mandatory_constraints
701
- debug :orm, "Processing non-absorbed mandatory constraints" do
702
+ trace :orm, "Processing non-absorbed mandatory constraints" do
702
703
  @mandatory_constraints_by_rs.each { |role_sequence, x|
703
704
  id = x['id']
704
705
  # Create a simply-mandatory PresenceConstraint for each mandatory constraint
@@ -710,7 +711,7 @@ module ActiveFacts
710
711
  join_over, = *ActiveFacts::Metamodel.plays_over(role_sequence.all_role_ref.map{|rr| rr.role}, :proximate)
711
712
  raise "Mandatory join constraint #{name} has incompatible players #{players.map{|o| o.name}.inspect}" unless join_over
712
713
  if players.detect{|p| p != join_over}
713
- debug :query, "subtyping step simple mandatory constraint #{name} over #{join_over.name}"
714
+ trace :query, "subtyping step simple mandatory constraint #{name} over #{join_over.name}"
714
715
  players.each_with_index do |player, i|
715
716
  next if player != join_over
716
717
  # REVISIT: We don't need to make a subtyping step here (from join_over to player)
@@ -735,7 +736,7 @@ module ActiveFacts
735
736
 
736
737
  def read_uniqueness_constraints
737
738
  x_uniqueness_constraints = @x_model.xpath("orm:Constraints/orm:UniquenessConstraint")
738
- debug :orm, "Reading uniqueness constraints" do
739
+ trace :orm, "Reading uniqueness constraints" do
739
740
  x_uniqueness_constraints.each{|x|
740
741
  name = x["Name"] || ''
741
742
  name = nil if name.size == 0
@@ -767,7 +768,7 @@ module ActiveFacts
767
768
  end
768
769
  subtyping = players.size > 1 ? 'subtyping ' : ''
769
770
  # REVISIT: Create the Query, the Variable for join_over, and steps from each role_ref to join_over
770
- debug :query, "#{subtyping}join uniqueness constraint over #{join_over.name} in #{fact_types.map(&:default_reading)*', '}"
771
+ trace :query, "#{subtyping}join uniqueness constraint over #{join_over.name} in #{fact_types.map(&:default_reading)*', '}"
771
772
  end
772
773
 
773
774
  # There is an implicit uniqueness constraint when any object plays a unary. Skip it.
@@ -786,7 +787,7 @@ module ActiveFacts
786
787
 
787
788
  if (mc = @mandatory_constraints_by_rs[role_sequence])
788
789
  # Remove absorbed mandatory constraints, leaving residual ones.
789
- debug :orm, "Absorbing MC #{mc['Name']} over #{role_sequence.describe}"
790
+ trace :orm, "Absorbing MC #{mc['Name']} over #{role_sequence.describe}"
790
791
  @mandatory_constraints_by_rs.delete(role_sequence)
791
792
  mc_id = mc['id']
792
793
  @mandatory_constraint_rs_by_id.delete(mc['id'])
@@ -797,7 +798,7 @@ module ActiveFacts
797
798
  # That is, the phantom roles are mandatory, even if the visible roles are not.
798
799
  mc = true
799
800
  else
800
- debug :orm, "No MC to absorb over #{role_sequence.describe}"
801
+ trace :orm, "No MC to absorb over #{role_sequence.describe}"
801
802
  end
802
803
 
803
804
  # A TypeInheritance fact type has a uniqueness constraint on each role.
@@ -818,9 +819,9 @@ module ActiveFacts
818
819
  pc.min_frequency = mc ? 1 : 0
819
820
  pc.max_frequency = 1
820
821
  pc.is_preferred_identifier = true if pi || unary_identifier || is_supertype_constraint
821
- debug :orm, "#{name} covers #{role_sequence.describe} has min=#{pc.min_frequency}, max=1, preferred=#{pc.is_preferred_identifier.inspect}"
822
+ trace :orm, "#{name} covers #{role_sequence.describe} has min=#{pc.min_frequency}, max=1, preferred=#{pc.is_preferred_identifier.inspect}"
822
823
 
823
- debug :orm, role_sequence.all_role_ref.to_a[0].role.fact_type.describe + " is subject to " + pc.describe if role_sequence.all_role_ref.all?{|r| r.role.fact_type.is_a? ActiveFacts::Metamodel::TypeInheritance }
824
+ trace :orm, role_sequence.all_role_ref.to_a[0].role.fact_type.describe + " is subject to " + pc.describe if role_sequence.all_role_ref.all?{|r| r.role.fact_type.is_a? ActiveFacts::Metamodel::TypeInheritance }
824
825
 
825
826
  (@constraints_by_rs[role_sequence] ||= []) << pc
826
827
  @by_id[uc_id] = pc
@@ -840,7 +841,7 @@ module ActiveFacts
840
841
  @constellation.RoleRef(rs, 1, :role => ti.supertype_role)
841
842
  sup_play = @constellation.Play(supertype_node, ti.supertype_role)
842
843
  step = @constellation.Step(sub_play, sup_play, :fact_type => ti)
843
- debug :query, "New subtyping step #{step.describe}"
844
+ trace :query, "New subtyping step #{step.describe}"
844
845
  step
845
846
  end
846
847
 
@@ -915,10 +916,10 @@ module ActiveFacts
915
916
  return true
916
917
  end
917
918
 
918
- debug :query, "#{constraint_type} join constraint #{name} over #{role_sequences.map{|rs|rs.describe}*', '}"
919
+ trace :query, "#{constraint_type} join constraint #{name} over #{role_sequences.map{|rs|rs.describe}*', '}"
919
920
 
920
921
  query = nil
921
- debug :query, "#{constraint_type} join constraint #{name} constrains #{
922
+ trace :query, "#{constraint_type} join constraint #{name} constrains #{
922
923
  end_points.zip(end_steps).map{|(p,j)| (p ? p.name : 'NULL')+(j ? ' & subtypes':'')}*', '
923
924
  }#{
924
925
  if role_sequences[0].all_role_ref.size > 1
@@ -956,7 +957,7 @@ module ActiveFacts
956
957
  unless end_point
957
958
  raise "In #{constraint_type} #{name}, there is a faulty or non-translated query"
958
959
  end
959
- debug :query, "Variable #{query.all_variable.size} is for #{end_point.name}"
960
+ trace :query, "Variable #{query.all_variable.size} is for #{end_point.name}"
960
961
  end_node = @constellation.Variable(query, query.all_variable.size, :object_type => end_point)
961
962
 
962
963
  # We're going to rewrite the constraint to constrain the supertype roles, but assume they're the same:
@@ -967,7 +968,7 @@ module ActiveFacts
967
968
  projecting_play = nil
968
969
  constrained_play = nil
969
970
  if (subtype = role_ref.role.object_type) != end_point
970
- debug :query, "Making subtyping steps from #{subtype.name} to #{end_point.name}" do
971
+ trace :query, "Making subtyping steps from #{subtype.name} to #{end_point.name}" do
971
972
  # There may be more than one supertyping level. Make the steps:
972
973
  subtyping_steps = subtype_steps(query, subtype, end_point)
973
974
  step = subtyping_steps[0]
@@ -989,10 +990,10 @@ module ActiveFacts
989
990
 
990
991
  if join_over
991
992
  if !variable # Create the Variable when processing the first role
992
- debug :query, "Variable #{query.all_variable.size} is over #{join_over.name}"
993
+ trace :query, "Variable #{query.all_variable.size} is over #{join_over.name}"
993
994
  variable = @constellation.Variable(query, query.all_variable.size, :object_type => join_over)
994
995
  end
995
- debug :query, "Making step from #{end_point.name} to #{join_over.name}" do
996
+ trace :query, "Making step from #{end_point.name} to #{join_over.name}" do
996
997
  rs = @constellation.RoleSequence(:new)
997
998
  # Detect the fact type over which we're stepping (may involve objectification)
998
999
  raise "Internal error in #{constraint_type} #{name}: making illegal reference to variable, object type mismatch" if role_ref.role.object_type != role_node.object_type
@@ -1003,10 +1004,10 @@ module ActiveFacts
1003
1004
  join_play = @constellation.Play(variable, joined_role)
1004
1005
 
1005
1006
  step = @constellation.Step(role_play, join_play, :fact_type => joined_role.fact_type)
1006
- debug :query, "New step #{step.describe}"
1007
+ trace :query, "New step #{step.describe}"
1007
1008
  end
1008
1009
  else
1009
- debug :query, "Need step for non-join_over role #{end_point.name} #{role_ref.describe} in #{role_ref.role.fact_type.default_reading}"
1010
+ trace :query, "Need step for non-join_over role #{end_point.name} #{role_ref.describe} in #{role_ref.role.fact_type.default_reading}"
1010
1011
  if (roles = role_ref.role.fact_type.all_role.to_a).size > 1
1011
1012
  # Here we have an end join (step already created) but no sequence join
1012
1013
  if variable
@@ -1052,7 +1053,7 @@ module ActiveFacts
1052
1053
 
1053
1054
  # Thoroughly check that this is a valid query
1054
1055
  query.validate
1055
- debug :query, "Query has projected nodes #{replacement_rs.describe}"
1056
+ trace :query, "Query has projected nodes #{replacement_rs.describe}"
1056
1057
 
1057
1058
  # Constrain the replacement role sequence, which has the attached query:
1058
1059
  role_sequences[role_sequences.index(role_sequence)] = replacement_rs
@@ -1060,7 +1061,7 @@ module ActiveFacts
1060
1061
  return true
1061
1062
  end
1062
1063
  rescue => e
1063
- debugger if debug :debug
1064
+ debugger if trace :debug
1064
1065
  $stderr.puts "// #{e.to_s}: #{e.backtrace[0]}"
1065
1066
  return false
1066
1067
  end
@@ -1069,7 +1070,7 @@ module ActiveFacts
1069
1070
 
1070
1071
  def read_exclusion_constraints
1071
1072
  x_exclusion_constraints = @x_model.xpath("orm:Constraints/orm:ExclusionConstraint")
1072
- debug :orm, "Reading #{x_exclusion_constraints.size} exclusion constraints" do
1073
+ trace :orm, "Reading #{x_exclusion_constraints.size} exclusion constraints" do
1073
1074
  x_exclusion_constraints.each{|x|
1074
1075
  id = x['id']
1075
1076
  name = x["Name"] || ''
@@ -1111,7 +1112,7 @@ module ActiveFacts
1111
1112
 
1112
1113
  def read_equality_constraints
1113
1114
  x_equality_constraints = @x_model.xpath("orm:Constraints/orm:EqualityConstraint")
1114
- debug :orm, "Reading equality constraints" do
1115
+ trace :orm, "Reading equality constraints" do
1115
1116
  x_equality_constraints.each{|x|
1116
1117
  id = x['id']
1117
1118
  name = x["Name"] || ''
@@ -1144,7 +1145,7 @@ module ActiveFacts
1144
1145
 
1145
1146
  def read_subset_constraints
1146
1147
  x_subset_constraints = @x_model.xpath("orm:Constraints/orm:SubsetConstraint")
1147
- debug :orm, "Reading subset constraints" do
1148
+ trace :orm, "Reading subset constraints" do
1148
1149
  x_subset_constraints.each{|x|
1149
1150
  id = x['id']
1150
1151
  name = x["Name"] || ''
@@ -1173,7 +1174,7 @@ module ActiveFacts
1173
1174
 
1174
1175
  def read_ring_constraints
1175
1176
  x_ring_constraints = @x_model.xpath("orm:Constraints/orm:RingConstraint")
1176
- debug :orm, "Reading ring constraints" do
1177
+ trace :orm, "Reading ring constraints" do
1177
1178
  x_ring_constraints.each{|x|
1178
1179
  id = x['id']
1179
1180
  name = x["Name"] || ''
@@ -1188,7 +1189,7 @@ module ActiveFacts
1188
1189
  if from.object_type != to.object_type
1189
1190
  join_over, = *ActiveFacts::Metamodel.plays_over([from, to], :counterpart)
1190
1191
  raise "Ring constraint has incompatible players #{from.object_type.name}, #{to.object_type.name}" if !join_over
1191
- debug :query, "join ring constraint over #{join_over.name}"
1192
+ trace :query, "join ring constraint over #{join_over.name}"
1192
1193
  end
1193
1194
  rc = @constellation.RingConstraint(id_of(x))
1194
1195
  rc.vocabulary = @vocabulary
@@ -1204,7 +1205,7 @@ module ActiveFacts
1204
1205
 
1205
1206
  def read_frequency_constraints
1206
1207
  x_frequency_constraints = @x_model.xpath("orm:Constraints/orm:FrequencyConstraint")
1207
- debug :orm, "Reading frequency constraints" do
1208
+ trace :orm, "Reading frequency constraints" do
1208
1209
  x_frequency_constraints.each do |x_frequency_constraint|
1209
1210
  id = x_frequency_constraint['id']
1210
1211
  min_frequency = x_frequency_constraint["MinFrequency"].to_i
@@ -1216,7 +1217,7 @@ module ActiveFacts
1216
1217
  role_sequence = @constellation.RoleSequence(:new)
1217
1218
  role_ref = @constellation.RoleRef(role_sequence, 0, :role => role)
1218
1219
  next unless role # Role missing; belongs to a derived fact type
1219
- debug :orm, "FrequencyConstraint(min #{min_frequency.inspect} max #{max_frequency.inspect} over #{role.fact_type.describe(role)} #{id} role ref = #{x_roles[0]["ref"]}"
1220
+ trace :orm, "FrequencyConstraint(min #{min_frequency.inspect} max #{max_frequency.inspect} over #{role.fact_type.describe(role)} #{id} role ref = #{x_roles[0]["ref"]}"
1220
1221
  @by_id[id] = @constellation.PresenceConstraint(
1221
1222
  id_of(x_frequency_constraint),
1222
1223
  :vocabulary => @vocabulary,
@@ -1232,14 +1233,14 @@ module ActiveFacts
1232
1233
  end
1233
1234
 
1234
1235
  def read_instances
1235
- debug :orm, "Reading sample data" do
1236
+ trace :orm, "Reading sample data" do
1236
1237
  population = @constellation.Population(@vocabulary, "sample", :concept => :new)
1237
1238
 
1238
1239
  # Value instances first, then entities then facts:
1239
1240
 
1240
1241
  x_values = @x_model.xpath("orm:Objects/orm:ValueType/orm:Instances/orm:ValueTypeInstance/orm:Value")
1241
1242
  #pp x_values.map{|v| [ v.parent['id'], v.text ] }
1242
- debug :orm, "Reading sample values" do
1243
+ trace :orm, "Reading sample values" do
1243
1244
  x_values.each{|v|
1244
1245
  id = v.parent['id']
1245
1246
  # Get details of the ValueType:
@@ -1264,7 +1265,7 @@ module ActiveFacts
1264
1265
  last_et_id = nil
1265
1266
  last_et = nil
1266
1267
  et = nil
1267
- debug :orm, "Reading sample entities" do
1268
+ trace :orm, "Reading sample entities" do
1268
1269
  x_entities.each{|v|
1269
1270
  id = v['id']
1270
1271
 
@@ -1282,7 +1283,7 @@ module ActiveFacts
1282
1283
 
1283
1284
  instance = @constellation.Instance(id_of(v), :population => population, :object_type => et, :value => nil)
1284
1285
  @by_id[id] = instance
1285
- debug :orm, "Made new EntityType #{etname}"
1286
+ trace :orm, "Made new EntityType #{etname}"
1286
1287
  }
1287
1288
  end
1288
1289
 
@@ -1291,14 +1292,14 @@ module ActiveFacts
1291
1292
  # We create implicit PI facts after all the instances.
1292
1293
  entity_count = 0
1293
1294
  pi_fact_count = 0
1294
- debug :orm, "Creating identifying facts for entities" do
1295
+ trace :orm, "Creating identifying facts for entities" do
1295
1296
  x_entities.each do |v|
1296
1297
  id = v['id']
1297
1298
  instance = @by_id[id]
1298
1299
  et = @by_id[v.parent.parent['id']]
1299
1300
  next unless (preferred_id = et.preferred_identifier)
1300
1301
 
1301
- debug :orm, "Create identifying facts using #{preferred_id}"
1302
+ trace :orm, "Create identifying facts using #{preferred_id}"
1302
1303
 
1303
1304
  # Collate the referenced objects by role:
1304
1305
  role_instances = v.elements[0].elements.inject({}){|h, v|
@@ -1315,14 +1316,14 @@ module ActiveFacts
1315
1316
  preferred_id.role_sequence.all_role_ref.map { |rr| rr.role.fact_type }.uniq
1316
1317
  identifying_fact_types.
1317
1318
  each do |ft|
1318
- debug :orm, "For FactType #{ft}" do
1319
+ trace :orm, "For FactType #{ft}" do
1319
1320
  fact = @constellation.Fact(:new, :population => population, :fact_type => ft)
1320
1321
  fact_roles = ft.all_role.map do |role|
1321
1322
  if role.object_type == et
1322
1323
  object = instance
1323
1324
  else
1324
1325
  object = role_instances[role]
1325
- debug :orm, "instance for role #{role} is #{object}"
1326
+ trace :orm, "instance for role #{role} is #{object}"
1326
1327
  end
1327
1328
  @constellation.RoleValue(:instance => object, :population => population, :fact => fact, :role => role)
1328
1329
  end
@@ -1333,7 +1334,7 @@ module ActiveFacts
1333
1334
  entity_count += 1
1334
1335
  end
1335
1336
  end
1336
- debug :orm, "Created #{pi_fact_count} facts to identify #{entity_count} entities"
1337
+ trace :orm, "Created #{pi_fact_count} facts to identify #{entity_count} entities"
1337
1338
 
1338
1339
  # Use the "ref" attribute of FactTypeRoleInstance:
1339
1340
  x_fact_roles = @x_model.xpath("orm:Facts/orm:Fact/orm:Instances/orm:FactTypeInstance/orm:RoleInstances/orm:FactTypeRoleInstance")
@@ -1342,7 +1343,7 @@ module ActiveFacts
1342
1343
  last_id = nil
1343
1344
  fact = nil
1344
1345
  fact_roles = []
1345
- debug :orm, "Reading sample facts" do
1346
+ trace :orm, "Reading sample facts" do
1346
1347
  x_fact_roles.each do |v|
1347
1348
  fact_type_id = v.parent.parent.parent.parent['id']
1348
1349
  id = v.parent.parent['id']
@@ -1371,13 +1372,13 @@ module ActiveFacts
1371
1372
 
1372
1373
  def read_diagrams
1373
1374
  x_diagrams = @document.root.xpath("ormDiagram:ORMDiagram")
1374
- debug :orm, "Reading diagrams" do
1375
+ trace :orm, "Reading diagrams" do
1375
1376
  x_diagrams.each do |x|
1376
1377
  name = (x["Name"] || '').strip
1377
1378
  diagram = @constellation.ORMDiagram(@vocabulary, name)
1378
- debug :diagram, "Starting to read diagram #{name}"
1379
+ trace :diagram, "Starting to read diagram #{name}"
1379
1380
  shapes = x.xpath("ormDiagram:Shapes/*")
1380
- debug :orm, "Reading shapes" do
1381
+ trace :orm, "Reading shapes" do
1381
1382
  shapes.map do |x_shape|
1382
1383
  x_subject = x_shape.xpath("ormDiagram:Subject")[0]
1383
1384
  subject = @by_id[x_subject["ref"]]
@@ -1449,9 +1450,9 @@ module ActiveFacts
1449
1450
 
1450
1451
  # $stderr.puts "#{fact_type.describe}: bounds=#{bounds} -> location = (#{location.x}, #{location.y})"
1451
1452
 
1452
- debug :orm, "REVISIT: Can't place rotated fact type correctly on diagram yet" if rotation_setting
1453
+ trace :orm, "REVISIT: Can't place rotated fact type correctly on diagram yet" if rotation_setting
1453
1454
 
1454
- debug :orm, "fact type at #{location.x},#{location.y} has display_role_names_setting=#{display_role_names_setting.inspect}, rotation_setting=#{rotation_setting.inspect}"
1455
+ trace :orm, "fact type at #{location.x},#{location.y} has display_role_names_setting=#{display_role_names_setting.inspect}, rotation_setting=#{rotation_setting.inspect}"
1455
1456
  shape = @constellation.FactTypeShape(
1456
1457
  :guid => id_of(x_shape),
1457
1458
  :orm_diagram => diagram,
@@ -1465,7 +1466,7 @@ module ActiveFacts
1465
1466
  x_role_display = x_shape.xpath("ormDiagram:RoleDisplayOrder/ormDiagram:Role")
1466
1467
  # print "Fact type '#{fact_type.preferred_reading.expand}' (#{fact_type.all_role.map{|r|r.object_type.name}*' '})"
1467
1468
  if x_role_display.size > 0
1468
- debug :orm, " has roleDisplay (#{x_role_display.map{|rd| @by_id[rd['ref']].object_type.name}*','})'"
1469
+ trace :orm, " has roleDisplay (#{x_role_display.map{|rd| @by_id[rd['ref']].object_type.name}*','})'"
1469
1470
  x_role_display.each_with_index do |rd, ordinal|
1470
1471
  role_display = @constellation.RoleDisplay(shape, ordinal, :role => @by_id[rd['ref']])
1471
1472
  end
@@ -1473,7 +1474,7 @@ module ActiveFacts
1473
1474
  # Decide whether to create all RoleDisplay objects for this fact type, which is in role order
1474
1475
  # Omitting this here might lead to incomplete RoleDisplay sequences,
1475
1476
  # because each RoleNameShape or ValueConstraintShape creates just one.
1476
- debug :orm, " has no roleDisplay"
1477
+ trace :orm, " has no roleDisplay"
1477
1478
  end
1478
1479
 
1479
1480
  relative_shapes = x_shape.xpath('ormDiagram:RelativeShapes/*')
@@ -1492,7 +1493,7 @@ module ActiveFacts
1492
1493
  when 'RoleNameShape'
1493
1494
  role = @by_id[xr_shape.xpath("ormDiagram:Subject")[0]['ref']]
1494
1495
  role_display = role_display_for_role(shape, x_role_display, role)
1495
- debug :orm, "Fact type '#{fact_type.preferred_reading.expand}' has #{xr_shape.name}"
1496
+ trace :orm, "Fact type '#{fact_type.preferred_reading.expand}' has #{xr_shape.name}"
1496
1497
  @constellation.RoleNameShape(
1497
1498
  :guid => id_of(xr_shape), :orm_diagram => diagram, :location => location, :is_expanded => false,
1498
1499
  :role_display => role_display
@@ -1500,10 +1501,10 @@ module ActiveFacts
1500
1501
  when 'ValueConstraintShape'
1501
1502
  vc_subject_id = xr_shape.xpath("ormDiagram:Subject")[0]['ref']
1502
1503
  constraint = @by_id[vc_subject_id]
1503
- debug :orm, "Fact type '#{fact_type.preferred_reading.expand}' has #{xr_shape.name} for #{constraint.inspect}"
1504
+ trace :orm, "Fact type '#{fact_type.preferred_reading.expand}' has #{xr_shape.name} for #{constraint.inspect}"
1504
1505
 
1505
1506
  role_display = role_display_for_role(shape, x_role_display, constraint.role)
1506
- debug :orm, "ValueConstraintShape is on #{role_display.ordinal}'th role (by #{x_role_display.size > 0 ? 'role_display' : 'fact roles'})"
1507
+ trace :orm, "ValueConstraintShape is on #{role_display.ordinal}'th role (by #{x_role_display.size > 0 ? 'role_display' : 'fact roles'})"
1507
1508
  @constellation.ValueConstraintShape(
1508
1509
  :guid => id_of(xr_shape), :orm_diagram => diagram, :location => location, :is_expanded => false,
1509
1510
  :constraint => constraint,