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.
Files changed (200) hide show
  1. data/CHANGELOG.md +77 -0
  2. data/examples/operators/page.alf +4 -0
  3. data/lib/alf-adapter-fs/alf/adapter/folder.rb +4 -0
  4. data/lib/alf-adapter-fs/alf/adapter/folder/connection.rb +3 -2
  5. data/lib/alf-adapter/alf/adapter/connection.rb +1 -1
  6. data/lib/alf-algebra/alf/algebra/operand.rb +2 -2
  7. data/lib/alf-algebra/alf/algebra/operand/fake.rb +3 -3
  8. data/lib/alf-algebra/alf/algebra/operand/named.rb +1 -1
  9. data/lib/alf-algebra/alf/algebra/operand/proxy.rb +14 -0
  10. data/lib/alf-algebra/alf/algebra/operator.rb +4 -1
  11. data/lib/alf-algebra/alf/algebra/operator/clip.rb +7 -4
  12. data/lib/alf-algebra/alf/algebra/operator/frame.rb +22 -0
  13. data/lib/alf-algebra/alf/algebra/operator/hierarchize.rb +22 -0
  14. data/lib/alf-algebra/alf/algebra/operator/page.rb +22 -0
  15. data/lib/alf-algebra/alf/algebra/operator/project.rb +4 -9
  16. data/lib/alf-algebra/alf/algebra/operator/rank.rb +2 -2
  17. data/lib/alf-algebra/alf/algebra/support.rb +2 -0
  18. data/lib/alf-algebra/alf/algebra/support/signature.rb +2 -1
  19. data/lib/alf-algebra/alf/algebra/support/with_ordering.rb +11 -0
  20. data/lib/alf-core/ext/domain/heading_based.rb +16 -4
  21. data/lib/alf-core/facade.rb +5 -1
  22. data/lib/alf-core/version.rb +2 -2
  23. data/lib/alf-database/alf/database/connection.rb +2 -2
  24. data/lib/alf-database/alf/database/options.rb +0 -3
  25. data/lib/alf-engine/alf/engine.rb +4 -1
  26. data/lib/alf-engine/alf/engine/aggregate.rb +2 -1
  27. data/lib/alf-engine/alf/engine/autonum.rb +2 -1
  28. data/lib/alf-engine/alf/engine/clip.rb +2 -1
  29. data/lib/alf-engine/alf/engine/coerce.rb +2 -1
  30. data/lib/alf-engine/alf/engine/cog.rb +23 -0
  31. data/lib/alf-engine/alf/engine/compact.rb +3 -2
  32. data/lib/alf-engine/alf/engine/compact/set.rb +2 -1
  33. data/lib/alf-engine/alf/engine/compact/uniq.rb +2 -1
  34. data/lib/alf-engine/alf/engine/compiler.rb +60 -33
  35. data/lib/alf-engine/alf/engine/concat.rb +2 -1
  36. data/lib/alf-engine/alf/engine/defaults.rb +2 -1
  37. data/lib/alf-engine/alf/engine/filter.rb +4 -2
  38. data/lib/alf-engine/alf/engine/generator.rb +2 -1
  39. data/lib/alf-engine/alf/engine/group/hash.rb +4 -3
  40. data/lib/alf-engine/alf/engine/hierarchize.rb +87 -0
  41. data/lib/alf-engine/alf/engine/infer_heading.rb +2 -1
  42. data/lib/alf-engine/alf/engine/join.rb +5 -1
  43. data/lib/alf-engine/alf/engine/join/hash.rb +9 -2
  44. data/lib/alf-engine/alf/engine/leaf.rb +6 -1
  45. data/lib/alf-engine/alf/engine/materialize/array.rb +2 -1
  46. data/lib/alf-engine/alf/engine/materialize/hash.rb +2 -1
  47. data/lib/alf-engine/alf/engine/quota/cesure.rb +2 -1
  48. data/lib/alf-engine/alf/engine/rank/cesure.rb +2 -1
  49. data/lib/alf-engine/alf/engine/rename.rb +2 -1
  50. data/lib/alf-engine/alf/engine/semi/hash.rb +7 -1
  51. data/lib/alf-engine/alf/engine/set_attr.rb +4 -3
  52. data/lib/alf-engine/alf/engine/sort.rb +3 -2
  53. data/lib/alf-engine/alf/engine/sort/in_memory.rb +2 -1
  54. data/lib/alf-engine/alf/engine/summarize/cesure.rb +2 -1
  55. data/lib/alf-engine/alf/engine/summarize/hash.rb +3 -2
  56. data/lib/alf-engine/alf/engine/{cesure.rb → support/cesure.rb} +0 -0
  57. data/lib/alf-engine/alf/engine/take.rb +53 -0
  58. data/lib/alf-engine/alf/engine/to_array.rb +6 -5
  59. data/lib/alf-engine/alf/engine/type_safe.rb +2 -1
  60. data/lib/alf-engine/alf/engine/ungroup.rb +2 -1
  61. data/lib/alf-engine/alf/engine/unwrap.rb +2 -1
  62. data/lib/alf-engine/alf/engine/wrap.rb +2 -1
  63. data/lib/alf-io/alf/reader.rb +1 -1
  64. data/lib/alf-io/alf/reader/ruby.rb +23 -0
  65. data/lib/alf-io/alf/renderer/text.rb +22 -9
  66. data/lib/alf-lang/alf/lang/lispy.rb +41 -29
  67. data/lib/alf-lang/alf/lang/oo/algebra_methods.rb +17 -1
  68. data/lib/alf-optimizer/alf/optimizer/restrict.rb +7 -1
  69. data/lib/alf-predicate/alf/predicate.rb +11 -2
  70. data/lib/alf-relation/alf/relation.rb +21 -1
  71. data/lib/alf-relvar/alf/relvar.rb +21 -1
  72. data/lib/alf-relvar/alf/relvar/base.rb +11 -6
  73. data/lib/alf-relvar/alf/relvar/fake.rb +3 -2
  74. data/lib/alf-relvar/alf/relvar/virtual.rb +1 -2
  75. data/lib/alf-support/alf/support/bindable.rb +1 -1
  76. data/lib/alf-support/alf/support/config.rb +91 -18
  77. data/lib/alf-support/alf/support/tuple_scope.rb +8 -4
  78. data/lib/alf-types/alf/types.rb +2 -0
  79. data/lib/alf-types/alf/types/attr_list.rb +3 -1
  80. data/lib/alf-types/alf/types/heading.rb +4 -1
  81. data/lib/alf-types/alf/types/keys.rb +0 -4
  82. data/lib/alf-types/alf/types/ordering.rb +104 -18
  83. data/lib/alf-types/alf/types/selection.rb +18 -0
  84. data/lib/alf-types/alf/types/selector.rb +59 -0
  85. data/lib/alf-types/alf/types/tuple_computation.rb +2 -2
  86. data/lib/alf-types/alf/types/tuple_expression.rb +18 -2
  87. data/lib/alf-viewpoint/alf/viewpoint.rb +23 -8
  88. data/lib/alf-viewpoint/alf/viewpoint/metadata.rb +73 -0
  89. data/spec/integration/relation/test_extend.rb +20 -0
  90. data/spec/integration/relation/test_to_array.rb +1 -1
  91. data/spec/integration/test_examples.rb +18 -2
  92. data/spec/shared/a_cog.rb +36 -0
  93. data/spec/spec_helper.rb +8 -0
  94. data/spec/unit/alf-algebra/operand/test_proxy.rb +54 -0
  95. data/spec/unit/alf-algebra/operator/hierarchize/test_heading.rb +23 -0
  96. data/spec/unit/alf-algebra/operator/project/test_key_preserving.rb +3 -0
  97. data/spec/unit/alf-algebra/operator/project/test_keys.rb +54 -17
  98. data/spec/unit/alf-algebra/operator/rank/test_keys.rb +2 -2
  99. data/spec/unit/alf-algebra/operator/restrict/test_keys.rb +2 -2
  100. data/spec/unit/alf-algebra/operator/test_page.rb +30 -0
  101. data/spec/unit/alf-algebra/support/test_relational.rb +3 -0
  102. data/spec/unit/alf-algebra/support/with_ordering/test_total_ordering.rb +61 -0
  103. data/spec/unit/alf-database/connection/test_reconnect.rb +1 -1
  104. data/spec/unit/alf-database/options/test_new.rb +4 -4
  105. data/spec/unit/alf-database/shared_examples/a_facade_on_database_options.rb +1 -2
  106. data/spec/unit/alf-engine/cog/test_to_cog.rb +14 -0
  107. data/spec/unit/alf-engine/compiler/test_on_frame.rb +70 -0
  108. data/spec/unit/alf-engine/compiler/test_on_hierarchize.rb +33 -0
  109. data/spec/unit/alf-engine/compiler/test_on_page.rb +128 -0
  110. data/spec/unit/alf-engine/compiler/test_unsupported.rb +48 -0
  111. data/spec/unit/alf-engine/hierarchize/test_renamer.rb +18 -0
  112. data/spec/unit/alf-engine/test_filter.rb +43 -11
  113. data/spec/unit/alf-engine/test_hierarchize.rb +71 -0
  114. data/spec/unit/alf-engine/test_set_attr.rb +13 -0
  115. data/spec/unit/alf-engine/test_take.rb +46 -0
  116. data/spec/unit/alf-engine/test_to_array.rb +45 -28
  117. data/spec/unit/alf-io/reader/{input.rb → input.rash} +0 -0
  118. data/spec/unit/alf-io/reader/input.ruby +4 -0
  119. data/spec/unit/alf-io/reader/test_rash.rb +1 -1
  120. data/spec/unit/alf-io/reader/test_ruby.rb +25 -0
  121. data/spec/unit/alf-predicate/predicate/test_evaluate.rb +51 -13
  122. data/spec/unit/alf-relation/relation/class/test_recursive_type.rb +42 -0
  123. data/spec/unit/alf-relation/relation/test_equality.rb +19 -1
  124. data/spec/unit/alf-relation/relation/test_relops.rb +14 -2
  125. data/spec/unit/alf-relation/relation/test_to_hash.rb +31 -0
  126. data/spec/unit/alf-relvar/base/test_connection.rb +8 -2
  127. data/spec/unit/alf-relvar/base/test_delete.rb +2 -2
  128. data/spec/unit/alf-relvar/base/test_heading.rb +2 -2
  129. data/spec/unit/alf-relvar/base/test_insert.rb +3 -3
  130. data/spec/unit/alf-relvar/base/test_keys.rb +2 -2
  131. data/spec/unit/alf-relvar/base/test_lock.rb +2 -2
  132. data/spec/unit/alf-relvar/base/test_name.rb +3 -2
  133. data/spec/unit/alf-relvar/base/test_oo_lang.rb +2 -1
  134. data/spec/unit/alf-relvar/base/test_to_cog.rb +3 -3
  135. data/spec/unit/alf-relvar/base/test_to_lispy.rb +3 -2
  136. data/spec/unit/alf-relvar/base/test_to_relvar.rb +2 -1
  137. data/spec/unit/alf-relvar/base/test_to_s.rb +3 -2
  138. data/spec/unit/alf-relvar/base/test_update.rb +5 -4
  139. data/spec/unit/alf-relvar/virtual/test_connection.rb +3 -2
  140. data/spec/unit/alf-relvar/virtual/test_delete.rb +3 -4
  141. data/spec/unit/alf-relvar/virtual/test_expr.rb +3 -2
  142. data/spec/unit/alf-relvar/virtual/test_heading.rb +5 -4
  143. data/spec/unit/alf-relvar/virtual/test_insert.rb +2 -2
  144. data/spec/unit/alf-relvar/virtual/test_keys.rb +5 -4
  145. data/spec/unit/alf-relvar/virtual/test_oo_lang.rb +7 -2
  146. data/spec/unit/alf-relvar/virtual/test_to_cog.rb +4 -3
  147. data/spec/unit/alf-relvar/virtual/test_to_lispy.rb +3 -6
  148. data/spec/unit/alf-relvar/virtual/test_to_relvar.rb +2 -1
  149. data/spec/unit/alf-relvar/virtual/test_to_s.rb +3 -3
  150. data/spec/unit/alf-relvar/virtual/test_update.rb +4 -5
  151. data/spec/unit/alf-support/config/test_dup.rb +58 -0
  152. data/spec/unit/alf-support/config/test_freeze.rb +37 -0
  153. data/spec/unit/alf-support/config/test_hash_get.rb +41 -0
  154. data/spec/unit/alf-support/config/test_hash_set.rb +61 -0
  155. data/spec/unit/alf-support/config/test_new.rb +10 -0
  156. data/spec/unit/alf-support/config/test_option.rb +15 -0
  157. data/spec/unit/alf-support/config/test_option_setter.rb +72 -0
  158. data/spec/unit/alf-support/config/test_options.rb +22 -0
  159. data/spec/unit/alf-support/tuple_scope/test_hash_get.rb +20 -0
  160. data/spec/unit/alf-support/tuple_scope/test_respond_to.rb +6 -0
  161. data/spec/unit/alf-support/tuple_scope/test_to_s.rb +22 -0
  162. data/spec/unit/alf-types/keys/test_select.rb +57 -8
  163. data/spec/unit/alf-types/ordering/test_coerce.rb +46 -35
  164. data/spec/unit/alf-types/ordering/test_dive.rb +41 -0
  165. data/spec/unit/alf-types/ordering/test_hash_get.rb +20 -0
  166. data/spec/unit/alf-types/ordering/test_merge.rb +61 -0
  167. data/spec/unit/alf-types/ordering/test_reverse.rb +40 -0
  168. data/spec/unit/alf-types/ordering/test_selectors.rb +24 -0
  169. data/spec/unit/alf-types/ordering/test_sorter.rb +62 -8
  170. data/spec/unit/alf-types/ordering/test_to_attr_list.rb +16 -4
  171. data/spec/unit/alf-types/ordering/test_total.rb +56 -0
  172. data/spec/unit/alf-types/selection/test_coerce.rb +38 -0
  173. data/spec/unit/alf-types/selection/test_select.rb +34 -0
  174. data/spec/unit/alf-types/selector/test_coerce.rb +36 -0
  175. data/spec/unit/alf-types/selector/test_composite_q.rb +20 -0
  176. data/spec/unit/alf-types/selector/test_dive.rb +32 -0
  177. data/spec/unit/alf-types/selector/test_select.rb +40 -0
  178. data/spec/unit/alf-types/selector/test_simple_q.rb +20 -0
  179. data/spec/unit/alf-types/selector/test_to_a.rb +20 -0
  180. data/spec/unit/alf-types/selector/test_to_lispy.rb +20 -0
  181. data/spec/unit/alf-types/selector/test_to_ruby_literal.rb +20 -0
  182. data/spec/unit/alf-types/tuple_expression/test_evaluate.rb +38 -0
  183. data/spec/unit/alf-viewpoint/metadata/test_add_members.rb +38 -0
  184. data/spec/unit/alf-viewpoint/metadata/test_all_members.rb +33 -0
  185. data/spec/unit/alf-viewpoint/metadata/test_depends.rb +50 -0
  186. data/spec/unit/alf-viewpoint/metadata/test_dup.rb +32 -0
  187. data/spec/unit/alf-viewpoint/metadata/test_expand.rb +31 -0
  188. data/spec/unit/alf-viewpoint/metadata/test_expects.rb +38 -0
  189. data/spec/unit/alf-viewpoint/metadata/test_initialize.rb +40 -0
  190. data/spec/unit/alf-viewpoint/metadata/test_to_module.rb +37 -0
  191. data/spec/unit/alf-viewpoint/test_depends.rb +18 -0
  192. data/spec/unit/alf-viewpoint/test_expects.rb +18 -0
  193. data/spec/unit/alf-viewpoint/test_members.rb +33 -0
  194. data/spec/unit/alf-viewpoint/test_metadata.rb +27 -0
  195. data/spec/unit/alf-viewpoint/test_native_const.rb +6 -0
  196. metadata +125 -14
  197. data/spec/unit/alf-database/options/test_default_viewpoint.rb +0 -25
  198. data/spec/unit/alf-types/keys/test_compact.rb +0 -21
  199. data/spec/unit/alf-types/ordering/test_plus.rb +0 -27
  200. data/spec/unit/alf-viewpoint/test_namespace.rb +0 -23
