activefacts-cql 1.8.2 → 1.8.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc4fec528ea30db43664caba24b4eae5b394d59b
4
- data.tar.gz: 670db8c27a33bf2a3777127fd3d41babd0641718
3
+ metadata.gz: 17b326a796d8f23d4b73ca8af114df35ae8d1cb0
4
+ data.tar.gz: 9b99bebe1d49eb09878bb3df01302f7649e58fea
5
5
  SHA512:
6
- metadata.gz: d57cf6ed6d728b03c4f4b644e4a1866e313d53fef2315674be23f1f0695b7294b3ef388196c7bf95aca581a54b4da29b0ce65a79fe9944b17d128c0441e092d6
7
- data.tar.gz: 46e7553490bd3bcaf73c65b5006d7c1f13e38fbaf46e41f4d1a32ce6afaa0066c9e15e723ea2a48f22af887fb562c4fb6e26a8a954c66f57e6d67a9669a3ced1
6
+ metadata.gz: 15e06b8dea51d28928b9618f0b3903c6db8721a4695f5682a8d0391f5d48a88851d04e6aa7db215f97b64296e97f0a4a4ab660a549634d5632efbbb96101badf
7
+ data.tar.gz: bff64b710592ac5bf3ff9da9b1a99243da09a6dd8c613af478da0b15e363c5bfb7ef08826e4fa16573d0f23f8b63062fe2ea60287f899c9edf93da465c98add0
@@ -860,8 +860,8 @@ module ActiveFacts
860
860
  end
861
861
 
862
862
  class Reference
863
- attr_reader :term, :quantifier, :function_call, :value_constraint, :literal, :nested_clauses
864
- attr_accessor :leading_adjective, :trailing_adjective, :role_name
863
+ attr_reader :term, :function_call, :value_constraint, :literal, :nested_clauses
864
+ attr_accessor :quantifier, :leading_adjective, :trailing_adjective, :role_name
865
865
  attr_accessor :player # What ObjectType does the Binding denote
866
866
  attr_accessor :binding # What Binding for that ObjectType
867
867
  attr_accessor :role # Which Role of this ObjectType
@@ -1105,7 +1105,7 @@ module ActiveFacts
1105
1105
  attr_accessor :enforcement
1106
1106
  attr_accessor :context_note
1107
1107
  attr_accessor :pragmas
1108
- attr_reader :min, :max
1108
+ attr_accessor :min, :max
1109
1109
 
1110
1110
  def initialize min, max, enforcement = nil, context_note = nil, pragmas = nil
1111
1111
  @min = min
@@ -54,7 +54,7 @@ module ActiveFacts
54
54
 
55
55
  # At this point, @identification is an array of References and/or Clauses (for unary fact types)
56
56
  # Have to do this after creating the necessary fact types
57
- complete_reference_mode_fact_type fact_types
57
+ complete_reference_mode_fact_type context, fact_types
58
58
 
59
59
  # Find the roles to use if we have to create an identifying uniqueness constraint:
60
60
  identifying_roles = bind_identifying_roles context
@@ -276,8 +276,17 @@ module ActiveFacts
276
276
  @reference_mode_value_type = vt
277
277
  end
278
278
 
279
- def complete_reference_mode_fact_type(fact_types)
280
- return unless identifying_type = @reference_mode_value_type
279
+ def complete_reference_mode_fact_type context, fact_types
280
+ identifying_type =
281
+ @reference_mode_value_type ||
282
+ begin
283
+ @identification && # There's an "identified by" clause
284
+ @identification.size == 1 && # With just one identifying role
285
+ (id = @identification[0]).is_a?(Reference) && # Which is a simple reference
286
+ @clauses.size == 0 && # No readings for this role
287
+ id.binding.player # And the player is bound already
288
+ end
289
+ return unless identifying_type
281
290
 
282
291
  # Find an existing fact type, if any:
283
292
  entity_role = identifying_role = nil
@@ -71,8 +71,13 @@ module ActiveFacts
71
71
  end
72
72
 
73
73
  rule vocabulary_name
74
- id
75
- { def node_type; :vocabulary; end }
74
+ id tail:(S id)*
75
+ {
76
+ def node_type; :vocabulary; end
77
+ def value
78
+ [id.value, *tail.elements.map{|e| e.id.value }].join(' ')
79
+ end
80
+ }
76
81
  end
77
82
 
78
83
  rule import_definition
@@ -16,18 +16,31 @@ module ActiveFacts
16
16
  }
17
17
  end
18
18
 
