activefacts-cql 1.8.1 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +6 -5
  4. data/activefacts-cql.gemspec +4 -3
  5. data/lib/activefacts/cql/compiler.rb +29 -22
  6. data/lib/activefacts/cql/compiler/clause.rb +86 -84
  7. data/lib/activefacts/cql/compiler/constraint.rb +53 -53
  8. data/lib/activefacts/cql/compiler/entity_type.rb +28 -28
  9. data/lib/activefacts/cql/compiler/expression.rb +27 -27
  10. data/lib/activefacts/cql/compiler/fact.rb +37 -37
  11. data/lib/activefacts/cql/compiler/fact_type.rb +91 -85
  12. data/lib/activefacts/cql/compiler/informal.rb +48 -0
  13. data/lib/activefacts/cql/compiler/query.rb +52 -52
  14. data/lib/activefacts/cql/compiler/shared.rb +17 -17
  15. data/lib/activefacts/cql/compiler/value_type.rb +11 -11
  16. data/lib/activefacts/cql/parser/CQLParser.treetop +76 -56
  17. data/lib/activefacts/cql/parser/Context.treetop +15 -17
  18. data/lib/activefacts/cql/parser/Expressions.treetop +21 -21
  19. data/lib/activefacts/cql/parser/FactTypes.treetop +216 -216
  20. data/lib/activefacts/cql/parser/Language/English.treetop +136 -131
  21. data/lib/activefacts/cql/parser/Language/French.treetop +118 -118
  22. data/lib/activefacts/cql/parser/Language/Mandarin.treetop +111 -111
  23. data/lib/activefacts/cql/parser/LexicalRules.treetop +45 -45
  24. data/lib/activefacts/cql/parser/ObjectTypes.treetop +120 -120
  25. data/lib/activefacts/cql/parser/Terms.treetop +63 -63
  26. data/lib/activefacts/cql/parser/ValueTypes.treetop +71 -71
  27. data/lib/activefacts/cql/require.rb +8 -8
  28. data/lib/activefacts/cql/verbaliser.rb +88 -88
  29. data/lib/activefacts/cql/version.rb +1 -1
  30. data/lib/activefacts/input/cql.rb +7 -7
  31. metadata +12 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4d6aee1f5f23c23a3a63b39313d2604d07f03a9
4
- data.tar.gz: d2a4a7a5426a48c35bed29330257550dd460956e
3
+ metadata.gz: dc4fec528ea30db43664caba24b4eae5b394d59b
4
+ data.tar.gz: 670db8c27a33bf2a3777127fd3d41babd0641718
5
5
  SHA512:
6
- metadata.gz: 618d767c7325a2e4a22cfff3a4c245bcdc764458529c63623f32e1efd247b1b30bc1fceda682a18e5c206e0e8c9a5d45597be181fdd68c1c1c41d38fa0ec6b61
7
- data.tar.gz: 58c3b053a6d7fabcd348ca9fd9c63705f98d873018879c5e7d307a2bc78d979bc4cceb36ae52fcd95e8b4656fbe334aa7d10ba5999df3b5265532727dcb970f9
6
+ metadata.gz: d57cf6ed6d728b03c4f4b644e4a1866e313d53fef2315674be23f1f0695b7294b3ef388196c7bf95aca581a54b4da29b0ce65a79fe9944b17d128c0441e092d6
7
+ data.tar.gz: 46e7553490bd3bcaf73c65b5006d7c1f13e38fbaf46e41f4d1a32ce6afaa0066c9e15e723ea2a48f22af887fb562c4fb6e26a8a954c66f57e6d67a9669a3ced1
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  lib/activefacts/cql/parser/[A-Z]*.rb
11
+ lib/activefacts/cql/parser/Language/[A-Z]*.rb
11
12
  *.swp
12
13
  clj
13
14
  .DS_Store