@@ -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
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env alf
2
+
3
+ # second suppliers page, with page size of 50
4
+ (page suppliers, [[:city, :asc]], 2, page_size: 50)
@@ -15,6 +15,10 @@ module Alf
15
15
  Folder::Connection.new(Path(conn_spec))
16
16
  end
17
17
 
18
+ def to_s
19
+ "Alf::Adapter::Folder(#{conn_spec})"
20
+ end
21
+
18
22
  Adapter.register(:folder, self)
19
23
  end # class Folder
20
24
  end # class Adapter
@@ -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
@@ -49,7 +49,7 @@ module Alf
49
49
  ### read-only methods
50
50
 
51
51
  # Returns a cog for a given name
52
- def cog(name)
52
+ def cog(name, expr = nil)
53
53
  raise NotSupportedError, "Unable to serve cog `#{name}` in `#{self}`"
54
54
  end
55
55
 
@@ -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!.heading(name)
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
@@ -19,7 +19,7 @@ module Alf
19
19
  end
20
20
 
21
21
  def to_relvar
22
- Relvar::Base.new(name, connection)
22
+ Relvar::Base.new(self)
23
23
  end
24
24
 
25
25
  def to_s
@@ -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, connection)
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
- project(attributes, allbut).
18
- compact.
19
- if_empty{ Keys[ heading.to_attr_list ] }
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 ||= begin
17
- keys = operand.keys.project(attributes, allbut).compact
18
- if keys.empty?
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.any?{|op_k| k.subset?(op_k) } }
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, order_attrs = operand.keys, order.to_attr_list
18
- if keys.any?{|k| order_attrs.superset?(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
- domain == Boolean ? "--#{name}" : "--#{name}=#{name.to_s.upcase}"
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
@@ -0,0 +1,11 @@
1
+ module Alf
2
+ module Algebra
3
+ module WithOrdering
4
+
5
+ def total_ordering
6
+ ordering.total(keys){ heading }
7
+ end
8
+
9
+ end # module WithOrdering
10
+ end # module Algebra
11
+ end # module Alf
@@ -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
- meths = [
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
- Class.new(master_class).extend(*meths).heading_based_factored
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
- "#{master_class.name}[#{Alf::Support.to_ruby_literal(to_heading.to_hash)}]"
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
@@ -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 Path.backfind('examples/suppliers_and_parts'), &bl
17
+ Alf::Database.connect examples_adapter, &bl
14
18
  end
15
19
 
16
20
  def reader(source, *args)
@@ -3,8 +3,8 @@ module Alf
3
3
  module Version
4
4
 
5
5
  MAJOR = 0
6
- MINOR = 13
7
- TINY = 1
6
+ MINOR = 14
7
+ TINY = 0
8
8
 
9
9
  def self.to_s
10
10
  [ MAJOR, MINOR, TINY ].join('.')