alf-core 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +77 -0
- data/examples/operators/page.alf +4 -0
- data/lib/alf-adapter-fs/alf/adapter/folder.rb +4 -0
- data/lib/alf-adapter-fs/alf/adapter/folder/connection.rb +3 -2
- data/lib/alf-adapter/alf/adapter/connection.rb +1 -1
- data/lib/alf-algebra/alf/algebra/operand.rb +2 -2
- data/lib/alf-algebra/alf/algebra/operand/fake.rb +3 -3
- data/lib/alf-algebra/alf/algebra/operand/named.rb +1 -1
- data/lib/alf-algebra/alf/algebra/operand/proxy.rb +14 -0
- data/lib/alf-algebra/alf/algebra/operator.rb +4 -1
- data/lib/alf-algebra/alf/algebra/operator/clip.rb +7 -4
- data/lib/alf-algebra/alf/algebra/operator/frame.rb +22 -0
- data/lib/alf-algebra/alf/algebra/operator/hierarchize.rb +22 -0
- data/lib/alf-algebra/alf/algebra/operator/page.rb +22 -0
- data/lib/alf-algebra/alf/algebra/operator/project.rb +4 -9
- data/lib/alf-algebra/alf/algebra/operator/rank.rb +2 -2
- data/lib/alf-algebra/alf/algebra/support.rb +2 -0
- data/lib/alf-algebra/alf/algebra/support/signature.rb +2 -1
- data/lib/alf-algebra/alf/algebra/support/with_ordering.rb +11 -0
- data/lib/alf-core/ext/domain/heading_based.rb +16 -4
- data/lib/alf-core/facade.rb +5 -1
- data/lib/alf-core/version.rb +2 -2
- data/lib/alf-database/alf/database/connection.rb +2 -2
- data/lib/alf-database/alf/database/options.rb +0 -3
- data/lib/alf-engine/alf/engine.rb +4 -1
- data/lib/alf-engine/alf/engine/aggregate.rb +2 -1
- data/lib/alf-engine/alf/engine/autonum.rb +2 -1
- data/lib/alf-engine/alf/engine/clip.rb +2 -1
- data/lib/alf-engine/alf/engine/coerce.rb +2 -1
- data/lib/alf-engine/alf/engine/cog.rb +23 -0
- data/lib/alf-engine/alf/engine/compact.rb +3 -2
- data/lib/alf-engine/alf/engine/compact/set.rb +2 -1
- data/lib/alf-engine/alf/engine/compact/uniq.rb +2 -1
- data/lib/alf-engine/alf/engine/compiler.rb +60 -33
- data/lib/alf-engine/alf/engine/concat.rb +2 -1
- data/lib/alf-engine/alf/engine/defaults.rb +2 -1
- data/lib/alf-engine/alf/engine/filter.rb +4 -2
- data/lib/alf-engine/alf/engine/generator.rb +2 -1
- data/lib/alf-engine/alf/engine/group/hash.rb +4 -3
- data/lib/alf-engine/alf/engine/hierarchize.rb +87 -0
- data/lib/alf-engine/alf/engine/infer_heading.rb +2 -1
- data/lib/alf-engine/alf/engine/join.rb +5 -1
- data/lib/alf-engine/alf/engine/join/hash.rb +9 -2
- data/lib/alf-engine/alf/engine/leaf.rb +6 -1
- data/lib/alf-engine/alf/engine/materialize/array.rb +2 -1
- data/lib/alf-engine/alf/engine/materialize/hash.rb +2 -1
- data/lib/alf-engine/alf/engine/quota/cesure.rb +2 -1
- data/lib/alf-engine/alf/engine/rank/cesure.rb +2 -1
- data/lib/alf-engine/alf/engine/rename.rb +2 -1
- data/lib/alf-engine/alf/engine/semi/hash.rb +7 -1
- data/lib/alf-engine/alf/engine/set_attr.rb +4 -3
- data/lib/alf-engine/alf/engine/sort.rb +3 -2
- data/lib/alf-engine/alf/engine/sort/in_memory.rb +2 -1
- data/lib/alf-engine/alf/engine/summarize/cesure.rb +2 -1
- data/lib/alf-engine/alf/engine/summarize/hash.rb +3 -2
- data/lib/alf-engine/alf/engine/{cesure.rb → support/cesure.rb} +0 -0
- data/lib/alf-engine/alf/engine/take.rb +53 -0
- data/lib/alf-engine/alf/engine/to_array.rb +6 -5
- data/lib/alf-engine/alf/engine/type_safe.rb +2 -1
- data/lib/alf-engine/alf/engine/ungroup.rb +2 -1
- data/lib/alf-engine/alf/engine/unwrap.rb +2 -1
- data/lib/alf-engine/alf/engine/wrap.rb +2 -1
- data/lib/alf-io/alf/reader.rb +1 -1
- data/lib/alf-io/alf/reader/ruby.rb +23 -0
- data/lib/alf-io/alf/renderer/text.rb +22 -9
- data/lib/alf-lang/alf/lang/lispy.rb +41 -29
- data/lib/alf-lang/alf/lang/oo/algebra_methods.rb +17 -1
- data/lib/alf-optimizer/alf/optimizer/restrict.rb +7 -1
- data/lib/alf-predicate/alf/predicate.rb +11 -2
- data/lib/alf-relation/alf/relation.rb +21 -1
- data/lib/alf-relvar/alf/relvar.rb +21 -1
- data/lib/alf-relvar/alf/relvar/base.rb +11 -6
- data/lib/alf-relvar/alf/relvar/fake.rb +3 -2
- data/lib/alf-relvar/alf/relvar/virtual.rb +1 -2
- data/lib/alf-support/alf/support/bindable.rb +1 -1
- data/lib/alf-support/alf/support/config.rb +91 -18
- data/lib/alf-support/alf/support/tuple_scope.rb +8 -4
- data/lib/alf-types/alf/types.rb +2 -0
- data/lib/alf-types/alf/types/attr_list.rb +3 -1
- data/lib/alf-types/alf/types/heading.rb +4 -1
- data/lib/alf-types/alf/types/keys.rb +0 -4
- data/lib/alf-types/alf/types/ordering.rb +104 -18
- data/lib/alf-types/alf/types/selection.rb +18 -0
- data/lib/alf-types/alf/types/selector.rb +59 -0
- data/lib/alf-types/alf/types/tuple_computation.rb +2 -2
- data/lib/alf-types/alf/types/tuple_expression.rb +18 -2
- data/lib/alf-viewpoint/alf/viewpoint.rb +23 -8
- data/lib/alf-viewpoint/alf/viewpoint/metadata.rb +73 -0
- data/spec/integration/relation/test_extend.rb +20 -0
- data/spec/integration/relation/test_to_array.rb +1 -1
- data/spec/integration/test_examples.rb +18 -2
- data/spec/shared/a_cog.rb +36 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/unit/alf-algebra/operand/test_proxy.rb +54 -0
- data/spec/unit/alf-algebra/operator/hierarchize/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/project/test_key_preserving.rb +3 -0
- data/spec/unit/alf-algebra/operator/project/test_keys.rb +54 -17
- data/spec/unit/alf-algebra/operator/rank/test_keys.rb +2 -2
- data/spec/unit/alf-algebra/operator/restrict/test_keys.rb +2 -2
- data/spec/unit/alf-algebra/operator/test_page.rb +30 -0
- data/spec/unit/alf-algebra/support/test_relational.rb +3 -0
- data/spec/unit/alf-algebra/support/with_ordering/test_total_ordering.rb +61 -0
- data/spec/unit/alf-database/connection/test_reconnect.rb +1 -1
- data/spec/unit/alf-database/options/test_new.rb +4 -4
- data/spec/unit/alf-database/shared_examples/a_facade_on_database_options.rb +1 -2
- data/spec/unit/alf-engine/cog/test_to_cog.rb +14 -0
- data/spec/unit/alf-engine/compiler/test_on_frame.rb +70 -0
- data/spec/unit/alf-engine/compiler/test_on_hierarchize.rb +33 -0
- data/spec/unit/alf-engine/compiler/test_on_page.rb +128 -0
- data/spec/unit/alf-engine/compiler/test_unsupported.rb +48 -0
- data/spec/unit/alf-engine/hierarchize/test_renamer.rb +18 -0
- data/spec/unit/alf-engine/test_filter.rb +43 -11
- data/spec/unit/alf-engine/test_hierarchize.rb +71 -0
- data/spec/unit/alf-engine/test_set_attr.rb +13 -0
- data/spec/unit/alf-engine/test_take.rb +46 -0
- data/spec/unit/alf-engine/test_to_array.rb +45 -28
- data/spec/unit/alf-io/reader/{input.rb → input.rash} +0 -0
- data/spec/unit/alf-io/reader/input.ruby +4 -0
- data/spec/unit/alf-io/reader/test_rash.rb +1 -1
- data/spec/unit/alf-io/reader/test_ruby.rb +25 -0
- data/spec/unit/alf-predicate/predicate/test_evaluate.rb +51 -13
- data/spec/unit/alf-relation/relation/class/test_recursive_type.rb +42 -0
- data/spec/unit/alf-relation/relation/test_equality.rb +19 -1
- data/spec/unit/alf-relation/relation/test_relops.rb +14 -2
- data/spec/unit/alf-relation/relation/test_to_hash.rb +31 -0
- data/spec/unit/alf-relvar/base/test_connection.rb +8 -2
- data/spec/unit/alf-relvar/base/test_delete.rb +2 -2
- data/spec/unit/alf-relvar/base/test_heading.rb +2 -2
- data/spec/unit/alf-relvar/base/test_insert.rb +3 -3
- data/spec/unit/alf-relvar/base/test_keys.rb +2 -2
- data/spec/unit/alf-relvar/base/test_lock.rb +2 -2
- data/spec/unit/alf-relvar/base/test_name.rb +3 -2
- data/spec/unit/alf-relvar/base/test_oo_lang.rb +2 -1
- data/spec/unit/alf-relvar/base/test_to_cog.rb +3 -3
- data/spec/unit/alf-relvar/base/test_to_lispy.rb +3 -2
- data/spec/unit/alf-relvar/base/test_to_relvar.rb +2 -1
- data/spec/unit/alf-relvar/base/test_to_s.rb +3 -2
- data/spec/unit/alf-relvar/base/test_update.rb +5 -4
- data/spec/unit/alf-relvar/virtual/test_connection.rb +3 -2
- data/spec/unit/alf-relvar/virtual/test_delete.rb +3 -4
- data/spec/unit/alf-relvar/virtual/test_expr.rb +3 -2
- data/spec/unit/alf-relvar/virtual/test_heading.rb +5 -4
- data/spec/unit/alf-relvar/virtual/test_insert.rb +2 -2
- data/spec/unit/alf-relvar/virtual/test_keys.rb +5 -4
- data/spec/unit/alf-relvar/virtual/test_oo_lang.rb +7 -2
- data/spec/unit/alf-relvar/virtual/test_to_cog.rb +4 -3
- data/spec/unit/alf-relvar/virtual/test_to_lispy.rb +3 -6
- data/spec/unit/alf-relvar/virtual/test_to_relvar.rb +2 -1
- data/spec/unit/alf-relvar/virtual/test_to_s.rb +3 -3
- data/spec/unit/alf-relvar/virtual/test_update.rb +4 -5
- data/spec/unit/alf-support/config/test_dup.rb +58 -0
- data/spec/unit/alf-support/config/test_freeze.rb +37 -0
- data/spec/unit/alf-support/config/test_hash_get.rb +41 -0
- data/spec/unit/alf-support/config/test_hash_set.rb +61 -0
- data/spec/unit/alf-support/config/test_new.rb +10 -0
- data/spec/unit/alf-support/config/test_option.rb +15 -0
- data/spec/unit/alf-support/config/test_option_setter.rb +72 -0
- data/spec/unit/alf-support/config/test_options.rb +22 -0
- data/spec/unit/alf-support/tuple_scope/test_hash_get.rb +20 -0
- data/spec/unit/alf-support/tuple_scope/test_respond_to.rb +6 -0
- data/spec/unit/alf-support/tuple_scope/test_to_s.rb +22 -0
- data/spec/unit/alf-types/keys/test_select.rb +57 -8
- data/spec/unit/alf-types/ordering/test_coerce.rb +46 -35
- data/spec/unit/alf-types/ordering/test_dive.rb +41 -0
- data/spec/unit/alf-types/ordering/test_hash_get.rb +20 -0
- data/spec/unit/alf-types/ordering/test_merge.rb +61 -0
- data/spec/unit/alf-types/ordering/test_reverse.rb +40 -0
- data/spec/unit/alf-types/ordering/test_selectors.rb +24 -0
- data/spec/unit/alf-types/ordering/test_sorter.rb +62 -8
- data/spec/unit/alf-types/ordering/test_to_attr_list.rb +16 -4
- data/spec/unit/alf-types/ordering/test_total.rb +56 -0
- data/spec/unit/alf-types/selection/test_coerce.rb +38 -0
- data/spec/unit/alf-types/selection/test_select.rb +34 -0
- data/spec/unit/alf-types/selector/test_coerce.rb +36 -0
- data/spec/unit/alf-types/selector/test_composite_q.rb +20 -0
- data/spec/unit/alf-types/selector/test_dive.rb +32 -0
- data/spec/unit/alf-types/selector/test_select.rb +40 -0
- data/spec/unit/alf-types/selector/test_simple_q.rb +20 -0
- data/spec/unit/alf-types/selector/test_to_a.rb +20 -0
- data/spec/unit/alf-types/selector/test_to_lispy.rb +20 -0
- data/spec/unit/alf-types/selector/test_to_ruby_literal.rb +20 -0
- data/spec/unit/alf-types/tuple_expression/test_evaluate.rb +38 -0
- data/spec/unit/alf-viewpoint/metadata/test_add_members.rb +38 -0
- data/spec/unit/alf-viewpoint/metadata/test_all_members.rb +33 -0
- data/spec/unit/alf-viewpoint/metadata/test_depends.rb +50 -0
- data/spec/unit/alf-viewpoint/metadata/test_dup.rb +32 -0
- data/spec/unit/alf-viewpoint/metadata/test_expand.rb +31 -0
- data/spec/unit/alf-viewpoint/metadata/test_expects.rb +38 -0
- data/spec/unit/alf-viewpoint/metadata/test_initialize.rb +40 -0
- data/spec/unit/alf-viewpoint/metadata/test_to_module.rb +37 -0
- data/spec/unit/alf-viewpoint/test_depends.rb +18 -0
- data/spec/unit/alf-viewpoint/test_expects.rb +18 -0
- data/spec/unit/alf-viewpoint/test_members.rb +33 -0
- data/spec/unit/alf-viewpoint/test_metadata.rb +27 -0
- data/spec/unit/alf-viewpoint/test_native_const.rb +6 -0
- metadata +125 -14
- data/spec/unit/alf-database/options/test_default_viewpoint.rb +0 -25
- data/spec/unit/alf-types/keys/test_compact.rb +0 -21
- data/spec/unit/alf-types/ordering/test_plus.rb +0 -27
- data/spec/unit/alf-viewpoint/test_namespace.rb +0 -23
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Engine
|
4
|
+
describe Compiler, 'unsupported' do
|
5
|
+
|
6
|
+
def unsupported(*args, &bl)
|
7
|
+
Compiler.new.send(:unsupported, *args, &bl)
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'when nothing raised' do
|
11
|
+
|
12
|
+
subject{
|
13
|
+
unsupported(:fall){ 12 }
|
14
|
+
}
|
15
|
+
|
16
|
+
it 'should return the value if nothing raised' do
|
17
|
+
subject.should eq(12)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when a NotSupportedError is raised' do
|
22
|
+
|
23
|
+
subject{
|
24
|
+
unsupported(:fall){ raise NotSupportedError }
|
25
|
+
}
|
26
|
+
|
27
|
+
it 'should return the fallback value' do
|
28
|
+
subject.should eq(:fall)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when something else is raised' do
|
33
|
+
|
34
|
+
subject{
|
35
|
+
unsupported(:fall){ raise ArgumentError, "here" }
|
36
|
+
}
|
37
|
+
|
38
|
+
it 'should let the error be raised' do
|
39
|
+
lambda{
|
40
|
+
subject
|
41
|
+
}.should raise_error(ArgumentError, "here")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Engine
|
4
|
+
describe Hierarchize, "renaming" do
|
5
|
+
|
6
|
+
let(:hierarchize){
|
7
|
+
Hierarchize.new([], AttrList[:id, :subid], AttrList[:parent, :subparent], :children)
|
8
|
+
}
|
9
|
+
|
10
|
+
subject{
|
11
|
+
hierarchize.send(:renamer)
|
12
|
+
}
|
13
|
+
|
14
|
+
it{ should eq(Renaming[parent: :id, subparent: :subid]) }
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -3,19 +3,51 @@ module Alf
|
|
3
3
|
module Engine
|
4
4
|
describe Filter do
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
subject{ Filter.new(operand, predicate).to_a }
|
7
|
+
|
8
|
+
context 'on an empty operand' do
|
9
|
+
let(:operand) { Leaf.new([]) }
|
10
|
+
let(:predicate){ Predicate.coerce(true) }
|
11
|
+
|
12
|
+
it{ should eq([]) }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'on a non-empty operand' do
|
16
|
+
let(:operand){
|
17
|
+
Leaf.new [
|
18
|
+
{:name => "Jones"},
|
19
|
+
{:name => "Smith"}
|
20
|
+
]
|
21
|
+
}
|
22
|
+
let(:predicate){
|
23
|
+
Predicate.parse("name =~ /^J/")
|
24
|
+
}
|
25
|
+
let(:expected){
|
26
|
+
[
|
27
|
+
{:name => "Jones"},
|
28
|
+
]
|
29
|
+
}
|
30
|
+
|
31
|
+
it{ should eq(expected) }
|
8
32
|
end
|
9
33
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
34
|
+
context 'on a predicate of arity 1' do
|
35
|
+
let(:operand){
|
36
|
+
Leaf.new [
|
37
|
+
{:name => "Jones"},
|
38
|
+
{:name => "Smith"}
|
39
|
+
]
|
40
|
+
}
|
41
|
+
let(:predicate){
|
42
|
+
Predicate.native(->(t){ t[:name] =~ /^J/})
|
43
|
+
}
|
44
|
+
let(:expected){
|
45
|
+
[
|
46
|
+
{:name => "Jones"},
|
47
|
+
]
|
48
|
+
}
|
49
|
+
|
50
|
+
it{ should eq(expected) }
|
19
51
|
end
|
20
52
|
|
21
53
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Engine
|
4
|
+
describe Hierarchize do
|
5
|
+
|
6
|
+
let(:type){
|
7
|
+
Relation.type(id: Fixnum, parent: Fixnum, name: String){|r| {subs: r} }
|
8
|
+
}
|
9
|
+
|
10
|
+
let(:operand){[
|
11
|
+
{id: 1, parent: 1, name: "USA"},
|
12
|
+
{id: 5, parent: 3, name: "Brussels"},
|
13
|
+
{id: 2, parent: 2, name: "Europe"},
|
14
|
+
{id: 3, parent: 2, name: "Belgium"},
|
15
|
+
{id: 4, parent: 2, name: "France"},
|
16
|
+
]}
|
17
|
+
|
18
|
+
let(:expected){
|
19
|
+
type.new([
|
20
|
+
{ id: 1, parent: 1, name: "USA", subs: type.empty },
|
21
|
+
{ id: 2, parent: 2, name: "Europe", subs: type.new([
|
22
|
+
{ id: 3, parent: 2, name: "Belgium", subs: type.new([
|
23
|
+
{id: 5, parent: 3, name: "Brussels", subs: type.empty } ].to_set) },
|
24
|
+
{ id: 4, parent: 2, name: "France", subs: type.empty } ].to_set) }
|
25
|
+
].to_set)
|
26
|
+
}
|
27
|
+
|
28
|
+
subject{
|
29
|
+
Hierarchize.new(operand, AttrList[:id], AttrList[:parent], :subs)
|
30
|
+
}
|
31
|
+
|
32
|
+
let(:resulting_relation){
|
33
|
+
subject.to_relation
|
34
|
+
}
|
35
|
+
|
36
|
+
def are_equal(x, y)
|
37
|
+
# same class
|
38
|
+
x.class.should eq(y.class)
|
39
|
+
|
40
|
+
# take tuples
|
41
|
+
got = x.to_a.sort{|t,u| t[:id] <=> u[:id] }
|
42
|
+
exp = y.to_a.sort{|t,u| t[:id] <=> u[:id] }
|
43
|
+
|
44
|
+
# compare attributes
|
45
|
+
got.zip(exp) do |e,f|
|
46
|
+
[:id, :parent, :name].each do |a|
|
47
|
+
e[a].should eq(f[a])
|
48
|
+
end
|
49
|
+
are_equal(e[:subs], f[:subs])
|
50
|
+
e[:subs].to_set.should eq(f[:subs].to_set)
|
51
|
+
e[:subs].should eq(f[:subs])
|
52
|
+
end
|
53
|
+
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'has expected result type' do
|
58
|
+
resulting_relation.class.should eq(type)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'has pair-wise equal tuples' do
|
62
|
+
are_equal(resulting_relation, expected).should be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'computes expected relation' do
|
66
|
+
resulting_relation.should eq(expected)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -33,6 +33,19 @@ module Alf
|
|
33
33
|
SetAttr.new(rel, comp).to_a.should eq(exp)
|
34
34
|
end
|
35
35
|
|
36
|
+
it 'should support lambda of arity 1' do
|
37
|
+
rel = Leaf.new [
|
38
|
+
{:name => "Jones"},
|
39
|
+
{:name => "Smith"}
|
40
|
+
]
|
41
|
+
exp = [
|
42
|
+
{:name => "Jones", :up => "JONES"},
|
43
|
+
{:name => "Smith", :up => "SMITH"}
|
44
|
+
]
|
45
|
+
comp = TupleComputation[:up => lambda{|t| t.name.upcase }]
|
46
|
+
SetAttr.new(rel, comp).to_a.should eq(exp)
|
47
|
+
end
|
48
|
+
|
36
49
|
end
|
37
50
|
end # module Engine
|
38
51
|
end # module Alf
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Engine
|
4
|
+
describe Take do
|
5
|
+
|
6
|
+
it 'should work on an empty operand' do
|
7
|
+
Take.new(Leaf.new([]), 1, 1).to_a.should eq([])
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should filter according to the offset' do
|
11
|
+
rel = Leaf.new [
|
12
|
+
{:name => "Jones"},
|
13
|
+
{:name => "Smith"}
|
14
|
+
]
|
15
|
+
exp = [
|
16
|
+
{:name => "Smith"}
|
17
|
+
]
|
18
|
+
Take.new(rel, 1, 10).to_a.should eq(exp)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should filter according to the limit (1/2)' do
|
22
|
+
rel = Leaf.new [
|
23
|
+
{:name => "Jones"},
|
24
|
+
{:name => "Smith"}
|
25
|
+
]
|
26
|
+
exp = [
|
27
|
+
{:name => "Jones"},
|
28
|
+
{:name => "Smith"}
|
29
|
+
]
|
30
|
+
Take.new(rel, 0, 2).to_a.should eq(exp)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should filter according to the limit (2/2)' do
|
34
|
+
rel = Leaf.new [
|
35
|
+
{:name => "Jones"},
|
36
|
+
{:name => "Smith"}
|
37
|
+
]
|
38
|
+
exp = [
|
39
|
+
{:name => "Jones"},
|
40
|
+
]
|
41
|
+
Take.new(rel, 0, 1).to_a.should eq(exp)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end # module Engine
|
46
|
+
end # module Alf
|
@@ -3,40 +3,57 @@ module Alf
|
|
3
3
|
module Engine
|
4
4
|
describe ToArray do
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
subject{ ToArray.new(rel, ordering).to_a }
|
7
|
+
|
8
|
+
context 'when both empty' do
|
9
|
+
let(:rel) { [] }
|
10
|
+
let(:ordering){ Ordering::EMPTY }
|
11
|
+
|
12
|
+
it{ should eq(rel) }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when ascending on single attribute' do
|
16
|
+
let(:rel){[
|
17
|
+
{name: "Jones"},
|
18
|
+
{name: "Smith"}
|
19
|
+
]}
|
20
|
+
let(:ordering){ Ordering.new([[:name, :asc]]) }
|
21
|
+
|
22
|
+
it{ should eq(rel) }
|
8
23
|
end
|
9
24
|
|
10
|
-
|
11
|
-
rel
|
12
|
-
{:
|
13
|
-
{:
|
14
|
-
]
|
15
|
-
|
25
|
+
context 'when descending on single attribute' do
|
26
|
+
let(:rel){[
|
27
|
+
{name: "Jones"},
|
28
|
+
{name: "Smith"}
|
29
|
+
]}
|
30
|
+
let(:ordering){ Ordering.new([[:name, :desc]]) }
|
31
|
+
|
32
|
+
it{ should eq(rel.reverse) }
|
16
33
|
end
|
17
34
|
|
18
|
-
|
19
|
-
rel
|
20
|
-
{:
|
21
|
-
{:
|
22
|
-
]
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
]
|
27
|
-
ToArray.new(rel, Ordering[[:name, :desc]]).to_a.should eq(exp)
|
35
|
+
context 'when TVAs are involved' do
|
36
|
+
let(:rel){[
|
37
|
+
{name: "Jones", hobby: { score: 10 }},
|
38
|
+
{name: "Jones", hobby: { score: 12 }}
|
39
|
+
]}
|
40
|
+
let(:ordering){ Ordering.new([[:name, :asc], [[:hobby, :score], :desc]]) }
|
41
|
+
|
42
|
+
it{ should eq(rel.reverse) }
|
28
43
|
end
|
29
44
|
|
30
|
-
|
31
|
-
rel
|
32
|
-
{:
|
33
|
-
{:
|
34
|
-
]
|
35
|
-
|
36
|
-
{:
|
37
|
-
{:
|
38
|
-
]
|
39
|
-
|
45
|
+
context 'when RVAs are involved' do
|
46
|
+
let(:rel){[
|
47
|
+
{name: "Smith", rva: Relation(id: [8, 7]) },
|
48
|
+
{name: "Jones", rva: Relation(id: [1, 3]) }
|
49
|
+
]}
|
50
|
+
let(:expected){[
|
51
|
+
{name: "Jones", rva: [Tuple(id: 1), Tuple(id: 3)] },
|
52
|
+
{name: "Smith", rva: [Tuple(id: 7), Tuple(id: 8)] }
|
53
|
+
]}
|
54
|
+
let(:ordering){ Ordering.new([[:name, :asc], [[:rva, :id], :asc]]) }
|
55
|
+
|
56
|
+
it{ should eq(expected) }
|
40
57
|
end
|
41
58
|
|
42
59
|
end # describe ToArray
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
describe Reader::Ruby do
|
4
|
+
it_should_behave_like "a Reader class"
|
5
|
+
|
6
|
+
let(:file){
|
7
|
+
File.expand_path('../input.ruby', __FILE__)
|
8
|
+
}
|
9
|
+
let(:reader){
|
10
|
+
Reader::Ruby.new(file)
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:expected){
|
14
|
+
[
|
15
|
+
{:id => 1},
|
16
|
+
{:id => 2}
|
17
|
+
]
|
18
|
+
}
|
19
|
+
|
20
|
+
it "should be enumerable" do
|
21
|
+
reader.to_a.should eq(expected)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -3,28 +3,66 @@ module Alf
|
|
3
3
|
class Predicate
|
4
4
|
describe Predicate, "evaluate" do
|
5
5
|
|
6
|
-
let(:predicate){
|
7
|
-
Predicate.new(Factory.lte(:x => 2))
|
8
|
-
}
|
9
|
-
|
10
6
|
subject{ predicate.evaluate(scope) }
|
11
7
|
|
12
|
-
|
13
|
-
let(:
|
8
|
+
context 'on a native predicate of arity 1, used through tuple#[]' do
|
9
|
+
let(:predicate){
|
10
|
+
Predicate.native(->(t){ t[:name] =~ /foo/ })
|
11
|
+
}
|
12
|
+
|
13
|
+
context 'on a matching tuple' do
|
14
|
+
let(:scope){ Support::TupleScope.new(:name => "foo") }
|
15
|
+
|
16
|
+
it{ should be_true }
|
17
|
+
end
|
14
18
|
|
15
|
-
|
19
|
+
context 'on a non-matching tuple' do
|
20
|
+
let(:scope){ Support::TupleScope.new(:name => "bar") }
|
21
|
+
|
22
|
+
it{ should be_false }
|
23
|
+
end
|
16
24
|
end
|
17
25
|
|
18
|
-
|
19
|
-
let(:
|
26
|
+
context 'on a native predicate of arity 1, used through tuple.xxx' do
|
27
|
+
let(:predicate){
|
28
|
+
Predicate.native(->(t){ t.name =~ /foo/ })
|
29
|
+
}
|
30
|
+
|
31
|
+
context 'on a matching tuple' do
|
32
|
+
let(:scope){ Support::TupleScope.new(:name => "foo") }
|
33
|
+
|
34
|
+
it{ should be_true }
|
35
|
+
end
|
20
36
|
|
21
|
-
|
37
|
+
context 'on a non-matching tuple' do
|
38
|
+
let(:scope){ Support::TupleScope.new(:name => "bar") }
|
39
|
+
|
40
|
+
it{ should be_false }
|
41
|
+
end
|
22
42
|
end
|
23
43
|
|
24
|
-
|
25
|
-
let(:
|
44
|
+
context 'on a factored predicate' do
|
45
|
+
let(:predicate){
|
46
|
+
Predicate.new(Factory.lte(:x => 2))
|
47
|
+
}
|
48
|
+
|
49
|
+
describe "on x == 2" do
|
50
|
+
let(:scope){ Support::TupleScope.new(:x => 2) }
|
51
|
+
|
52
|
+
it{ should be_true }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "on x == 1" do
|
56
|
+
let(:scope){ Support::TupleScope.new(:x => 1) }
|
57
|
+
|
58
|
+
it{ should be_true }
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "on x == 3" do
|
62
|
+
let(:scope){ Support::TupleScope.new(:x => 3) }
|
26
63
|
|
27
|
-
|
64
|
+
it{ should be_false }
|
65
|
+
end
|
28
66
|
end
|
29
67
|
|
30
68
|
end
|