alf-shell 0.14.0 → 0.15.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/Gemfile +5 -2
- data/Gemfile.lock +29 -10
- data/bin/alf +2 -0
- data/doc/man/alf-explain.man +22 -0
- data/doc/man/alf-metadata.man +13 -0
- data/doc/man/alf-show.man +16 -0
- data/doc/man/alf.man +77 -0
- data/doc/man/allbut.man +39 -0
- data/doc/man/among.man +25 -0
- data/doc/man/avg.man +37 -0
- data/doc/man/between.man +24 -0
- data/doc/man/concat.man +55 -0
- data/doc/man/contradiction.man +26 -0
- data/doc/man/count.man +20 -0
- data/doc/man/eq.man +29 -0
- data/doc/man/extend.man +33 -0
- data/doc/man/frame.man +60 -0
- data/doc/man/group.man +51 -0
- data/doc/man/gt.man +30 -0
- data/doc/man/gte.man +30 -0
- data/doc/man/intersect.man +54 -0
- data/doc/man/join.man +84 -0
- data/doc/man/lt.man +30 -0
- data/doc/man/lte.man +30 -0
- data/doc/man/matching.man +73 -0
- data/doc/man/max.man +36 -0
- data/doc/man/min.man +36 -0
- data/doc/man/minus.man +54 -0
- data/doc/man/native.man +32 -0
- data/doc/man/neq.man +29 -0
- data/doc/man/not_matching.man +51 -0
- data/doc/man/page.man +60 -0
- data/doc/man/project.man +36 -0
- data/doc/man/rank.man +42 -0
- data/doc/man/rename.man +29 -0
- data/doc/man/restrict.man +38 -0
- data/doc/man/stddev.man +37 -0
- data/doc/man/sum.man +37 -0
- data/doc/man/summarize.man +45 -0
- data/doc/man/tautology.man +26 -0
- data/doc/man/ungroup.man +30 -0
- data/doc/man/union.man +55 -0
- data/doc/man/unwrap.man +37 -0
- data/doc/man/variance.man +37 -0
- data/doc/man/wrap.man +37 -0
- data/doc/txt/alf-explain.man +22 -0
- data/doc/txt/alf-metadata.man +16 -0
- data/doc/txt/alf-show.man +19 -0
- data/doc/txt/alf.man +80 -0
- data/doc/txt/allbut.txt +31 -0
- data/doc/txt/among.txt +20 -0
- data/doc/txt/avg.txt +22 -0
- data/doc/txt/between.txt +19 -0
- data/doc/txt/concat.txt +31 -0
- data/doc/txt/contradiction.txt +15 -0
- data/doc/txt/count.txt +14 -0
- data/doc/txt/eq.txt +19 -0
- data/doc/txt/extend.txt +29 -0
- data/doc/txt/frame.txt +48 -0
- data/doc/txt/group.txt +37 -0
- data/doc/txt/gt.txt +20 -0
- data/doc/txt/gte.txt +20 -0
- data/doc/txt/intersect.txt +42 -0
- data/doc/txt/join.txt +65 -0
- data/doc/txt/lt.txt +20 -0
- data/doc/txt/lte.txt +20 -0
- data/doc/txt/matching.txt +54 -0
- data/doc/txt/max.txt +21 -0
- data/doc/txt/min.txt +21 -0
- data/doc/txt/minus.txt +42 -0
- data/doc/txt/native.txt +27 -0
- data/doc/txt/neq.txt +19 -0
- data/doc/txt/not_matching.txt +39 -0
- data/doc/txt/page.txt +48 -0
- data/doc/txt/project.txt +28 -0
- data/doc/txt/rank.txt +34 -0
- data/doc/txt/rename.txt +25 -0
- data/doc/txt/restrict.txt +26 -0
- data/doc/txt/stddev.txt +22 -0
- data/doc/txt/sum.txt +22 -0
- data/doc/txt/summarize.txt +33 -0
- data/doc/txt/tautology.txt +15 -0
- data/doc/txt/ungroup.txt +26 -0
- data/doc/txt/union.txt +43 -0
- data/doc/txt/unwrap.txt +29 -0
- data/doc/txt/variance.txt +22 -0
- data/doc/txt/wrap.txt +29 -0
- data/lib/alf/shell.rb +2 -32
- data/lib/alf/shell/alfrc.rb +3 -0
- data/lib/alf/shell/command.rb +2 -18
- data/lib/alf/shell/command/explain.rb +37 -0
- data/lib/alf/shell/command/help.rb +3 -21
- data/lib/alf/shell/command/main.rb +20 -78
- data/lib/alf/shell/command/metadata.rb +32 -0
- data/lib/alf/shell/command/show.rb +17 -5
- data/lib/alf/shell/support.rb +21 -13
- data/lib/alf/shell/version.rb +1 -1
- data/spec/integration/explain/explain.cmd +1 -0
- data/spec/integration/explain/explain.stdout +11 -0
- data/spec/integration/show/group.alf +2 -0
- data/spec/integration/show/show_alf.cmd +1 -0
- data/spec/integration/{group/group_0.stdout → show/show_alf.stdout} +0 -0
- data/tasks/doc.rake +4 -0
- metadata +116 -178
- data/doc/commands/exec.md +0 -16
- data/doc/commands/help.md +0 -11
- data/doc/commands/main.md +0 -33
- data/doc/commands/show.md +0 -12
- data/doc/operators/non_relational/autonum.md +0 -23
- data/doc/operators/non_relational/clip.md +0 -31
- data/doc/operators/non_relational/coerce.md +0 -15
- data/doc/operators/non_relational/compact.md +0 -20
- data/doc/operators/non_relational/defaults.md +0 -32
- data/doc/operators/non_relational/generator.md +0 -20
- data/doc/operators/non_relational/sort.md +0 -24
- data/doc/operators/non_relational/type-safe.md +0 -20
- data/doc/operators/relational/extend.md +0 -18
- data/doc/operators/relational/frame.md +0 -26
- data/doc/operators/relational/group.md +0 -27
- data/doc/operators/relational/hierarchize.md +0 -14
- data/doc/operators/relational/infer-heading.md +0 -20
- data/doc/operators/relational/intersect.md +0 -13
- data/doc/operators/relational/join.md +0 -28
- data/doc/operators/relational/matching.md +0 -24
- data/doc/operators/relational/minus.md +0 -12
- data/doc/operators/relational/not-matching.md +0 -20
- data/doc/operators/relational/page.md +0 -31
- data/doc/operators/relational/project.md +0 -28
- data/doc/operators/relational/quota.md +0 -21
- data/doc/operators/relational/rank.md +0 -27
- data/doc/operators/relational/rename.md +0 -17
- data/doc/operators/relational/restrict.md +0 -25
- data/doc/operators/relational/summarize.md +0 -25
- data/doc/operators/relational/ungroup.md +0 -20
- data/doc/operators/relational/union.md +0 -14
- data/doc/operators/relational/unwrap.md +0 -20
- data/doc/operators/relational/wrap.md +0 -24
- data/lib/alf/shell/command/exec.rb +0 -16
- data/lib/alf/shell/doc_manager.rb +0 -84
- data/lib/alf/shell/ext/signature.rb +0 -45
- data/lib/alf/shell/from_argv.rb +0 -84
- data/lib/alf/shell/operator.rb +0 -63
- data/spec/integration/__database__/group.alf +0 -3
- data/spec/integration/alf/alf_e.cmd +0 -1
- data/spec/integration/alf/alf_e.stdout +0 -4
- data/spec/integration/alf/alf_help.cmd +0 -1
- data/spec/integration/alf/alf_help.stdout +0 -76
- data/spec/integration/alf/alf_r.cmd +0 -1
- data/spec/integration/alf/alf_r.stdout +0 -5
- data/spec/integration/autonum/autonum_0.cmd +0 -1
- data/spec/integration/autonum/autonum_0.stdout +0 -9
- data/spec/integration/autonum/autonum_1.cmd +0 -1
- data/spec/integration/autonum/autonum_1.stdout +0 -9
- data/spec/integration/clip/clip_0.cmd +0 -1
- data/spec/integration/clip/clip_0.stdout +0 -9
- data/spec/integration/clip/clip_1.cmd +0 -1
- data/spec/integration/clip/clip_1.stdout +0 -9
- data/spec/integration/coerce/coerce_1.cmd +0 -1
- data/spec/integration/coerce/coerce_1.stdout +0 -5
- data/spec/integration/compact/compact_0.cmd +0 -1
- data/spec/integration/compact/compact_0.stdout +0 -9
- data/spec/integration/defaults/defaults_0.cmd +0 -1
- data/spec/integration/defaults/defaults_0.stdout +0 -9
- data/spec/integration/defaults/defaults_1.cmd +0 -1
- data/spec/integration/defaults/defaults_1.stdout +0 -9
- data/spec/integration/defaults/defaults_2.cmd +0 -1
- data/spec/integration/defaults/defaults_2.stdout +0 -9
- data/spec/integration/extend/extend_0.cmd +0 -1
- data/spec/integration/extend/extend_0.stdout +0 -16
- data/spec/integration/frame/frame_0.cmd +0 -1
- data/spec/integration/frame/frame_0.stdout +0 -6
- data/spec/integration/generator/generator_1.cmd +0 -1
- data/spec/integration/generator/generator_1.stdout +0 -10
- data/spec/integration/generator/generator_2.cmd +0 -1
- data/spec/integration/generator/generator_2.stdout +0 -5
- data/spec/integration/generator/generator_3.cmd +0 -1
- data/spec/integration/generator/generator_3.stdout +0 -5
- data/spec/integration/group/group_0.cmd +0 -1
- data/spec/integration/group/group_1.cmd +0 -1
- data/spec/integration/group/group_1.stdout +0 -32
- data/spec/integration/help/help_1.cmd +0 -1
- data/spec/integration/help/help_1.stdout +0 -12
- data/spec/integration/intersect/intersect_0.cmd +0 -1
- data/spec/integration/intersect/intersect_0.stdout +0 -9
- data/spec/integration/join/join_0.cmd +0 -1
- data/spec/integration/join/join_0.stdout +0 -16
- data/spec/integration/matching/matching_0.cmd +0 -1
- data/spec/integration/matching/matching_0.stdout +0 -8
- data/spec/integration/minus/minus_0.cmd +0 -1
- data/spec/integration/minus/minus_0.stdout +0 -4
- data/spec/integration/not-matching/not-matching_0.cmd +0 -1
- data/spec/integration/not-matching/not-matching_0.stdout +0 -5
- data/spec/integration/page/page_0.cmd +0 -1
- data/spec/integration/page/page_0.stdout +0 -6
- data/spec/integration/project/project_0.cmd +0 -1
- data/spec/integration/project/project_0.stdout +0 -9
- data/spec/integration/project/project_1.cmd +0 -1
- data/spec/integration/project/project_1.stdout +0 -9
- data/spec/integration/quota/quota_0.cmd +0 -1
- data/spec/integration/quota/quota_0.stdout +0 -16
- data/spec/integration/rank/rank_1.cmd +0 -1
- data/spec/integration/rank/rank_1.stdout +0 -10
- data/spec/integration/rank/rank_2.cmd +0 -1
- data/spec/integration/rank/rank_2.stdout +0 -10
- data/spec/integration/rank/rank_3.cmd +0 -1
- data/spec/integration/rank/rank_3.stdout +0 -10
- data/spec/integration/rank/rank_4.cmd +0 -1
- data/spec/integration/rank/rank_4.stdout +0 -6
- data/spec/integration/rank/rank_5.cmd +0 -1
- data/spec/integration/rank/rank_5.stdout +0 -6
- data/spec/integration/rename/rename_0.cmd +0 -1
- data/spec/integration/rename/rename_0.stdout +0 -9
- data/spec/integration/restrict/restrict_0.cmd +0 -1
- data/spec/integration/restrict/restrict_0.stdout +0 -6
- data/spec/integration/restrict/restrict_1.cmd +0 -1
- data/spec/integration/restrict/restrict_1.stdout +0 -6
- data/spec/integration/sort/sort_0.cmd +0 -1
- data/spec/integration/sort/sort_0.stdout +0 -9
- data/spec/integration/sort/sort_1.cmd +0 -1
- data/spec/integration/sort/sort_1.stdout +0 -9
- data/spec/integration/sort/sort_2.cmd +0 -1
- data/spec/integration/sort/sort_2.stdout +0 -9
- data/spec/integration/sort/sort_3.cmd +0 -1
- data/spec/integration/sort/sort_3.stdout +0 -9
- data/spec/integration/summarize/summarize_0.cmd +0 -1
- data/spec/integration/summarize/summarize_0.stdout +0 -8
- data/spec/integration/union/union_0.cmd +0 -1
- data/spec/integration/union/union_0.stdout +0 -9
- data/spec/integration/unwrap/unwrap_0.cmd +0 -1
- data/spec/integration/unwrap/unwrap_0.stdout +0 -9
- data/spec/integration/wrap/wrap_0.cmd +0 -1
- data/spec/integration/wrap/wrap_0.stdout +0 -9
- data/spec/unit/doc_manager/dynamic.md +0 -1
- data/spec/unit/doc_manager/example.md +0 -1
- data/spec/unit/doc_manager/example_1.txt +0 -11
- data/spec/unit/doc_manager/static.md +0 -1
- data/spec/unit/doc_manager/test_call.rb +0 -41
- data/spec/unit/ext/signature/test_argv2args.rb +0 -82
- data/spec/unit/ext/signature/test_to_shell.rb +0 -103
- data/spec/unit/from_argv/test_to_attr_list.rb +0 -30
- data/spec/unit/from_argv/test_to_attr_name.rb +0 -27
- data/spec/unit/from_argv/test_to_boolean.rb +0 -32
- data/spec/unit/from_argv/test_to_heading.rb +0 -37
- data/spec/unit/from_argv/test_to_ordering.rb +0 -28
- data/spec/unit/from_argv/test_to_predicate.rb +0 -26
- data/spec/unit/from_argv/test_to_renaming.rb +0 -23
- data/spec/unit/from_argv/test_to_size.rb +0 -32
- data/spec/unit/from_argv/test_to_summarization.rb +0 -19
- data/spec/unit/from_argv/test_to_tuple_computation.rb +0 -18
- data/spec/unit/from_argv/test_to_tuple_expression.rb +0 -38
- data/spec/unit/main/test_class_methods.rb +0 -44
- data/spec/unit/operator/test_autonum.rb +0 -28
- data/spec/unit/operator/test_clip.rb +0 -29
- data/spec/unit/operator/test_coerce.rb +0 -22
- data/spec/unit/operator/test_compact.rb +0 -16
- data/spec/unit/operator/test_defaults.rb +0 -29
- data/spec/unit/operator/test_extend.rb +0 -21
- data/spec/unit/operator/test_generator.rb +0 -37
- data/spec/unit/operator/test_group.rb +0 -32
- data/spec/unit/operator/test_infer_heading.rb +0 -16
- data/spec/unit/operator/test_intersect.rb +0 -18
- data/spec/unit/operator/test_join.rb +0 -18
- data/spec/unit/operator/test_matching.rb +0 -18
- data/spec/unit/operator/test_minus.rb +0 -18
- data/spec/unit/operator/test_not_matching.rb +0 -18
- data/spec/unit/operator/test_project.rb +0 -38
- data/spec/unit/operator/test_quota.rb +0 -23
- data/spec/unit/operator/test_rank.rb +0 -30
- data/spec/unit/operator/test_rename.rb +0 -21
- data/spec/unit/operator/test_restrict.rb +0 -36
- data/spec/unit/operator/test_sort.rb +0 -49
- data/spec/unit/operator/test_summarize.rb +0 -30
- data/spec/unit/operator/test_ungroup.rb +0 -28
- data/spec/unit/operator/test_union.rb +0 -18
- data/spec/unit/operator/test_unwrap.rb +0 -28
- data/spec/unit/operator/test_wrap.rb +0 -30
data/doc/man/max.man
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.TH Max
|
|
2
|
+
.PP
|
|
3
|
+
Maximal value
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
max(expr: AttrName|(Tuple->Numeric)) -> Aggregator
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
max(:qty)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
max{|t| t.qty * t.price }
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.PP
|
|
25
|
+
.RS
|
|
26
|
+
.nf
|
|
27
|
+
max(->(t){ t.qty * t.price })
|
|
28
|
+
.fi
|
|
29
|
+
.RE
|
|
30
|
+
.SH Description
|
|
31
|
+
.PP
|
|
32
|
+
Returns the greatest of input values.
|
|
33
|
+
.SH Implementation notes
|
|
34
|
+
.PP
|
|
35
|
+
This aggregate function must only be used with comparable types. As of
|
|
36
|
+
current Alf version, it does not aggregate empty sets correctly.
|
data/doc/man/min.man
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.TH Min
|
|
2
|
+
.PP
|
|
3
|
+
Minimal value
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
min(expr: AttrName|(Tuple->Numeric)) -> Aggregator
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
min(:qty)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
min{|t| t.qty * t.price }
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.PP
|
|
25
|
+
.RS
|
|
26
|
+
.nf
|
|
27
|
+
min(->(t){ t.qty * t.price })
|
|
28
|
+
.fi
|
|
29
|
+
.RE
|
|
30
|
+
.SH Description
|
|
31
|
+
.PP
|
|
32
|
+
Returns the smallest of input values.
|
|
33
|
+
.SH Implementation notes
|
|
34
|
+
.PP
|
|
35
|
+
This aggregate function must only be used with comparable types. As of
|
|
36
|
+
current Alf version, it does not aggregate empty sets correctly.
|
data/doc/man/minus.man
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
.TH Minus
|
|
2
|
+
.PP
|
|
3
|
+
Logical AND NOT
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
minus(left: Relation, right: Relation) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
minus(
|
|
16
|
+
restrict(suppliers, eq(:city, 'Paris')),
|
|
17
|
+
restrict(suppliers, gt(:status, 10)))
|
|
18
|
+
.fi
|
|
19
|
+
.RE
|
|
20
|
+
.SH Description
|
|
21
|
+
.PP
|
|
22
|
+
Computes the relation as the set difference of \fB\fCleft\fR and \fB\fCright\fR\&.
|
|
23
|
+
.PP
|
|
24
|
+
The \fB\fCleft\fR and \fB\fCright\fR relations must be minus\-compatible, which meaning
|
|
25
|
+
that they must have same heading (type inheritance is partly supported
|
|
26
|
+
through ruby's own type system, so that the actual behavior is slighlty more
|
|
27
|
+
permissive).
|
|
28
|
+
.SH Implementation notes
|
|
29
|
+
.PP
|
|
30
|
+
Unlike SQL, this operator ALWAYS remove duplicates. There is no way, in
|
|
31
|
+
Alf, to compute \fIbags\fP of tuples and therefore no way to express something
|
|
32
|
+
such as SQL's EXCEPT ALL.
|
|
33
|
+
.PP
|
|
34
|
+
It is sometimes idiomatic in Alf to use \fB\fCintersect\fR as a logical AND NOT, as
|
|
35
|
+
illustrated below. So far, the optimizer/compiler is not smart enough to
|
|
36
|
+
translate the former into the latter (which is likely to have a better query
|
|
37
|
+
plan when using faithful SQL compilation and available SQL DBMSs). Any patch
|
|
38
|
+
is welcome here too!
|
|
39
|
+
.PP
|
|
40
|
+
.RS
|
|
41
|
+
.nf
|
|
42
|
+
minus(
|
|
43
|
+
restrict(suppliers, eq(:city, 'Paris')),
|
|
44
|
+
restrict(suppliers, gt(:status, 10)))
|
|
45
|
+
.fi
|
|
46
|
+
.RE
|
|
47
|
+
.PP
|
|
48
|
+
is equivalent to
|
|
49
|
+
.PP
|
|
50
|
+
.RS
|
|
51
|
+
.nf
|
|
52
|
+
restrict(suppliers, eq(:city, 'Paris') & !gt(:status, 10))
|
|
53
|
+
.fi
|
|
54
|
+
.RE
|
data/doc/man/native.man
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
.TH Native
|
|
2
|
+
.PP
|
|
3
|
+
User\-defined tuple predicate
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
native(predicate: (Tuple -> Boolean)) -> Predicate
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
->(t){ t.city == 'London' }
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.SH Description
|
|
19
|
+
.PP
|
|
20
|
+
So called 'native' predicates are functions computing truth values from
|
|
21
|
+
tuples.
|
|
22
|
+
.SH Implementation notes
|
|
23
|
+
.PP
|
|
24
|
+
Native predicates can be any ruby Proc object of arity 1. The argument
|
|
25
|
+
will be a Tuple instance. the Proc SHOULD return true or false, but ruby
|
|
26
|
+
patterns for boolean expressions are supported to (such a nil evaluating
|
|
27
|
+
to false, etc.).
|
|
28
|
+
.PP
|
|
29
|
+
Note that, as of current Alf version, native predicates cannot be delegated
|
|
30
|
+
to an underlying data engine, and are not compiled to SQL in particular.
|
|
31
|
+
Please always use predicate factories such as \fB\fCeq(:city, 'London')\fR if
|
|
32
|
+
possible, as they do not hurt logical optimizations and compilation.
|
data/doc/man/neq.man
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.TH Neq
|
|
2
|
+
.PP
|
|
3
|
+
Not equal to
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
neq(left: Alpha|AttrName, right: Alpha|AttrName) -> Predicate
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
neq(:city, 'London')
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
neq(:supplier_city, :part_city)
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.SH Description
|
|
25
|
+
.PP
|
|
26
|
+
This predicates checks whether two values are different.
|
|
27
|
+
.SH Implementation notes
|
|
28
|
+
.PP
|
|
29
|
+
This predicate is equivalent to \fB\fC->(t){ _left_ != _right_ }\fR\&.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
.TH Not_matching
|
|
2
|
+
.PP
|
|
3
|
+
Aka 'where not exists'
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
not_matching(left: Relation, right: Relation) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
not_matching(suppliers, supplies)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.SH Description
|
|
19
|
+
.PP
|
|
20
|
+
Computes a relation as a subset of \fB\fCleft\fR tuples for which no tuple from
|
|
21
|
+
\fB\fCright\fR would join on common attributes.
|
|
22
|
+
.PP
|
|
23
|
+
This operator is the inverse of \fB\fCmatching\fR, as shown by the definition
|
|
24
|
+
below. It keeps all tuples from \fB\fCleft\fR but those that match a tuple from
|
|
25
|
+
\fB\fCright\fR\&.
|
|
26
|
+
.PP
|
|
27
|
+
.RS
|
|
28
|
+
.nf
|
|
29
|
+
def not_matching(left, right)
|
|
30
|
+
minus(left, matching(left, right))
|
|
31
|
+
end
|
|
32
|
+
not_matching(suppliers, supplies)
|
|
33
|
+
.fi
|
|
34
|
+
.RE
|
|
35
|
+
.PP
|
|
36
|
+
The synonym 'where not exists' comes from the fact that, since right
|
|
37
|
+
attributes do not appear in the result, it may seem more intuitive to think
|
|
38
|
+
about this operator as filtering tuples from left where \fIthere does not
|
|
39
|
+
exist\fP any tuple from right that \fIwould\fP join. In SQL terms:
|
|
40
|
+
.PP
|
|
41
|
+
.RS
|
|
42
|
+
.nf
|
|
43
|
+
SELECT * FROM left WHERE NOT EXISTS (SELECT * FROM right WHERE [join condition])
|
|
44
|
+
.fi
|
|
45
|
+
.RE
|
|
46
|
+
.SH Implementation notes
|
|
47
|
+
.PP
|
|
48
|
+
As for join and matching, you must take care of ensuring that the list of
|
|
49
|
+
common attributes on which the (not) matching applies corresponds to what
|
|
50
|
+
you want. Renamings and projections are worth having at hand.
|
|
51
|
+
Alternatively, shortcuts can be considered (see \fB\fCmatching\fR and \fB\fCjoin\fR).
|
data/doc/man/page.man
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
.TH Page
|
|
2
|
+
.PP
|
|
3
|
+
Pagination
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
page(operand: Relation, ordering: Ordering, nth: Integer) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
page(suppliers, [:status, :sid], 1, page_size: 3)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
page(suppliers, [:status, :sid], -1, page_size: 3)
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.SH Description
|
|
25
|
+
.PP
|
|
26
|
+
Computes a relation by restricting the tuples of \fB\fCoperand\fR to those
|
|
27
|
+
belonging to the \fB\fCnth\fR page (starting at 1). When \fB\fCnth\fR is negative, returns
|
|
28
|
+
tuples that belong to the \fB\fCnth\fR page from the end (e.g., \-1 is last page).
|
|
29
|
+
.PP
|
|
30
|
+
Formally, the page is defined by those tuples whose ranking according to
|
|
31
|
+
\fB\fCorder\fR is such that \fB\fC(nth-1)*page_size <= rank < nth*page_size\fR\&. In other
|
|
32
|
+
words, this operator is almost equivalent to the following definition
|
|
33
|
+
(ignoring negative page indexes for simplicity):
|
|
34
|
+
.PP
|
|
35
|
+
.RS
|
|
36
|
+
.nf
|
|
37
|
+
def page(operand, order, nth, page_size)
|
|
38
|
+
allbut(
|
|
39
|
+
restrict(
|
|
40
|
+
rank(operand, order, :rank),
|
|
41
|
+
lte((nth-1)*page_size, :rank) & lt(:rank, nth*page_size)),
|
|
42
|
+
[:rank])
|
|
43
|
+
end
|
|
44
|
+
.fi
|
|
45
|
+
.RE
|
|
46
|
+
.PP
|
|
47
|
+
As of current Alf version, for this operator to be semantically sound and
|
|
48
|
+
deterministic, \fB\fCorder\fR MUST be a total order, that is, it must at least
|
|
49
|
+
cover a candidate key. As of current Alf version, no error is raised if
|
|
50
|
+
this is not the case but that might change in future versions.
|
|
51
|
+
.SH Implementation notes
|
|
52
|
+
.PP
|
|
53
|
+
Contrary to the longer expression shown above, this operator compiles to
|
|
54
|
+
SQL (rank does not, so far) at the cost of having to provide a total
|
|
55
|
+
order.
|
|
56
|
+
.PP
|
|
57
|
+
As the result is a relation and relations are not ordered by definition,
|
|
58
|
+
the order in which tuples can be observed in the result (e.g. through
|
|
59
|
+
explicit tuple iteration, casting to an array, json encoding) is NOT
|
|
60
|
+
guaranteed to follow \fB\fCorder\fR\&.
|
data/doc/man/project.man
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.TH Project
|
|
2
|
+
.PP
|
|
3
|
+
Keeps only a subset of attributes.
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
project(operand: Relation, attributes: AttrList) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
project(suppliers, [:city])
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
project(suppliers, [:city], allbut: true)
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.SH Description
|
|
25
|
+
.PP
|
|
26
|
+
Computes the relation obtained by projecting tuples from \fB\fCoperand\fR on a
|
|
27
|
+
subset of their attributes.
|
|
28
|
+
.PP
|
|
29
|
+
This operator supports an ALL BUT variant, through the \fB\fCallbut\fR option.
|
|
30
|
+
When set to true, the operator \fIremoves\fP specified attributes instead of
|
|
31
|
+
keeping them. An \fB\fCallbut\fR operator is also provided that has the same
|
|
32
|
+
effect.
|
|
33
|
+
.SH Implementation notes
|
|
34
|
+
.PP
|
|
35
|
+
Unlike SQL, this operator ALWAYS remove duplicates. There is no way, in
|
|
36
|
+
Alf, to compute \fIbags\fP of tuples.
|
data/doc/man/rank.man
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.TH Rank
|
|
2
|
+
.PP
|
|
3
|
+
Tuple ranking
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
rank(operand: Relation, order: Ordering, as: AttrName) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
rank(suppliers, [:status], :ranking)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
rank(suppliers, [:status, :sid], :ranking)
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.SH Description
|
|
25
|
+
.PP
|
|
26
|
+
Extends tuples from \fB\fCoperand\fR with a new attribute (\fB\fCas\fR) capturing the
|
|
27
|
+
tuple position with respect to \fB\fCorder\fR\&.
|
|
28
|
+
.PP
|
|
29
|
+
The ranking of a tuple \fB\fCt\fR is more precisely defined as the number of tuples
|
|
30
|
+
from \fB\fCoperand\fR that would come strictly before \fB\fCt\fR if they were all ordered
|
|
31
|
+
according to \fB\fCorder\fR\&. 'Equal' tuples with respect to \fB\fCorder\fR are not counted
|
|
32
|
+
in this ranking.
|
|
33
|
+
.PP
|
|
34
|
+
This means that, unless \fB\fCorder\fR is a total order, duplicate ranking may be
|
|
35
|
+
observed. In contrast, if \fB\fCorder\fR covers a candidate key then the ranking
|
|
36
|
+
attribute (\fB\fCas\fR) is unique, and therefore defines an additional candidate
|
|
37
|
+
key for the resulting relation.
|
|
38
|
+
.SH Implementation notes
|
|
39
|
+
.PP
|
|
40
|
+
Note that this operator does not compile to SQL so far. The \fB\fCpage\fR and
|
|
41
|
+
\fB\fCframe\fR operators provide useful alternatives when the aim is to compute
|
|
42
|
+
a subset of tuples based on a ranking.
|
data/doc/man/rename.man
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.TH Rename
|
|
2
|
+
.PP
|
|
3
|
+
Rename attributes
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
rename(operand: Relation, renaming: Renaming) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
rename(suppliers, :sid => :supplier_id, :city => :lives_in)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.SH Description
|
|
19
|
+
.PP
|
|
20
|
+
Computes the same relation as \fB\fCoperand\fR expect that some attributes have
|
|
21
|
+
been renamed.
|
|
22
|
+
.SH Implementation notes
|
|
23
|
+
.PP
|
|
24
|
+
As of current version, renamings can only be expressed through a Hash
|
|
25
|
+
mapping input to output attribute names.
|
|
26
|
+
.PP
|
|
27
|
+
Other ways of specifying renamining will be added in future versions, such
|
|
28
|
+
as prefixing, postfixing, renaming through a Proc, etc. Any patch towards
|
|
29
|
+
these improvements is welcome.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
.TH Restrict
|
|
2
|
+
.PP
|
|
3
|
+
Predicate\-based filtering
|
|
4
|
+
.SH Signature
|
|
5
|
+
.PP
|
|
6
|
+
.RS
|
|
7
|
+
.nf
|
|
8
|
+
restrict(operand: Relation, predicate: Predicate) -> Relation
|
|
9
|
+
.fi
|
|
10
|
+
.RE
|
|
11
|
+
.SH Examples
|
|
12
|
+
.PP
|
|
13
|
+
.RS
|
|
14
|
+
.nf
|
|
15
|
+
restrict(suppliers, city: 'Paris', status: 20)
|
|
16
|
+
.fi
|
|
17
|
+
.RE
|
|
18
|
+
.PP
|
|
19
|
+
.RS
|
|
20
|
+
.nf
|
|
21
|
+
restrict(suppliers, eq(city: 'Paris') & gt(:status, 20))
|
|
22
|
+
.fi
|
|
23
|
+
.RE
|
|
24
|
+
.PP
|
|
25
|
+
.RS
|
|
26
|
+
.nf
|
|
27
|
+
restrict(suppliers, ->(t){ t.city == 'Paris' and t.status > 20 })
|
|
28
|
+
.fi
|
|
29
|
+
.RE
|
|
30
|
+
.SH Description
|
|
31
|
+
.PP
|
|
32
|
+
Computes a relation as a subset of \fB\fCoperand\fR tuples for which a tuple
|
|
33
|
+
predicate evaluates to TRUE.
|
|
34
|
+
.SH Implementation notes
|
|
35
|
+
.PP
|
|
36
|
+
As of current Alf version, native predicates (through ruby \fB\fCProc\fR objects)
|
|
37
|
+
cannot be optimized nor compiled to SQL. The use of predicate factories
|
|
38
|
+
(\fB\fCeq\fR, \fB\fCgt\fR, etc.) is strongly recommanded.
|