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.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +60 -0
  8. data/Rakefile +3 -80
  9. data/activefacts.gemspec +36 -0
  10. data/bin/afgen +4 -2
  11. data/bin/cql +5 -1
  12. data/lib/activefacts.rb +3 -12
  13. data/lib/activefacts/{vocabulary/query_evaluator.rb → query/evaluator.rb} +0 -0
  14. data/lib/activefacts/version.rb +2 -2
  15. metadata +48 -296
  16. data/History.txt +0 -4
  17. data/LICENSE +0 -19
  18. data/Manifest.txt +0 -165
  19. data/README.rdoc +0 -81
  20. data/css/offline.css +0 -3
  21. data/css/orm2.css +0 -124
  22. data/css/print.css +0 -8
  23. data/css/style-print.css +0 -357
  24. data/css/style.css +0 -387
  25. data/download.html +0 -110
  26. data/examples/CQL/Address.cql +0 -44
  27. data/examples/CQL/Blog.cql +0 -54
  28. data/examples/CQL/CompanyDirectorEmployee.cql +0 -56
  29. data/examples/CQL/Death.cql +0 -17
  30. data/examples/CQL/Diplomacy.cql +0 -48
  31. data/examples/CQL/Genealogy.cql +0 -98
  32. data/examples/CQL/Insurance.cql +0 -320
  33. data/examples/CQL/Marriage.cql +0 -18
  34. data/examples/CQL/Metamodel.cql +0 -493
  35. data/examples/CQL/Monogamy.cql +0 -24
  36. data/examples/CQL/MultiInheritance.cql +0 -22
  37. data/examples/CQL/NonRoleId.cql +0 -14
  38. data/examples/CQL/OddIdentifier.cql +0 -18
  39. data/examples/CQL/OilSupply.cql +0 -53
  40. data/examples/CQL/OneToOnes.cql +0 -17
  41. data/examples/CQL/Orienteering.cql +0 -111
  42. data/examples/CQL/PersonPlaysGame.cql +0 -18
  43. data/examples/CQL/RedundantDependency.cql +0 -34
  44. data/examples/CQL/SchoolActivities.cql +0 -33
  45. data/examples/CQL/SeparateSubtype.cql +0 -30
  46. data/examples/CQL/ServiceDirector.cql +0 -276
  47. data/examples/CQL/SimplestUnary.cql +0 -12
  48. data/examples/CQL/Supervision.cql +0 -34
  49. data/examples/CQL/WaiterTips.cql +0 -33
  50. data/examples/CQL/Warehousing.cql +0 -101
  51. data/examples/CQL/WindowInRoomInBldg.cql +0 -28
  52. data/examples/CQL/unit.cql +0 -474
  53. data/examples/index.html +0 -420
  54. data/examples/intro.html +0 -327
  55. data/examples/local.css +0 -24
  56. data/index.html +0 -111
  57. data/lib/activefacts/cql.rb +0 -35
  58. data/lib/activefacts/cql/CQLParser.treetop +0 -158
  59. data/lib/activefacts/cql/Context.treetop +0 -48
  60. data/lib/activefacts/cql/Expressions.treetop +0 -67
  61. data/lib/activefacts/cql/FactTypes.treetop +0 -358
  62. data/lib/activefacts/cql/Language/English.treetop +0 -315
  63. data/lib/activefacts/cql/LexicalRules.treetop +0 -253
  64. data/lib/activefacts/cql/ObjectTypes.treetop +0 -210
  65. data/lib/activefacts/cql/Rakefile +0 -14
  66. data/lib/activefacts/cql/Terms.treetop +0 -183
  67. data/lib/activefacts/cql/ValueTypes.treetop +0 -202
  68. data/lib/activefacts/cql/compiler.rb +0 -156
  69. data/lib/activefacts/cql/compiler/clause.rb +0 -1137
  70. data/lib/activefacts/cql/compiler/constraint.rb +0 -581
  71. data/lib/activefacts/cql/compiler/entity_type.rb +0 -457
  72. data/lib/activefacts/cql/compiler/expression.rb +0 -443
  73. data/lib/activefacts/cql/compiler/fact.rb +0 -390
  74. data/lib/activefacts/cql/compiler/fact_type.rb +0 -421
  75. data/lib/activefacts/cql/compiler/query.rb +0 -106
  76. data/lib/activefacts/cql/compiler/shared.rb +0 -161
  77. data/lib/activefacts/cql/compiler/value_type.rb +0 -174
  78. data/lib/activefacts/cql/nodes.rb +0 -49
  79. data/lib/activefacts/cql/parser.rb +0 -241
  80. data/lib/activefacts/dependency_analyser.rb +0 -182
  81. data/lib/activefacts/generate/absorption.rb +0 -70
  82. data/lib/activefacts/generate/composition.rb +0 -118
  83. data/lib/activefacts/generate/cql.rb +0 -714
  84. data/lib/activefacts/generate/dm.rb +0 -279
  85. data/lib/activefacts/generate/help.rb +0 -64
  86. data/lib/activefacts/generate/helpers/inject.rb +0 -16
  87. data/lib/activefacts/generate/helpers/oo.rb +0 -162
  88. data/lib/activefacts/generate/helpers/ordered.rb +0 -605
  89. data/lib/activefacts/generate/helpers/rails.rb +0 -57
  90. data/lib/activefacts/generate/html/glossary.rb +0 -461
  91. data/lib/activefacts/generate/json.rb +0 -337
  92. data/lib/activefacts/generate/null.rb +0 -32
  93. data/lib/activefacts/generate/rails/models.rb +0 -246
  94. data/lib/activefacts/generate/rails/schema.rb +0 -216
  95. data/lib/activefacts/generate/records.rb +0 -46
  96. data/lib/activefacts/generate/ruby.rb +0 -133
  97. data/lib/activefacts/generate/sql/mysql.rb +0 -280
  98. data/lib/activefacts/generate/sql/server.rb +0 -273
  99. data/lib/activefacts/generate/stats.rb +0 -69
  100. data/lib/activefacts/generate/text.rb +0 -27
  101. data/lib/activefacts/generate/topics.rb +0 -265
  102. data/lib/activefacts/generate/traits/datavault.rb +0 -241
  103. data/lib/activefacts/generate/traits/oo.rb +0 -73
  104. data/lib/activefacts/generate/traits/ordered.rb +0 -33
  105. data/lib/activefacts/generate/traits/ruby.rb +0 -210
  106. data/lib/activefacts/generate/transform/datavault.rb +0 -266
  107. data/lib/activefacts/generate/transform/surrogate.rb +0 -214
  108. data/lib/activefacts/generate/version.rb +0 -26
  109. data/lib/activefacts/input/cql.rb +0 -43
  110. data/lib/activefacts/input/orm.rb +0 -1636
  111. data/lib/activefacts/mapping/rails.rb +0 -132
  112. data/lib/activefacts/persistence.rb +0 -15
  113. data/lib/activefacts/persistence/columns.rb +0 -446
  114. data/lib/activefacts/persistence/foreignkey.rb +0 -187
  115. data/lib/activefacts/persistence/index.rb +0 -240
  116. data/lib/activefacts/persistence/object_type.rb +0 -198
  117. data/lib/activefacts/persistence/reference.rb +0 -434
  118. data/lib/activefacts/persistence/tables.rb +0 -380
  119. data/lib/activefacts/registry.rb +0 -11
  120. data/lib/activefacts/support.rb +0 -132
  121. data/lib/activefacts/vocabulary.rb +0 -9
  122. data/lib/activefacts/vocabulary/extensions.rb +0 -1348
  123. data/lib/activefacts/vocabulary/metamodel.rb +0 -570
  124. data/lib/activefacts/vocabulary/verbaliser.rb +0 -804
  125. data/script/txt2html +0 -71
  126. data/spec/absorption_spec.rb +0 -95
  127. data/spec/cql/comparison_spec.rb +0 -89
  128. data/spec/cql/context_spec.rb +0 -94
  129. data/spec/cql/contractions_spec.rb +0 -224
  130. data/spec/cql/deontic_spec.rb +0 -88
  131. data/spec/cql/entity_type_spec.rb +0 -320
  132. data/spec/cql/expressions_spec.rb +0 -66
  133. data/spec/cql/fact_type_matching_spec.rb +0 -338
  134. data/spec/cql/french_spec.rb +0 -21
  135. data/spec/cql/parser/bad_literals_spec.rb +0 -86
  136. data/spec/cql/parser/constraints_spec.rb +0 -19
  137. data/spec/cql/parser/entity_types_spec.rb +0 -106
  138. data/spec/cql/parser/expressions_spec.rb +0 -199
  139. data/spec/cql/parser/fact_types_spec.rb +0 -44
  140. data/spec/cql/parser/literals_spec.rb +0 -312
  141. data/spec/cql/parser/pragmas_spec.rb +0 -89
  142. data/spec/cql/parser/value_types_spec.rb +0 -42
  143. data/spec/cql/role_matching_spec.rb +0 -148
  144. data/spec/cql/samples_spec.rb +0 -244
  145. data/spec/cql_cql_spec.rb +0 -73
  146. data/spec/cql_dm_spec.rb +0 -136
  147. data/spec/cql_mysql_spec.rb +0 -69
  148. data/spec/cql_parse_spec.rb +0 -34
  149. data/spec/cql_ruby_spec.rb +0 -73
  150. data/spec/cql_sql_spec.rb +0 -72
  151. data/spec/cql_symbol_tables_spec.rb +0 -261
  152. data/spec/cqldump_spec.rb +0 -170
  153. data/spec/helpers/array_matcher.rb +0 -23
  154. data/spec/helpers/ctrl_c_support.rb +0 -52
  155. data/spec/helpers/diff_matcher.rb +0 -39
  156. data/spec/helpers/file_matcher.rb +0 -34
  157. data/spec/helpers/parse_to_ast_matcher.rb +0 -80
  158. data/spec/helpers/string_matcher.rb +0 -30
  159. data/spec/helpers/test_parser.rb +0 -15
  160. data/spec/norma_cql_spec.rb +0 -66
  161. data/spec/norma_ruby_spec.rb +0 -62
  162. data/spec/norma_ruby_sql_spec.rb +0 -107
  163. data/spec/norma_sql_spec.rb +0 -57
  164. data/spec/norma_tables_spec.rb +0 -95
  165. data/spec/ruby_api_spec.rb +0 -23
  166. data/spec/spec_helper.rb +0 -35
  167. data/spec/transform_surrogate_spec.rb +0 -59
  168. data/status.html +0 -138
  169. data/why.html +0 -60
