activefacts 1.6.0 → 1.7.1
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.
- checksums.yaml +4 -4
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +21 -0
- data/README.md +60 -0
- data/Rakefile +3 -80
- data/activefacts.gemspec +36 -0
- data/bin/afgen +4 -2
- data/bin/cql +5 -1
- data/lib/activefacts.rb +3 -12
- data/lib/activefacts/{vocabulary/query_evaluator.rb → query/evaluator.rb} +0 -0
- data/lib/activefacts/version.rb +2 -2
- metadata +48 -296
- data/History.txt +0 -4
- data/LICENSE +0 -19
- data/Manifest.txt +0 -165
- data/README.rdoc +0 -81
- data/css/offline.css +0 -3
- data/css/orm2.css +0 -124
- data/css/print.css +0 -8
- data/css/style-print.css +0 -357
- data/css/style.css +0 -387
- data/download.html +0 -110
- data/examples/CQL/Address.cql +0 -44
- data/examples/CQL/Blog.cql +0 -54
- data/examples/CQL/CompanyDirectorEmployee.cql +0 -56
- data/examples/CQL/Death.cql +0 -17
- data/examples/CQL/Diplomacy.cql +0 -48
- data/examples/CQL/Genealogy.cql +0 -98
- data/examples/CQL/Insurance.cql +0 -320
- data/examples/CQL/Marriage.cql +0 -18
- data/examples/CQL/Metamodel.cql +0 -493
- data/examples/CQL/Monogamy.cql +0 -24
- data/examples/CQL/MultiInheritance.cql +0 -22
- data/examples/CQL/NonRoleId.cql +0 -14
- data/examples/CQL/OddIdentifier.cql +0 -18
- data/examples/CQL/OilSupply.cql +0 -53
- data/examples/CQL/OneToOnes.cql +0 -17
- data/examples/CQL/Orienteering.cql +0 -111
- data/examples/CQL/PersonPlaysGame.cql +0 -18
- data/examples/CQL/RedundantDependency.cql +0 -34
- data/examples/CQL/SchoolActivities.cql +0 -33
- data/examples/CQL/SeparateSubtype.cql +0 -30
- data/examples/CQL/ServiceDirector.cql +0 -276
- data/examples/CQL/SimplestUnary.cql +0 -12
- data/examples/CQL/Supervision.cql +0 -34
- data/examples/CQL/WaiterTips.cql +0 -33
- data/examples/CQL/Warehousing.cql +0 -101
- data/examples/CQL/WindowInRoomInBldg.cql +0 -28
- data/examples/CQL/unit.cql +0 -474
- data/examples/index.html +0 -420
- data/examples/intro.html +0 -327
- data/examples/local.css +0 -24
- data/index.html +0 -111
- data/lib/activefacts/cql.rb +0 -35
- data/lib/activefacts/cql/CQLParser.treetop +0 -158
- data/lib/activefacts/cql/Context.treetop +0 -48
- data/lib/activefacts/cql/Expressions.treetop +0 -67
- data/lib/activefacts/cql/FactTypes.treetop +0 -358
- data/lib/activefacts/cql/Language/English.treetop +0 -315
- data/lib/activefacts/cql/LexicalRules.treetop +0 -253
- data/lib/activefacts/cql/ObjectTypes.treetop +0 -210
- data/lib/activefacts/cql/Rakefile +0 -14
- data/lib/activefacts/cql/Terms.treetop +0 -183
- data/lib/activefacts/cql/ValueTypes.treetop +0 -202
- data/lib/activefacts/cql/compiler.rb +0 -156
- data/lib/activefacts/cql/compiler/clause.rb +0 -1137
- data/lib/activefacts/cql/compiler/constraint.rb +0 -581
- data/lib/activefacts/cql/compiler/entity_type.rb +0 -457
- data/lib/activefacts/cql/compiler/expression.rb +0 -443
- data/lib/activefacts/cql/compiler/fact.rb +0 -390
- data/lib/activefacts/cql/compiler/fact_type.rb +0 -421
- data/lib/activefacts/cql/compiler/query.rb +0 -106
- data/lib/activefacts/cql/compiler/shared.rb +0 -161
- data/lib/activefacts/cql/compiler/value_type.rb +0 -174
- data/lib/activefacts/cql/nodes.rb +0 -49
- data/lib/activefacts/cql/parser.rb +0 -241
- data/lib/activefacts/dependency_analyser.rb +0 -182
- data/lib/activefacts/generate/absorption.rb +0 -70
- data/lib/activefacts/generate/composition.rb +0 -118
- data/lib/activefacts/generate/cql.rb +0 -714
- data/lib/activefacts/generate/dm.rb +0 -279
- data/lib/activefacts/generate/help.rb +0 -64
- data/lib/activefacts/generate/helpers/inject.rb +0 -16
- data/lib/activefacts/generate/helpers/oo.rb +0 -162
- data/lib/activefacts/generate/helpers/ordered.rb +0 -605
- data/lib/activefacts/generate/helpers/rails.rb +0 -57
- data/lib/activefacts/generate/html/glossary.rb +0 -461
- data/lib/activefacts/generate/json.rb +0 -337
- data/lib/activefacts/generate/null.rb +0 -32
- data/lib/activefacts/generate/rails/models.rb +0 -246
- data/lib/activefacts/generate/rails/schema.rb +0 -216
- data/lib/activefacts/generate/records.rb +0 -46
- data/lib/activefacts/generate/ruby.rb +0 -133
- data/lib/activefacts/generate/sql/mysql.rb +0 -280
- data/lib/activefacts/generate/sql/server.rb +0 -273
- data/lib/activefacts/generate/stats.rb +0 -69
- data/lib/activefacts/generate/text.rb +0 -27
- data/lib/activefacts/generate/topics.rb +0 -265
- data/lib/activefacts/generate/traits/datavault.rb +0 -241
- data/lib/activefacts/generate/traits/oo.rb +0 -73
- data/lib/activefacts/generate/traits/ordered.rb +0 -33
- data/lib/activefacts/generate/traits/ruby.rb +0 -210
- data/lib/activefacts/generate/transform/datavault.rb +0 -266
- data/lib/activefacts/generate/transform/surrogate.rb +0 -214
- data/lib/activefacts/generate/version.rb +0 -26
- data/lib/activefacts/input/cql.rb +0 -43
- data/lib/activefacts/input/orm.rb +0 -1636
- data/lib/activefacts/mapping/rails.rb +0 -132
- data/lib/activefacts/persistence.rb +0 -15
- data/lib/activefacts/persistence/columns.rb +0 -446
- data/lib/activefacts/persistence/foreignkey.rb +0 -187
- data/lib/activefacts/persistence/index.rb +0 -240
- data/lib/activefacts/persistence/object_type.rb +0 -198
- data/lib/activefacts/persistence/reference.rb +0 -434
- data/lib/activefacts/persistence/tables.rb +0 -380
- data/lib/activefacts/registry.rb +0 -11
- data/lib/activefacts/support.rb +0 -132
- data/lib/activefacts/vocabulary.rb +0 -9
- data/lib/activefacts/vocabulary/extensions.rb +0 -1348
- data/lib/activefacts/vocabulary/metamodel.rb +0 -570
- data/lib/activefacts/vocabulary/verbaliser.rb +0 -804
- data/script/txt2html +0 -71
- data/spec/absorption_spec.rb +0 -95
- data/spec/cql/comparison_spec.rb +0 -89
- data/spec/cql/context_spec.rb +0 -94
- data/spec/cql/contractions_spec.rb +0 -224
- data/spec/cql/deontic_spec.rb +0 -88
- data/spec/cql/entity_type_spec.rb +0 -320
- data/spec/cql/expressions_spec.rb +0 -66
- data/spec/cql/fact_type_matching_spec.rb +0 -338
- data/spec/cql/french_spec.rb +0 -21
- data/spec/cql/parser/bad_literals_spec.rb +0 -86
- data/spec/cql/parser/constraints_spec.rb +0 -19
- data/spec/cql/parser/entity_types_spec.rb +0 -106
- data/spec/cql/parser/expressions_spec.rb +0 -199
- data/spec/cql/parser/fact_types_spec.rb +0 -44
- data/spec/cql/parser/literals_spec.rb +0 -312
- data/spec/cql/parser/pragmas_spec.rb +0 -89
- data/spec/cql/parser/value_types_spec.rb +0 -42
- data/spec/cql/role_matching_spec.rb +0 -148
- data/spec/cql/samples_spec.rb +0 -244
- data/spec/cql_cql_spec.rb +0 -73
- data/spec/cql_dm_spec.rb +0 -136
- data/spec/cql_mysql_spec.rb +0 -69
- data/spec/cql_parse_spec.rb +0 -34
- data/spec/cql_ruby_spec.rb +0 -73
- data/spec/cql_sql_spec.rb +0 -72
- data/spec/cql_symbol_tables_spec.rb +0 -261
- data/spec/cqldump_spec.rb +0 -170
- data/spec/helpers/array_matcher.rb +0 -23
- data/spec/helpers/ctrl_c_support.rb +0 -52
- data/spec/helpers/diff_matcher.rb +0 -39
- data/spec/helpers/file_matcher.rb +0 -34
- data/spec/helpers/parse_to_ast_matcher.rb +0 -80
- data/spec/helpers/string_matcher.rb +0 -30
- data/spec/helpers/test_parser.rb +0 -15
- data/spec/norma_cql_spec.rb +0 -66
- data/spec/norma_ruby_spec.rb +0 -62
- data/spec/norma_ruby_sql_spec.rb +0 -107
- data/spec/norma_sql_spec.rb +0 -57
- data/spec/norma_tables_spec.rb +0 -95
- data/spec/ruby_api_spec.rb +0 -23
- data/spec/spec_helper.rb +0 -35
- data/spec/transform_surrogate_spec.rb +0 -59
- data/status.html +0 -138
- data/why.html +0 -60
data/examples/local.css
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
@charset "utf-8";
|
|
2
|
-
|
|
3
|
-
.offline {
|
|
4
|
-
display: none;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
.localnav {
|
|
8
|
-
position:fixed;
|
|
9
|
-
left:25px;
|
|
10
|
-
top:210px;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.hangleft {
|
|
14
|
-
margin-left: -220px;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
table.examples { border: 6px solid #e5f0f0; box-shadow: 0px 2px 5px black; -webkit-box-shadow: 1px 1px 5px black; -moz-box-shadow: 0px 2px 5px black; border-radius:0.8em; -webkit-border-radius:0.8em; -moz-border-radius:0.8em; border-collapse: separate; border-spacing: 0; }
|
|
18
|
-
.examples td { vertical-align: top; padding: 8px 5px 8px 5px; }
|
|
19
|
-
.examples td a:link { font-size: 0.78em; }
|
|
20
|
-
.examples td.title span { font-size: 1.3em; }
|
|
21
|
-
.examples td.title > a { font-weight:bold; padding: 0px 30px 0px 0px; }
|
|
22
|
-
.examples .diagrams a { display: block; padding: 0px 0px 0px 0px; }
|
|
23
|
-
.even { background: #e5f8f9; }
|
|
24
|
-
.odd { }
|
data/index.html
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
<!--#include virtual="/header.html" -->
|
|
2
|
-
<!--#include virtual="navbar.html" -->
|
|
3
|
-
|
|
4
|
-
<link rel="stylesheet" href="css/offline.css" media="screen" type="text/css" />
|
|
5
|
-
<link rel="stylesheet" href="css/print.css" media="print" type="text/css" />
|
|
6
|
-
|
|
7
|
-
<!-- Things to show only in the online version -->
|
|
8
|
-
<div id="sidebar" class="online">
|
|
9
|
-
<h3>Quotes</h3>
|
|
10
|
-
|
|
11
|
-
<p><em>“You have to get this out there, it will change <b>almost everything</b>
|
|
12
|
-
that <b>all</b> of us actually <b>do</b>”</em></p>
|
|
13
|
-
<p align="right">Mark Mansour,<br>Agile Alliance Australia</p>
|
|
14
|
-
|
|
15
|
-
<!--p><em>“I've long believed there must be a way to do this, but could never
|
|
16
|
-
work out how to start.”</em></p>
|
|
17
|
-
<p align="right">OSDC conference attendee</p-->
|
|
18
|
-
|
|
19
|
-
<p><em>“Epic, a major achievement. Your approach is so far ahead of the
|
|
20
|
-
industry it's hard to believe it possible.”</em></p>
|
|
21
|
-
<p align="right">Richard P,<br>OSDC conference attendee</p-->
|
|
22
|
-
|
|
23
|
-
<!--p><em>“Inspirational!”</em></p>
|
|
24
|
-
<p align="right">Sven Dowideit</p-->
|
|
25
|
-
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<div id="top" class="content">
|
|
29
|
-
<h2>ActiveFacts</h2>
|
|
30
|
-
|
|
31
|
-
<!-- Things to show only in the offline version -->
|
|
32
|
-
<div class="localnav offline noprint">
|
|
33
|
-
<ul>
|
|
34
|
-
<li><a href="http://dataconstellation.com" title="Data Constellation Home">Data Constellation</a></li>
|
|
35
|
-
<li><a href="http://dataconstellation.com/ActiveFacts" title="ActiveFacts Home Page">ActiveFacts Home</a></li>
|
|
36
|
-
<li><a href="examples/index.html" title="Example Models">Example Models</a></li>
|
|
37
|
-
<li><a href="examples/intro.html" title="Introduction to ORM2">Introduction to ORM2</a></li>
|
|
38
|
-
<li><a href="http://dataconstellation.com/ActiveFacts/CQLIntroduction.html" title="The Constellation Query Language">Constellation Query Language</a></li>
|
|
39
|
-
<li><a href="status.html" title="Project Status">Project Status</a></li>
|
|
40
|
-
<li><a href="download.html" title="Download">Download</a></li>
|
|
41
|
-
<!--li><a href="resources.html" title="Resources">Resources</a></li-->
|
|
42
|
-
</ul>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
<p>
|
|
46
|
-
ActiveFacts is a <strong>semantic modeling toolkit</strong> that
|
|
47
|
-
revolutionises the processes of software <strong>specification</strong>,
|
|
48
|
-
<strong>design</strong>, and <strong>implementation</strong>. It
|
|
49
|
-
incorporates the Constellation Query Language (CQL) and the Constellation
|
|
50
|
-
API, which together enable your data to be designed, expressed and
|
|
51
|
-
queried in a completely natural form for the first time. The language
|
|
52
|
-
is so easy to learn and use because of the way it incorporates natural
|
|
53
|
-
language expressions into a formal framework. This allows the business
|
|
54
|
-
user (in conjunction with the programmer and database experts) to use
|
|
55
|
-
the language to express the rules and behaviour of the business domain,
|
|
56
|
-
in the process formulating efficient database designs without needing
|
|
57
|
-
specialist database skills.
|
|
58
|
-
|
|
59
|
-
<h3> Constellation Query Language </h3>
|
|
60
|
-
|
|
61
|
-
<p> CQL achieves the seemingly impossible task of combining the
|
|
62
|
-
precision of a <strong>formal</strong> language with the
|
|
63
|
-
intuitive feel of natural language. It can be used both to
|
|
64
|
-
define and query semantic models. You can write CQL models
|
|
65
|
-
directly, use APRIMO, or import <a href="examples/intro.html"
|
|
66
|
-
>ORM2</a> models from <a
|
|
67
|
-
href="http://www.ormfoundation.org/files/">NORMA</a>. See
|
|
68
|
-
some <a href="examples/">example</a> models, or read the <a
|
|
69
|
-
href="CQLIntroduction.html">specification</a>.
|
|
70
|
-
</p>
|
|
71
|
-
|
|
72
|
-
<h3> Constellation API </h3>
|
|
73
|
-
<p> The Constellation API goes beyond object-oriented to
|
|
74
|
-
fact-oriented programming, introducing a new way to code
|
|
75
|
-
transactional applications. A Constellation of related facts
|
|
76
|
-
derived from a query can be modified only by <em>assert</em>
|
|
77
|
-
and <em>retract</em> operations. The result is translated
|
|
78
|
-
back to relational form and saved on demand.
|
|
79
|
-
</p>
|
|
80
|
-
|
|
81
|
-
<p>
|
|
82
|
-
In the preferred case, each user action results in a
|
|
83
|
-
single query, which can span deeply into and across the
|
|
84
|
-
whole database (more than just a relational join),
|
|
85
|
-
returning only the data required to respond to that action.
|
|
86
|
-
Any required changes are made to the result Constellation,
|
|
87
|
-
and a single <em>save</em> operation pushes all the changes
|
|
88
|
-
resulting from the user's action back into the database in
|
|
89
|
-
a single atomic action.
|
|
90
|
-
</p>
|
|
91
|
-
|
|
92
|
-
<h3> Code generators </h3>
|
|
93
|
-
<p> The ActiveFacts code generation framework reads CQL
|
|
94
|
-
and emits extensible and effective object models for
|
|
95
|
-
use with the Constellation API, and efficient SQL
|
|
96
|
-
for whatever relational database product you're using.
|
|
97
|
-
Learn to write CQL and have a play with the open source
|
|
98
|
-
<a href="download.html">Ruby code generator</a>.
|
|
99
|
-
</p>
|
|
100
|
-
|
|
101
|
-
<h3> APRIMO </h3>
|
|
102
|
-
<p> APRIMO is a semantic model development environment,
|
|
103
|
-
incorporating a Flash-based graphical designer that
|
|
104
|
-
implements ORM2 diagrams, with direct CQL entry and
|
|
105
|
-
even reverse engineering tools for existing databases.
|
|
106
|
-
APRIMO is not yet publicly available.
|
|
107
|
-
</p>
|
|
108
|
-
|
|
109
|
-
</div>
|
|
110
|
-
|
|
111
|
-
<!--#include virtual="/footer.html" -->
|
data/lib/activefacts/cql.rb
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL loader.
|
|
3
|
-
# Use Polyglot to patch things so you can *require* a CQL file and have it define a Ruby module.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
6
|
-
#
|
|
7
|
-
require 'rubygems'
|
|
8
|
-
require 'polyglot'
|
|
9
|
-
require 'stringio'
|
|
10
|
-
require 'activefacts/support'
|
|
11
|
-
require 'activefacts/input/cql'
|
|
12
|
-
require 'activefacts/generate/ruby'
|
|
13
|
-
|
|
14
|
-
module ActiveFacts
|
|
15
|
-
# This class has a load method for Polyglot to tell it how to _require_ a CQL file.
|
|
16
|
-
# The CQL file is parsed to a vocabulary constellation, which is generated
|
|
17
|
-
# to Ruby code and eval'd, making the generated classes available.
|
|
18
|
-
# To make this Loader available, simply
|
|
19
|
-
# require 'activefacts/cql'
|
|
20
|
-
class CQLLoader
|
|
21
|
-
def self.load(file) #:nodoc:
|
|
22
|
-
trace "Loading #{file}" do
|
|
23
|
-
vocabulary = ActiveFacts::Input::CQL.readfile(file)
|
|
24
|
-
|
|
25
|
-
ruby = StringIO.new
|
|
26
|
-
@dumper = ActiveFacts::Generate::RUBY.new(vocabulary.constellation)
|
|
27
|
-
@dumper.generate(ruby)
|
|
28
|
-
ruby.rewind
|
|
29
|
-
eval ruby.read, ::TOPLEVEL_BINDING
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
Polyglot.register('cql', CQLLoader)
|
|
35
|
-
end
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Parser.
|
|
3
|
-
# Parse rules relating to high-level CQL definitions and constraints.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
6
|
-
#
|
|
7
|
-
module ActiveFacts
|
|
8
|
-
module CQL
|
|
9
|
-
grammar CQL
|
|
10
|
-
include LexicalRules
|
|
11
|
-
include Expressions
|
|
12
|
-
include Terms
|
|
13
|
-
include ObjectTypes
|
|
14
|
-
include ValueTypes
|
|
15
|
-
include FactTypes
|
|
16
|
-
include Context
|
|
17
|
-
|
|
18
|
-
rule cql_file
|
|
19
|
-
s seq:definition*
|
|
20
|
-
{
|
|
21
|
-
def definitions
|
|
22
|
-
seq.elements.map{|e|
|
|
23
|
-
e.value rescue $stderr.puts "Can't call value() on #{e.inspect}"
|
|
24
|
-
}
|
|
25
|
-
end
|
|
26
|
-
}
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Each definition has an ast() method that returns an instance of a subclass of Compiler::Definition
|
|
30
|
-
rule definition
|
|
31
|
-
definition_body s
|
|
32
|
-
{
|
|
33
|
-
def ast
|
|
34
|
-
definition_body.ast
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def body
|
|
38
|
-
definition_body.text_value
|
|
39
|
-
end
|
|
40
|
-
}
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
rule definition_body
|
|
44
|
-
vocabulary_definition
|
|
45
|
-
/ import_definition
|
|
46
|
-
/ prescan # Always fails, but its side-effects are needed in the following
|
|
47
|
-
/ constraint
|
|
48
|
-
/ unit_definition # REVISIT: Move this above the prescan?
|
|
49
|
-
/ object_type
|
|
50
|
-
/ query
|
|
51
|
-
/ s ';' s { def ast; nil; end }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
rule vocabulary_definition
|
|
55
|
-
s vocabulary S vocabulary_name s ';'
|
|
56
|
-
{
|
|
57
|
-
def ast
|
|
58
|
-
Compiler::Vocabulary.new(vocabulary_name.value)
|
|
59
|
-
end
|
|
60
|
-
}
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
rule vocabulary_name
|
|
64
|
-
id
|
|
65
|
-
{ def node_type; :vocabulary; end }
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
rule import_definition
|
|
69
|
-
s import S vocabulary_name alias_list ';'
|
|
70
|
-
{
|
|
71
|
-
def ast
|
|
72
|
-
Compiler::Import.new(import.input.parser, vocabulary_name.value, alias_list.value)
|
|
73
|
-
end
|
|
74
|
-
}
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# REVISIT: Need a way to define equivalent readings for fact types here (and in the metamodel)
|
|
78
|
-
rule alias_list
|
|
79
|
-
( s ',' s alias S aliased_from:alias_term S as S alias_to:alias_term s )*
|
|
80
|
-
{
|
|
81
|
-
def value
|
|
82
|
-
elements.inject({}){|h, e| h[e.aliased_from.value] = e.alias_to; h }
|
|
83
|
-
end
|
|
84
|
-
}
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
rule alias_term
|
|
88
|
-
id
|
|
89
|
-
{ def node_type; :term; end }
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
rule constraint
|
|
93
|
-
subset_constraint /
|
|
94
|
-
equality_constraint /
|
|
95
|
-
set_constraint /
|
|
96
|
-
presence_constraint
|
|
97
|
-
# REVISIT: / value_constraint
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
rule enforcement
|
|
101
|
-
s '(' s otherwise s action s a:agent? s ')' s
|
|
102
|
-
{
|
|
103
|
-
def ast; Compiler::Enforcement.new(action.text_value, a.empty? ? nil : a.text_value); end
|
|
104
|
-
}
|
|
105
|
-
/
|
|
106
|
-
''
|
|
107
|
-
{
|
|
108
|
-
def ast; nil; end
|
|
109
|
-
}
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# An enforcement action, like SMS, email, log, alarm, etc.
|
|
113
|
-
rule action
|
|
114
|
-
id
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# presence constraint:
|
|
118
|
-
rule presence_constraint
|
|
119
|
-
(each_occurs_in_clauses / either_or)
|
|
120
|
-
{
|
|
121
|
-
def ast
|
|
122
|
-
Compiler::PresenceConstraint.new c, enforcement.ast, clauses_ast, role_list_ast, quantifier_ast
|
|
123
|
-
end
|
|
124
|
-
}
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# set (exclusion, mandatory exclusion, complex equality) constraint
|
|
128
|
-
rule set_constraint
|
|
129
|
-
(for_each_how_many / either_or_not_both)
|
|
130
|
-
{
|
|
131
|
-
def ast
|
|
132
|
-
Compiler::SetExclusionConstraint.new c, enforcement.ast, clauses_ast, role_list_ast, quantifier_ast
|
|
133
|
-
end
|
|
134
|
-
}
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
rule subset_constraint
|
|
138
|
-
(a_only_if_b / if_b_then_a)
|
|
139
|
-
{
|
|
140
|
-
def ast
|
|
141
|
-
Compiler::SubsetConstraint.new c, enforcement.ast, [clauses.ast, r2.ast]
|
|
142
|
-
end
|
|
143
|
-
}
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
rule equality_constraint
|
|
147
|
-
if_and_only_if
|
|
148
|
-
{
|
|
149
|
-
def ast
|
|
150
|
-
all_clauses = [clauses.ast, *tail.elements.map{|e| e.clauses.ast }]
|
|
151
|
-
Compiler::SetEqualityConstraint.new c, enforcement.ast, all_clauses
|
|
152
|
-
end
|
|
153
|
-
}
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Parser.
|
|
3
|
-
# Parse rules relating to definition context.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
6
|
-
#
|
|
7
|
-
module ActiveFacts
|
|
8
|
-
module CQL
|
|
9
|
-
grammar Context
|
|
10
|
-
rule context_note
|
|
11
|
-
'('
|
|
12
|
-
s w:who_says? s context_type discussion agreed:(',' a:as_agreed_by)? s
|
|
13
|
-
')' s
|
|
14
|
-
{
|
|
15
|
-
def value
|
|
16
|
-
[ w.empty? ? nil : w.value, context_type.value, discussion.text_value, agreed.empty? ? [] : agreed.a.value]
|
|
17
|
-
end
|
|
18
|
-
def ast
|
|
19
|
-
who = w.empty? ? nil : w.value
|
|
20
|
-
ag = agreed.empty? ? [] : agreed.a.value
|
|
21
|
-
Compiler::ContextNote.new context_type.value, discussion.text_value, who, ag
|
|
22
|
-
end
|
|
23
|
-
}
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
rule who_says
|
|
27
|
-
according_to agents s ','
|
|
28
|
-
{ def value; agents.value; end }
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
rule context_type
|
|
32
|
-
because s { def value; 'because'; end } /
|
|
33
|
-
as_opposed_to { def value; 'as_opposed_to'; end } /
|
|
34
|
-
so_that { def value; 'so_that'; end } /
|
|
35
|
-
to_avoid { def value; 'to_avoid'; end }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
rule discussion
|
|
39
|
-
(
|
|
40
|
-
'(' discussion ')' / (!( [()] / ',' as_agreed_by) .)*
|
|
41
|
-
)
|
|
42
|
-
{
|
|
43
|
-
def node_type; :linking; end
|
|
44
|
-
}
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Parser.
|
|
3
|
-
# Parse rules relating to Expressions
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
6
|
-
#
|
|
7
|
-
module ActiveFacts
|
|
8
|
-
module CQL
|
|
9
|
-
grammar Expressions
|
|
10
|
-
rule expression
|
|
11
|
-
sum
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
rule sum
|
|
15
|
-
t0:product s tail:( op:add_op s t1:product s )*
|
|
16
|
-
{
|
|
17
|
-
def ast
|
|
18
|
-
if tail.elements.empty?
|
|
19
|
-
t0.ast
|
|
20
|
-
else
|
|
21
|
-
Compiler::Sum.new(t0.ast, *tail.elements.map{|e| e.op.text_value == '-' ? Compiler::Negate.new(e.t1.ast) : e.t1.ast})
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
}
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
rule add_op
|
|
28
|
-
'+' / '-'
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
rule product
|
|
32
|
-
f0:factor s tail:( op:mul_op s f1:factor s )*
|
|
33
|
-
{
|
|
34
|
-
def ast
|
|
35
|
-
if tail.elements.empty?
|
|
36
|
-
f0.ast
|
|
37
|
-
else
|
|
38
|
-
Compiler::Product.new(f0.ast, *tail.elements.map{|e| e.op.text_value != '*' ? Compiler::Reciprocal.new(e.op.text_value, e.f1.ast) : e.f1.ast})
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
}
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
rule factor
|
|
45
|
-
literal u:unit? s
|
|
46
|
-
{
|
|
47
|
-
def ast
|
|
48
|
-
Compiler::Literal.new(literal.value, u.empty? ? nil : u.text_value)
|
|
49
|
-
end
|
|
50
|
-
}
|
|
51
|
-
/ derived_variable
|
|
52
|
-
/ !context_note '(' s sum s ')' s { def ast; sum.ast; end }
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
rule derived_variable
|
|
56
|
-
derived:term s role_id:(role_name / subscript )?
|
|
57
|
-
{
|
|
58
|
-
def ast quantifier = nil, value_constraint = nil, literal = nil, nested_clauses = nil
|
|
59
|
-
role_name = role_id.empty? ? nil : role_id.value
|
|
60
|
-
derived.ast(quantifier, nil, role_name, value_constraint, literal, nested_clauses)
|
|
61
|
-
end
|
|
62
|
-
}
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|