activefacts 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -6,13 +6,15 @@
6
6
  #
7
7
  require 'activefacts/vocabulary'
8
8
  require 'activefacts/generate/helpers/ordered'
9
+ require 'activefacts/generate/traits/oo'
9
10
 
10
11
  module ActiveFacts
11
12
  module Generate
13
+
12
14
  module Helpers
13
15
  # Base class for generators of object-oriented class libraries for an ActiveFacts vocabulary.
14
16
  class OO < OrderedDumper #:nodoc:
15
- def constraints_dump(constraints_used)
17
+ def constraints_dump
16
18
  # Stub, not needed.
17
19
  end
18
20
 
@@ -23,7 +25,7 @@ module ActiveFacts
23
25
  end
24
26
 
25
27
  def entity_type_dump(o)
26
- @object_types_dumped[o] = true
28
+ o.ordered_dumped!
27
29
  pi = o.preferred_identifier
28
30
 
29
31
  supers = o.supertypes
@@ -34,7 +36,7 @@ module ActiveFacts
34
36
  else
35
37
  non_subtype_dump(o, pi)
36
38
  end
37
- @constraints_used[pi] = true
39
+ pi.ordered_dumped! if pi
38
40
  end
39
41
 
40
42
  # Dump the roles for an object type (excluding the roles of a fact type which is objectified)
@@ -45,27 +47,29 @@ module ActiveFacts
45
47
  !role.fact_type.is_a?(ActiveFacts::Metamodel::LinkFactType)
46
48
  }.
47
49
  sort_by{|role|
48
- preferred_role_name(role.fact_type.all_role.select{|r2| r2 != role}[0] || role, o)
50
+ other_role = role.fact_type.all_role.select{|r2| r2 != role}[0] || role
51
+ other_role.preferred_role_name(o) + ':' + role.preferred_role_name(other_role.object_type)
49
52
  }.each{|role|
50
53
  role_dump(role)
51
54
  }
52
55
  end
53
56
 
54
57
  def role_dump(role)
55
- return if role.fact_type.entity_type
56
-
57
58
  fact_type = role.fact_type
58
59
  if fact_type.all_role.size == 1
59
- unary_dump(role, preferred_role_name(role))
60
+ unary_dump(role, role.preferred_role_name)
60
61
  return
61
- elsif fact_type.all_role.size != 2
62
+ end
63
+ return if role.fact_type.entity_type
64
+
65
+ if fact_type.all_role.size != 2
62
66
  # Shouldn't come here, except perhaps for an invalid model
63
67
  return # ternaries and higher are always objectified
64
68
  end
65
69
 
66
70
  # REVISIT: TypeInheritance
67
71
  if fact_type.is_a?(ActiveFacts::Metamodel::TypeInheritance)
68
- # debug "Ignoring role #{role} in #{fact_type}, subtype fact type"
72
+ # trace "Ignoring role #{role} in #{fact_type}, subtype fact type"
69
73
  # REVISIT: What about secondary subtypes?
70
74
  # REVISIT: What about dumping the relational mapping when using separate tables?
71
75
  return
@@ -74,68 +78,31 @@ module ActiveFacts
74
78
  return unless role.is_functional
75
79
 
76
80
  other_role = fact_type.all_role.select{|r| r != role}[0]
77
- other_role_name = preferred_role_name(other_role)
81
+ other_role_name = other_role.preferred_role_name
78
82
  other_player = other_role.object_type
79
83
 
80
84
  # It's a one_to_one if there's a uniqueness constraint on the other role:
81
85
  one_to_one = other_role.is_functional
82
86
  return if one_to_one &&
83
- !@object_types_dumped[other_role.object_type]
87
+ !other_role.object_type.ordered_dumped
84
88
 
85
89
  # Find role name:
86
- role_method = preferred_role_name(role)
90
+ role_method = role.preferred_role_name
87
91
  other_role_method = one_to_one ? role_method : "all_"+role_method
88
92
  # puts "---"+role.role_name if role.role_name
89
- if other_role_name != other_player.name.gsub(/ /,'_').snakecase and
90
- role_method == role.object_type.name.gsub(/ /,'_').snakecase
93
+ if other_role_name != other_player.oo_default_role_name and
94
+ role_method == role.object_type.oo_default_role_name
95
+ # debugger
91
96
  other_role_method += "_as_#{other_role_name}"
92
97
  end
93
98
 
94
99
  role_name = role_method