data/Gemfile CHANGED
@@ -2,9 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- if ENV['PWD'] =~ %r{\A#{ENV['HOME']}/work}
6
- $stderr.puts "Using work area gems for #{File.basename(File.dirname(__FILE__))} from activefacts-cql"
7
- gem 'activefacts-api', path: '/Users/cjh/work/activefacts/api'
8
- gem 'activefacts-metamodel', path: '/Users/cjh/work/activefacts/metamodel'
9
- # gem 'activefacts-metamodel', git: 'git://github.com/cjheath/activefacts-metamodel.git'
5
+ this_file = File.absolute_path(__FILE__)
6
+ if this_file =~ %r{\A#{ENV['HOME']}}i
7
+ dir = File.dirname(File.dirname(this_file))
8
+ $stderr.puts "Using work area gems in #{dir} from activefacts-cql"
9
+ gem 'activefacts-api', path: dir+'/api'
10
+ gem 'activefacts-metamodel', path: dir+'/metamodel'
10
11
  end
@@ -18,12 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.bindir = "exe"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
+ spec.extensions << 'lib/activefacts/cql/Rakefile'
21
22
 
22
- spec.add_development_dependency "bundler", ">= 1.10", "~> 1.10.6"
23
+ spec.add_development_dependency "bundler", ">= 1.10"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
25
  spec.add_development_dependency "rspec", "~> 3.3"
25
26
 
26
- spec.add_runtime_dependency "activefacts-metamodel", ">= 1.8.3", "~> 1"
27
- spec.add_runtime_dependency %q<treetop>, [">= 1.4.14", "~> 1.4"]
27
+ spec.add_runtime_dependency "activefacts-metamodel", "~> 1", ">= 1.9.5"
28
+ spec.add_runtime_dependency "treetop", [">= 1.4.14", "~> 1.4"]
28
29
  end
29
30
 
@@ -13,6 +13,7 @@ require 'activefacts/cql/compiler/expression'
13
13
  require 'activefacts/cql/compiler/fact'
14
14
  require 'activefacts/cql/compiler/constraint'
15
15
  require 'activefacts/cql/compiler/query'
16
+ require 'activefacts/cql/compiler/informal'
16
17
 
17
18
  module ActiveFacts
18
19
  module CQL
@@ -28,6 +29,7 @@ module ActiveFacts
28
29
  @filename = a.shift || "stdio"
29
30
  super *a
30
31
  @constellation = ActiveFacts::API::Constellation.new(ActiveFacts::Metamodel)
32
+ @constellation.loggers << proc{|*k| trace :apilog, k.inspect} if trace(:apilog)
31
33
  @language = nil
32
34
  trace :file, "Parsing '#{@filename}'"
33
35
  end
@@ -58,11 +60,11 @@ module ActiveFacts
58
60
 
59
61
  # Mark any new Concepts as belonging to this topic
60
62
  def topic_flood
61
- @constellation.Concept.each do |key, concept|
62
- next if concept.topic
63
- trace :topic, "Colouring #{concept.describe} with #{@topic.topic_name}"
64
- concept.topic = @topic
65
- end
63
+ @constellation.Concept.each do |key, concept|
64
+ next if concept.topic
65
+ trace :topic, "Colouring #{concept.describe} with #{@topic.topic_name}"
66
+ concept.topic = @topic
67
+ end
66
68
  end
67
69
 
68
70
  def compile input
@@ -74,7 +76,7 @@ module ActiveFacts
74
76
  # parse_all returns an array of the block's non-nil return values.
75
77
  ok = parse_all(@string, :definition) do |node|
76
78
  trace :parse, "Parsed '#{node.text_value.gsub(/\s+/,' ').strip}'" do
77
- trace :lex, (proc { node.inspect })
79
+ trace :lex, (proc { node.inspect })
78
80
  begin
79
81
  ast = node.ast
80
82
  next unless ast
@@ -84,14 +86,14 @@ module ActiveFacts
84
86
  ast.vocabulary = @vocabulary
85
87
  value = compile_definition ast
86
88
  trace :definition, "Compiled to #{value.is_a?(Array) ? value.map{|v| v.verbalise}*', ' : value.verbalise}" if value
87
- if value.is_a?(ActiveFacts::Metamodel::Topic)
88
- topic_flood if @topic
89
- @topic = value
90
- elsif ast.is_a?(Compiler::Vocabulary)
91
- topic_flood if @topic
92
- @vocabulary = value
93
- @topic = @constellation.Topic(@vocabulary.name)
94
- end
89
+ if value.is_a?(ActiveFacts::Metamodel::Topic)
90
+ topic_flood if @topic
91
+ @topic = value
92
+ elsif ast.is_a?(Compiler::Vocabulary)
93
+ topic_flood if @topic
94
+ @vocabulary = value
95
+ @topic = @constellation.Topic(@vocabulary.name)
96
+ end
95
97
  rescue => e
96
98
  # Augment the exception message, but preserve the backtrace
97
99
  start_line = @string.line_of(node.interval.first)
@@ -102,7 +104,7 @@ module ActiveFacts
102
104
  raise ne
103
105
  end
104
106
  end
105
- topic_flood if @topic
107
+ topic_flood if @topic
106
108
  end
107
109
  raise failure_reason unless ok
108
110
  vocabulary
@@ -115,16 +117,16 @@ module ActiveFacts
115
117
  saved_input_length = @input_length
116
118
  saved_topic = @topic
117
119
  old_filename = @filename
118
- @filename = File.dirname(old_filename)+'/'+file+'.cql'
120
+ @filename = import_filename(old_filename, file)
119
121
 
120
122
  # REVISIT: Save and use another @vocabulary for this file?
121
123
  File.open(@filename) do |f|
122
- topic_flood if @topic
123
- @topic = @constellation.Topic(File.basename(@filename, '.cql'))
124
- trace :import, "Importing #{@filename} as #{@topic.topic_name}" do
125
- ok = parse_all(f.read, nil, &@block)
126
- end
127
- @topic = saved_topic
124
+ topic_flood if @topic
125
+ @topic = @constellation.Topic(File.basename(@filename, '.cql'))
126
+ trace :import, "Importing #{@filename} as #{@topic.topic_name}" do
127
+ ok = parse_all(f.read, nil, &@block)
128
+ end
129
+ @topic = saved_topic
128
130
  end
129
131
 
130
132
  rescue => e
@@ -140,6 +142,11 @@ module ActiveFacts
140
142
  nil
141
143
  end
142
144
 
145
+ # import_filename may be redefined in subclass
146
+ def import_filename(old_filename, file)
147
+ File.dirname(old_filename)+'/'+file+'.cql'
148
+ end
149
+
143
150
  def compile_definition ast
144
151
  ast.compile
145
152
  end
@@ -52,34 +52,34 @@ module ActiveFacts
52
52
  # else 'definitely '
53
53
  end
54
54
  }#{
55
- (
56
- phrases.map do |phrase|
57
- case phrase
58
- when String
59
- '"' + phrase.to_s + '"'
60
- when Reference
61
- phrase.to_s +
62
- if phrase.nested_clauses
63
- ' (in which ' +
64
- phrase.nested_clauses.map do |c|
65
- ((j = c.conjunction) ? j+' ' : '') +
66
- c.to_s
67
- end*' ' +
68
- ')'
69
- else
70
- ''
71
- end
72
- when Operation
73
- phrase.inspect
74
- when Literal
75
- phrase.inspect
76
- #when FunctionCallChain # REVISIT: Add something here when I re-add functions
77
- # phrase.inspect
78
- else
79
- raise "Unexpected phrase type in clause: #{phrase.class}"
80
- end
81
- end * ' '
82
- ).gsub(/" "/, ' ')
55
+ (
56
+ phrases.map do |phrase|
57
+ case phrase
58
+ when String
59
+ '"' + phrase.to_s + '"'
60
+ when Reference
61
+ phrase.to_s +
62
+ if phrase.nested_clauses
63
+ ' (in which ' +
64
+ phrase.nested_clauses.map do |c|
65
+ ((j = c.conjunction) ? j+' ' : '') +
66
+ c.to_s
67
+ end*' ' +
68
+ ')'
69
+ else
70
+ ''
71
+ end
72
+ when Operation
73
+ phrase.inspect
74
+ when Literal
75
+ phrase.inspect
76
+ #when FunctionCallChain # REVISIT: Add something here when I re-add functions
77
+ # phrase.inspect
78
+ else
79
+ raise "Unexpected phrase type in clause: #{phrase.class}"
80
+ end
81
+ end * ' '
82
+ ).gsub(/" "/, ' ')
83
83
  }#{