@@ -1,57 +0,0 @@
1
- #
2
- # ActiveFacts tests: Parse all CQL files and check the generated Ruby.
3
- # Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'spec_helper'
7
- require 'stringio'
8
- require 'activefacts/vocabulary'
9
- require 'activefacts/support'
10
- require 'activefacts/persistence'
11
- require 'activefacts/input/orm'
12
- require 'activefacts/generate/sql/server'
13
-
14
- describe "NORMA Loader with SQL output" do
15
- orm_failures = {
16
- "SubtypePI" => "Has an illegal uniqueness constraint",
17
- }
18
- # Generate and return the SQL for the given vocabulary
19
- def sql(vocabulary)
20
- output = StringIO.new
21
- @dumper = ActiveFacts::Generate::SQL::SERVER.new(vocabulary.constellation)
22
- @dumper.generate(output)
23
- output.rewind
24
- output.read
25
- end
26
-
27
- pattern = ENV["AFTESTS"] || "*"
28
- Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
29
- expected_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'examples/SQL/\1.sql')
30
- actual_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.sql')
31
- base = File.basename(orm_file, ".orm")
32
-
33
- next unless ENV["AFTESTS"] || File.exists?(expected_file)
34
-
35
- it "should load #{orm_file} and dump SQL matching #{expected_file}" do
36
- begin
37
- vocabulary = ActiveFacts::Input::ORM.readfile(orm_file)
38
- rescue => e
39
- raise unless orm_failures.include?(base)
40
- pending orm_failures[base]
41
- end
42
-
43
- # Build and save the actual file:
44
- sql_text = sql(vocabulary)
45
- Dir.mkdir "spec/actual" rescue nil
46
- File.open(actual_file, "w") { |f| f.write sql_text }
47
-
48
- pending("expected output file #{expected_file} not found") unless File.exists? expected_file
49
-
50
- expected_text = File.open(expected_file) {|f| f.read }
51
- sql_text.gsub!(/ INDEX (\[[^\]]*\]|`[^`]*`|[^ ]*) ON /, ' INDEX <Name is hidden> ON ')
52
- expected_text.gsub!(/ INDEX (\[[^\]]*\]|`[^`]*`|[^ ]*) ON /, ' INDEX <Name is hidden> ON ')
53
- sql_text.should_not differ_from(expected_text)
54
- File.delete(actual_file) # It succeeded, we don't need the file.
55
- end
56
- end
57
- end
@@ -1,95 +0,0 @@
1
- #
2
- # ActiveFacts test:
3
- #
4
- # Parse all NORMA files, compute the composition (list of tables)
5
- # and compare that with NORMA's output.
6
- #
7
- # Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
8
- #
9
-
10
- require 'spec_helper'
11
- require 'stringio'
12
- require 'activefacts/vocabulary'
13
- require 'activefacts/persistence'
14
- require 'activefacts/support'
15
- require 'activefacts/input/orm'
16
-
17
- # The exceptions table is keyed by the model name, and contains the added and removed table names vs NORMA
18
- orm_failures = {
19
- }
20
- norma_table_exceptions = {
21
- "Corporate" => [%w{}, %w{Comment ContactReport ID Money Name Nr Photo ReferenceCheck Resource TimeDivision}], # ActiveFacts absorbs Agreement into ContextNote, Enforcement into Constraint, lots into Concept
22
- "Metamodel" => [%w{Query}, %w{Agreement Enforcement Comment ContactReport ID Money Nr Photo ReferenceCheck Resource TimeDivision Constraint ContextNote Fact Instance Query Unit}], # ActiveFacts absorbs Agreement into ContextNote, Enforcement into Constraint, lots into Concept
23
- "MetamodelNext" => [[], %w{Agreement Enforcement TypeInheritance}],
24
- "Orienteering" => [%w{Punch}, []], # NORMA doesn't make a table for the IDENTITY field
25
- "OrienteeringER" => [%w{SeriesEvent}, []], # NORMA doesn't make a table for the IDENTITY field
26
- "RedundantDependency" => [%w{Politician StateOrProvince}, %w{LegislativeDistrict}], # NORMA doesn't make a table for the 3 IDENTITY fields
27
- "Warehousing" => [%w{Product Warehouse}, %w{Dispatch Receipt}], # NORMA doesn't make a table for the IDENTITY field
28
- "ServiceDirector" => [%w{DataStoreService MonitorNotificationUser}, %w{DataStoreFileHostSystem }],
29
- "SeparateSubtype" => [%w{Claim}, %w{Incident}],
30
- }
31
-
32
- def extract_created_tables_from_sql sql_file
33
- File.open(sql_file) do |f|
34
- f.
35
- readlines.
36
- select do |l|
37
- l =~ /CREATE TABLE/
38
- end.
39
- map do |l|
40
- l.chomp.gsub(/.*CREATE TABLE\s+\W*(\w+\.)?"?(\w+)"?.*/, '\2')
41
- end.
42
- sort
43
- end
44
- end
45
-
46
- describe "Relational Composition from NORMA" do
47
- pattern = ENV["AFTESTS"] || "*"
48
- Dir["examples/norma/#{pattern}.orm"].each do |orm_file|
49
- exception = norma_table_exceptions[File.basename(orm_file, ".orm")]
50
- sql_file_pattern = orm_file.sub(/\.orm\Z/, '.*sql')
51
- sql_file = Dir[sql_file_pattern][0]
52
- next unless sql_file
53
- base = File.basename(orm_file, ".orm")
54
-
55
- it "should load #{orm_file} and compute #{
56
- (exception ? "a modified" : "the same") + " list of tables similar to those in #{sql_file}"
57
- }" do
58
-
59
- # Read the ORM file:
60
- begin
61
- vocabulary = ActiveFacts::Input::ORM.readfile(orm_file)
62
- rescue => e
63
- raise unless orm_failures.include?(base)
64
- pending orm_failures[base]
65
- end
66
-
67
- # Get the list of tables from NORMA's SQL:
68
- expected_tables = extract_created_tables_from_sql(sql_file)
69
- if exception
70
- expected_tables = expected_tables + exception[0] - exception[1]
71
- end
72
-
73
- # Get the list of tables from our composition:
74
- tables = vocabulary.tables
75
- table_names = tables.map{|o| o.name.gsub(/\s/,'')}.sort
76
-
77
- # Save the actual and expected composition to files
78
- actual_tables_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.tables')
79
- File.open(actual_tables_file, "w") { |f| f.puts table_names*"\n" }
80
- expected_tables_file = orm_file.sub(%r{examples/norma/(.*).orm\Z}, 'spec/actual/\1.expected.tables')
81
- File.open(expected_tables_file, "w") { |f| f.puts expected_tables*"\n" }
82
-
83
- # Check that the list matched:
84
- table_names.should_not differ_from(expected_tables)
85
-
86
- # Calculate the columns and column names; REVISIT: check the results
87
- tables.each do |table|
88
- table.columns
89
- end
90
-
91
- File.delete(actual_tables_file)
92
- File.delete(expected_tables_file)
93
- end
94
- end
95
- end
@@ -1,23 +0,0 @@
1
- #
2
- # ActiveFacts tests: Compare column lists created by aborption and by generated Ruby.
3
- # Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'spec_helper'
7
- require 'stringio'
8
- require 'activefacts/vocabulary'
9
- require 'activefacts/support'
10
-
11
- describe "Requiring vocabularies in Ruby" do
12
- ruby_failures = {
13
- "MetamodelNext" => "Has a duplicate role name",
14
- }
15
- pattern = ENV["AFTESTS"] || "*"
16
- Dir["examples/ruby/#{pattern}.rb"].each do |ruby_file|
17
- base = File.basename(ruby_file, ".rb")
18
- next if ruby_failures.include?(base)
19
- it "#{ruby_file} should load cleanly" do
20
- require "./"+ruby_file
21
- end
22
- end
23
- end
@@ -1,35 +0,0 @@
1
- #
2
- # A Custom Matcher for RSpec that shows the difference between two multi-line strings.
3
- #
4
- # Usage:
5
- # actual_text.should_not differ_from(expected_text)
6
- #
7
-
8
- require 'helpers/diff_matcher'
9
- require 'helpers/array_matcher'
10
- require 'helpers/file_matcher'
11
- require 'helpers/string_matcher'
12
- require 'helpers/parse_to_ast_matcher'
13
-
14
- Dir[File.dirname(__FILE__)+"/helpers/**rb"].each do |helper| require helper; end
15
-
16
- class String
17
- def strip_comments()
18
- c_comment = %r{/\*((?!\*/).)*\*/}m
19
- gsub(c_comment, '').gsub(%r{\n\n+},"\n")
20
- end
21
- end
22
-
23
- class Array
24
- def diff_strings(a2)
25
- d = Diff::LCS::diff(self, a2)
26
- d.map do |chunk|
27
- added_at = (add = chunk.detect{|d| d.action == '+'}) && add.position+1
28
- removed_at = (remove = chunk.detect{|d| d.action == '-'}) && remove.position+1
29
- "Line #{added_at}/#{removed_at}:\n"+
30
- chunk.map do |change|
31
- "#{change.action} #{change.element}"
32
- end*"\n"
33
- end*"\n"
34
- end
35
- end
@@ -1,59 +0,0 @@
1
- #
2
- # ActiveFacts tests: Parse all CQL files and check the surrogate key transformation
3
- # Copyright (c) 2012 Clifford Heath. Read the LICENSE file.
4
- #
5
-
6
- require 'spec_helper'
7
- require 'stringio'
8
- require 'activefacts/vocabulary'
9
- require 'activefacts/support'
10
- require 'activefacts/input/cql'
11
- require 'activefacts/generate/absorption'
12
- require 'activefacts/generate/transform/surrogate'
13
-
14
- describe "CQL Loader with Surrogate transformation" do
15
- cql_failures = {
16
- }
17
-
18
- pattern = ENV["AFTESTS"] || "*"
19
- Dir["examples/CQL/#{pattern}.cql"].each do |cql_file|
20
- expected_file = cql_file.sub(%r{/CQL/(.*).cql\Z}, '/transform-surrogate/\1.transform-surrogate')
21
- actual_file = cql_file.sub(%r{examples/CQL/(.*).cql\Z}, 'spec/actual/\1.transform-surrogate')
22
-
23
- next unless ENV["AFTESTS"] || File.exists?(expected_file)
24
-
25
- it "should load #{cql_file} and make transformations like #{expected_file}" do
26
- vocabulary = nil
27
- broken = cql_failures[File.basename(cql_file, ".cql")]
28
- if broken
29
- pending(broken) {
30
- vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
31
- }
32
- else
33
- vocabulary = ActiveFacts::Input::CQL.readfile(cql_file)
34
- end
35
- vocabulary.finalise
36
-
37
- # Build and save the actual file:
38
- output = StringIO.new
39
-
40
- transformer = ActiveFacts::Generate::Transform::Surrogate.new(vocabulary)
41
- transformer.generate(output)
42
-
43
- absorption = ActiveFacts::Generate::Absorption.new(vocabulary)
44
- absorption.generate(output)
45
-
46
- # Save the output from the StringIO:
47
- output.rewind
48
- transformed_text = output.read
49
- Dir.mkdir "spec/actual" rescue nil
50
- File.open(actual_file, "w") { |f| f.write transformed_text }
51
-
52
- pending("expected output file #{expected_file} not found") unless File.exists? expected_file
53
-
54
- expected_text = File.open(expected_file) {|f| f.read }
55
- transformed_text.should_not differ_from(expected_text)
56
- File.delete(actual_file) # It succeeded, we don't need the file.
57
- end
58
- end
59
- end
@@ -1,138 +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
- <div id="sidebar"></div>
6
-
7
- <div id="top" class="content">
8
-
9
- <a name="status"></a>
10
- <h2 class="title">
11
- ActiveFacts Project Status
12
- </h2>
13
-
14
- <h4>Constellation Query Language</h4>
15
-
16
- <p>
17
- The Constellation Query Language implementation available in
18
- version 0.8.5 compiles all features of ORM2 implemented by NORMA
19
- with only minuscule differences. Entity Types, Value Types, Fact
20
- Types (including objectified), Reference Modes, and all types of
21
- constraints - Value and Role Value Constraints, Presence
22
- Constraints (which covers Mandatory, Uniqueness, and Frequency
23
- constraints), Subset, Equality, Exclusion, Mandatory Exclusion,
24
- and Ring constraints.
25
- </p>
26
-
27
- <p> At this version Terms (object type names) may not contain
28
- spaces. Terms may not appear in readings (unless in lower-case)
29
- and readings may only contain single adjectives (hyphen-binding).
30
- Deontic constraints are recognised using the annotation (otherwise
31
- <b>action</b>). Join Constraints may also be defined beyond those
32
- available in NORMA. Example data may be declared. </p>
33
-
34
- <p>
35
- This version provides functionality not available in NORMA. Additions
36
- include:
37
- </p>
38
- <ul>
39
- <li> Business Context Notes, which are annotations indicating why a
40
- particular modeling construct was used, and who approved that.
41
- </li>
42
- <li> Definition of Units using conversion formulae. A library of
43
- 500 standard unit conversions is provided. </li>
44
- <li> Value Types may be defined to utilise those units. </li>
45
- </ul>
46
-
47
- <p>
48
- New features are being developed for an upcoming 0.9.0 release:
49
- </p>
50
- <ul>
51
- <li> Multi-word terms, and multiple adjectives.
52
- <li> Improvements on the use of the hyphen to allow hyphenated words in readings.
53
- <li> Term Synonyms
54
- <li> Imported vocabularies (including multi-lingual versioning)
55
- <li> Improved model validation
56
- </ul>
57
-
58
- <p>
59
- Beyond that, the query syntax will be completed and queries will be generated
60
- to SQL.
61
- </p>
62
-
63
- <h4>Constellation Query Language generators</h4>
64
-
65
- <p>
66
- The CQL generator allows conversion of NORMA files. At the present release,
67
- deontic constraints and example fact populations are not emitted.
68
- </p>
69
-
70
- <p>
71
- The Ruby generator is functional. Not all constraints are emitted to Ruby yet,
72
- but any combination of facts allowed by the vocabulary may be represented.
73
- </p>
74
-
75
- <p>
76
- The SQL generators are generating correct and useful SQL, using a relational
77
- mapping algorithm that produces similar results to NORMA. This algorithm will
78
- be extended to emit more constraints, and to provide more control over
79
- the generation of object names, and to directly support Ruby on Rails.
80
- Deontic constraints are still handled as Alethic.
81
- </p>
82
-
83
- <h4>The Constellation API</h4>
84
-
85
- <p>
86
- The Constellation API (in Ruby) supports the generated Ruby code, by
87
- allowing any fact population to be asserted into a constellation for
88
- a given vocabulary. The generated Ruby module for a vocabulary can be
89
- told which object types are tables in the SQL, and can infer all the
90
- column names and object mappings from that.
91
- </p>
92
-
93
- <p> Processing of the retract operation (which removes facts from a
94
- constellation) does not yet propagate retraction through mandatory roles.
95
- There is not yet a validate operation to verify that all verifible
96
- constraints are met. Where a constellation is known to be
97
- incomplete, that's not yet able to be recorded (this will be used
98
- in determining which constraints can be checked)
99
- There is not yet any support within the API for database persistence
100
- (creating a constellation from query results, and creating, deleting or
101
- updating database rows by saving a constellation).
102
- </p>
103
-
104
- <h4>The ORM2 Metamodel</h4>
105
-
106
- <p>
107
- The ORM2 Metamodel is generated to Ruby from CQL or ORM2 to support
108
- the creation and manipulation of any semantic model. Some changes are
109
- upcoming to support synonyms, including allowing a vocabulary to
110
- provide a translation of an existing vocabulary, such as a Dutch or
111
- Japanese version of an English language model.
112
- </p>
113
-
114
- <!--p>
115
- ActiveFacts can currently read models from NORMA, which are in elementary
116
- form, and it can reverse engineer the schemas of existing databases in SQL
117
- Server, DB2, Oracle, and open-source databases not yet tested including
118
- MySQL, PostgreSQL, etc. Reverse-engineered models are still in composite
119
- form - the mapping to elementary form is incomplete. Reverse engineering
120
- does not yet analyse actual data.
121
- </p-->
122
-
123
- <!--p>
124
- ActiveFacts has no database adapter infrastructure yet. The
125
- previously-available reverse engineering tools used used the
126
- infrastructure of ActiveRecord with DRYSql and Composite Primary Keys, but
127
- future versions will probably just use the ActiveRecord adapters directly.
128
- </p-->
129
-
130
- <!--p>
131
- APRIMO allows the definition of vocabulary aspects as well as the addition
132
- of entity and value objects and the fact types that link them. Subtyping,
133
- data types and units, and complex constraints are still to be implemented.
134
- </p-->
135
-
136
- </div>
137
-
138
- <!--#include virtual="/footer.html" -->
data/why.html DELETED
@@ -1,60 +0,0 @@
1
- <!--#include virtual="/header.html" -->
2
-
3
- <div class="content">
4
- <h2>Why Semantic Modeling?</h2>
5
-
6
- <p>
7
- Software is not mainly about <em>how</em>, but about <em>what</em> and
8
- <em>why</em>. Software projects fail most commonly because they build
9
- the <em>wrong thing</em>, not because they build it wrongly. Other
10
- forms of modeling, such as object modeling and entity relationship
11
- modeling, attempt to capture <em>what</em>, but the models are shaped
12
- from the start by the needs of implementation (<em>how</em>). That
13
- shuts out the non-technical business expert, and bends the model out
14
- of shape, losing track of <em>why</em> each feature is needed, what it
15
- means and under what terms, the roles it plays in the overall system.
16
- <strong>Semantic modeling</strong> incorporates and transcends both
17
- approaches, and works in either Agile or traditional environments.
18
- </p>
19
-
20
- <p>
21
- ActiveFacts uses a <strong>fact-oriented</strong> approach to
22
- constructing models in <strong>elementary</strong> form. Every
23
- concept, whether a business entity or a relationship, is represented
24
- in the simplest possible form, isolated from all other concerns.
25
- Every role that each concept plays in the system is incorporated in
26
- simple <strong>business rules</strong> that can be effectively
27
- verbalised in plain language, displayed on diagrams, and managed in a
28
- system ontology (vocabulary). The elementary form is the most direct
29
- mind-map of the business domain that can be constructed, is based on
30
- pure logic, and is unsullied by implementation concerns. That makes it
31
- much easier to understand and validate by all parties, especially the
32
- business expert. Purely for its benefits in specification, semantic
33
- modeling is revolutionary.
34
- </p>
35
-
36
- <p>
37
- Because the semantic approach is based in pure logic, it can be
38
- automatically <strong>transformed</strong> into working software,
39
- in the form of executable code and database designs in efficient
40
- normalised form. It's an established truth that very small changes
41
- (even additions) in business rules can require large changes to
42
- the structure of an database. Contrary to existing methods used
43
- to design and access databases, semantic modeling allows you to
44
- make radical changes in the underlying physical table structures
45
- without the huge ramifications in your application code. The
46
- advantages in business agility are manifold.
47
- </p>
48
-
49
- <!--p>
50
- Queries in CQL span tables transparently, crossing conceptual
51
- relationships (fact types) without explicit database joins, and
52
- return structured data in a nested-relational form (called
53
- constellation form). For every user action in an application, a
54
- single query can be defined that provides all the data required to
55
- respond to that action. There's no need to fetch this, that, and
56
- the other. All required results are fetched at once, which
57
- improves application structure, performance, and even concurrency.
58
- </p-->
59
-
60
- <!--#include virtual="/footer.html" -->