95
- role_name = nil if role_name == role.object_type.name.gsub(/ /,'_').snakecase
96
-
97
- binary_dump(role, other_role_name, other_player, role.is_mandatory, one_to_one, nil, role_name, other_role_method)
98
- end
99
-
100
- def preferred_role_name(role, is_for = nil, &b)
101
- b ||= proc {|names| names.map(&:downcase)*'_' } # Make snake_case by default
102
- return b.call([]) if role.fact_type.is_a?(ActiveFacts::Metamodel::TypeInheritance)
103
-
104
- if is_for && role.fact_type.entity_type == is_for && role.fact_type.all_role.size == 1
105
- return b.call(role.object_type.name.gsub(/[- ]/,'_').split(/_/))
106
- end
107
-
108
- # debug "Looking for preferred_role_name of #{describe_fact_type(role.fact_type, role)}"
109
- reading = role.fact_type.preferred_reading
110
- preferred_role_ref = reading.role_sequence.all_role_ref.detect{|reading_rr|
111
- reading_rr.role == role
112
- }
113
-
114
- # Unaries are a hack, with only one role for what is effectively a binary:
115
- if (role.fact_type.all_role.size == 1)
116
- return b.call(
117
- ( (role.role_name && role.role_name.snakecase) ||
118
- reading.text.gsub(/ *\{0\} */,'').gsub(/[- ]/,'_')
119
- ).split(/_/)
120
- )
121
- end
122
-
123
- # debug "\tleading_adjective=#{(p=preferred_role_ref).leading_adjective}, role_name=#{role.role_name}, role player=#{role.object_type.name}, trailing_adjective=#{p.trailing_adjective}"
124
- role_words = []
125
- role_name = role.role_name
126
- role_name = nil if role_name == ""
100
+ role_name = nil if role_name == role.object_type.oo_default_role_name
127
101
 
128
- # REVISIT: Consider whether NOT to use the adjective if it's a prefix of the role_name
129
- la = preferred_role_ref.leading_adjective
130
- role_words << la.gsub(/[- ]/,'_') if la && la != "" and !role.role_name
102
+ b = role.ruby_role_definition
103
+ puts b
131
104
 
132
- role_words << (role_name || role.object_type.name.gsub(/[- ]/,'_'))
133
- # REVISIT: Same when trailing_adjective is a suffix of the role_name
134
- ta = preferred_role_ref.trailing_adjective
135
- role_words << ta.gsub(/[- ]/,'_') if ta && ta != "" and !role_name
136
- n = role_words.map{|w| w.gsub(/([a-z])([A-Z]+)/,'\1_\2').downcase}*"_"
137
- # debug "\tresult=#{n}"
138
- return b.call(n.gsub(' ','_').split(/_/))
105
+ # binary_dump(role, other_role_name, other_player, role.is_mandatory, one_to_one, nil, role_name, other_role_method)
139
106
  end
140
107
 
141
108
  def skip_fact_type(f)
@@ -147,19 +114,15 @@ module ActiveFacts
147
114
  # An objectified fact type has internal roles that are always "has_one":
148
115
  def fact_roles_dump(fact_type)
149
116
  fact_type.all_role.sort_by{|role|
150
- preferred_role_name(role, fact_type.entity_type)
117
+ role.preferred_role_name(fact_type.entity_type)
151
118
  }.each{|role|
152
- role_name = preferred_role_name(role, fact_type.entity_type)
153
- one_to_one = role.all_role_ref.detect{|rr|
154
- rr.role_sequence.all_role_ref.size == 1 &&
155
- rr.role_sequence.all_presence_constraint.detect{|pc|
156
- pc.max_frequency == 1
157
- }
158
- }
159
- as = role_name != role.object_type.name.gsub(/ /,'_').snakecase ? "_as_#{role_name}" : ""
119
+ role_name = role.preferred_role_name(fact_type.entity_type)
120
+ one_to_one = role.is_unique
121
+ as = role_name != role.object_type.oo_default_role_name ? "_as_#{role_name}" : ""
122
+ # debugger if as != ''
160
123
  raise "Fact #{fact_type.describe} type is not objectified" unless fact_type.entity_type
161
124
  other_role_method = (one_to_one ? "" : "all_") +
162
- fact_type.entity_type.name.gsub(/ /,'_').snakecase +
125
+ fact_type.entity_type.oo_default_role_name +
163
126
  as
164
127
  binary_dump(role, role_name, role.object_type, true, one_to_one, nil, nil, other_role_method)
165
128
  }