84
84
  @context_note && ' ' + @context_note.inspect
85
85
  }"
@@ -121,8 +121,8 @@ module ActiveFacts
121
121
  end
122
122
  end
123
123
 
124
- # This method is used in matching unary fact types in entity identification
125
- # It disregards literals, which are not allowed in this context.
124
+ # This method is used in matching unary fact types in entity identification
125
+ # It disregards literals, which are not allowed in this context.
126
126
  def phrases_match(phrases)
127
127
  @phrases.zip(phrases).each do |mine, theirs|
128
128
  return false if mine.is_a?(Reference) != theirs.is_a?(Reference)
@@ -145,20 +145,20 @@ module ActiveFacts
145
145
  raise "Cannot match a clause that contains no object types" if refs.size == 0
146
146
  raise "Internal error, clause already matched, should not match again" if @fact_type
147
147
 
148
- if is_naked_object_type
149
- ref = refs[0] # "There can be only one"
150
- return true unless ref.nested_clauses
151
- ref.nested_clauses.each do |nested|
152
- ft = nested.match_existing_fact_type(context)
153
- raise "Unrecognised fact type #{nested.display} nested under #{inspect}" unless ft
154
- if (ft.entity_type == ref.player)
155
- ref.objectification_of = ft
156
- nested.objectified_as = ref
157
- end
158
- end
159
- raise "#{ref.inspect} contains objectification steps that do not objectify it" unless ref.objectification_of
160
- return true
161
- end
148
+ if is_naked_object_type
149
+ ref = refs[0] # "There can be only one"
150
+ return true unless ref.nested_clauses
151
+ ref.nested_clauses.each do |nested|
152
+ ft = nested.match_existing_fact_type(context)
153
+ raise "Unrecognised fact type #{nested.display} nested under #{inspect}" unless ft
154
+ if (ft.entity_type == ref.player)
155
+ ref.objectification_of = ft
156
+ nested.objectified_as = ref
157
+ end
158
+ end
159
+ raise "#{ref.inspect} contains objectification steps that do not objectify it" unless ref.objectification_of
160
+ return true
161
+ end
162
162
 
