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/script/txt2html
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
load File.dirname(__FILE__) + "/../Rakefile"
|
|
4
|
-
require 'rubyforge'
|
|
5
|
-
require 'redcloth'
|
|
6
|
-
require 'syntax/convertors/html'
|
|
7
|
-
require 'erb'
|
|
8
|
-
|
|
9
|
-
download = "http://rubyforge.org/projects/#{$hoe.rubyforge_name}"
|
|
10
|
-
version = $hoe.version
|
|
11
|
-
|
|
12
|
-
def rubyforge_project_id
|
|
13
|
-
RubyForge.new.configure.autoconfig["group_ids"][$hoe.rubyforge_name]
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
class Fixnum
|
|
17
|
-
def ordinal
|
|
18
|
-
# teens
|
|
19
|
-
return 'th' if (10..19).include?(self % 100)
|
|
20
|
-
# others
|
|
21
|
-
case self % 10
|
|
22
|
-
when 1: return 'st'
|
|
23
|
-
when 2: return 'nd'
|
|
24
|
-
when 3: return 'rd'
|
|
25
|
-
else return 'th'
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
class Time
|
|
31
|
-
def pretty
|
|
32
|
-
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def convert_syntax(syntax, source)
|
|
37
|
-
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
if ARGV.length >= 1
|
|
41
|
-
src, template = ARGV
|
|
42
|
-
template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
|
|
43
|
-
else
|
|
44
|
-
puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
|
|
45
|
-
exit!
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
template = ERB.new(File.open(template).read)
|
|
49
|
-
|
|
50
|
-
title = nil
|
|
51
|
-
body = nil
|
|
52
|
-
File.open(src) do |fsrc|
|
|
53
|
-
title_text = fsrc.readline
|
|
54
|
-
body_text_template = fsrc.read
|
|
55
|
-
body_text = ERB.new(body_text_template).result(binding)
|
|
56
|
-
syntax_items = []
|
|
57
|
-
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
|
58
|
-
ident = syntax_items.length
|
|
59
|
-
element, syntax, source = $1, $2, $3
|
|
60
|
-
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
|
61
|
-
"syntax-temp-#{ident}"
|
|
62
|
-
}
|
|
63
|
-
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
|
64
|
-
body = RedCloth.new(body_text).to_html
|
|
65
|
-
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
|
66
|
-
end
|
|
67
|
-
stat = File.stat(src)
|
|
68
|
-
created = stat.ctime
|
|
69
|
-
modified = stat.mtime
|
|
70
|
-
|
|
71
|
-
$stdout << template.result(binding)
|
data/spec/absorption_spec.rb
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts tests: Test the relational absorption by compiling CQL fragments.
|
|
3
|
-
# Copyright (c) 2008 Clifford Heath. Read the LICENSE file.
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
require 'spec_helper'
|
|
7
|
-
require 'activefacts/support'
|
|
8
|
-
require 'activefacts/api/support'
|
|
9
|
-
require 'activefacts/input/cql'
|
|
10
|
-
require 'activefacts/persistence'
|
|
11
|
-
|
|
12
|
-
describe "Absorption" do
|
|
13
|
-
AT_Prologue = %Q{
|
|
14
|
-
vocabulary Test;
|
|
15
|
-
DateTime is written as DateAndTime();
|
|
16
|
-
Month is written as VariableLengthText(3);
|
|
17
|
-
Season is written as VariableLengthText(6);
|
|
18
|
-
PartyID is written as AutoCounter();
|
|
19
|
-
ClaimID is written as AutoCounter();
|
|
20
|
-
}
|
|
21
|
-
AT_Claim = %Q{
|
|
22
|
-
Claim is identified by ClaimID where
|
|
23
|
-
Claim has exactly one ClaimID,
|
|
24
|
-
ClaimID is of at most one Claim;
|
|
25
|
-
Claim was reported on one DateTime;
|
|
26
|
-
}
|
|
27
|
-
AT_Incident = %Q{
|
|
28
|
-
Incident is identified by Claim where
|
|
29
|
-
Claim concerns at most one Incident,
|
|
30
|
-
Incident is of exactly one Claim;
|
|
31
|
-
}
|
|
32
|
-
AT_Party = %Q{
|
|
33
|
-
Party is identified by PartyID where
|
|
34
|
-
Party has exactly one PartyID,
|
|
35
|
-
PartyID is of at most one Party;
|
|
36
|
-
}
|
|
37
|
-
AT_Person = %Q{
|
|
38
|
-
Person is a kind of Party;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
Tests = [
|
|
42
|
-
{ :should => "inject a value column into the table for an independent ValueType",
|
|
43
|
-
:cql => %Q{
|
|
44
|
-
#{AT_Prologue}
|
|
45
|
-
Month is in exactly one Season;
|
|
46
|
-
},
|
|
47
|
-
:tables => { "Month" => [["Month", "Value"], ["Season"]] }
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
{ :should => "absorb a one-to-one along the identification path",
|
|
51
|
-
:cql => %Q{
|
|
52
|
-
#{AT_Prologue} #{AT_Claim} #{AT_Incident}
|
|
53
|
-
Incident relates to loss on exactly one DateTime;
|
|
54
|
-
},
|
|
55
|
-
:tables => { "Claim" => [%w{Claim ID}, %w{Date Time}, %w{Incident Date Time}]}
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
{ :should => "absorb an objectified binary with single-role UC",
|
|
59
|
-
:cql => %Q{
|
|
60
|
-
#{AT_Prologue} #{AT_Claim} #{AT_Party} #{AT_Person}
|
|
61
|
-
Lodgement is where
|
|
62
|
-
Claim was lodged by at most one Person;
|
|
63
|
-
Lodgement was made at at most one DateTime;
|
|
64
|
-
Person has exactly one birth-DateTime;
|
|
65
|
-
},
|
|
66
|
-
:tables => {
|
|
67
|
-
"Claim" => [%w{Claim ID}, %w{Date Time}, %w{Lodgement Date Time}, %w{Lodgement Person ID}],
|
|
68
|
-
"Party" => [%w{Party ID}, %w{Person Birth Date Time}]
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
]
|
|
73
|
-
|
|
74
|
-
Tests.each do |test|
|
|
75
|
-
should = test[:should]
|
|
76
|
-
cql = test[:cql]
|
|
77
|
-
expected_tables = test[:tables]
|
|
78
|
-
it "should #{should}" do
|
|
79
|
-
@compiler = ActiveFacts::CQL::Compiler.new(should)
|
|
80
|
-
@vocabulary = @compiler.compile(cql)
|
|
81
|
-
|
|
82
|
-
# puts cql
|
|
83
|
-
|
|
84
|
-
# Ensure that the same tables were generated:
|
|
85
|
-
tables = @vocabulary.tables.sort_by(&:name)
|
|
86
|
-
tables.map(&:name).should == expected_tables.keys.sort
|
|
87
|
-
|
|
88
|
-
# Ensure that the same column descriptions were generated:
|
|
89
|
-
tables.each do |table|
|
|
90
|
-
column_descriptions = table.columns.map{|col| col.name(nil) }.sort
|
|
91
|
-
column_descriptions.should == expected_tables[table.name].map{|c| Array(c) }.sort
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
data/spec/cql/comparison_spec.rb
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Comparison Fact Type tests
|
|
3
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
require 'rspec/expectations'
|
|
7
|
-
|
|
8
|
-
require 'activefacts/support'
|
|
9
|
-
require 'activefacts/api/support'
|
|
10
|
-
require 'activefacts/cql/compiler'
|
|
11
|
-
require File.dirname(__FILE__) + '/../helpers/compile_helpers'
|
|
12
|
-
|
|
13
|
-
describe "When matching a reading with an existing fact type" do
|
|
14
|
-
before :each do
|
|
15
|
-
extend CompileHelpers
|
|
16
|
-
|
|
17
|
-
prefix = %q{
|
|
18
|
-
vocabulary Tests;
|
|
19
|
-
Name is written as String;
|
|
20
|
-
year/years converts to 365.25 day;
|
|
21
|
-
Age is written as Integer year;
|
|
22
|
-
Person is identified by its Name;
|
|
23
|
-
Person is of Age;
|
|
24
|
-
|
|
25
|
-
// Company is identified by its Name;
|
|
26
|
-
// Directorship is where Person directs Company;
|
|
27
|
-
}
|
|
28
|
-
@compiler = ActiveFacts::CQL::Compiler.new('Test')
|
|
29
|
-
@compiler.compile(prefix)
|
|
30
|
-
@constellation = @compiler.vocabulary.constellation
|
|
31
|
-
|
|
32
|
-
baseline
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
describe "equality comparisons" do
|
|
36
|
-
before :each do
|
|
37
|
-
#debug_enable("binding"); debug_enable("matching"); debug_enable("matching_fails"); debug_enable("parse")
|
|
38
|
-
end
|
|
39
|
-
after :each do
|
|
40
|
-
#debug_disable("binding"); debug_disable("matching"); debug_disable("matching_fails"); debug_disable("parse")
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def value_should_match value, lit, unit = nil
|
|
44
|
-
value.should_not be_nil
|
|
45
|
-
value.literal.should == lit.to_s
|
|
46
|
-
(!!value.is_literal_string).should == lit.is_a?(String)
|
|
47
|
-
if unit
|
|
48
|
-
value.unit.should_not be_nil
|
|
49
|
-
value.unit.name.should == unit
|
|
50
|
-
else
|
|
51
|
-
value.unit.should be_nil
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def one_query_with_value v, unit = nil
|
|
56
|
-
queries.size.should == 1
|
|
57
|
-
(jss = steps).size.should == 2
|
|
58
|
-
(jns = variables).size.should == 3
|
|
59
|
-
integer_node = jns.detect{|jn| jn.object_type.name == 'Integer'}
|
|
60
|
-
integer_node.should_not be_nil
|
|
61
|
-
value_should_match integer_node.value, v, unit
|
|
62
|
-
# pending should test content of the steps
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "should create a comparison fact type" do
|
|
66
|
-
compile %q{Person is old where Person is of Age >= 60 years; }
|
|
67
|
-
(new_fact_types = fact_types).size.should == 2
|
|
68
|
-
|
|
69
|
-
is_old_ft = new_fact_types.detect{|ft| ft.all_reading.detect{|r| r.text =~ /is old/} }
|
|
70
|
-
(is_old_ft.all_reading.map{ |r| r.expand }*', ').should == "Person is old"
|
|
71
|
-
|
|
72
|
-
comparison_ft = (new_fact_types - [is_old_ft])[0]
|
|
73
|
-
(comparison_ft.all_reading.map{ |r| r.expand }*', ').should == "Boolean = Age >= Integer"
|
|
74
|
-
|
|
75
|
-
one_query_with_value 60, 'year'
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
it "should create a comparison fact type twice without duplication"
|
|
79
|
-
|
|
80
|
-
it "should parse a query and comparison fact type" do
|
|
81
|
-
compile %q{Person is of Age >= 60 years? }
|
|
82
|
-
(new_fact_types = fact_types).size.should == 1
|
|
83
|
-
(readings = new_fact_types[0].all_reading).size.should == 1
|
|
84
|
-
readings.single.text.should == '{0} = {1} >= {2}'
|
|
85
|
-
|
|
86
|
-
one_query_with_value 60, 'year'
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
data/spec/cql/context_spec.rb
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Business Context Note tests
|
|
3
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
require 'activefacts/support'
|
|
7
|
-
require 'activefacts/api/support'
|
|
8
|
-
require 'activefacts/cql/compiler'
|
|
9
|
-
|
|
10
|
-
describe "Business Context Notes" do
|
|
11
|
-
# (according_to people ',')? (because / as_opposed_to / so_that / to_avoid) discussion (',' as_agreed_by)? s
|
|
12
|
-
ContextNotePrefix = %q{
|
|
13
|
-
vocabulary Test;
|
|
14
|
-
Person is written as Person;
|
|
15
|
-
Person is employed;
|
|
16
|
-
Person is unemployed;
|
|
17
|
-
Person is a bad credit risk;
|
|
18
|
-
Person is good credit risk;
|
|
19
|
-
Bar is written as Bar;
|
|
20
|
-
Baz is written as Baz;
|
|
21
|
-
}
|
|
22
|
-
Notes = [
|
|
23
|
-
# Constraints:
|
|
24
|
-
[ 'each Person occurs one time in Person is employed, Person is unemployed (because it can be no other way!);',
|
|
25
|
-
1, 'because'
|
|
26
|
-
],
|
|
27
|
-
[ 'each Person occurs one time in Person is employed, Person is unemployed (as opposed to blah!);',
|
|
28
|
-
1, 'as_opposed_to'
|
|
29
|
-
],
|
|
30
|
-
[ 'for each Person at least one of these holds: Person is employed, Person is a bad credit risk (so that blah);',
|
|
31
|
-
1, 'so_that'
|
|
32
|
-
],
|
|
33
|
-
[ 'Person is good credit risk only if Person is employed (to avoid lending to people who can\'t repay);',
|
|
34
|
-
1, 'to_avoid'
|
|
35
|
-
],
|
|
36
|
-
[ 'Person is good credit risk if and only if Person is employed (to avoid lending to people who can\'t repay);',
|
|
37
|
-
1, 'to_avoid'
|
|
38
|
-
],
|
|
39
|
-
[ 'Person is good credit risk if and only if Person is employed (to avoid lending to people who can\'t repay, as agreed by Jim);',
|
|
40
|
-
1, 'to_avoid', nil, ['Jim']
|
|
41
|
-
],
|
|
42
|
-
# Entity and Fact types
|
|
43
|
-
# Entity and Fact types
|
|
44
|
-
[ 'Foo is identified by Bar [independent] where Foo has one(to avoid fuckups) Bar (so that we have an id);',
|
|
45
|
-
1, 'so_that'
|
|
46
|
-
],
|
|
47
|
-
[ 'Baz has one Bar (so that we have an id), Bar is of one Baz (because we need that);',
|
|
48
|
-
2
|
|
49
|
-
],
|
|
50
|
-
# REVISIT: No context notes on quantifiers yet
|
|
51
|
-
# As agreed by:
|
|
52
|
-
[ 'for each Person at least one of these holds: Person is employed, Person is a bad credit risk (so that blah, as agreed by Jim);',
|
|
53
|
-
1, 'so_that', nil, ['Jim']
|
|
54
|
-
],
|
|
55
|
-
# REVISIT: Populate an "as agreed by" with a date
|
|
56
|
-
[ 'for each Person at least one of these holds: Person is employed, Person is a bad credit risk (so that blah, as agreed on 10-04-10 by Jim);',
|
|
57
|
-
1, 'so_that', nil, ['Jim'], '10-04-10'
|
|
58
|
-
],
|
|
59
|
-
# According to:
|
|
60
|
-
[ 'for each Person at least one of these holds: Person is employed, Person is a bad credit risk (according to jim, so that blah);',
|
|
61
|
-
1, 'so_that', ['jim']
|
|
62
|
-
],
|
|
63
|
-
]
|
|
64
|
-
|
|
65
|
-
before :each do
|
|
66
|
-
@compiler = ActiveFacts::CQL::Compiler.new('Test')
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
Notes.each do |c|
|
|
70
|
-
source, count, kind, according_to, agreed_by, agreed_date = *c
|
|
71
|
-
it "should parse #{source.inspect}" do
|
|
72
|
-
|
|
73
|
-
result =
|
|
74
|
-
begin
|
|
75
|
-
@compiler.compile(ContextNotePrefix+source)
|
|
76
|
-
rescue => e
|
|
77
|
-
puts "#{e}:\n\t#{e.backtrace*"\n\t"}"
|
|
78
|
-
end
|
|
79
|
-
puts @compiler.failure_reason unless result
|
|
80
|
-
result.should_not be_nil
|
|
81
|
-
constellation = @compiler.vocabulary.constellation
|
|
82
|
-
|
|
83
|
-
# constellation.ContextNote.each{|k,cn| puts "#{k.inspect} => #{cn.inspect}" }
|
|
84
|
-
constellation.ContextNote.size.should == (count || 1)
|
|
85
|
-
context_note = constellation.ContextNote.values[0]
|
|
86
|
-
context_note.context_note_kind.should == kind if kind
|
|
87
|
-
context_note.all_context_according_to.map{|cat| cat.agent.agent_name }.sort.should == according_to if according_to
|
|
88
|
-
# context_note.discussion.should == discussion if discussion
|
|
89
|
-
context_note.agreement.should_not be_nil if agreed_by || agreed_date
|
|
90
|
-
context_note.agreement.all_context_agreed_by.map{|cab| cab.agent.agent_name}.sort.should == agreed_by if agreed_by
|
|
91
|
-
context_note.agreement.date.should == Date.parse(agreed_date) if agreed_date
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# ActiveFacts CQL Fact Type matching tests - contractions.
|
|
3
|
-
# Copyright (c) 2009 Clifford Heath. Read the LICENSE file.
|
|
4
|
-
#
|
|
5
|
-
# Contractions are where a fact type clause is followed by another (with
|
|
6
|
-
# some conjunction except for comparisons) with one player *implicit* in
|
|
7
|
-
# the following clause.
|
|
8
|
-
#
|
|
9
|
-
# Right contraction elides the repetition of the right-most player,
|
|
10
|
-
# and left contraction elides the left-most player.
|
|
11
|
-
#
|
|
12
|
-
# So, using the notation "A rel B" for binaries,
|
|
13
|
-
# "A relA B relA C" for ternaries, and "C prop" for properties,
|
|
14
|
-
# we can write equivalences as follows.
|
|
15
|
-
#
|
|
16
|
-
# Note 1: Terms may be more than one word.
|
|
17
|
-
# Note 2: For any "A rel B", the example also applies to a ternary or
|
|
18
|
-
# higher, as appropriate.
|
|
19
|
-
|
|
20
|
-
=begin
|
|
21
|
-
Right contractions with 'and':
|
|
22
|
-
A rel B and B prop
|
|
23
|
-
-> A rel B who/that prop
|
|
24
|
-
E.g. Person pats Cat that is asleep
|
|
25
|
-
|
|
26
|
-
A rel B and B rel2 C
|
|
27
|
-
-> A rel B who/that rel2 C
|
|
28
|
-
E.g. Person pats Cat that is lying on Mat
|
|
29
|
-
|
|
30
|
-
A rel B and B rel2A C rel2A D
|
|
31
|
-
-> A rel B who/that rel2A C rel2B D
|
|
32
|
-
E.g. Person pats Cat that ate Food at Time
|
|
33
|
-
|
|
34
|
-
A rel B and B > C
|
|
35
|
-
-> A rel B > C
|
|
36
|
-
E.g. Person is of Age >= 21
|
|
37
|
-
|
|
38
|
-
A > B and B rel C
|
|
39
|
-
-> A > B rel C
|
|
40
|
-
E.g. 21 > Age of Person
|
|
41
|
-
|
|
42
|
-
Right contractions with ',':
|
|
43
|
-
A rel B, B rel2 C
|
|
44
|
-
-> A rel B who/that rel2 C
|
|
45
|
-
|
|
46
|
-
A rel B, B prop
|
|
47
|
-
-> A rel B who/that prop
|
|
48
|
-
|
|
49
|
-
A rel B, B > C
|
|
50
|
-
-> A rel B > C
|
|
51
|
-
|
|
52
|
-
A > B, B rel C
|
|
53
|
-
-> A > B rel C
|
|
54
|
-
|
|
55
|
-
Left contractions with 'and':
|
|
56
|
-
A rel B and A rel2 C
|
|
57
|
-
-> A rel B and rel2 C
|
|
58
|
-
E.g. Boy seduces Girl and is drunk
|
|
59
|
-
|
|
60
|
-
A rel B and A prop
|
|
61
|
-
-> A rel B and prop
|
|
62
|
-
|
|
63
|
-
A rel B and A > C
|
|
64
|
-
-> A rel B and > C
|
|
65
|
-
|
|
66
|
-
Left contractions with 'or':
|
|
67
|
-
A rel B or A rel2 C
|
|
68
|
-
-> A rel B or rel2 C
|
|
69
|
-
|
|
70
|
-
A rel B or A prop
|
|
71
|
-
-> A rel B or prop
|
|
72
|
-
|
|
73
|
-
A rel B or A > C
|
|
74
|
-
-> A rel B or > C
|
|
75
|
-
|
|
76
|
-
A > B or A rel C
|
|
77
|
-
-> A > B or rel C
|
|
78
|
-
|
|
79
|
-
Double contractions (not supported in CQL yet):
|
|
80
|
-
A rel B and A rel2 B
|
|
81
|
-
-> A rel B and rel2
|
|
82
|
-
E.g. Person came to Party and was invited to
|
|
83
|
-
|
|
84
|
-
Extended contractions (not supported in CQL yet) (note the ambiguity - if allowed, the first takes precedence!):
|
|
85
|
-
A rel B and B rel2 C and B prop
|
|
86
|
-
-> A rel B that rel2 C and prop
|
|
87
|
-
E.g. LazyDogOwner is a Person who owns Dog that barks and Dog is lazy.
|
|
88
|
-
|
|
89
|
-
A rel B and B rel2 C and A prop
|
|
90
|
-
-> A rel B that rel2 C and prop
|
|
91
|
-
E.g. LazyDogOwner is a Person who owns Dog that barks and Person is lazy.
|
|
92
|
-
|
|
93
|
-
And/or resolution:
|
|
94
|
-
A rel B and B rel2 C or A rel3 D
|
|
95
|
-
A rel B and B rel2 C or B rel3 D -> Logical, A must rel B but B can carry either rel
|
|
96
|
-
A rel B and B rel2 C or C rel3 D -> Illogical form (mandates B rel2 C so 'or' is meaningless)
|
|
97
|
-
|
|
98
|
-
Ambiguous, disallowed:
|
|
99
|
-
A > 2 + B > C
|
|
100
|
-
|
|
101
|
-
Comments from Matt on contraction and verbalisation:
|
|
102
|
-
|
|
103
|
-
I have two types of list phrases which I classify as 'header' and 'inline'.
|
|
104
|
-
And and or are inline, the other four (negated and/or, positive or negative
|
|
105
|
-
xor) all use header forms. There is also a header form of negation (it is not
|
|
106
|
-
true that...). The header forms (all of the following must be true: etc) can
|
|
107
|
-
introduce vars in the starting context, but not those introduced by previous
|
|
108
|
-
elements in the list.
|
|
109
|
-
|
|
110
|
-
You'll likely need something similar, though, on nested expressions. You also
|
|
111
|
-
have to decide where your implicit existential placement is if you use the
|
|
112
|
-
same var in multiple branches or under negation. Lots of fun stuff.
|
|
113
|
-
|
|
114
|
-
=end
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
require 'rspec/expectations'
|
|
118
|
-
|
|
119
|
-
require 'activefacts/support'
|
|
120
|
-
require 'activefacts/api/support'
|
|
121
|
-
require 'activefacts/cql/compiler'
|
|
122
|
-
require File.dirname(__FILE__) + '/../helpers/compile_helpers' # Can't see how to include/extend these methods correctly
|
|
123
|
-
|
|
124
|
-
describe "When compiling a query, " do
|
|
125
|
-
before :each do
|
|
126
|
-
extend CompileHelpers
|
|
127
|
-
|
|
128
|
-
prefix = %q{
|
|
129
|
-
vocabulary Tests;
|
|
130
|
-
Boy is written as String;
|
|
131
|
-
Girl is written as Integer;
|
|
132
|
-
Age is written as Integer;
|
|
133
|
-
Boy is of Age;
|
|
134
|
-
Boy is going out with Girl, Girl is going out with Boy;
|
|
135
|
-
}
|
|
136
|
-
@compiler = ActiveFacts::CQL::Compiler.new('Test')
|
|
137
|
-
@compiler.compile(prefix)
|
|
138
|
-
@constellation = @compiler.vocabulary.constellation
|
|
139
|
-
|
|
140
|
-
baseline
|
|
141
|
-
|
|
142
|
-
def self.compile string
|
|
143
|
-
lambda {
|
|
144
|
-
@compiler.compile string
|
|
145
|
-
}.should_not raise_error
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
shared_examples_for "single contractions" do
|
|
150
|
-
it "should produce one fact type" do
|
|
151
|
-
(new_fact_types = fact_types).size.should == 1
|
|
152
|
-
end
|
|
153
|
-
it "the fact type should have one reading" do
|
|
154
|
-
fact_type = fact_types[0]
|
|
155
|
-
fact_type.all_reading.size.should == 1
|
|
156
|
-
end
|
|
157
|
-
it "the fact type should have no presence constraints" do
|
|
158
|
-
fact_type = fact_types[0]
|
|
159
|
-
(pcs = fact_pcs(fact_type)).size.should == 0
|
|
160
|
-
end
|
|
161
|
-
it "should produce one query" do
|
|
162
|
-
fact_type = fact_types[0]
|
|
163
|
-
query = derivation(fact_type)
|
|
164
|
-
end
|
|
165
|
-
it "the query should have 3 variables" do
|
|
166
|
-
fact_type = fact_types[0]
|
|
167
|
-
query = derivation(fact_type)
|
|
168
|
-
variables = query.all_variable.to_a
|
|
169
|
-
variables.size.should == 3
|
|
170
|
-
end
|
|
171
|
-
it "the query should have 2 steps" do
|
|
172
|
-
fact_type = fact_types[0]
|
|
173
|
-
query = derivation(fact_type)
|
|
174
|
-
steps = query.all_step.to_a
|
|
175
|
-
steps.size.should == 2
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
it "and should project the fact type roles from the query" do
|
|
179
|
-
skip "Plays are not yet projected" do
|
|
180
|
-
query = derivation(fact_type)
|
|
181
|
-
queries = fact_type.all_role.map{|r| r.all_play.map{|play| play.query}}.flatten.uniq
|
|
182
|
-
queries.size == 1
|
|
183
|
-
queries.should == [query]
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
describe "right contractions having" do
|
|
189
|
-
describe "a single contraction using 'who'" do
|
|
190
|
-
before :each do
|
|
191
|
-
compile %q{Boy is relevant where Girl is going out with Boy who is of Age; }
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it_should_behave_like "single contractions"
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
describe "a single contraction using 'that'" do
|
|
198
|
-
before :each do
|
|
199
|
-
compile %q{Boy is relevant where Girl is going out with Boy that is of Age; }
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
it_should_behave_like "single contractions"
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
describe "left contractions having" do
|
|
207
|
-
describe "a single contraction" do
|
|
208
|
-
before :each do
|
|
209
|
-
compile %q{Boy is relevant where Boy is of Age and is going out with Girl; }
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
it_should_behave_like "single contractions"
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
=begin
|
|
218
|
-
Examples on the Blog model:
|
|
219
|
-
|
|
220
|
-
Post is nice where Post was written by Author and belongs to Topic and includes Ordinal paragraph;
|
|
221
|
-
Post is nice where Post was written by Author and belongs to Topic or Post includes Ordinal paragraph or has Post Id;
|
|
222
|
-
Post is nice where Post was written by Author and belongs to Topic or includes Ordinal paragraph;
|
|
223
|
-
Post is nice where Post was written by Author and belongs to Topic or Post includes Ordinal paragraph or has Post Id;
|
|
224
|
-
=end
|