@@ -172,7 +135,7 @@ module ActiveFacts
172
135
  end
173
136
 
174
137
  def append_ring_to_reading(reading, ring)
175
- # REVISIT: debug "Should override append_ring_to_reading"
138
+ # REVISIT: trace "Should override append_ring_to_reading"
176
139
  end
177
140
 
178
141
  def fact_type_banner
@@ -182,15 +145,15 @@ module ActiveFacts
182
145
  end
183
146
 
184
147
  def constraint_banner
185
- # debug "Should override constraint_banner"
148
+ # trace "Should override constraint_banner"
186
149
  end
187
150
 
188
151
  def constraint_end
189
- # debug "Should override constraint_end"
152
+ # trace "Should override constraint_end"
190
153
  end
191
154
 
192
155
  def constraint_dump(c)
193
- # debug "Should override constraint_dump"
156
+ # trace "Should override constraint_dump"
194
157
  end
195
158
 
196
159
  end
@@ -5,6 +5,8 @@
5
5
  # Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
6
6
  #
7
7
  require 'activefacts/api'
8
+ require 'activefacts/generate/helpers/inject'
9
+ require 'activefacts/generate/traits/ordered'
8
10
 
9
11
  module ActiveFacts
10
12
  module Generate #:nodoc:
@@ -30,40 +32,15 @@ module ActiveFacts
30
32
 
31
33
  def generate(out = $>)
32
34
  @out = out
33
- vocabulary_start(@vocabulary)
34
-
35
- build_indices
36
- @object_types_dumped = {}
37
- @fact_types_dumped = {}
38
- units_dump()
39
- value_types_dump()
40
- entity_types_dump()
41
- fact_types_dump()
42
- constraints_dump(@constraints_used)
35
+ vocabulary_start
36
+ units_dump
37
+ value_types_dump
38
+ entity_types_dump
39
+ fact_types_dump
40
+ constraints_dump
43
41
  vocabulary_end
44
42
  end
45
43
 
46
- def build_indices
47
- @presence_constraints_by_fact = Hash.new{ |h, k| h[k] = [] }
48
- @ring_constraints_by_fact = Hash.new{ |h, k| h[k] = [] }
49
-
50
- @vocabulary.all_constraint.each { |c|
51
- case c
52
- when ActiveFacts::Metamodel::PresenceConstraint
53
- fact_types = c.role_sequence.all_role_ref.map{|rr| rr.role.fact_type}.uniq # All fact types spanned by this constraint
54
- if fact_types.size == 1 # There's only one, save it:
55
- # debug "Single-fact constraint on #{fact_types[0].concept.guid}: #{c.name}"
56
- (@presence_constraints_by_fact[fact_types[0]] ||= []) << c
57
- end
58
- when ActiveFacts::Metamodel::RingConstraint
59
- (@ring_constraints_by_fact[c.role.fact_type] ||= []) << c
60
- else
61
- # debug "Found unhandled constraint #{c.class} #{c.name}"
62
- end
63
- }
64
- @constraints_used = {}
65
- end
66
-
67
44
  def units_dump
68
45
  done_banner = false
69
46
  units = @vocabulary.all_unit.to_a.sort_by{|u| u.name.gsub(/ /,'')}
@@ -115,7 +92,6 @@ module ActiveFacts
115
92
 
116
93
  def value_types_dump
117
94
  done_banner = false
118
- @value_type_dumped = {}
119
95
  @vocabulary.all_object_type.sort_by{|o| o.name.gsub(/ /,'')}.each{|o|
120
96
  next unless o.is_a?(ActiveFacts::Metamodel::ValueType)
121
97
 
@@ -123,17 +99,18 @@ module ActiveFacts
123
99
  done_banner = true
124
100
 
125
101
  value_type_chain_dump(o)
126
- @object_types_dumped[o] = true
102
+ # @object_types_dumped[o] = true
103
+ o.ordered_dumped!
127
104
  }
128
105
  value_type_end if done_banner
129
106
  end
130
107
 
131
108
  # Ensure that supertype gets dumped first
132
109
  def value_type_chain_dump(o)
133
- return if @value_type_dumped[o]
134
- value_type_chain_dump(o.supertype) if (o.supertype && !@value_type_dumped[o.supertype])
110
+ return if o.ordered_dumped
111
+ value_type_chain_dump(o.supertype) if (o.supertype && !o.supertype.ordered_dumped)
135
112
  value_type_fork(o)