163
163
  # If we fail to match, try a left contraction (or save this for a subsequent left contraction):
164
164
  left_contract_this_onto = context.left_contractable_clause
@@ -267,9 +267,9 @@ module ActiveFacts
267
267
  next if role.fact_type.is_a?(ActiveFacts::Metamodel::LinkFactType)
268
268
  next if role.fact_type.all_role.size != players.size # Wrong number of players
269
269
 
270
- compatible_readings = role.fact_type.compatible_readings(player_related_types)
271
- next unless compatible_readings.size > 0
272
- trace :matching_fails, "These readings are compatible: #{compatible_readings.map(&:expand).inspect}"
270
+ compatible_readings = role.fact_type.compatible_readings(player_related_types)
271
+ next unless compatible_readings.size > 0
272
+ trace :matching_fails, "These readings are compatible: #{compatible_readings.map(&:expand).inspect}"
273
273
  true
274
274
  end.
275
275
  map{ |role| role.fact_type}
@@ -437,13 +437,13 @@ module ActiveFacts
437
437
  if la = role_ref.leading_adjective and !la.empty?
438
438
  # The leading adjectives must match, one way or another
439
439
  la = la.split(/\s+/)
440
- if (la[0, intervening_words.size] == intervening_words) # Exact match
441
- iw = intervening_words
442
- else
443
- # We may have hyphenated adjectives. Break them up to check:
444
- iw = intervening_words.map{|w| w.split(/-/)}.flatten
445
- return nil unless la[0,iw.size] == iw
446
- end
440
+ if (la[0, intervening_words.size] == intervening_words) # Exact match
441
+ iw = intervening_words
442
+ else
443
+ # We may have hyphenated adjectives. Break them up to check:
444
+ iw = intervening_words.map{|w| w.split(/-/)}.flatten
445
+ return nil unless la[0,iw.size] == iw
446
+ end
447
447
 
