alf-core 0.13.1 → 0.14.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/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
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,80 @@
|
|
|
1
|
+
# 0.14.0 / 01-10-2013
|
|
2
|
+
|
|
3
|
+
## Types
|
|
4
|
+
|
|
5
|
+
* Introduced Selector as an ordered list of attribute names. An Ordering is now
|
|
6
|
+
a list of [Selector, (:asc|:desc)] pairs.
|
|
7
|
+
* Introduced Selection as an ordered list of Selectors.
|
|
8
|
+
* Accordingly, orderings may now include selections on tuple-valued attributes.
|
|
9
|
+
* Added Ordering#[] that returns the direction associated to an attribute.
|
|
10
|
+
* Added Ordering#reverse that reverse the direction of every attribute.
|
|
11
|
+
* Fixed Ordering#+ to avoid duplicate attributes. This operator is now called
|
|
12
|
+
`merge` (with alias to `+`) and looks like Hash#merge, including an block to
|
|
13
|
+
arbitrate conflicts.
|
|
14
|
+
* Removed Keys#compact which was seriously confusing.
|
|
15
|
+
* TupleExpression now recognizes Procs of arity 1 and simply call them with the
|
|
16
|
+
tuple scope instead of `instance_exec`uting them on the scope. Predicate does
|
|
17
|
+
something similar when native predicates are used.
|
|
18
|
+
* TupleExpression optionnaly accepts a connection argument. When the evaluated
|
|
19
|
+
expression ends-up being a relational expression, the latter is evaluated on
|
|
20
|
+
the connection and returns the resulting relation. TupleComputation delegates
|
|
21
|
+
accordingly.
|
|
22
|
+
|
|
23
|
+
## Support
|
|
24
|
+
|
|
25
|
+
* TupleScope now delegates to_s, inspect and [] to the underlying tuple. This
|
|
26
|
+
should fix the freezing bug that occured when an error was raised during
|
|
27
|
+
TupleScope-driven evaluations.
|
|
28
|
+
* Removed TupleScope#query and TupleScoe#tuple_extract
|
|
29
|
+
|
|
30
|
+
## Relation
|
|
31
|
+
|
|
32
|
+
* Added Relation#to_hash for getting hashes from any attribute pair.
|
|
33
|
+
|
|
34
|
+
## Viewpoint
|
|
35
|
+
|
|
36
|
+
* Added `Viewpoint.(expects,depends)` for declaring expectations and dependencies
|
|
37
|
+
* Added `Viewpoint.metadata` to query those expectations and dependencies
|
|
38
|
+
* Added `Viewpoint.build` to build viewpoints (with particular contexts)
|
|
39
|
+
* Removed `Viewpoint.namespace`, use `Viewpoint.depends` instead.
|
|
40
|
+
|
|
41
|
+
## Algebra
|
|
42
|
+
|
|
43
|
+
* Fixed Project#keys and Project#key_preserving? (same for Clip)
|
|
44
|
+
* Added `page` operator (page-index, page-size) implemented through `sort+take`
|
|
45
|
+
where `take` is a new engine cog.
|
|
46
|
+
* Added `frame` operator (offset, limit àla SQL) implemented through `sort+take`
|
|
47
|
+
as well.
|
|
48
|
+
* Extend now recognizes Procs of arity 1. Instead of relying on instance_exec,
|
|
49
|
+
underlying expressions are evaluated by passing a TupleScope to the proc.
|
|
50
|
+
* Extend automatically evaluates relational expressions returned by procs,
|
|
51
|
+
bounding them to the current connection if needed.
|
|
52
|
+
|
|
53
|
+
## Engine & compilation
|
|
54
|
+
|
|
55
|
+
* All engine-compiled cogs may optionally be tagged with the expression they
|
|
56
|
+
come from (as taken as last argument of initialize, and readable through
|
|
57
|
+
`expr`).
|
|
58
|
+
* The default compiler uses this feature so that algebra expressions can be
|
|
59
|
+
tracked back from compilation results.
|
|
60
|
+
|
|
61
|
+
## Adapter
|
|
62
|
+
|
|
63
|
+
* Adapter::Connection#cog now takes an optional `expr` parameter for
|
|
64
|
+
traceability with algebra expressions. The resulting cog is expected to be
|
|
65
|
+
tagged accordingly.
|
|
66
|
+
|
|
67
|
+
## I/O
|
|
68
|
+
|
|
69
|
+
* Added a `Ruby` input reader mapping to '.rb' and '.ruby' files.
|
|
70
|
+
* Reader no longer includes `Engine::Cog`. `Adapter::Folder::Connection`
|
|
71
|
+
correctly adapts its `cog` method to return an Engine::Leaf instance that
|
|
72
|
+
delegated to the reader itself.
|
|
73
|
+
|
|
74
|
+
## Database
|
|
75
|
+
|
|
76
|
+
* The `default_viewpoint` option has been renamed `viewpoint`
|
|
77
|
+
|
|
1
78
|
# 0.13.1 / 2013-08-05
|
|
2
79
|
|
|
3
80
|
* Empty lines are silently ignored by .rash reader
|
|
@@ -11,9 +11,10 @@ module Alf
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
# Returns a cog for `name`
|
|
14
|
-
def cog(name)
|
|
14
|
+
def cog(name, expr = nil)
|
|
15
15
|
if f = find_file(name)
|
|
16
|
-
Reader.reader(find_file(name))
|
|
16
|
+
reader = Reader.reader(find_file(name))
|
|
17
|
+
Alf::Engine::Leaf.new(reader, expr)
|
|
17
18
|
else
|
|
18
19
|
raise NoSuchRelvarError, "Unable to find a file for #{name}"
|
|
19
20
|
end
|
|
@@ -21,7 +21,7 @@ module Alf
|
|
|
21
21
|
### Static analysis & inference
|
|
22
22
|
|
|
23
23
|
def heading
|
|
24
|
-
raise NotSupportedError
|
|
24
|
+
raise NotSupportedError, "Heading inference unsupported on `#{self}`"
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def attr_list
|
|
@@ -29,7 +29,7 @@ module Alf
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def keys
|
|
32
|
-
raise NotSupportedError
|
|
32
|
+
raise NotSupportedError, "Key inference unsupported on `#{self}`"
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
### to_xxx
|
|
@@ -29,7 +29,7 @@ module Alf
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def heading
|
|
32
|
-
@attributes[:heading] || connection
|
|
32
|
+
@attributes[:heading] || (connection && connection.heading(name)) || super
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def keys
|
|
@@ -37,11 +37,11 @@ module Alf
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def to_relvar
|
|
40
|
-
Relvar::Fake.new(heading)
|
|
40
|
+
Relvar::Fake.new(self, heading)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def to_cog
|
|
44
|
-
Engine::Leaf.new([])
|
|
44
|
+
Engine::Leaf.new([], self)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def to_lispy
|
|
@@ -9,6 +9,16 @@ module Alf
|
|
|
9
9
|
end
|
|
10
10
|
attr_reader :subject
|
|
11
11
|
|
|
12
|
+
def heading
|
|
13
|
+
return subject.heading if subject.respond_to?(:heading)
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def keys
|
|
18
|
+
return subject.keys if subject.respond_to?(:keys)
|
|
19
|
+
super
|
|
20
|
+
end
|
|
21
|
+
|
|
12
22
|
def to_cog
|
|
13
23
|
return subject.to_cog if subject.respond_to?(:to_cog)
|
|
14
24
|
Alf::Engine::Leaf.new(subject)
|
|
@@ -19,6 +29,10 @@ module Alf
|
|
|
19
29
|
super
|
|
20
30
|
end
|
|
21
31
|
|
|
32
|
+
def to_s
|
|
33
|
+
"Operand::Proxy(#{subject})"
|
|
34
|
+
end
|
|
35
|
+
|
|
22
36
|
end # class Proxy
|
|
23
37
|
end # module Operand
|
|
24
38
|
end # module Algebra
|
|
@@ -70,7 +70,7 @@ module Alf
|
|
|
70
70
|
alias :to_s :to_lispy
|
|
71
71
|
|
|
72
72
|
def to_relvar
|
|
73
|
-
Relvar::Virtual.new(self
|
|
73
|
+
Relvar::Virtual.new(self)
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
### identity and pseudo-mutability
|
|
@@ -115,6 +115,8 @@ require_relative 'operator/type_safe'
|
|
|
115
115
|
require_relative 'operator/generator'
|
|
116
116
|
|
|
117
117
|
require_relative 'operator/extend'
|
|
118
|
+
require_relative 'operator/frame'
|
|
119
|
+
require_relative 'operator/hierarchize'
|
|
118
120
|
require_relative 'operator/project'
|
|
119
121
|
require_relative 'operator/restrict'
|
|
120
122
|
require_relative 'operator/rename'
|
|
@@ -130,5 +132,6 @@ require_relative 'operator/group'
|
|
|
130
132
|
require_relative 'operator/ungroup'
|
|
131
133
|
require_relative 'operator/summarize'
|
|
132
134
|
require_relative 'operator/rank'
|
|
135
|
+
require_relative 'operator/page'
|
|
133
136
|
require_relative 'operator/quota'
|
|
134
137
|
require_relative 'operator/infer_heading'
|
|
@@ -13,10 +13,13 @@ module Alf
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def keys
|
|
16
|
-
@keys ||= operand.keys.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
@keys ||= operand.keys.select{|k|
|
|
17
|
+
k.project(attributes, allbut) == k
|
|
18
|
+
}.if_empty{ Keys[ heading.to_attr_list ] }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def key_preserving?
|
|
22
|
+
keys.any?{|k| operand.keys.include?(k) }
|
|
20
23
|
end
|
|
21
24
|
|
|
22
25
|
def stay_attributes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Alf
|
|
2
|
+
module Algebra
|
|
3
|
+
class Frame
|
|
4
|
+
include Operator, Relational, Unary, WithOrdering
|
|
5
|
+
|
|
6
|
+
signature do |s|
|
|
7
|
+
s.argument :ordering, Ordering, []
|
|
8
|
+
s.argument :offset, Integer, 0
|
|
9
|
+
s.argument :limit, Integer, 25
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def heading
|
|
13
|
+
operand.heading
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def keys
|
|
17
|
+
operand.keys
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # class Frame
|
|
21
|
+
end # module Algebra
|
|
22
|
+
end # module Alf
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Alf
|
|
2
|
+
module Algebra
|
|
3
|
+
class Hierarchize
|
|
4
|
+
include Operator, Relational, Unary, Experimental
|
|
5
|
+
|
|
6
|
+
signature do |s|
|
|
7
|
+
s.argument :id, AttrList, [:id]
|
|
8
|
+
s.argument :parent, AttrList, [:parent]
|
|
9
|
+
s.argument :as, AttrName, [:children]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def heading
|
|
13
|
+
@heading ||= Relation.type(operand.heading){|r| {as => r}}.heading
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def keys
|
|
17
|
+
operand.keys
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # class Hierarchize
|
|
21
|
+
end # module Algebra
|
|
22
|
+
end # module Alf
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Alf
|
|
2
|
+
module Algebra
|
|
3
|
+
class Page
|
|
4
|
+
include Operator, Relational, Unary, WithOrdering
|
|
5
|
+
|
|
6
|
+
signature do |s|
|
|
7
|
+
s.argument :ordering, Ordering, []
|
|
8
|
+
s.argument :page_index, Integer, 1
|
|
9
|
+
s.option :page_size, Integer, 25, 'Size of the pages to compute'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def heading
|
|
13
|
+
operand.heading
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def keys
|
|
17
|
+
operand.keys
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # class Page
|
|
21
|
+
end # module Algebra
|
|
22
|
+
end # module Alf
|
|
@@ -13,18 +13,13 @@ module Alf
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def keys
|
|
16
|
-
@keys ||=
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
has_empty = operand.keys.include?(AttrList::EMPTY)
|
|
20
|
-
keys = Keys[ has_empty ? AttrList::EMPTY : heading.to_attr_list ]
|
|
21
|
-
end
|
|
22
|
-
keys
|
|
23
|
-
end
|
|
16
|
+
@keys ||= operand.keys.select{|k|
|
|
17
|
+
k.project(attributes, allbut) == k
|
|
18
|
+
}.if_empty{ Keys[ heading.to_attr_list ] }
|
|
24
19
|
end
|
|
25
20
|
|
|
26
21
|
def key_preserving?
|
|
27
|
-
keys.any?{|k| operand.keys.
|
|
22
|
+
keys.any?{|k| operand.keys.include?(k) }
|
|
28
23
|
end
|
|
29
24
|
|
|
30
25
|
def stay_attributes
|
|
@@ -14,8 +14,8 @@ module Alf
|
|
|
14
14
|
|
|
15
15
|
def keys
|
|
16
16
|
@keys ||= begin
|
|
17
|
-
keys,
|
|
18
|
-
if keys.any?{|k|
|
|
17
|
+
keys, selectors = operand.keys, order.to_attr_list
|
|
18
|
+
if keys.any?{|k| k.subsetOf?(selectors) }
|
|
19
19
|
keys + [ AttrList[as] ]
|
|
20
20
|
else
|
|
21
21
|
keys
|
|
@@ -9,6 +9,8 @@ require_relative 'support/experimental'
|
|
|
9
9
|
require_relative 'support/classification'
|
|
10
10
|
require_relative 'support/signature'
|
|
11
11
|
|
|
12
|
+
require_relative 'support/with_ordering'
|
|
13
|
+
|
|
12
14
|
require_relative 'support/visitor'
|
|
13
15
|
require_relative 'support/compiler'
|
|
14
16
|
require_relative 'support/rewriter'
|
|
@@ -174,7 +174,8 @@ module Alf
|
|
|
174
174
|
# @return the name to use in shell for `option`
|
|
175
175
|
def option_name(option)
|
|
176
176
|
name, domain, defa, = option
|
|
177
|
-
|
|
177
|
+
name = name.to_s.gsub(/_/, '-')
|
|
178
|
+
domain == Boolean ? "--#{name}" : "--#{name}=#{name.upcase}"
|
|
178
179
|
end
|
|
179
180
|
|
|
180
181
|
# Yields `(name,dom,value)` triples for each argument value
|
|
@@ -6,13 +6,18 @@ module Domain
|
|
|
6
6
|
raise "#{master_class}.new may not be called directly" if master_class==self
|
|
7
7
|
super(*args)
|
|
8
8
|
}
|
|
9
|
-
define_method(:type){|generating_type|
|
|
10
|
-
|
|
9
|
+
define_method(:type){|generating_type={},&bl|
|
|
10
|
+
clazz = Class.new(master_class)
|
|
11
|
+
if bl
|
|
12
|
+
generating_type = generating_type.to_heading.to_hash unless generating_type.is_a?(Hash)
|
|
13
|
+
generating_type = generating_type.merge(bl.call(clazz))
|
|
14
|
+
end
|
|
15
|
+
meths = [
|
|
11
16
|
DomainMethods.new(master_class, generating_type),
|
|
12
17
|
AlgebraMethods.new(master_class, generating_type),
|
|
13
18
|
Domain::Comparisons,
|
|
14
19
|
]
|
|
15
|
-
|
|
20
|
+
clazz.extend(*meths).heading_based_factored
|
|
16
21
|
}
|
|
17
22
|
alias_method :[], :type
|
|
18
23
|
define_method(:heading_based_factored) do
|
|
@@ -27,6 +32,7 @@ module Domain
|
|
|
27
32
|
gt
|
|
28
33
|
}
|
|
29
34
|
define_method(:<=>){|other|
|
|
35
|
+
return 0 if self == other
|
|
30
36
|
return nil unless other.ancestors.include?(master_class)
|
|
31
37
|
return -1 if other == master_class
|
|
32
38
|
to_heading <=> other.to_heading
|
|
@@ -48,8 +54,14 @@ module Domain
|
|
|
48
54
|
define_method(:to_heading){
|
|
49
55
|
@heading ||= Alf::Heading.coerce(generating_type)
|
|
50
56
|
}
|
|
57
|
+
define_method(:recursive?){
|
|
58
|
+
h = to_heading
|
|
59
|
+
h.to_attr_list.any?{|a| h[a] == self}
|
|
60
|
+
}
|
|
51
61
|
define_method(:to_ruby_literal){
|
|
52
|
-
|
|
62
|
+
recursive? ?
|
|
63
|
+
"#{master_class.name}[...]" :
|
|
64
|
+
"#{master_class.name}[#{Alf::Support.to_ruby_literal(to_heading.to_hash)}]"
|
|
53
65
|
}
|
|
54
66
|
alias_method :name, :to_ruby_literal
|
|
55
67
|
alias_method :to_s, :to_ruby_literal
|
data/lib/alf-core/facade.rb
CHANGED
|
@@ -9,8 +9,12 @@ module Alf
|
|
|
9
9
|
Alf::Database.connect(*args, &bl)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
def examples_adapter
|
|
13
|
+
Path.backfind('examples/suppliers_and_parts')
|
|
14
|
+
end
|
|
15
|
+
|
|
12
16
|
def examples(&bl)
|
|
13
|
-
Alf::Database.connect
|
|
17
|
+
Alf::Database.connect examples_adapter, &bl
|
|
14
18
|
end
|
|
15
19
|
|
|
16
20
|
def reader(source, *args)
|