136
- @value_type_dumped[o] = true
113
+ o.ordered_dumped!
137
114
  end
138
115
 
139
116
  # Try to dump entity types in order of name, but we need
@@ -152,11 +129,11 @@ module ActiveFacts
152
129
  count_this_pass = 0
153
130
  skipped_this_pass = 0
154
131
  sorted.each{|o|
155
- next if @object_types_dumped[o] # Already done
132
+ next if o.ordered_dumped # Already done
156
133
 
157
134
  # Can we do this yet?
158
135
  if (o != panic and # We don't *have* to do it (panic mode)
159
- (p = @precursors[o]) and # There might be...
136
+ (p = @precursors[o]) and # There might be...
160
137
  p.size > 0) # precursors - still blocked
161
138
  skipped_this_pass += 1
162
139
  next
@@ -188,7 +165,7 @@ module ActiveFacts
188
165
  if panic # We were already panicing... what to do now?
189
166
  # This won't happen again unless the above code is changed to decide it can't dump "panic".
190
167
  raise "Unresolvable cycle of forward references: " +
191
- (bad = sorted.select{|o| EntityType === o && !@object_types_dumped[o]}).map{|o| o.name }.inspect +
168
+ (bad = sorted.select{|o| EntityType === o && !o.ordered_dumped}).map{|o| o.name }.inspect +
192
169
  ":\n\t" + bad.map{|o|
193
170
  o.name +
194
171
  ": " +
@@ -198,12 +175,12 @@ module ActiveFacts
198
175
  # Find the object that has the most followers and no fwd-ref'd supertypes:
199
176
  # This selection might be better if we allow PI roles to be fwd-ref'd...
200
177
  panic = sorted.
201
- select{|o| !@object_types_dumped[o] }.
178
+ select{|o| o.ordered_dumped }.
202
179
  sort_by{|o|
203
180
  f = @followers[o] || [];
204
- o.supertypes.detect{|s| !@object_types_dumped[s] } ? 0 : -f.size
181
+ o.supertypes.detect{|s| !s.ordered_dumped } ? 0 : -f.size
205
182
  }[0]
206
- # debug "Panic mode, selected #{panic.name} next"
183
+ # trace "Panic mode, selected #{panic.name} next"
207
184
  end
208
185
  end
209
186
 
@@ -276,7 +253,7 @@ module ActiveFacts
276
253
  subtyping = o.all_type_inheritance_as_supertype
277
254
  next a if subtyping.size == 0
278
255
  subtyping.each{|ti|
279
- # debug ti.class.roles.verbalise; debug "all_type_inheritance_as_supertype"; exit
256
+ # debug ti.class.roles.verbalise; trace "all_type_inheritance_as_supertype"; exit
280
257
  s = ti.subtype
281
258
  (precursor[s] ||= []) << o
282
259
  (follower[o] ||= []) << s
@@ -299,9 +276,9 @@ module ActiveFacts
299
276
  progress = false
300
277
  roles.map(&:fact_type).uniq.select{|fact_type|
301
278
  # The fact type hasn't already been dumped but all its role players have
302
- !@fact_types_dumped[fact_type] &&
279
+ !fact_type.ordered_dumped &&
303
280
  !fact_type.is_a?(ActiveFacts::Metamodel::LinkFactType) &&
304
- !fact_type.all_role.detect{|r| !@object_types_dumped[r.object_type] } &&
281
+ !fact_type.all_role.detect{|r| !r.object_type.ordered_dumped } &&
305
282
  !fact_type.entity_type &&
306
283
  derivation_precursors_complete(fact_type)
307
284
  # REVISIT: A derived fact type must not be dumped before its dependent fact types have
@@ -320,43 +297,39 @@ module ActiveFacts
320
297
  pr = fact_type.preferred_reading
321
298
  return true unless jr = pr.role_sequence.all_role_ref.to_a[0].play
322
299
  query = jr.variable.query
323
- return false if query.all_step.detect{|js| !@fact_types_dumped[js.fact_type] }
324
- return false if query.all_variable.detect{|jn| !@object_types_dumped[jn.object_type] }
300
+ return false if query.all_step.detect{|js| !js.fact_type.ordered_dumped }
301
+ return false if query.all_variable.detect{|jn| !jn.object_type.ordered_dumped }
325
302
  true
326
303
  end
327
304
 
328
305
  def skip_fact_type(f)
329
306
  return true if f.is_a?(ActiveFacts::Metamodel::TypeInheritance)
330
- return false if f.entity_type && !@object_types_dumped[f.entity_type]
307
+ return false if f.entity_type && !f.entity_type.ordered_dumped
331
308
 
332
309
  # REVISIT: There might be constraints we have to merge into the nested entity or subtype.
333
310
  # These will come up as un-handled constraints:
334
311
  # Dump this fact type only if it contains a presence constraint we've missed:
335
312
  pcs = @presence_constraints_by_fact[f]
336
- pcs && pcs.size > 0 && !pcs.detect{|c| !@constraints_used[c] }
313
+ pcs && pcs.size > 0 && !pcs.detect{|c| !c.ordered_dumped }
337
314
  end
338
315
 
339
316
  # Dump one fact type.
340
317
  # Include as many as possible internal constraints in the fact type readings.
341
318
  def fact_type_dump_with_dependents(fact_type)
342
- @fact_types_dumped[fact_type] = true
343
- # debug "Trying to dump FT again" if @fact_types_dumped[fact_type]
319
+ fact_type.ordered_dumped!
344
320
  return if skip_fact_type(fact_type)
345
321
 
346
322
  if (et = fact_type.entity_type) &&
347
323
  (pi = et.preferred_identifier) &&
348
324
  pi.role_sequence.all_role_ref.detect{|rr| rr.role.fact_type != fact_type }
349
- # debug "Dumping objectified FT #{et.name} as an entity, non-fact PI"
325
+ # trace "Dumping objectified FT #{et.name} as an entity, non-fact PI"
350
326
  entity_type_dump(et)
351
327
  released_fact_types_dump(et)
352
328
  return
353
329
  end
354
330
 
355
- fact_constraints = @presence_constraints_by_fact[fact_type]
356
-
357
- # debug "for fact type #{fact_type.to_s}, considering\n\t#{fact_constraints.map(&:to_s)*",\n\t"}"
358
- # debug "#{fact_type.name} has readings:\n\t#{fact_type.readings.map(&:name)*"\n\t"}"
359
- # debug "Dumping #{fact_type.concept.guid} as a fact type"
331
+ # trace "#{fact_type.name} has readings:\n\t#{fact_type.readings.map(&:name)*"\n\t"}"
332
+ # trace "Dumping #{fact_type.concept.guid} as a fact type"
360
333
 
361
334
  # Fact types that aren't nested have no names
362
335
  name = fact_type.entity_type && fact_type.entity_type.name
@@ -365,8 +338,9 @@ module ActiveFacts
365
338
 
366
339
  # REVISIT: Go through the residual constraints and re-process appropriate readings to show them
367
340
 
368
- @fact_types_dumped[fact_type] = true
369
- @object_types_dumped[fact_type.entity_type] = true if fact_type.entity_type
341
+ #CJH: Necessary?
342
+ fact_type.ordered_dumped!
343
+ fact_type.entity_type.ordered_dumped! if fact_type.entity_type
370
344
  end
371
345
 
372
346
  # Dump fact types.
@@ -383,7 +357,7 @@ module ActiveFacts
383
357
  fact_type = fact_collection[fact_id] and
384
358
  !fact_type.is_a?(ActiveFacts::Metamodel::TypeInheritance) and
385
359
  !fact_type.is_a?(ActiveFacts::Metamodel::LinkFactType) and
386
- !@fact_types_dumped[fact_type] and
360
+ !fact_type.ordered_dumped and
387
361
  !skip_fact_type(fact_type) and
388
362
  !fact_type.all_role.detect{|r| r.object_type.is_a?(ActiveFacts::Metamodel::EntityType) }
389
363
  }.sort_by{|fact_id|
@@ -404,18 +378,14 @@ module ActiveFacts
404
378
  }.sort_by{|fact_type|
405
379
  fact_type_key(fact_type)
406
380
  }.each{|fact_type|
407
- next if @fact_types_dumped[fact_type]
408
- # debug "Not dumped #{fact_type.verbalise}(#{fact_type.all_role.map{|r| r.object_type.name}*", "})"
381
+ next if fact_type.ordered_dumped
382
+ # trace "Not dumped #{fact_type.verbalise}(#{fact_type.all_role.map{|r| r.object_type.name}*", "})"
409
383
  fact_type_banner unless done_banner
410
384
  done_banner = true
411
385
  fact_type_dump_with_dependents(fact_type)
412
386
  }
413
387
 
414
388
  fact_type_end if done_banner
415
- # unused = constraints - @constraints_used.keys
416
- # debug "residual constraints are\n\t#{unused.map(&:to_s)*",\n\t"}"
417
-
418
- @constraints_used
419
389
  end
420
390
 
421
391
  def fact_instances_dump
@@ -423,7 +393,7 @@ module ActiveFacts
423
393
  # Dump the instances:
424
394
  f.facts.each{|i|
425
395
  raise "REVISIT: Not dumping fact instances"
426
- debug "\t\t"+i.to_s
396
+ trace "\t\t"+i.to_s
427
397
  }
428
398
  }
429
399
  end
@@ -498,9 +468,13 @@ module ActiveFacts
498
468
  end
499
469
  end
500
470
 
501
- def constraints_dump(except = {})
471
+ def constraints_dump
502
472
  heading = false
503
- @vocabulary.all_constraint.reject{|c| except[c]}.sort_by{ |c| constraint_sort_key(c) }.each do|c|
473
+ @vocabulary.
474
+ all_constraint.
475
+ reject{|c| c.ordered_dumped}.
476
+ sort_by{ |c| constraint_sort_key(c) }.
477
+ each do |c|
504
478
  # Skip some PresenceConstraints:
505
479
  if c.is_a?(ActiveFacts::Metamodel::PresenceConstraint)
506
480
  # Skip uniqueness constraints that cover all roles of a fact type, they're implicit
@@ -528,12 +502,12 @@ module ActiveFacts
528
502
  constraint_end if heading
529
503
  end
530
504
 
531
- def vocabulary_start(vocabulary)
532
- debug "Should override vocabulary_start"
505
+ def vocabulary_start
506
+ trace "Should override vocabulary_start"
533
507
  end
534
508
 
535
509
  def vocabulary_end
536
- debug "Should override vocabulary_end"
510
+ trace "Should override vocabulary_end"
537
511
  end
538
512
 
539
513
  def units_banner
@@ -546,63 +520,63 @@ module ActiveFacts
546
520
  end
547
521
 
548
522
  def value_type_banner
549
- debug "Should override value_type_banner"
523
+ trace "Should override value_type_banner"
550
524
  end
551
525
 
552
526
  def value_type_end
553
- debug "Should override value_type_end"
527
+ trace "Should override value_type_end"
554
528
  end
555
529
 
556
530
  def data_type_dump(o)
557
- debug "Should override data_type_dump"
531
+ trace "Should override data_type_dump"
558
532
  end
559
533
 
560
534
  def value_type_dump(o, super_type_name, facets)
561
- debug "Should override value_type_dump"
535
+ trace "Should override value_type_dump"
562
536
  end
563
537
 
564
538
  def entity_type_banner
565
- debug "Should override entity_type_banner"
539
+ trace "Should override entity_type_banner"
566
540
  end
567
541
 
568
542
  def entity_type_group_end
569
- debug "Should override entity_type_group_end"
543
+ trace "Should override entity_type_group_end"
570
544
  end
571
545
 
572
546
  def non_subtype_dump(o, pi)
573
- debug "Should override non_subtype_dump"
547
+ trace "Should override non_subtype_dump"
574
548
  end
575
549
 
576
550
  def subtype_dump(o, supertypes, pi = nil)
577
- debug "Should override subtype_dump"
551
+ trace "Should override subtype_dump"
578
552
  end
579
553
 
580
554
  def append_ring_to_reading(reading, ring)
581
- debug "Should override append_ring_to_reading"
555
+ trace "Should override append_ring_to_reading"
582
556
  end
583
557
 
584
558
  def fact_type_banner
585
- debug "Should override fact_type_banner"
559
+ trace "Should override fact_type_banner"
586
560
  end
587
561
 
588
562
  def fact_type_end
589
- debug "Should override fact_type_end"
563
+ trace "Should override fact_type_end"
590
564
  end
591
565
 
592
566
  def fact_type_dump(fact_type, name)
593
- debug "Should override fact_type_dump"
567
+ trace "Should override fact_type_dump"
594
568
  end
595
569
 
596
570
  def constraint_banner
597
- debug "Should override constraint_banner"
571
+ trace "Should override constraint_banner"
598
572
  end
599
573
 
600
574
  def constraint_end
601
- debug "Should override constraint_end"
575
+ trace "Should override constraint_end"
602
576
  end
603
577
 
604
578
  def constraint_dump(c)
605
- debug "Should override constraint_dump"
579
+ trace "Should override constraint_dump"
606
580
  end
607
581
 
608
582
  end