19
- rule named_fact_type
20
- s each?
21
- s term_definition_name
22
- mapping_pragmas is_where
19
+ rule fact_type
20
+ s each:(each)? # Chew the "each" or it will get accepted as a quantifier
21
+ name:(s term_definition_name mapping_pragmas is_where)? # Name of objectifying entity type
23
22
  anonymous_fact_type
24
23
  {
25
24
  def ast
26
25
  ft = anonymous_fact_type.ast
27
- ft.name = term_definition_name.value
28
- pragmas = mapping_pragmas.value
29
- pragmas << 'independent' if is_where.independent
30
- ft.pragmas = pragmas
26
+ if !name.empty?
27
+ # "each" is often used, and doesn't imply uniqueness
28
+ ft.name = name.term_definition_name.value
29
+ pragmas = name.mapping_pragmas.value
30
+ pragmas << 'independent' if name.is_where.independent
31
+ ft.pragmas = pragmas
32
+ elsif !each.empty?
33
+ # Handle the implied mandatory constraint on the appropriate role
34
+ first_reading = ft.clauses[0]
35
+ refs = first_reading.refs
36
+ raise "Ambiguous 'each' implies mandatory on fact type of arity #{refs.size}" unless refs.size == 2
37
+ q = refs[-1].quantifier
38
+ if q
39
+ q.min = 1 # Make the existing quantifier mandatory
40
+ else
41
+ refs[-1].quantifier = q = Compiler::Quantifier.new(1, nil)
42
+ end
43
+ end
31
44
  ft
32
45
  end
33
46
  }
@@ -66,7 +79,7 @@ module ActiveFacts
66
79
  rule query_clauses
67
80
  qualified_clauses
68
81
  # REVISIT: This creates no precedence between and/or, which could cause confusion.
69
- # Should disallow mixed conjuntions - using a sempred?
82
+ # Should disallow mixed conjunctions - using a sempred?
70
83
  ftail:( conjunction:(',' / and / or ) s qualified_clauses s )*
71
84
  {
72
85
  def ast
@@ -167,8 +167,7 @@ module ActiveFacts
167
167
  end
168
168
 
169
169
  rule quantifier1
170
- (each s { def value; [1, nil]; end })
171
- / (some s { def value; nil; end })
170
+ (some s { def value; nil; end })
172
171
  # REVISIT: "Some" means that any prior occurrence of this role player is to be ignored; this is a new occurrence
173
172
  # "that" on the other hand means that this role player was *previously* designated using "some".
174
173
  # These distinctions are lost here
@@ -308,7 +307,7 @@ module ActiveFacts
308
307
  rule transient 'transient' !alphanumeric end
309
308
  rule transitive 'transitive' !alphanumeric end
310
309
  rule true 'true' !alphanumeric end
311
- rule vocabulary 'vocabulary' !alphanumeric end
310
+ rule vocabulary ('vocabulary' / 'schema') !alphanumeric end
312
311
  rule when 'when' !alphanumeric end
313
312
  rule where 'where' !alphanumeric end
314
313
  rule which 'which' !alphanumeric end
@@ -10,8 +10,7 @@ module ActiveFacts
10
10
  rule object_type
11
11
  value_type
12
12
  / entity_type
13
- / named_fact_type
14
- / anonymous_fact_type
13
+ / fact_type
15
14
  end
16
15
 
17
16
  rule entity_type
@@ -93,7 +92,7 @@ module ActiveFacts
93
92
  end
94
93
  }
95
94
  /
96
- identified_by role_list
95
+ identified_by role_list # REVISIT: We'd like to be able to use implicit_value_type_names here too.
97
96
  &{|s|
98
97
  role_list = s[-1]
99
98
  forwards = role_list.ast.
@@ -44,6 +44,9 @@ module ActiveFacts
44
44
  in S units
45
45
  end
46
46
 
47
+ # A ValueType name that might not yet have been identified or registered as a Term
48
+ # REVISIT: We'd like to support multi-word terms here (cannot include "where", "and", or anything that could follow in the value_type definition)
49
+ # REVISIT: We'd like these to be forward-referenced ObjectTypes too, not immediately created as ValueTypes
47
50
  rule implicit_value_type_name
48
51
  id
49
52
  {
@@ -1,5 +1,5 @@
1
1
  module ActiveFacts
2
2
  module CQL
3
- VERSION = "1.8.2"
3
+ VERSION = "1.8.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activefacts-cql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clifford Heath
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-09 00:00:00.000000000 Z
11
+ date: 2017-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler