activefacts 0.6.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.
- data/History.txt +4 -0
- data/Manifest.txt +83 -0
- data/README.rdoc +81 -0
- data/Rakefile +41 -0
- data/bin/afgen +46 -0
- data/bin/cql +52 -0
- data/examples/CQL/Address.cql +46 -0
- data/examples/CQL/Blog.cql +54 -0
- data/examples/CQL/CompanyDirectorEmployee.cql +51 -0
- data/examples/CQL/Death.cql +16 -0
- data/examples/CQL/Genealogy.cql +95 -0
- data/examples/CQL/Marriage.cql +18 -0
- data/examples/CQL/Metamodel.cql +238 -0
- data/examples/CQL/MultiInheritance.cql +19 -0
- data/examples/CQL/OilSupply.cql +47 -0
- data/examples/CQL/Orienteering.cql +108 -0
- data/examples/CQL/PersonPlaysGame.cql +17 -0
- data/examples/CQL/SchoolActivities.cql +31 -0
- data/examples/CQL/SimplestUnary.cql +12 -0
- data/examples/CQL/SubtypePI.cql +32 -0
- data/examples/CQL/Warehousing.cql +99 -0
- data/examples/CQL/WindowInRoomInBldg.cql +22 -0
- data/lib/activefacts.rb +10 -0
- data/lib/activefacts/api.rb +25 -0
- data/lib/activefacts/api/concept.rb +384 -0
- data/lib/activefacts/api/constellation.rb +106 -0
- data/lib/activefacts/api/entity.rb +239 -0
- data/lib/activefacts/api/instance.rb +54 -0
- data/lib/activefacts/api/numeric.rb +158 -0
- data/lib/activefacts/api/role.rb +94 -0
- data/lib/activefacts/api/standard_types.rb +67 -0
- data/lib/activefacts/api/support.rb +59 -0
- data/lib/activefacts/api/value.rb +122 -0
- data/lib/activefacts/api/vocabulary.rb +120 -0
- data/lib/activefacts/cql.rb +31 -0
- data/lib/activefacts/cql/CQLParser.treetop +104 -0
- data/lib/activefacts/cql/Concepts.treetop +112 -0
- data/lib/activefacts/cql/DataTypes.treetop +66 -0
- data/lib/activefacts/cql/Expressions.treetop +113 -0
- data/lib/activefacts/cql/FactTypes.treetop +185 -0
- data/lib/activefacts/cql/Language/English.treetop +92 -0
- data/lib/activefacts/cql/LexicalRules.treetop +169 -0
- data/lib/activefacts/cql/Rakefile +6 -0
- data/lib/activefacts/cql/parser.rb +88 -0
- data/lib/activefacts/generate/absorption.rb +87 -0
- data/lib/activefacts/generate/cql.rb +441 -0
- data/lib/activefacts/generate/cql/html.rb +397 -0
- data/lib/activefacts/generate/null.rb +19 -0
- data/lib/activefacts/generate/ordered.rb +557 -0
- data/lib/activefacts/generate/ruby.rb +326 -0
- data/lib/activefacts/generate/sql/server.rb +164 -0
- data/lib/activefacts/generate/text.rb +21 -0
- data/lib/activefacts/input/cql.rb +1268 -0
- data/lib/activefacts/input/orm.rb +926 -0
- data/lib/activefacts/persistence.rb +1 -0
- data/lib/activefacts/persistence/composition.rb +653 -0
- data/lib/activefacts/support.rb +51 -0
- data/lib/activefacts/version.rb +3 -0
- data/lib/activefacts/vocabulary.rb +6 -0
- data/lib/activefacts/vocabulary/extensions.rb +343 -0
- data/lib/activefacts/vocabulary/metamodel.rb +303 -0
- data/script/txt2html +71 -0
- data/spec/absorption_spec.rb +95 -0
- data/spec/api/autocounter.rb +82 -0
- data/spec/api/constellation.rb +130 -0
- data/spec/api/entity_type.rb +101 -0
- data/spec/api/instance.rb +428 -0
- data/spec/api/roles.rb +122 -0
- data/spec/api/value_type.rb +112 -0
- data/spec/api_spec.rb +14 -0
- data/spec/cql_cql_spec.rb +58 -0
- data/spec/cql_parse_spec.rb +31 -0
- data/spec/cql_ruby_spec.rb +60 -0
- data/spec/cql_sql_spec.rb +54 -0
- data/spec/cql_symbol_tables_spec.rb +259 -0
- data/spec/cql_unit_spec.rb +336 -0
- data/spec/cqldump_spec.rb +169 -0
- data/spec/norma_cql_spec.rb +48 -0
- data/spec/norma_ruby_spec.rb +50 -0
- data/spec/norma_sql_spec.rb +45 -0
- data/spec/norma_tables_spec.rb +94 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- metadata +173 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
bin/afgen
|
6
|
+
bin/cql
|
7
|
+
examples/CQL/Address.cql
|
8
|
+
examples/CQL/Blog.cql
|
9
|
+
examples/CQL/CompanyDirectorEmployee.cql
|
10
|
+
examples/CQL/Death.cql
|
11
|
+
examples/CQL/Genealogy.cql
|
12
|
+
examples/CQL/Marriage.cql
|
13
|
+
examples/CQL/Metamodel.cql
|
14
|
+
examples/CQL/MultiInheritance.cql
|
15
|
+
examples/CQL/OilSupply.cql
|
16
|
+
examples/CQL/Orienteering.cql
|
17
|
+
examples/CQL/PersonPlaysGame.cql
|
18
|
+
examples/CQL/SchoolActivities.cql
|
19
|
+
examples/CQL/SimplestUnary.cql
|
20
|
+
examples/CQL/SubtypePI.cql
|
21
|
+
examples/CQL/Warehousing.cql
|
22
|
+
examples/CQL/WindowInRoomInBldg.cql
|
23
|
+
lib/activefacts.rb
|
24
|
+
lib/activefacts/api.rb
|
25
|
+
lib/activefacts/api/concept.rb
|
26
|
+
lib/activefacts/api/constellation.rb
|
27
|
+
lib/activefacts/api/entity.rb
|
28
|
+
lib/activefacts/api/instance.rb
|
29
|
+
lib/activefacts/api/numeric.rb
|
30
|
+
lib/activefacts/api/role.rb
|
31
|
+
lib/activefacts/api/standard_types.rb
|
32
|
+
lib/activefacts/api/support.rb
|
33
|
+
lib/activefacts/api/value.rb
|
34
|
+
lib/activefacts/api/vocabulary.rb
|
35
|
+
lib/activefacts/cql.rb
|
36
|
+
lib/activefacts/cql/Rakefile
|
37
|
+
lib/activefacts/cql/CQLParser.treetop
|
38
|
+
lib/activefacts/cql/Concepts.treetop
|
39
|
+
lib/activefacts/cql/DataTypes.treetop
|
40
|
+
lib/activefacts/cql/Expressions.treetop
|
41
|
+
lib/activefacts/cql/FactTypes.treetop
|
42
|
+
lib/activefacts/cql/Language/English.treetop
|
43
|
+
lib/activefacts/cql/LexicalRules.treetop
|
44
|
+
lib/activefacts/cql/parser.rb
|
45
|
+
lib/activefacts/generate/absorption.rb
|
46
|
+
lib/activefacts/generate/cql.rb
|
47
|
+
lib/activefacts/generate/cql/html.rb
|
48
|
+
lib/activefacts/generate/null.rb
|
49
|
+
lib/activefacts/generate/ordered.rb
|
50
|
+
lib/activefacts/generate/ruby.rb
|
51
|
+
lib/activefacts/generate/sql/server.rb
|
52
|
+
lib/activefacts/generate/text.rb
|
53
|
+
lib/activefacts/input/cql.rb
|
54
|
+
lib/activefacts/input/orm.rb
|
55
|
+
lib/activefacts/persistence.rb
|
56
|
+
lib/activefacts/persistence/composition.rb
|
57
|
+
lib/activefacts/support.rb
|
58
|
+
lib/activefacts/version.rb
|
59
|
+
lib/activefacts/vocabulary.rb
|
60
|
+
lib/activefacts/vocabulary/extensions.rb
|
61
|
+
lib/activefacts/vocabulary/metamodel.rb
|
62
|
+
script/txt2html
|
63
|
+
spec/absorption_spec.rb
|
64
|
+
spec/api/autocounter.rb
|
65
|
+
spec/api/constellation.rb
|
66
|
+
spec/api/entity_type.rb
|
67
|
+
spec/api/instance.rb
|
68
|
+
spec/api/roles.rb
|
69
|
+
spec/api/value_type.rb
|
70
|
+
spec/api_spec.rb
|
71
|
+
spec/cql_cql_spec.rb
|
72
|
+
spec/cql_parse_spec.rb
|
73
|
+
spec/cql_ruby_spec.rb
|
74
|
+
spec/cql_sql_spec.rb
|
75
|
+
spec/cql_symbol_tables_spec.rb
|
76
|
+
spec/cql_unit_spec.rb
|
77
|
+
spec/cqldump_spec.rb
|
78
|
+
spec/norma_cql_spec.rb
|
79
|
+
spec/norma_ruby_spec.rb
|
80
|
+
spec/norma_sql_spec.rb
|
81
|
+
spec/norma_tables_spec.rb
|
82
|
+
spec/spec.opts
|
83
|
+
spec/spec_helper.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
= activefacts
|
2
|
+
|
3
|
+
* http://dataconstellation.com/ActiveFacts/
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
ActiveFacts is a semantic modeling toolkit, comprising an implementation
|
8
|
+
of the Constellation Query Language, the Constellation API, and code
|
9
|
+
generators that receive CQL or ORM (Object Role Modeling files, from
|
10
|
+
NORMA) to emit CQL, Ruby and SQL.
|
11
|
+
|
12
|
+
Semantic modeling is a refinement of fact-based modeling techniques
|
13
|
+
that draw on natural language verbalisation and formal logic. Fact
|
14
|
+
based modeling is essentially the same as relational modeling in the
|
15
|
+
sixth normal form. The tools provided here automatically condense
|
16
|
+
that to third normal form for efficient storage. They also generate
|
17
|
+
object models as a Ruby module which has an effective mapping to
|
18
|
+
both the original semantic model and to the generated SQL.
|
19
|
+
|
20
|
+
The result is a formal language that reads like plain English, and
|
21
|
+
allows creation of relational and object models that are guaranteed
|
22
|
+
equivalent, and much more stable in the face of schema evolution than
|
23
|
+
SQL is.
|
24
|
+
|
25
|
+
== FEATURES/PROBLEMS:
|
26
|
+
|
27
|
+
* Queries are parsed, but not yet generated to SQL. DDL is complete.
|
28
|
+
|
29
|
+
* SQL generation handles some one-to-one relationships wrongly,
|
30
|
+
including subtypes when independent of the supertype's table.
|
31
|
+
|
32
|
+
* The Constellation API lacks SQL persistence (but is already useful;
|
33
|
+
the CQL compiler uses the generated Ruby code extensively)
|
34
|
+
|
35
|
+
* Re-invoking a fact type to add new readings doesn't work
|
36
|
+
|
37
|
+
* Some types of external constraints (when adjectives mis-match)
|
38
|
+
don't yet pass the CQL parser's semantic analysis.
|
39
|
+
|
40
|
+
* Validation of semantic models (and many other areas) is incomplete
|
41
|
+
|
42
|
+
* There's no interactive CQL interpreter yet; the cql command merely
|
43
|
+
shows the parse tree.
|
44
|
+
|
45
|
+
== SYNOPSIS:
|
46
|
+
|
47
|
+
afgen --sql/server myfile.cql
|
48
|
+
afgen --ruby myfile.cql
|
49
|
+
afgen --cql myfile.orm
|
50
|
+
|
51
|
+
== REQUIREMENTS:
|
52
|
+
|
53
|
+
* Treetop parser generator
|
54
|
+
* Optional: NORMA, see <http://www.ormfoundation.org/files/>
|
55
|
+
(needs Visual Studio pro edition), if you want to use ORM
|
56
|
+
|
57
|
+
== INSTALL:
|
58
|
+
|
59
|
+
* sudo gem install activefacts
|
60
|
+
|
61
|
+
== LICENSE:
|
62
|
+
|
63
|
+
Copyright (c) 2008 Clifford Heath.
|
64
|
+
|
65
|
+
This software is provided 'as-is', without any express or implied warranty.
|
66
|
+
In no event will the authors be held liable for any damages arising from the
|
67
|
+
use of this software.
|
68
|
+
|
69
|
+
Permission is granted to anyone to use this software for any purpose,
|
70
|
+
including commercial applications, and to alter it and redistribute it
|
71
|
+
freely, subject to the following restrictions:
|
72
|
+
|
73
|
+
1. The origin of this software must not be misrepresented; you must not
|
74
|
+
claim that you wrote the original software. If you use this software
|
75
|
+
in a product, an acknowledgment in the product documentation would be
|
76
|
+
appreciated but is not required.
|
77
|
+
|
78
|
+
2. Altered source versions must be plainly marked as such, and must not be
|
79
|
+
misrepresented as being the original software.
|
80
|
+
|
81
|
+
3. This notice may not be removed or altered from any source distribution.
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
%w[rubygems rake rake/clean fileutils newgem rubigen spec spec/rake/spectask].each { |f| require f }
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/lib/activefacts'
|
4
|
+
|
5
|
+
# Generate all the Rake tasks
|
6
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
7
|
+
$hoe = Hoe.new('activefacts', ActiveFacts::VERSION) do |p|
|
8
|
+
p.developer('Clifford Heath', 'cjh@dataconstellation.org')
|
9
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
10
|
+
p.post_install_message = 'For more information on ActiveFacts, see http://dataconstellation.com/ActiveFacts'
|
11
|
+
p.rubyforge_name = "cjheath@rubyforge.org"
|
12
|
+
p.extra_deps = [
|
13
|
+
['treetop','>= 1.2.4'],
|
14
|
+
]
|
15
|
+
p.extra_dev_deps = [
|
16
|
+
['newgem', ">= #{::Newgem::VERSION}"]
|
17
|
+
]
|
18
|
+
p.spec_extras[:extensions] = 'lib/activefacts/cql/Rakefile'
|
19
|
+
p.spec_extras[:rdoc_options] = [
|
20
|
+
"-x", "lib/activefacts/cql/.*.rb",
|
21
|
+
"-x", "lib/activefacts/vocabulary/.*.rb",
|
22
|
+
"-x", "lib/activefacts/persistence/.*.rb",
|
23
|
+
]
|
24
|
+
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
25
|
+
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
26
|
+
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
27
|
+
p.rsync_args = '-av --delete --ignore-errors'
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'newgem/tasks' # load /tasks/*.rake
|
31
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
32
|
+
|
33
|
+
# TODO - want other tests/tasks run by default? Add them to the list
|
34
|
+
# task :default => [:spec, :features]
|
35
|
+
|
36
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
37
|
+
t.ruby_opts = ['-I', "lib"]
|
38
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
39
|
+
# t.rcov = true
|
40
|
+
# t.rcov_opts = ['--exclude', 'spec,/usr/lib/ruby' ]
|
41
|
+
end
|
data/bin/afgen
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#! env ruby
|
2
|
+
#
|
3
|
+
# Read an ORM2 Vocabulary from a NORMA, CQL or other file
|
4
|
+
#
|
5
|
+
# Copyright (c) 2007 Clifford Heath. Read the LICENSE file.
|
6
|
+
#
|
7
|
+
$:.unshift File.dirname(File.expand_path(__FILE__))+"/../lib"
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'ruby-debug'
|
11
|
+
require 'activefacts'
|
12
|
+
require 'activefacts/vocabulary'
|
13
|
+
|
14
|
+
arg = ARGV.shift
|
15
|
+
|
16
|
+
# Load the required generator, or the default "text" generator:
|
17
|
+
generator = "text"
|
18
|
+
if arg =~ /^--([^=]*)(?:=(.*))?/
|
19
|
+
generator = $1
|
20
|
+
generator_options = ($2||"").split(/,/)
|
21
|
+
arg = ARGV.shift
|
22
|
+
end
|
23
|
+
output_handler = "activefacts/generate/#{generator.downcase}"
|
24
|
+
require output_handler
|
25
|
+
output_class = generator.upcase.gsub(%r{[/\\]+},'::')
|
26
|
+
output_klass = eval("ActiveFacts::Generate::#{output_class}")
|
27
|
+
raise "Expected #{output_handler} to define #{output_class}" unless output_klass
|
28
|
+
|
29
|
+
# Load the file type input method
|
30
|
+
extension = arg.sub(/\A.*\./,'').downcase
|
31
|
+
input_handler = "activefacts/input/#{extension}"
|
32
|
+
require input_handler
|
33
|
+
input_class = extension.upcase
|
34
|
+
input_klass = ActiveFacts::Input.const_get(input_class.to_sym)
|
35
|
+
raise "Expected #{input_handler} to define #{input_class}" unless input_klass
|
36
|
+
|
37
|
+
# Read the input file:
|
38
|
+
begin
|
39
|
+
vocabulary = input_klass.readfile(arg)
|
40
|
+
rescue => e
|
41
|
+
puts "#{e.message}"
|
42
|
+
puts "#{e}:\n\t#{e.backtrace*"\n\t"}" if debug
|
43
|
+
end
|
44
|
+
|
45
|
+
# Generate the output:
|
46
|
+
output_klass.new(vocabulary, *generator_options).generate if vocabulary
|
data/bin/cql
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#! env ruby
|
2
|
+
#
|
3
|
+
# Interactive CQL command-line.
|
4
|
+
# Copyright (c) 2007 Clifford Heath. Read the LICENSE file.
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'activefacts'
|
8
|
+
require 'activefacts/cql/parser'
|
9
|
+
require 'readline'
|
10
|
+
|
11
|
+
puts "This is a stub for the CQL interactive commandline. At the moment it only parses CQL and shows the parse trees."
|
12
|
+
|
13
|
+
parser = ActiveFacts::CQLParser.new
|
14
|
+
parser.root = :definition
|
15
|
+
statement = nil
|
16
|
+
while line = Readline::readline(statement ? "CQL+ " : "CQL? ", [])
|
17
|
+
statement = statement ? statement + "\n"+line : line
|
18
|
+
if line =~ %r{\A/}
|
19
|
+
# meta-commands start with /
|
20
|
+
case (words = line.split).shift
|
21
|
+
when "/root"
|
22
|
+
parser.root = words[0] && words[0].to_sym || :definition
|
23
|
+
puts "ok"
|
24
|
+
else
|
25
|
+
puts "Unknown metacommand #{line}, did you mean /root <rule>?"
|
26
|
+
end
|
27
|
+
statement = nil
|
28
|
+
elsif parser.root != :definition or
|
29
|
+
line.gsub(/(['"])([^\1\\]|\\.)*\1/,'') =~ /;/
|
30
|
+
# After stripping string literals the line contains a ';', it's the last line of the command:
|
31
|
+
begin
|
32
|
+
result = parser.parse(statement)
|
33
|
+
if result
|
34
|
+
begin
|
35
|
+
p result.value
|
36
|
+
rescue => e
|
37
|
+
puts e.to_s+":"
|
38
|
+
p result # In case the root is changed and there's no value()
|
39
|
+
end
|
40
|
+
#p parser.definition(result)
|
41
|
+
else
|
42
|
+
p parser.failure_reason
|
43
|
+
end
|
44
|
+
rescue => e
|
45
|
+
puts e
|
46
|
+
puts "\t"+e.backtrace*"\n\t"
|
47
|
+
end
|
48
|
+
statement = nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
puts
|
52
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
vocabulary Address;
|
2
|
+
|
3
|
+
/*
|
4
|
+
* Value Types
|
5
|
+
*/
|
6
|
+
City is defined as VariableLengthText(64);
|
7
|
+
CompanyName is defined as VariableLengthText();
|
8
|
+
FamilyName is defined as VariableLengthText(20);
|
9
|
+
GivenNames is defined as VariableLengthText(20);
|
10
|
+
Number is defined as VariableLengthText(12);
|
11
|
+
Postcode is defined as VariableLengthText();
|
12
|
+
StreetLine is defined as VariableLengthText(64);
|
13
|
+
|
14
|
+
/*
|
15
|
+
* Entity Types
|
16
|
+
*/
|
17
|
+
Company is identified by its Name;
|
18
|
+
|
19
|
+
Family is identified by its Name;
|
20
|
+
|
21
|
+
Person is identified by Family and GivenNames where
|
22
|
+
Person is of one Family,
|
23
|
+
Family includes Person,
|
24
|
+
Person has one GivenNames;
|
25
|
+
|
26
|
+
Street is identified by first-StreetLine and second-StreetLine and third-StreetLine where
|
27
|
+
Street includes one first-StreetLine,
|
28
|
+
Street includes at most one second-StreetLine,
|
29
|
+
Street includes at most one third-StreetLine;
|
30
|
+
|
31
|
+
Address is identified by street-Number and Street and City and Postcode where
|
32
|
+
Address is at at most one street-Number,
|
33
|
+
Address is at one Street,
|
34
|
+
Address is in one City,
|
35
|
+
Address is in at most one Postcode,
|
36
|
+
Postcode is of Address;
|
37
|
+
Company has head office at at most one Address;
|
38
|
+
Person lives at at most one Address;
|
39
|
+
|
40
|
+
/*
|
41
|
+
* Constraints:
|
42
|
+
*/
|
43
|
+
Street includes third-StreetLine
|
44
|
+
only if Street includes second-StreetLine;
|
45
|
+
Street includes second-StreetLine
|
46
|
+
only if Street includes first-StreetLine;
|
@@ -0,0 +1,54 @@
|
|
1
|
+
vocabulary Blog;
|
2
|
+
|
3
|
+
/*
|
4
|
+
* Value Types
|
5
|
+
*/
|
6
|
+
AuthorId is defined as AutoCounter();
|
7
|
+
CommentId is defined as AutoCounter();
|
8
|
+
Name is defined as VariableLengthText(64);
|
9
|
+
Ordinal is defined as UnsignedInteger(32);
|
10
|
+
PostId is defined as AutoCounter();
|
11
|
+
Style is defined as VariableLengthText(20);
|
12
|
+
Text is defined as LargeLengthText();
|
13
|
+
TopicId is defined as AutoCounter();
|
14
|
+
|
15
|
+
/*
|
16
|
+
* Entity Types
|
17
|
+
*/
|
18
|
+
Author is identified by its Id;
|
19
|
+
author-Name is of at most one Author,
|
20
|
+
Author is called one Name;
|
21
|
+
|
22
|
+
Comment is identified by its Id;
|
23
|
+
Author wrote Comment,
|
24
|
+
Comment was written by one Author;
|
25
|
+
|
26
|
+
Content is identified by Style and Text where
|
27
|
+
Content is of at most one Style,
|
28
|
+
Content has one Text,
|
29
|
+
Text is of Content;
|
30
|
+
Content provides text of at most one Comment,
|
31
|
+
Comment consists of one text-Content;
|
32
|
+
|
33
|
+
Post is identified by its Id;
|
34
|
+
Post was written by one Author;
|
35
|
+
Paragraph is where
|
36
|
+
Post includes Ordinal paragraph;
|
37
|
+
Content is of at most one Paragraph,
|
38
|
+
Paragraph contains one Content;
|
39
|
+
Paragraph has Comment,
|
40
|
+
Comment is on one Paragraph;
|
41
|
+
|
42
|
+
Topic is identified by its Id;
|
43
|
+
Post belongs to one Topic,
|
44
|
+
Topic contains Post;
|
45
|
+
Topic belongs to at most one parent-Topic [acyclic];
|
46
|
+
Topic is called one topic-Name,
|
47
|
+
Name is of at most one Topic;
|
48
|
+
|
49
|
+
/*
|
50
|
+
* Constraints:
|
51
|
+
*/
|
52
|
+
for each Content exactly one of these holds:
|
53
|
+
Content provides text of Comment,
|
54
|
+
Content is of Paragraph;
|
@@ -0,0 +1,51 @@
|
|
1
|
+
vocabulary CompanyDirector;
|
2
|
+
|
3
|
+
/*
|
4
|
+
* Value Types
|
5
|
+
*/
|
6
|
+
CompanyName is defined as VariableLengthText(48);
|
7
|
+
EmployeeNr is defined as SignedInteger(32);
|
8
|
+
Name is defined as VariableLengthText(48);
|
9
|
+
|
10
|
+
/*
|
11
|
+
* Entity Types
|
12
|
+
*/
|
13
|
+
Company is identified by its Name where
|
14
|
+
Company is called CompanyName;
|
15
|
+
Company is listed;
|
16
|
+
|
17
|
+
Meeting is identified by Date and Meeting is board meeting and Company where
|
18
|
+
Meeting is held on one Date,
|
19
|
+
Meeting is board meeting,
|
20
|
+
Company held Meeting,
|
21
|
+
Meeting is held by one Company;
|
22
|
+
|
23
|
+
Person is identified by given-Name and family-Name where
|
24
|
+
Person has one given-Name,
|
25
|
+
given-Name is of Person,
|
26
|
+
family-Name is of Person,
|
27
|
+
Person is called at most one family-Name;
|
28
|
+
Person was born on at most one birth-Date;
|
29
|
+
Attendance is where
|
30
|
+
Person (as Attendee) attended Meeting,
|
31
|
+
Meeting was attended by Attendee;
|
32
|
+
Directorship is where
|
33
|
+
Person (as Director) directs Company,
|
34
|
+
Company is directed by at least one Director;
|
35
|
+
Directorship began on one appointment-Date;
|
36
|
+
|
37
|
+
Employee is a kind of Person identified by its Nr;
|
38
|
+
Employee works at one Company,
|
39
|
+
Company employs Employee;
|
40
|
+
|
41
|
+
Manager is a kind of Employee;
|
42
|
+
Employee is supervised by at most one Manager [acyclic],
|
43
|
+
Manager supervises Employee;
|
44
|
+
Manager is ceo;
|
45
|
+
|
46
|
+
/*
|
47
|
+
* Constraints:
|
48
|
+
*/
|
49
|
+
for each Employee exactly one of these holds:
|
50
|
+
that Employee is ceo,
|
51
|
+
that Employee is supervised by some Manager;
|