448
448
  # Any intervening_words matched, see what remains
449
449
  la.slice!(0, iw.size)
@@ -933,7 +933,9 @@ module ActiveFacts
933
933
  def identify_player context
934
934
  @player || begin
935
935
  @player = context.object_type @term
936
- raise "ObjectType #{@term} unrecognised" unless @player
936
+ unless @player
937
+ raise "ObjectType #{@term} unrecognised"
938
+ end
937
939
  context.player_by_role_name[@role_name] = player if @role_name
938
940
  @player
939
941
  end
@@ -953,8 +955,8 @@ module ActiveFacts
953
955
  t = @trailing_adjective
954
956
  key = [!l || l.empty? ? nil : l, @term, !t || t.empty? ? nil : t]
955
957
  end
956
- key += [:literal, literal.literal] if @literal
957
- key
958
+ key += [:literal, literal.literal] if @literal
959
+ key
958
960
  end
959
961
 
960
962
  def bind context
@@ -972,27 +974,27 @@ module ActiveFacts
972
974
  role_name = @term
973
975
  end
974
976
  end
975
- k = key
976
- @binding = context.bindings[k]
977
- if !@binding
978
- if !literal
979
- # Find a binding that has a literal, and bind to it if it's the only one
980
- candidates = context.bindings.map do |binding_key, binding|
981
- binding_key[0...k.size] == k &&
982
- binding_key[-2] == :literal ? binding : nil
983
- end.compact
984
- raise "Uncertain binding reference for #{to_s}, could be any of #{candidates.inspect}" if candidates.size > 1
985
- @binding = candidates[0]
986
- else
987
- # New binding has a literal, look for one without:
988
- @binding = context.bindings[k[0...-2]]
989
- end
990
- end
991
-
992
- if !@binding
993
- @binding = Binding.new(@player, role_name)
994
- context.bindings[k] = @binding
995
- end
977
+ k = key
978
+ @binding = context.bindings[k]
979
+ if !@binding
980
+ if !literal
981
+ # Find a binding that has a literal, and bind to it if it's the only one
982
+ candidates = context.bindings.map do |binding_key, binding|
983
+ binding_key[0...k.size] == k &&
984
+ binding_key[-2] == :literal ? binding : nil
985
+ end.compact
986
+ raise "Uncertain binding reference for #{to_s}, could be any of #{candidates.inspect}" if candidates.size > 1
987
+ @binding = candidates[0]
988
+ else
989
+ # New binding has a literal, look for one without:
990
+ @binding = context.bindings[k[0...-2]]
991
+ end
992
+ end
993
+
994
+ if !@binding
995
+ @binding = Binding.new(@player, role_name)
996
+ context.bindings[k] = @binding
997
+ end
996
998
  @binding.add_ref self
997
999
  @binding
998
1000
  end
@@ -1079,11 +1081,11 @@ module ActiveFacts
1079
1081
  :max_frequency => @quantifier.max,
1080
1082
  :min_frequency => @quantifier.min
1081
1083
  )
1082
- if @quantifier.pragmas
1083
- @quantifier.pragmas.each do |p|
1084
- constellation.ConceptAnnotation(:concept => constraint.concept, :mapping_annotation => p)
1085
- end
1086
- end
1084
+ if @quantifier.pragmas
1085
+ @quantifier.pragmas.each do |p|
1086
+ constellation.ConceptAnnotation(:concept => constraint.concept, :mapping_annotation => p)
1087
+ end
1088
+ end
1087
1089
  trace :constraint, "Made new embedded PC GUID=#{constraint.concept.guid} min=#{@quantifier.min.inspect} max=#{@quantifier.max.inspect} over #{(e = fact_type.entity_type) ? e.name : role_sequence.describe} in #{fact_type.describe}"
1088
1090
  @quantifier.enforcement.compile(constellation, constraint) if @quantifier.enforcement
1089
1091
  @embedded_presence_constraint = constraint
@@ -1110,7 +1112,7 @@ module ActiveFacts
1110
1112
  @max = max
1111
1113
  @enforcement = enforcement
1112
1114
  @context_note = context_note
1113
- @pragmas = pragmas
1115
+ @pragmas = pragmas
1114
1116
  end
1115
1117
 
1116
1118
  def is_unique
@@ -14,10 +14,10 @@ module ActiveFacts
14
14
  end
15
15
 
16
16
  class ContextNote
17
- attr_reader :context_kind, :discussion, :who, :agreed_date, :agreed_agents
17
+ attr_reader :context_kind, :description, :who, :agreed_date, :agreed_agents
18
18
 
19
- def initialize context_kind, discussion, who, agreed
20
- @context_kind, @discussion, @who, @agreed = context_kind, discussion, who, agreed
19
+ def initialize context_kind, description, who, agreed
20
+ @context_kind, @description, @who, @agreed = context_kind, description, who, agreed
21
21
  @agreed_date, @agreed_agents = *agreed
22
22
  end
23
23
 
@@ -26,7 +26,7 @@ module ActiveFacts
26
26
  constellation.ContextNote(
27
27
  :new,
28
28
  :context_note_kind => @context_kind,
29
- :discussion => @discussion
29
+ :description => @description
30
30
  )
31
31
  context_note.relevant_concept = target.concept
32
32
  if @agreed_date || @agreed_agents
@@ -49,14 +49,14 @@ module ActiveFacts
49
49
  def initialize context_note, enforcement, clauses_lists = []
50
50
  if context_note.is_a?(Treetop::Runtime::SyntaxNode) && !context_note.empty?
51
51
  context_note = context_note.empty? ? nil : context_note.ast
52
- else
53
- context_note = nil # Perhaps a context note got attached to one of the clauses. Steal it.
54
- clauses_lists.detect do |clauses_list|
55
- if c = clauses_list.last.context_note
56
- context_note = c
57
- clauses_list.last.context_note = nil
58
- end
59
- end
52
+ else
53
+ context_note = nil # Perhaps a context note got attached to one of the clauses. Steal it.
54
+ clauses_lists.detect do |clauses_list|
55
+ if c = clauses_list.last.context_note
56
+ context_note = c
57
+ clauses_list.last.context_note = nil
58
+ end
59
+ end
60
60
  end
61
61
  @context_note = context_note
62
62
  @enforcement = enforcement
@@ -233,13 +233,13 @@ module ActiveFacts
233
233
  :is_preferred_identifier => false,
234
234
  :is_mandatory => @quantifier.min && @quantifier.min > 0
235
235
  )
236
- if @quantifier.pragmas
237
- @quantifier.pragmas.each do |p|
238
- @constellation.ConceptAnnotation(:concept => @constraint.concept, :mapping_annotation => p)
239
- end
240
- end
236
+ if @quantifier.pragmas
237
+ @quantifier.pragmas.each do |p|
238
+ @constellation.ConceptAnnotation(:concept => @constraint.concept, :mapping_annotation => p)
239
+ end
240
+ end
241
241
  @enforcement.compile(@constellation, @constraint) if @enforcement
242
- trace :constraint, "Made new PC GUID=#{@constraint.concept.guid} min=#{@quantifier.min.inspect} max=#{@quantifier.max.inspect} over #{role_sequence.describe}"
242
+ trace :constraint, "Made new PC GUID=#{@constraint.concept.guid} min=#{@quantifier.min.inspect} max=#{@quantifier.max.inspect} over #{role_sequence.describe}"
243
243
  super
244
244
  end
245
245
 
@@ -285,9 +285,9 @@ module ActiveFacts
285
285
  # Does this clauses_list involve a query?
286
286
  if clauses_list.size > 1 or
287
287
  clauses_list.detect do |clause|
288
- clause.refs.detect{|ref| ref.nested_clauses } or
289
- clause.includes_literals
290
- end
288
+ clause.refs.detect{|ref| ref.nested_clauses } or
289
+ clause.includes_literals
290
+ end
291
291
 
292
292
  trace :query, "Building query for #{clauses_list.inspect}" do
293
293
  trace :query, "Constrained bindings are #{@common_bindings.inspect}"
@@ -390,11 +390,11 @@ module ActiveFacts
390
390
  :vocabulary => @vocabulary,
391
391
  :is_mandatory => @quantifier.min == 1
392
392
  )
393
- if @quantifier.pragmas
394
- @quantifier.pragmas.each do |p|
395
- @constellation.ConceptAnnotation(:concept => @constraint.concept, :mapping_annotation => p)
396
- end
397
- end
393
+ if @quantifier.pragmas
394
+ @quantifier.pragmas.each do |p|
395
+ @constellation.ConceptAnnotation(:concept => @constraint.concept, :mapping_annotation => p)
396
+ end
397
+ end
398
398
  @enforcement.compile(@constellation, @constraint) if @enforcement
399
399
  role_sequences.each_with_index do |role_sequence, i|
400
400
  @constellation.SetComparisonRoles(@constraint, i, :role_sequence => role_sequence)
@@ -518,35 +518,35 @@ module ActiveFacts
518
518
  @regular_expression = ast[:regular_expression]
519
519
  end
520
520
 
521
- def assert_value(val)
522
- if val.is_a?(String)
523
- @constellation.Value(eval(val), true, nil)
524
- elsif val
525
- @constellation.Value(val.to_s, false , nil)
526
- else
527
- nil
528
- end
529
- end
521
+ def assert_value(val)
522
+ if val.is_a?(String)
523
+ @constellation.Value(eval(val), true, nil)
524
+ elsif val
525
+ @constellation.Value(val.to_s, false , nil)
526
+ else
527
+ nil
528
+ end
529
+ end
530
530
 
531
531
  def compile
532
532
  @constraint = @constellation.ValueConstraint(:new)
533
533
  raise "Units on value constraints are not yet processed (at line #{'REVISIT'})" if @units
534
534
  # @string.line_of(node.interval.first)
535
535
 
536
- if @value_ranges
537
- @value_ranges.each do |range|
538
- min, max = Array === range ? range : [range, range]
539
- v_range = @constellation.ValueRange(
540
- min && @constellation.Bound(:value => assert_value(min), :is_inclusive => true),
541
- max && @constellation.Bound(:value => assert_value(max), :is_inclusive => true))
542
- ar = @constellation.AllowedRange(@constraint, v_range)
543
- end
544
- else
545
- @constraint.regular_expression = @regular_expression
546
- end
547
- @enforcement.compile(@constellation, @constraint) if @enforcement
548
- super
549
- end
536
+ if @value_ranges
537
+ @value_ranges.each do |range|
538
+ min, max = Array === range ? range : [range, range]
539
+ v_range = @constellation.ValueRange(
540
+ min && @constellation.Bound(:value => assert_value(min), :is_inclusive => true),
541
+ max && @constellation.Bound(:value => assert_value(max), :is_inclusive => true))
542
+ ar = @constellation.AllowedRange(@constraint, v_range)
543
+ end
544
+ else
545
+ @constraint.regular_expression = @regular_expression
546
+ end
547
+ @enforcement.compile(@constellation, @constraint) if @enforcement
548
+ super
549
+ end
550
550
 
551
551
  def vrto_s vr
552
552
  if Array === vr
@@ -568,10 +568,10 @@ module ActiveFacts
568
568
 
569
569
  def to_s
570
570
  "#{super} to " +
571
- (@value_ranges ?
572
- "(#{@value_ranges.map{|vr| vrto_s(vr) }.inspect })#{ @units ? " in #{@units.inspect}" : ''}" :
573
- @regular_expression
574
- )
571
+ (@value_ranges ?
572
+ "(#{@value_ranges.map{|vr| vrto_s(vr) }.inspect })#{ @units ? " in #{@units.inspect}" : ''}" :
573
+ @regular_expression
574
+ )
575
575
  end
576
576
  end
577
577