alf-core 0.13.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 +4 -0
- data/Gemfile +29 -0
- data/Gemfile.lock +41 -0
- data/LICENCE.md +22 -0
- data/Manifest.txt +14 -0
- data/README.md +11 -0
- data/Rakefile +11 -0
- data/TODO.md +23 -0
- data/examples/functions-as-values.rb +39 -0
- data/examples/memory_database.rb +44 -0
- data/examples/operators/autonum.alf +6 -0
- data/examples/operators/cities.rash +4 -0
- data/examples/operators/clip.alf +3 -0
- data/examples/operators/compact.alf +2 -0
- data/examples/operators/defaults.alf +3 -0
- data/examples/operators/extend.alf +3 -0
- data/examples/operators/group.alf +3 -0
- data/examples/operators/intersect.alf +4 -0
- data/examples/operators/join.alf +2 -0
- data/examples/operators/matching.alf +2 -0
- data/examples/operators/minus.alf +8 -0
- data/examples/operators/not_matching.alf +2 -0
- data/examples/operators/nulls.rash +3 -0
- data/examples/operators/parts.rash +6 -0
- data/examples/operators/project.alf +3 -0
- data/examples/operators/pseudo-with.alf +7 -0
- data/examples/operators/quota.alf +4 -0
- data/examples/operators/rank.alf +4 -0
- data/examples/operators/rename.alf +3 -0
- data/examples/operators/restrict.alf +2 -0
- data/examples/operators/schema.yaml +28 -0
- data/examples/operators/sort.alf +4 -0
- data/examples/operators/summarize.alf +16 -0
- data/examples/operators/suppliers.rash +5 -0
- data/examples/operators/supplies.rash +12 -0
- data/examples/operators/ungroup.alf +4 -0
- data/examples/operators/union.alf +3 -0
- data/examples/operators/unwrap.alf +4 -0
- data/examples/operators/wrap.alf +2 -0
- data/examples/readme.rb +23 -0
- data/examples/suppliers_and_parts/cities.rash +4 -0
- data/examples/suppliers_and_parts/parts.rash +6 -0
- data/examples/suppliers_and_parts/suppliers.rash +5 -0
- data/examples/suppliers_and_parts/supplies.rash +12 -0
- data/lib/alf-adapter-fs/alf/adapter/folder.rb +22 -0
- data/lib/alf-adapter-fs/alf/adapter/folder/connection.rb +39 -0
- data/lib/alf-adapter-fs/alf/adapter/fs.rb +1 -0
- data/lib/alf-adapter/alf/adapter.rb +95 -0
- data/lib/alf-adapter/alf/adapter/connection.rb +88 -0
- data/lib/alf-adapter/alf/adapter/connection/schema_cached.rb +34 -0
- data/lib/alf-aggregator/alf/aggregator.rb +223 -0
- data/lib/alf-aggregator/alf/aggregator/avg.rb +39 -0
- data/lib/alf-aggregator/alf/aggregator/collect.rb +32 -0
- data/lib/alf-aggregator/alf/aggregator/concat.rb +47 -0
- data/lib/alf-aggregator/alf/aggregator/count.rb +32 -0
- data/lib/alf-aggregator/alf/aggregator/max.rb +32 -0
- data/lib/alf-aggregator/alf/aggregator/min.rb +32 -0
- data/lib/alf-aggregator/alf/aggregator/stddev.rb +25 -0
- data/lib/alf-aggregator/alf/aggregator/sum.rb +32 -0
- data/lib/alf-aggregator/alf/aggregator/variance.rb +45 -0
- data/lib/alf-algebra/alf/algebra.rb +13 -0
- data/lib/alf-algebra/alf/algebra/operand.rb +54 -0
- data/lib/alf-algebra/alf/algebra/operand/fake.rb +61 -0
- data/lib/alf-algebra/alf/algebra/operand/named.rb +36 -0
- data/lib/alf-algebra/alf/algebra/operand/proxy.rb +25 -0
- data/lib/alf-algebra/alf/algebra/operator.rb +134 -0
- data/lib/alf-algebra/alf/algebra/operator/autonum.rb +20 -0
- data/lib/alf-algebra/alf/algebra/operator/clip.rb +28 -0
- data/lib/alf-algebra/alf/algebra/operator/coerce.rb +20 -0
- data/lib/alf-algebra/alf/algebra/operator/compact.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/defaults.rb +24 -0
- data/lib/alf-algebra/alf/algebra/operator/extend.rb +23 -0
- data/lib/alf-algebra/alf/algebra/operator/generator.rb +21 -0
- data/lib/alf-algebra/alf/algebra/operator/group.rb +28 -0
- data/lib/alf-algebra/alf/algebra/operator/infer_heading.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/intersect.rb +24 -0
- data/lib/alf-algebra/alf/algebra/operator/join.rb +27 -0
- data/lib/alf-algebra/alf/algebra/operator/matching.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/minus.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/not_matching.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/project.rb +36 -0
- data/lib/alf-algebra/alf/algebra/operator/quota.rb +22 -0
- data/lib/alf-algebra/alf/algebra/operator/rank.rb +28 -0
- data/lib/alf-algebra/alf/algebra/operator/rename.rb +24 -0
- data/lib/alf-algebra/alf/algebra/operator/restrict.rb +26 -0
- data/lib/alf-algebra/alf/algebra/operator/sort.rb +20 -0
- data/lib/alf-algebra/alf/algebra/operator/summarize.rb +28 -0
- data/lib/alf-algebra/alf/algebra/operator/type_safe.rb +21 -0
- data/lib/alf-algebra/alf/algebra/operator/ungroup.rb +31 -0
- data/lib/alf-algebra/alf/algebra/operator/union.rb +19 -0
- data/lib/alf-algebra/alf/algebra/operator/unwrap.rb +23 -0
- data/lib/alf-algebra/alf/algebra/operator/wrap.rb +41 -0
- data/lib/alf-algebra/alf/algebra/support.rb +15 -0
- data/lib/alf-algebra/alf/algebra/support/binary.rb +51 -0
- data/lib/alf-algebra/alf/algebra/support/classification.rb +37 -0
- data/lib/alf-algebra/alf/algebra/support/compiler.rb +28 -0
- data/lib/alf-algebra/alf/algebra/support/experimental.rb +19 -0
- data/lib/alf-algebra/alf/algebra/support/non_relational.rb +16 -0
- data/lib/alf-algebra/alf/algebra/support/nullary.rb +25 -0
- data/lib/alf-algebra/alf/algebra/support/relational.rb +16 -0
- data/lib/alf-algebra/alf/algebra/support/rewriter.rb +32 -0
- data/lib/alf-algebra/alf/algebra/support/signature.rb +195 -0
- data/lib/alf-algebra/alf/algebra/support/to_dot.rb +196 -0
- data/lib/alf-algebra/alf/algebra/support/unary.rb +34 -0
- data/lib/alf-algebra/alf/algebra/support/visitor.rb +31 -0
- data/lib/alf-core.rb +37 -0
- data/lib/alf-core/dsl.rb +22 -0
- data/lib/alf-core/errors.rb +16 -0
- data/lib/alf-core/ext.rb +1 -0
- data/lib/alf-core/ext/domain/heading_based.rb +88 -0
- data/lib/alf-core/facade.rb +35 -0
- data/lib/alf-core/loader.rb +13 -0
- data/lib/alf-core/version.rb +16 -0
- data/lib/alf-database/alf/database.rb +46 -0
- data/lib/alf-database/alf/database/connection.rb +156 -0
- data/lib/alf-database/alf/database/options.rb +25 -0
- data/lib/alf-engine/alf/engine.rb +37 -0
- data/lib/alf-engine/alf/engine/aggregate.rb +46 -0
- data/lib/alf-engine/alf/engine/autonum.rb +46 -0
- data/lib/alf-engine/alf/engine/cesure.rb +47 -0
- data/lib/alf-engine/alf/engine/clip.rb +54 -0
- data/lib/alf-engine/alf/engine/coerce.rb +47 -0
- data/lib/alf-engine/alf/engine/cog.rb +27 -0
- data/lib/alf-engine/alf/engine/compact.rb +27 -0
- data/lib/alf-engine/alf/engine/compact/set.rb +24 -0
- data/lib/alf-engine/alf/engine/compact/uniq.rb +24 -0
- data/lib/alf-engine/alf/engine/compiler.rb +144 -0
- data/lib/alf-engine/alf/engine/concat.rb +26 -0
- data/lib/alf-engine/alf/engine/defaults.rb +44 -0
- data/lib/alf-engine/alf/engine/filter.rb +42 -0
- data/lib/alf-engine/alf/engine/generator.rb +51 -0
- data/lib/alf-engine/alf/engine/group.rb +3 -0
- data/lib/alf-engine/alf/engine/group/hash.rb +41 -0
- data/lib/alf-engine/alf/engine/infer_heading.rb +29 -0
- data/lib/alf-engine/alf/engine/join.rb +3 -0
- data/lib/alf-engine/alf/engine/join/hash.rb +36 -0
- data/lib/alf-engine/alf/engine/leaf.rb +24 -0
- data/lib/alf-engine/alf/engine/materialize.rb +4 -0
- data/lib/alf-engine/alf/engine/materialize/array.rb +79 -0
- data/lib/alf-engine/alf/engine/materialize/hash.rb +123 -0
- data/lib/alf-engine/alf/engine/quota.rb +3 -0
- data/lib/alf-engine/alf/engine/quota/cesure.rb +48 -0
- data/lib/alf-engine/alf/engine/rank.rb +3 -0
- data/lib/alf-engine/alf/engine/rank/cesure.rb +48 -0
- data/lib/alf-engine/alf/engine/rename.rb +40 -0
- data/lib/alf-engine/alf/engine/semi.rb +3 -0
- data/lib/alf-engine/alf/engine/semi/hash.rb +40 -0
- data/lib/alf-engine/alf/engine/set_attr.rb +47 -0
- data/lib/alf-engine/alf/engine/sort.rb +29 -0
- data/lib/alf-engine/alf/engine/sort/in_memory.rb +40 -0
- data/lib/alf-engine/alf/engine/summarize.rb +4 -0
- data/lib/alf-engine/alf/engine/summarize/cesure.rb +54 -0
- data/lib/alf-engine/alf/engine/summarize/hash.rb +36 -0
- data/lib/alf-engine/alf/engine/to_array.rb +62 -0
- data/lib/alf-engine/alf/engine/to_dot.rb +60 -0
- data/lib/alf-engine/alf/engine/type_safe.rb +28 -0
- data/lib/alf-engine/alf/engine/ungroup.rb +31 -0
- data/lib/alf-engine/alf/engine/unwrap.rb +33 -0
- data/lib/alf-engine/alf/engine/wrap.rb +40 -0
- data/lib/alf-io/alf/io.rb +6 -0
- data/lib/alf-io/alf/reader.rb +189 -0
- data/lib/alf-io/alf/reader/csv.rb +28 -0
- data/lib/alf-io/alf/reader/json.rb +25 -0
- data/lib/alf-io/alf/reader/rash.rb +32 -0
- data/lib/alf-io/alf/renderer.rb +119 -0
- data/lib/alf-io/alf/renderer/csv.rb +30 -0
- data/lib/alf-io/alf/renderer/json.rb +33 -0
- data/lib/alf-io/alf/renderer/rash.rb +38 -0
- data/lib/alf-io/alf/renderer/text.rb +166 -0
- data/lib/alf-io/alf/renderer/yaml.rb +25 -0
- data/lib/alf-io/alf/support/csv_utils.rb +40 -0
- data/lib/alf-lang/alf/lang.rb +4 -0
- data/lib/alf-lang/alf/lang/functional.rb +56 -0
- data/lib/alf-lang/alf/lang/lispy.rb +53 -0
- data/lib/alf-lang/alf/lang/object_oriented.rb +26 -0
- data/lib/alf-lang/alf/lang/oo/aggregation_methods.rb +19 -0
- data/lib/alf-lang/alf/lang/oo/algebra_methods.rb +72 -0
- data/lib/alf-lang/alf/lang/oo/rendering_methods.rb +54 -0
- data/lib/alf-lang/alf/lang/predicates.rb +17 -0
- data/lib/alf-optimizer/alf/optimizer.rb +38 -0
- data/lib/alf-optimizer/alf/optimizer/restrict.rb +169 -0
- data/lib/alf-predicate/alf/predicate.rb +110 -0
- data/lib/alf-predicate/alf/predicate/factory.rb +104 -0
- data/lib/alf-predicate/alf/predicate/grammar.rb +38 -0
- data/lib/alf-predicate/alf/predicate/grammar.sexp.yml +54 -0
- data/lib/alf-predicate/alf/predicate/nodes/and.rb +25 -0
- data/lib/alf-predicate/alf/predicate/nodes/contradiction.rb +36 -0
- data/lib/alf-predicate/alf/predicate/nodes/dyadic_comp.rb +28 -0
- data/lib/alf-predicate/alf/predicate/nodes/eq.rb +17 -0
- data/lib/alf-predicate/alf/predicate/nodes/expr.rb +65 -0
- data/lib/alf-predicate/alf/predicate/nodes/gt.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/gte.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/in.rb +28 -0
- data/lib/alf-predicate/alf/predicate/nodes/literal.rb +20 -0
- data/lib/alf-predicate/alf/predicate/nodes/lt.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/lte.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/nadic_bool.rb +18 -0
- data/lib/alf-predicate/alf/predicate/nodes/native.rb +20 -0
- data/lib/alf-predicate/alf/predicate/nodes/neq.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/not.rb +24 -0
- data/lib/alf-predicate/alf/predicate/nodes/or.rb +12 -0
- data/lib/alf-predicate/alf/predicate/nodes/tautology.rb +32 -0
- data/lib/alf-predicate/alf/predicate/nodes/var_ref.rb +20 -0
- data/lib/alf-predicate/alf/predicate/parser.rb +12 -0
- data/lib/alf-predicate/alf/predicate/processors.rb +3 -0
- data/lib/alf-predicate/alf/predicate/processors/renamer.rb +19 -0
- data/lib/alf-predicate/alf/predicate/processors/to_proc.rb +35 -0
- data/lib/alf-predicate/alf/predicate/processors/to_ruby_code.rb +74 -0
- data/lib/alf-relation/alf/relation.rb +123 -0
- data/lib/alf-relation/alf/tuple.rb +103 -0
- data/lib/alf-relvar/alf/relvar.rb +87 -0
- data/lib/alf-relvar/alf/relvar/base.rb +64 -0
- data/lib/alf-relvar/alf/relvar/fake.rb +34 -0
- data/lib/alf-relvar/alf/relvar/read_only.rb +67 -0
- data/lib/alf-relvar/alf/relvar/virtual.rb +62 -0
- data/lib/alf-support/alf/support.rb +21 -0
- data/lib/alf-support/alf/support/bindable.rb +26 -0
- data/lib/alf-support/alf/support/coerce.rb +28 -0
- data/lib/alf-support/alf/support/config.rb +62 -0
- data/lib/alf-support/alf/support/dot_utils.rb +15 -0
- data/lib/alf-support/alf/support/miscellaneous.rb +60 -0
- data/lib/alf-support/alf/support/ordered_set.rb +33 -0
- data/lib/alf-support/alf/support/registry.rb +52 -0
- data/lib/alf-support/alf/support/scope.rb +85 -0
- data/lib/alf-support/alf/support/to_lispy.rb +37 -0
- data/lib/alf-support/alf/support/to_ruby_literal.rb +33 -0
- data/lib/alf-support/alf/support/tuple_scope.rb +72 -0
- data/lib/alf-types/alf/types.rb +51 -0
- data/lib/alf-types/alf/types/attr_list.rb +154 -0
- data/lib/alf-types/alf/types/attr_name.rb +24 -0
- data/lib/alf-types/alf/types/boolean.rb +8 -0
- data/lib/alf-types/alf/types/heading.rb +189 -0
- data/lib/alf-types/alf/types/keys.rb +39 -0
- data/lib/alf-types/alf/types/ordering.rb +95 -0
- data/lib/alf-types/alf/types/renaming.rb +74 -0
- data/lib/alf-types/alf/types/size.rb +15 -0
- data/lib/alf-types/alf/types/summarization.rb +101 -0
- data/lib/alf-types/alf/types/tuple_computation.rb +104 -0
- data/lib/alf-types/alf/types/tuple_expression.rb +132 -0
- data/lib/alf-types/alf/types/type_check.rb +58 -0
- data/lib/alf-update/alf/update.rb +3 -0
- data/lib/alf-update/alf/update/deleter.rb +101 -0
- data/lib/alf-update/alf/update/inserter.rb +126 -0
- data/lib/alf-update/alf/update/updater.rb +55 -0
- data/lib/alf-viewpoint/alf/viewpoint.rb +41 -0
- data/spec/integration/__database__/group.alf +3 -0
- data/spec/integration/__database__/parts.rash +6 -0
- data/spec/integration/__database__/suppliers.rash +5 -0
- data/spec/integration/__database__/suppliers_csv.csv +6 -0
- data/spec/integration/__database__/supplies.rash +12 -0
- data/spec/integration/algebra/test_to_dot.rb +14 -0
- data/spec/integration/ext/test_relation.rb +16 -0
- data/spec/integration/relation/test_to_array.rb +28 -0
- data/spec/integration/relvar/test_type_safe.rb +22 -0
- data/spec/integration/test_alf.rb +8 -0
- data/spec/integration/test_examples.rb +14 -0
- data/spec/optimizer_helper.rb +19 -0
- data/spec/regression/heading/test_heading_with_date.rb +12 -0
- data/spec/regression/relation/test_coerce.rb +24 -0
- data/spec/regression/relation/test_relation_allbut_all.rb +14 -0
- data/spec/regression/relation/test_relation_with_date.rb +12 -0
- data/spec/regression/relation/test_restrict.rb +21 -0
- data/spec/regression/restrict/test_restrict_with_keywords.rb +17 -0
- data/spec/shared/a_scope.rb +21 -0
- data/spec/shared/a_valid_type_implementation.rb +47 -0
- data/spec/shared/a_value.rb +12 -0
- data/spec/shared/an_operator_class.rb +49 -0
- data/spec/spec_helper.rb +68 -0
- data/spec/unit/alf-adapter-fs/folder/fixtures/suppliers.rash +5 -0
- data/spec/unit/alf-adapter-fs/folder/test_adapter_class.rb +23 -0
- data/spec/unit/alf-adapter-fs/folder/test_adapter_instance.rb +17 -0
- data/spec/unit/alf-adapter/adapter/test_factor.rb +20 -0
- data/spec/unit/alf-adapter/connection/schema_cached/test_delegate.rb +14 -0
- data/spec/unit/alf-adapter/connection/schema_cached/test_heading.rb +12 -0
- data/spec/unit/alf-adapter/connection/schema_cached/test_keys.rb +12 -0
- data/spec/unit/alf-adapter/connection/schema_cached/test_knows.rb +12 -0
- data/spec/unit/alf-adapter/connection/test_lock.rb +16 -0
- data/spec/unit/alf-adapter/connection/test_migrate.rb +17 -0
- data/spec/unit/alf-adapter/shared_examples/a_cached_connection_method.rb +30 -0
- data/spec/unit/alf-adapter/shared_examples/an_adapter.rb +34 -0
- data/spec/unit/alf-adapter/shared_examples/an_adapter_class.rb +21 -0
- data/spec/unit/alf-adapter/shared_examples/an_adapter_with_readable_cogs.rb +31 -0
- data/spec/unit/alf-adapter/shared_examples/an_uncached_connection_method.rb +21 -0
- data/spec/unit/alf-aggregator/test_avg.rb +22 -0
- data/spec/unit/alf-aggregator/test_collect.rb +25 -0
- data/spec/unit/alf-aggregator/test_concat.rb +31 -0
- data/spec/unit/alf-aggregator/test_count.rb +17 -0
- data/spec/unit/alf-aggregator/test_max.rb +23 -0
- data/spec/unit/alf-aggregator/test_min.rb +23 -0
- data/spec/unit/alf-aggregator/test_stddev.rb +27 -0
- data/spec/unit/alf-aggregator/test_sum.rb +23 -0
- data/spec/unit/alf-aggregator/test_variance.rb +29 -0
- data/spec/unit/alf-algebra/operand/named/test_keys.rb +22 -0
- data/spec/unit/alf-algebra/operand/named/test_to_relvar.rb +18 -0
- data/spec/unit/alf-algebra/operand/test_coerce.rb +43 -0
- data/spec/unit/alf-algebra/operator/allbut/test_key_preserving.rb +55 -0
- data/spec/unit/alf-algebra/operator/allbut/test_keys.rb +52 -0
- data/spec/unit/alf-algebra/operator/autonum/test_heading.rb +22 -0
- data/spec/unit/alf-algebra/operator/autonum/test_keys.rb +22 -0
- data/spec/unit/alf-algebra/operator/clip/test_heading.rb +36 -0
- data/spec/unit/alf-algebra/operator/clip/test_keys.rb +48 -0
- data/spec/unit/alf-algebra/operator/coerce/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/coerce/test_keys.rb +23 -0
- data/spec/unit/alf-algebra/operator/commons/test_with_operands.rb +42 -0
- data/spec/unit/alf-algebra/operator/compact/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/compact/test_keys.rb +38 -0
- data/spec/unit/alf-algebra/operator/defaults/test_heading.rb +48 -0
- data/spec/unit/alf-algebra/operator/defaults/test_keys.rb +22 -0
- data/spec/unit/alf-algebra/operator/extend/test_heading.rb +37 -0
- data/spec/unit/alf-algebra/operator/extend/test_keys.rb +30 -0
- data/spec/unit/alf-algebra/operator/generator/test_heading.rb +19 -0
- data/spec/unit/alf-algebra/operator/generator/test_keys.rb +19 -0
- data/spec/unit/alf-algebra/operator/group/test_heading.rb +33 -0
- data/spec/unit/alf-algebra/operator/group/test_keys.rb +65 -0
- data/spec/unit/alf-algebra/operator/infer_heading/test_keys.rb +23 -0
- data/spec/unit/alf-algebra/operator/intersect/test_heading.rb +39 -0
- data/spec/unit/alf-algebra/operator/intersect/test_keys.rb +67 -0
- data/spec/unit/alf-algebra/operator/join/test_heading.rb +39 -0
- data/spec/unit/alf-algebra/operator/join/test_keys.rb +59 -0
- data/spec/unit/alf-algebra/operator/matching/test_heading.rb +26 -0
- data/spec/unit/alf-algebra/operator/matching/test_keys.rb +43 -0
- data/spec/unit/alf-algebra/operator/minus/test_heading.rb +26 -0
- data/spec/unit/alf-algebra/operator/minus/test_keys.rb +26 -0
- data/spec/unit/alf-algebra/operator/not_matching/test_heading.rb +26 -0
- data/spec/unit/alf-algebra/operator/not_matching/test_keys.rb +26 -0
- data/spec/unit/alf-algebra/operator/project/test_heading.rb +36 -0
- data/spec/unit/alf-algebra/operator/project/test_key_preserving.rb +55 -0
- data/spec/unit/alf-algebra/operator/project/test_keys.rb +52 -0
- data/spec/unit/alf-algebra/operator/quota/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/quota/test_keys.rb +23 -0
- data/spec/unit/alf-algebra/operator/rank/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/rank/test_keys.rb +36 -0
- data/spec/unit/alf-algebra/operator/rename/test_complete_renaming.rb +23 -0
- data/spec/unit/alf-algebra/operator/rename/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/rename/test_keys.rb +23 -0
- data/spec/unit/alf-algebra/operator/restrict/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/restrict/test_keys.rb +52 -0
- data/spec/unit/alf-algebra/operator/sort/test_heading.rb +23 -0
- data/spec/unit/alf-algebra/operator/sort/test_keys.rb +24 -0
- data/spec/unit/alf-algebra/operator/summarize/test_heading.rb +36 -0
- data/spec/unit/alf-algebra/operator/summarize/test_keys.rb +47 -0
- data/spec/unit/alf-algebra/operator/test_autonum.rb +32 -0
- data/spec/unit/alf-algebra/operator/test_clip.rb +32 -0
- data/spec/unit/alf-algebra/operator/test_coerce.rb +20 -0
- data/spec/unit/alf-algebra/operator/test_compact.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_defaults.rb +32 -0
- data/spec/unit/alf-algebra/operator/test_extend.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_generator.rb +23 -0
- data/spec/unit/alf-algebra/operator/test_group.rb +31 -0
- data/spec/unit/alf-algebra/operator/test_infer_heading.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_intersect.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_join.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_minus.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_project.rb +32 -0
- data/spec/unit/alf-algebra/operator/test_quota.rb +19 -0
- data/spec/unit/alf-algebra/operator/test_rank.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_rename.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_restrict.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_sort.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_summarize.rb +36 -0
- data/spec/unit/alf-algebra/operator/test_ungroup.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_union.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_unwrap.rb +16 -0
- data/spec/unit/alf-algebra/operator/test_wrap.rb +32 -0
- data/spec/unit/alf-algebra/operator/type_safe/test_heading.rb +26 -0
- data/spec/unit/alf-algebra/operator/type_safe/test_keys.rb +26 -0
- data/spec/unit/alf-algebra/operator/ungroup/test_heading.rb +20 -0
- data/spec/unit/alf-algebra/operator/ungroup/test_keys.rb +23 -0
- data/spec/unit/alf-algebra/operator/union/test_heading.rb +36 -0
- data/spec/unit/alf-algebra/operator/union/test_keys.rb +26 -0
- data/spec/unit/alf-algebra/operator/unwrap/test_heading.rb +20 -0
- data/spec/unit/alf-algebra/operator/unwrap/test_keys.rb +20 -0
- data/spec/unit/alf-algebra/operator/wrap/test_heading.rb +33 -0
- data/spec/unit/alf-algebra/operator/wrap/test_keys.rb +49 -0
- data/spec/unit/alf-algebra/support/binary/test_with_left.rb +27 -0
- data/spec/unit/alf-algebra/support/binary/test_with_right.rb +27 -0
- data/spec/unit/alf-algebra/support/signature/test_collect_on.rb +41 -0
- data/spec/unit/alf-algebra/support/signature/test_initialize.rb +20 -0
- data/spec/unit/alf-algebra/support/signature/test_install.rb +56 -0
- data/spec/unit/alf-algebra/support/signature/test_option_parser.rb +36 -0
- data/spec/unit/alf-algebra/support/signature/test_parse_args.rb +92 -0
- data/spec/unit/alf-algebra/support/signature/test_to_lispy.rb +102 -0
- data/spec/unit/alf-algebra/support/test_non_relational.rb +23 -0
- data/spec/unit/alf-algebra/support/test_relational.rb +33 -0
- data/spec/unit/alf-algebra/support/unary/test_with_operand.rb +28 -0
- data/spec/unit/alf-algebra/test_operator.rb +18 -0
- data/spec/unit/alf-algebra/test_rewriter.rb +29 -0
- data/spec/unit/alf-core/alf/example.rash +1 -0
- data/spec/unit/alf-core/alf/test_Relation.rb +28 -0
- data/spec/unit/alf-core/alf/test_connect.rb +25 -0
- data/spec/unit/alf-core/alf/test_database.rb +21 -0
- data/spec/unit/alf-core/alf/test_reader.rb +22 -0
- data/spec/unit/alf-core/assumptions/test_file.rb +16 -0
- data/spec/unit/alf-core/assumptions/test_instance_eval.rb +15 -0
- data/spec/unit/alf-core/assumptions/test_scoping.rb +29 -0
- data/spec/unit/alf-core/assumptions/test_set.rb +64 -0
- data/spec/unit/alf-core/test_aggregator.rb +59 -0
- data/spec/unit/alf-database/connection/test_assert.rb +36 -0
- data/spec/unit/alf-database/connection/test_close.rb +28 -0
- data/spec/unit/alf-database/connection/test_deny.rb +36 -0
- data/spec/unit/alf-database/connection/test_fact.rb +48 -0
- data/spec/unit/alf-database/connection/test_lock.rb +19 -0
- data/spec/unit/alf-database/connection/test_migrate.rb +27 -0
- data/spec/unit/alf-database/connection/test_new.rb +17 -0
- data/spec/unit/alf-database/connection/test_options.rb +16 -0
- data/spec/unit/alf-database/connection/test_parse.rb +109 -0
- data/spec/unit/alf-database/connection/test_query.rb +22 -0
- data/spec/unit/alf-database/connection/test_reconnect.rb +41 -0
- data/spec/unit/alf-database/connection/test_relvar.rb +42 -0
- data/spec/unit/alf-database/connection/test_tuple_extract.rb +38 -0
- data/spec/unit/alf-database/database/test_connect.rb +44 -0
- data/spec/unit/alf-database/database/test_connection.rb +21 -0
- data/spec/unit/alf-database/database/test_default_options.rb +14 -0
- data/spec/unit/alf-database/database/test_new.rb +53 -0
- data/spec/unit/alf-database/options/test_default_viewpoint.rb +25 -0
- data/spec/unit/alf-database/options/test_freeze.rb +20 -0
- data/spec/unit/alf-database/options/test_merge.rb +26 -0
- data/spec/unit/alf-database/options/test_new.rb +64 -0
- data/spec/unit/alf-database/options/test_schema_cache.rb +29 -0
- data/spec/unit/alf-database/options/test_viewpoint.rb +25 -0
- data/spec/unit/alf-database/shared_examples/a_facade_on_database_options.rb +6 -0
- data/spec/unit/alf-engine/compact/test_set.rb +33 -0
- data/spec/unit/alf-engine/compact/test_uniq.rb +33 -0
- data/spec/unit/alf-engine/group/test_hash.rb +29 -0
- data/spec/unit/alf-engine/infer_heading/test_heading.rb +30 -0
- data/spec/unit/alf-engine/join/test_hash.rb +55 -0
- data/spec/unit/alf-engine/materialize/test_array.rb +28 -0
- data/spec/unit/alf-engine/materialize/test_hash.rb +76 -0
- data/spec/unit/alf-engine/quota/test_cesure.rb +34 -0
- data/spec/unit/alf-engine/rank/test_cesure.rb +47 -0
- data/spec/unit/alf-engine/semi/test_hash.rb +58 -0
- data/spec/unit/alf-engine/sort/test_in_memory.rb +32 -0
- data/spec/unit/alf-engine/summarize/test_cesure.rb +36 -0
- data/spec/unit/alf-engine/summarize/test_hash.rb +36 -0
- data/spec/unit/alf-engine/test_aggregate.rb +26 -0
- data/spec/unit/alf-engine/test_autonum.rb +24 -0
- data/spec/unit/alf-engine/test_clip.rb +34 -0
- data/spec/unit/alf-engine/test_coerce.rb +35 -0
- data/spec/unit/alf-engine/test_compact.rb +33 -0
- data/spec/unit/alf-engine/test_concat.rb +38 -0
- data/spec/unit/alf-engine/test_defaults.rb +37 -0
- data/spec/unit/alf-engine/test_filter.rb +23 -0
- data/spec/unit/alf-engine/test_generator.rb +25 -0
- data/spec/unit/alf-engine/test_infer_heading.rb +58 -0
- data/spec/unit/alf-engine/test_rename.rb +24 -0
- data/spec/unit/alf-engine/test_set_attr.rb +38 -0
- data/spec/unit/alf-engine/test_sort.rb +32 -0
- data/spec/unit/alf-engine/test_to_array.rb +44 -0
- data/spec/unit/alf-engine/test_type_safe.rb +33 -0
- data/spec/unit/alf-engine/test_ungroup.rb +28 -0
- data/spec/unit/alf-engine/test_unwrap.rb +20 -0
- data/spec/unit/alf-engine/test_wrap.rb +26 -0
- data/spec/unit/alf-io/reader/class/test_by_mime_type.rb +32 -0
- data/spec/unit/alf-io/reader/input.csv +3 -0
- data/spec/unit/alf-io/reader/input.rb +2 -0
- data/spec/unit/alf-io/reader/test_csv.rb +67 -0
- data/spec/unit/alf-io/reader/test_initialize.rb +74 -0
- data/spec/unit/alf-io/reader/test_json.rb +30 -0
- data/spec/unit/alf-io/reader/test_rash.rb +32 -0
- data/spec/unit/alf-io/renderer/class/test_by_mime_type.rb +30 -0
- data/spec/unit/alf-io/renderer/test_csv.rb +68 -0
- data/spec/unit/alf-io/renderer/test_initialize.rb +40 -0
- data/spec/unit/alf-io/renderer/test_json.rb +42 -0
- data/spec/unit/alf-io/renderer/test_rash.rb +36 -0
- data/spec/unit/alf-io/renderer/test_text.rb +47 -0
- data/spec/unit/alf-io/renderer/test_yaml.rb +22 -0
- data/spec/unit/alf-io/renderer/text/test_cell.rb +35 -0
- data/spec/unit/alf-io/renderer/text/test_row.rb +30 -0
- data/spec/unit/alf-io/renderer/text/test_table.rb +39 -0
- data/spec/unit/alf-io/shared_examples/a_reader_class.rb +19 -0
- data/spec/unit/alf-io/shared_examples/a_renderer_class.rb +24 -0
- data/spec/unit/alf-io/support/test_proc_io.rb +18 -0
- data/spec/unit/alf-io/test_reader.rb +36 -0
- data/spec/unit/alf-io/test_renderer.rb +43 -0
- data/spec/unit/alf-lang/functional/test_aggregation.rb +26 -0
- data/spec/unit/alf-lang/functional/test_relation.rb +21 -0
- data/spec/unit/alf-lang/functional/test_tuple.rb +21 -0
- data/spec/unit/alf-lang/lispy/test_connection_bang.rb +26 -0
- data/spec/unit/alf-lang/lispy/test_parse.rb +38 -0
- data/spec/unit/alf-lang/lispy/test_to_s.rb +14 -0
- data/spec/unit/alf-lang/object_oriented/test_rendering_methods.rb +38 -0
- data/spec/unit/alf-lang/object_oriented/test_to_array.rb +45 -0
- data/spec/unit/alf-lang/object_oriented/test_to_rash.rb +34 -0
- data/spec/unit/alf-lang/object_oriented/test_tuple_extract.rb +51 -0
- data/spec/unit/alf-lang/test_predicates.rb +17 -0
- data/spec/unit/alf-optimizer/optimizer/test_optimizer.rb +37 -0
- data/spec/unit/alf-optimizer/optimizer/test_search.rb +48 -0
- data/spec/unit/alf-optimizer/restrict/test_on_autonum.rb +41 -0
- data/spec/unit/alf-optimizer/restrict/test_on_coerce.rb +42 -0
- data/spec/unit/alf-optimizer/restrict/test_on_join.rb +107 -0
- data/spec/unit/alf-optimizer/restrict/test_on_matching.rb +41 -0
- data/spec/unit/alf-optimizer/shared/a_pass_through_expression_for_restrict.rb +36 -0
- data/spec/unit/alf-optimizer/shared/a_split_able_expression_for_restrict.rb +46 -0
- data/spec/unit/alf-optimizer/shared/an_optimizable_expression_for_restrict.rb +39 -0
- data/spec/unit/alf-optimizer/shared/an_unoptimizable_expression_for_restrict.rb +24 -0
- data/spec/unit/alf-optimizer/test_autonum.rb +12 -0
- data/spec/unit/alf-optimizer/test_clip.rb +10 -0
- data/spec/unit/alf-optimizer/test_coerce.rb +12 -0
- data/spec/unit/alf-optimizer/test_compact.rb +10 -0
- data/spec/unit/alf-optimizer/test_defaults.rb +12 -0
- data/spec/unit/alf-optimizer/test_extend.rb +12 -0
- data/spec/unit/alf-optimizer/test_generator.rb +9 -0
- data/spec/unit/alf-optimizer/test_group.rb +12 -0
- data/spec/unit/alf-optimizer/test_infer_heading.rb +9 -0
- data/spec/unit/alf-optimizer/test_intersect.rb +10 -0
- data/spec/unit/alf-optimizer/test_minus.rb +10 -0
- data/spec/unit/alf-optimizer/test_project.rb +10 -0
- data/spec/unit/alf-optimizer/test_quota.rb +16 -0
- data/spec/unit/alf-optimizer/test_rank.rb +12 -0
- data/spec/unit/alf-optimizer/test_rename.rb +19 -0
- data/spec/unit/alf-optimizer/test_sort.rb +10 -0
- data/spec/unit/alf-optimizer/test_summarize.rb +15 -0
- data/spec/unit/alf-optimizer/test_union.rb +10 -0
- data/spec/unit/alf-optimizer/test_wrap.rb +12 -0
- data/spec/unit/alf-predicate/expr/test_to_proc.rb +20 -0
- data/spec/unit/alf-predicate/expr/test_to_ruby_code.rb +154 -0
- data/spec/unit/alf-predicate/factory/shared/a_comparison_factory_method.rb +35 -0
- data/spec/unit/alf-predicate/factory/shared/a_predicate_ast_node.rb +20 -0
- data/spec/unit/alf-predicate/factory/test_and.rb +15 -0
- data/spec/unit/alf-predicate/factory/test_between.rb +14 -0
- data/spec/unit/alf-predicate/factory/test_comp.rb +37 -0
- data/spec/unit/alf-predicate/factory/test_contradiction.rb +13 -0
- data/spec/unit/alf-predicate/factory/test_eq.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_factor_predicate.rb +52 -0
- data/spec/unit/alf-predicate/factory/test_gt.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_gte.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_in.rb +14 -0
- data/spec/unit/alf-predicate/factory/test_literal.rb +15 -0
- data/spec/unit/alf-predicate/factory/test_lt.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_lte.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_native.rb +16 -0
- data/spec/unit/alf-predicate/factory/test_neq.rb +11 -0
- data/spec/unit/alf-predicate/factory/test_not.rb +15 -0
- data/spec/unit/alf-predicate/factory/test_or.rb +15 -0
- data/spec/unit/alf-predicate/factory/test_tautology.rb +14 -0
- data/spec/unit/alf-predicate/factory/test_var_ref.rb +15 -0
- data/spec/unit/alf-predicate/grammar/test_match.rb +95 -0
- data/spec/unit/alf-predicate/grammar/test_parse.rb +23 -0
- data/spec/unit/alf-predicate/grammar/test_sexpr.rb +105 -0
- data/spec/unit/alf-predicate/nodes/and/test_and_split.rb +68 -0
- data/spec/unit/alf-predicate/nodes/dyadic_comp/test_and_split.rb +47 -0
- data/spec/unit/alf-predicate/nodes/nadic_bool/test_free_variables.rb +16 -0
- data/spec/unit/alf-predicate/nodes/var_ref/test_and_split.rb +25 -0
- data/spec/unit/alf-predicate/nodes/var_ref/test_free_variables.rb +14 -0
- data/spec/unit/alf-predicate/nodes/var_ref/test_var_name.rb +14 -0
- data/spec/unit/alf-predicate/predicate/test_and_split.rb +59 -0
- data/spec/unit/alf-predicate/predicate/test_bool_and.rb +36 -0
- data/spec/unit/alf-predicate/predicate/test_bool_not.rb +70 -0
- data/spec/unit/alf-predicate/predicate/test_bool_or.rb +36 -0
- data/spec/unit/alf-predicate/predicate/test_coerce.rb +131 -0
- data/spec/unit/alf-predicate/predicate/test_constant_variables.rb +54 -0
- data/spec/unit/alf-predicate/predicate/test_contradiction.rb +28 -0
- data/spec/unit/alf-predicate/predicate/test_evaluate.rb +32 -0
- data/spec/unit/alf-predicate/predicate/test_factory_methods.rb +79 -0
- data/spec/unit/alf-predicate/predicate/test_free_variables.rb +16 -0
- data/spec/unit/alf-predicate/predicate/test_hash_and_equal.rb +28 -0
- data/spec/unit/alf-predicate/predicate/test_rename.rb +35 -0
- data/spec/unit/alf-predicate/predicate/test_tautology.rb +28 -0
- data/spec/unit/alf-predicate/predicate/test_to_proc.rb +16 -0
- data/spec/unit/alf-predicate/predicate/test_to_ruby_code.rb +16 -0
- data/spec/unit/alf-predicate/predicate/test_to_ruby_literal.rb +16 -0
- data/spec/unit/alf-predicate/test_predicate.rb +132 -0
- data/spec/unit/alf-relation/relation/class/test_coerce.rb +62 -0
- data/spec/unit/alf-relation/relation/class/test_type.rb +31 -0
- data/spec/unit/alf-relation/relation/factored-types/test_allbut.rb +34 -0
- data/spec/unit/alf-relation/relation/factored-types/test_coerce.rb +45 -0
- data/spec/unit/alf-relation/relation/factored-types/test_comparisons.rb +69 -0
- data/spec/unit/alf-relation/relation/factored-types/test_equality.rb +28 -0
- data/spec/unit/alf-relation/relation/factored-types/test_project.rb +34 -0
- data/spec/unit/alf-relation/relation/factored-types/test_rename.rb +12 -0
- data/spec/unit/alf-relation/relation/factored-types/test_split.rb +30 -0
- data/spec/unit/alf-relation/relation/factored-types/test_to_ruby_literal.rb +18 -0
- data/spec/unit/alf-relation/relation/factored-types/test_triple_equal.rb +42 -0
- data/spec/unit/alf-relation/relation/test_aggregation.rb +36 -0
- data/spec/unit/alf-relation/relation/test_equality.rb +34 -0
- data/spec/unit/alf-relation/relation/test_hash.rb +28 -0
- data/spec/unit/alf-relation/relation/test_heading.rb +17 -0
- data/spec/unit/alf-relation/relation/test_inspect.rb +20 -0
- data/spec/unit/alf-relation/relation/test_relation.rb +77 -0
- data/spec/unit/alf-relation/relation/test_relops.rb +62 -0
- data/spec/unit/alf-relation/relation/test_sugar.rb +40 -0
- data/spec/unit/alf-relation/relation/test_to_a.rb +37 -0
- data/spec/unit/alf-relation/relation/test_to_relation.rb +14 -0
- data/spec/unit/alf-relation/tuple/class/test_coerce.rb +29 -0
- data/spec/unit/alf-relation/tuple/class/test_type.rb +27 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_allbut.rb +34 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_coerce.rb +91 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_comparisons.rb +69 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_equality.rb +28 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_project.rb +34 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_rename.rb +12 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_split.rb +30 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_to_ruby_literal.rb +18 -0
- data/spec/unit/alf-relation/tuple/factored-types/test_triple_equal.rb +56 -0
- data/spec/unit/alf-relation/tuple/test_allbut.rb +14 -0
- data/spec/unit/alf-relation/tuple/test_attribute_accessors.rb +36 -0
- data/spec/unit/alf-relation/tuple/test_equality.rb +28 -0
- data/spec/unit/alf-relation/tuple/test_extend.rb +30 -0
- data/spec/unit/alf-relation/tuple/test_hash.rb +28 -0
- data/spec/unit/alf-relation/tuple/test_heading.rb +20 -0
- data/spec/unit/alf-relation/tuple/test_merge.rb +24 -0
- data/spec/unit/alf-relation/tuple/test_project.rb +18 -0
- data/spec/unit/alf-relation/tuple/test_remap.rb +14 -0
- data/spec/unit/alf-relation/tuple/test_rename.rb +14 -0
- data/spec/unit/alf-relation/tuple/test_split.rb +28 -0
- data/spec/unit/alf-relation/tuple/test_to_attr_list.rb +12 -0
- data/spec/unit/alf-relation/tuple/test_triple_equal.rb +17 -0
- data/spec/unit/alf-relvar/base/test_connection.rb +14 -0
- data/spec/unit/alf-relvar/base/test_delete.rb +35 -0
- data/spec/unit/alf-relvar/base/test_heading.rb +22 -0
- data/spec/unit/alf-relvar/base/test_insert.rb +23 -0
- data/spec/unit/alf-relvar/base/test_keys.rb +22 -0
- data/spec/unit/alf-relvar/base/test_lock.rb +22 -0
- data/spec/unit/alf-relvar/base/test_name.rb +14 -0
- data/spec/unit/alf-relvar/base/test_oo_lang.rb +28 -0
- data/spec/unit/alf-relvar/base/test_to_cog.rb +22 -0
- data/spec/unit/alf-relvar/base/test_to_lispy.rb +14 -0
- data/spec/unit/alf-relvar/base/test_to_relvar.rb +14 -0
- data/spec/unit/alf-relvar/base/test_to_s.rb +14 -0
- data/spec/unit/alf-relvar/base/test_update.rb +24 -0
- data/spec/unit/alf-relvar/read_only/test_type.rb +21 -0
- data/spec/unit/alf-relvar/shared/test_empty.rb +21 -0
- data/spec/unit/alf-relvar/shared/test_empty_bang.rb +31 -0
- data/spec/unit/alf-relvar/shared/test_not_empty_bang.rb +31 -0
- data/spec/unit/alf-relvar/shared/test_to_relation.rb +45 -0
- data/spec/unit/alf-relvar/shared/test_type.rb +21 -0
- data/spec/unit/alf-relvar/shared/test_upsert.rb +41 -0
- data/spec/unit/alf-relvar/virtual/test_connection.rb +14 -0
- data/spec/unit/alf-relvar/virtual/test_delete.rb +41 -0
- data/spec/unit/alf-relvar/virtual/test_expr.rb +14 -0
- data/spec/unit/alf-relvar/virtual/test_heading.rb +20 -0
- data/spec/unit/alf-relvar/virtual/test_insert.rb +28 -0
- data/spec/unit/alf-relvar/virtual/test_keys.rb +20 -0
- data/spec/unit/alf-relvar/virtual/test_oo_lang.rb +29 -0
- data/spec/unit/alf-relvar/virtual/test_to_cog.rb +18 -0
- data/spec/unit/alf-relvar/virtual/test_to_lispy.rb +20 -0
- data/spec/unit/alf-relvar/virtual/test_to_relvar.rb +14 -0
- data/spec/unit/alf-relvar/virtual/test_to_s.rb +15 -0
- data/spec/unit/alf-relvar/virtual/test_update.rb +29 -0
- data/spec/unit/alf-support/bindable/test_bind.rb +60 -0
- data/spec/unit/alf-support/bindable/test_bound.rb +31 -0
- data/spec/unit/alf-support/bindable/test_connection.rb +31 -0
- data/spec/unit/alf-support/bindable/test_connection_bang.rb +35 -0
- data/spec/unit/alf-support/config/test_helpers.rb +33 -0
- data/spec/unit/alf-support/config/test_merge.rb +34 -0
- data/spec/unit/alf-support/config/test_new.rb +52 -0
- data/spec/unit/alf-support/config/test_option.rb +27 -0
- data/spec/unit/alf-support/scope/test_branch.rb +28 -0
- data/spec/unit/alf-support/scope/test_evaluate.rb +42 -0
- data/spec/unit/alf-support/scope/test_initialize.rb +20 -0
- data/spec/unit/alf-support/scope/test_respond_to.rb +33 -0
- data/spec/unit/alf-support/test_class_name.rb +16 -0
- data/spec/unit/alf-support/test_coerce.rb +24 -0
- data/spec/unit/alf-support/test_registry.rb +63 -0
- data/spec/unit/alf-support/test_ruby_case.rb +16 -0
- data/spec/unit/alf-support/test_rubycase_name.rb +24 -0
- data/spec/unit/alf-support/test_symbolize_keys.rb +24 -0
- data/spec/unit/alf-support/test_to_lispy.rb +142 -0
- data/spec/unit/alf-support/test_to_ruby_literal.rb +26 -0
- data/spec/unit/alf-support/test_to_tuple.rb +29 -0
- data/spec/unit/alf-support/test_tuple_scope.rb +35 -0
- data/spec/unit/alf-support/test_unsymbolize_keys.rb +24 -0
- data/spec/unit/alf-support/tuple_scope/test_evaluate.rb +37 -0
- data/spec/unit/alf-support/tuple_scope/test_respond_to.rb +34 -0
- data/spec/unit/alf-types/attr_list/test_allbut.rb +28 -0
- data/spec/unit/alf-types/attr_list/test_ampersand.rb +20 -0
- data/spec/unit/alf-types/attr_list/test_coerce.rb +68 -0
- data/spec/unit/alf-types/attr_list/test_difference.rb +20 -0
- data/spec/unit/alf-types/attr_list/test_hash_and_eql.rb +47 -0
- data/spec/unit/alf-types/attr_list/test_include.rb +22 -0
- data/spec/unit/alf-types/attr_list/test_intersect.rb +36 -0
- data/spec/unit/alf-types/attr_list/test_or.rb +20 -0
- data/spec/unit/alf-types/attr_list/test_project.rb +52 -0
- data/spec/unit/alf-types/attr_list/test_project_tuple.rb +31 -0
- data/spec/unit/alf-types/attr_list/test_sameset.rb +36 -0
- data/spec/unit/alf-types/attr_list/test_set_compare.rb +59 -0
- data/spec/unit/alf-types/attr_list/test_split_tuple.rb +31 -0
- data/spec/unit/alf-types/attr_list/test_subset.rb +50 -0
- data/spec/unit/alf-types/attr_list/test_superset.rb +50 -0
- data/spec/unit/alf-types/attr_list/test_to_a.rb +14 -0
- data/spec/unit/alf-types/attr_list/test_to_ordering.rb +19 -0
- data/spec/unit/alf-types/attr_name/test_coerce.rb +16 -0
- data/spec/unit/alf-types/attr_name/test_triple_equal.rb +27 -0
- data/spec/unit/alf-types/heading/class/test_coerce.rb +40 -0
- data/spec/unit/alf-types/heading/class/test_infer.rb +26 -0
- data/spec/unit/alf-types/heading/test_allbut.rb +12 -0
- data/spec/unit/alf-types/heading/test_cardinality.rb +25 -0
- data/spec/unit/alf-types/heading/test_coerce.rb +57 -0
- data/spec/unit/alf-types/heading/test_comparison.rb +96 -0
- data/spec/unit/alf-types/heading/test_intersection.rb +29 -0
- data/spec/unit/alf-types/heading/test_merge.rb +25 -0
- data/spec/unit/alf-types/heading/test_project.rb +20 -0
- data/spec/unit/alf-types/heading/test_split.rb +20 -0
- data/spec/unit/alf-types/heading/test_to_h.rb +24 -0
- data/spec/unit/alf-types/heading/test_triple_equal.rb +40 -0
- data/spec/unit/alf-types/heading/test_union.rb +33 -0
- data/spec/unit/alf-types/keys/test_all.rb +17 -0
- data/spec/unit/alf-types/keys/test_ampersand.rb +26 -0
- data/spec/unit/alf-types/keys/test_any.rb +17 -0
- data/spec/unit/alf-types/keys/test_coerce.rb +64 -0
- data/spec/unit/alf-types/keys/test_compact.rb +21 -0
- data/spec/unit/alf-types/keys/test_empty.rb +20 -0
- data/spec/unit/alf-types/keys/test_first.rb +17 -0
- data/spec/unit/alf-types/keys/test_hash_and_equal.rb +33 -0
- data/spec/unit/alf-types/keys/test_if_empty.rb +40 -0
- data/spec/unit/alf-types/keys/test_map.rb +17 -0
- data/spec/unit/alf-types/keys/test_plus.rb +26 -0
- data/spec/unit/alf-types/keys/test_project.rb +29 -0
- data/spec/unit/alf-types/keys/test_reject.rb +17 -0
- data/spec/unit/alf-types/keys/test_rename.rb +21 -0
- data/spec/unit/alf-types/keys/test_select.rb +17 -0
- data/spec/unit/alf-types/ordering/test_coerce.rb +53 -0
- data/spec/unit/alf-types/ordering/test_compare.rb +29 -0
- data/spec/unit/alf-types/ordering/test_plus.rb +27 -0
- data/spec/unit/alf-types/ordering/test_sorter.rb +16 -0
- data/spec/unit/alf-types/ordering/test_to_attr_list.rb +14 -0
- data/spec/unit/alf-types/renaming/test_coerce.rb +24 -0
- data/spec/unit/alf-types/renaming/test_complete.rb +14 -0
- data/spec/unit/alf-types/renaming/test_invert.rb +14 -0
- data/spec/unit/alf-types/renaming/test_rename_attr_list.rb +24 -0
- data/spec/unit/alf-types/renaming/test_rename_tuple.rb +14 -0
- data/spec/unit/alf-types/renaming/test_to_attr_list.rb +14 -0
- data/spec/unit/alf-types/size/test_coerce.rb +23 -0
- data/spec/unit/alf-types/size/test_triple_equal.rb +25 -0
- data/spec/unit/alf-types/summarization/test_coerce.rb +31 -0
- data/spec/unit/alf-types/summarization/test_least.rb +11 -0
- data/spec/unit/alf-types/summarization/test_summarize.rb +15 -0
- data/spec/unit/alf-types/test_attr_list.rb +18 -0
- data/spec/unit/alf-types/test_class_methods.rb +59 -0
- data/spec/unit/alf-types/test_heading.rb +59 -0
- data/spec/unit/alf-types/test_ordering.rb +18 -0
- data/spec/unit/alf-types/test_renaming.rb +18 -0
- data/spec/unit/alf-types/test_summarization.rb +25 -0
- data/spec/unit/alf-types/test_tuple_computation.rb +28 -0
- data/spec/unit/alf-types/test_tuple_expression.rb +17 -0
- data/spec/unit/alf-types/tuple_computation/test_coerce.rb +54 -0
- data/spec/unit/alf-types/tuple_computation/test_to_attr_list.rb +15 -0
- data/spec/unit/alf-types/tuple_computation/test_to_heading.rb +29 -0
- data/spec/unit/alf-types/tuple_expression/test_coerce.rb +44 -0
- data/spec/unit/alf-types/tuple_expression/test_to_ruby_literal.rb +16 -0
- data/spec/unit/alf-types/type_check/test_triple_equal.rb +58 -0
- data/spec/unit/alf-update/deleter/test_autonum.rb +31 -0
- data/spec/unit/alf-update/deleter/test_clip.rb +18 -0
- data/spec/unit/alf-update/deleter/test_defaults.rb +31 -0
- data/spec/unit/alf-update/deleter/test_extend.rb +31 -0
- data/spec/unit/alf-update/deleter/test_group.rb +31 -0
- data/spec/unit/alf-update/deleter/test_intersect.rb +21 -0
- data/spec/unit/alf-update/deleter/test_project.rb +18 -0
- data/spec/unit/alf-update/deleter/test_rank.rb +31 -0
- data/spec/unit/alf-update/deleter/test_rename.rb +31 -0
- data/spec/unit/alf-update/deleter/test_restrict.rb +20 -0
- data/spec/unit/alf-update/deleter/test_sort.rb +18 -0
- data/spec/unit/alf-update/deleter/test_var_ref.rb +19 -0
- data/spec/unit/alf-update/deleter/test_wrap.rb +31 -0
- data/spec/unit/alf-update/inserter/test_autonum.rb +19 -0
- data/spec/unit/alf-update/inserter/test_clip.rb +21 -0
- data/spec/unit/alf-update/inserter/test_compact.rb +19 -0
- data/spec/unit/alf-update/inserter/test_defaults.rb +19 -0
- data/spec/unit/alf-update/inserter/test_extend.rb +19 -0
- data/spec/unit/alf-update/inserter/test_group.rb +26 -0
- data/spec/unit/alf-update/inserter/test_intersect.rb +22 -0
- data/spec/unit/alf-update/inserter/test_join.rb +21 -0
- data/spec/unit/alf-update/inserter/test_matching.rb +19 -0
- data/spec/unit/alf-update/inserter/test_minus.rb +19 -0
- data/spec/unit/alf-update/inserter/test_not_matching.rb +19 -0
- data/spec/unit/alf-update/inserter/test_project.rb +21 -0
- data/spec/unit/alf-update/inserter/test_rank.rb +19 -0
- data/spec/unit/alf-update/inserter/test_rename.rb +19 -0
- data/spec/unit/alf-update/inserter/test_restrict.rb +19 -0
- data/spec/unit/alf-update/inserter/test_sort.rb +19 -0
- data/spec/unit/alf-update/inserter/test_type_safe.rb +72 -0
- data/spec/unit/alf-update/inserter/test_union.rb +22 -0
- data/spec/unit/alf-update/inserter/test_var_ref.rb +18 -0
- data/spec/unit/alf-update/inserter/test_wrap.rb +25 -0
- data/spec/unit/alf-update/updater/test_var_ref.rb +19 -0
- data/spec/unit/alf-viewpoint/test_namespace.rb +23 -0
- data/spec/unit/alf-viewpoint/test_native.rb +26 -0
- data/spec/unit/alf-viewpoint/test_native_const.rb +16 -0
- data/spec/unit/alf-viewpoint/test_parse.rb +36 -0
- data/spec/unit/alf-viewpoint/test_parser.rb +22 -0
- data/spec/update_helper.rb +69 -0
- data/tasks/clean.rake +3 -0
- data/tasks/gem.rake +73 -0
- data/tasks/gh-pages.rake +69 -0
- data/tasks/integration_test.rake +43 -0
- data/tasks/regression_test.rake +44 -0
- data/tasks/unit_test.rake +44 -0
- data/tasks/yard.rake +51 -0
- metadata +1544 -0
data/examples/readme.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'alf'
|
2
|
+
|
3
|
+
db = Alf.examples
|
4
|
+
|
5
|
+
grouped = db.query{
|
6
|
+
group(suppliers, [:sid, :name, :status], :in_that_city)
|
7
|
+
}
|
8
|
+
puts grouped
|
9
|
+
|
10
|
+
grouped2 = db.query{
|
11
|
+
extend(grouped, how_many: ->{ in_that_city.count },
|
12
|
+
avg_status: ->{ in_that_city.avg{ status } })
|
13
|
+
}
|
14
|
+
puts grouped2
|
15
|
+
|
16
|
+
summarized = db.query{
|
17
|
+
summary = summarize(suppliers, [:city], how_many: count{ sid }, avg_status: avg{ status })
|
18
|
+
join(grouped, summary)
|
19
|
+
}
|
20
|
+
puts summarized
|
21
|
+
|
22
|
+
require 'json'
|
23
|
+
puts summarized.to_json
|
@@ -0,0 +1,6 @@
|
|
1
|
+
{:pid => 'P1', :name => 'Nut', :color => 'Red', :weight => 12.0, :city => 'London'}
|
2
|
+
{:pid => 'P2', :name => 'Bolt', :color => 'Green', :weight => 17.0, :city => 'Paris'}
|
3
|
+
{:pid => 'P3', :name => 'Screw', :color => 'Blue', :weight => 17.0, :city => 'Oslo'}
|
4
|
+
{:pid => 'P4', :name => 'Screw', :color => 'Red', :weight => 14.0, :city => 'London'}
|
5
|
+
{:pid => 'P5', :name => 'Cam', :color => 'Blue', :weight => 12.0, :city => 'Paris'}
|
6
|
+
{:pid => 'P6', :name => 'Cog', :color => 'Red', :weight => 19.0, :city => 'London'}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
{:sid => 'S1', :name => 'Smith', :status => 20, :city => 'London'}
|
2
|
+
{:sid => 'S2', :name => 'Jones', :status => 10, :city => 'Paris'}
|
3
|
+
{:sid => 'S3', :name => 'Blake', :status => 30, :city => 'Paris'}
|
4
|
+
{:sid => 'S4', :name => 'Clark', :status => 20, :city => 'London'}
|
5
|
+
{:sid => 'S5', :name => 'Adams', :status => 30, :city => 'Athens'}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{:sid => 'S1', :pid => 'P1', :qty => 300}
|
2
|
+
{:sid => 'S1', :pid => 'P2', :qty => 200}
|
3
|
+
{:sid => 'S1', :pid => 'P3', :qty => 400}
|
4
|
+
{:sid => 'S1', :pid => 'P4', :qty => 200}
|
5
|
+
{:sid => 'S1', :pid => 'P5', :qty => 100}
|
6
|
+
{:sid => 'S1', :pid => 'P6', :qty => 100}
|
7
|
+
{:sid => 'S2', :pid => 'P1', :qty => 300}
|
8
|
+
{:sid => 'S2', :pid => 'P2', :qty => 400}
|
9
|
+
{:sid => 'S3', :pid => 'P2', :qty => 200}
|
10
|
+
{:sid => 'S4', :pid => 'P2', :qty => 200}
|
11
|
+
{:sid => 'S4', :pid => 'P4', :qty => 300}
|
12
|
+
{:sid => 'S4', :pid => 'P5', :qty => 400}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Alf
|
2
|
+
class Adapter
|
3
|
+
class Folder < Adapter
|
4
|
+
|
5
|
+
# (see Connection.recognizes?)
|
6
|
+
#
|
7
|
+
# @return [Boolean] true if args contains one String only, which denotes
|
8
|
+
# an existing folder; false otherwise
|
9
|
+
def self.recognizes?(conn_spec)
|
10
|
+
Path.like?(conn_spec) && Path(conn_spec).directory?
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a connection on the underlying folder
|
14
|
+
def connection
|
15
|
+
Folder::Connection.new(Path(conn_spec))
|
16
|
+
end
|
17
|
+
|
18
|
+
Adapter.register(:folder, self)
|
19
|
+
end # class Folder
|
20
|
+
end # class Adapter
|
21
|
+
end # module Alf
|
22
|
+
require_relative 'folder/connection'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Alf
|
2
|
+
class Adapter
|
3
|
+
class Folder
|
4
|
+
class Connection < Adapter::Connection
|
5
|
+
|
6
|
+
alias :folder :conn_spec
|
7
|
+
|
8
|
+
# Returns true if `name` is known, false otherwise.
|
9
|
+
def knows?(name)
|
10
|
+
!find_file(name).nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a cog for `name`
|
14
|
+
def cog(name)
|
15
|
+
if f = find_file(name)
|
16
|
+
Reader.reader(find_file(name))
|
17
|
+
else
|
18
|
+
raise NoSuchRelvarError, "Unable to find a file for #{name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
# Finds a specific file by name
|
25
|
+
#
|
26
|
+
# @param [String] name the name of a dataset
|
27
|
+
# @return [Path] path to an existing file if it exists, nil otherwise.
|
28
|
+
def find_file(name)
|
29
|
+
if (explicit = folder/name.to_s).file?
|
30
|
+
explicit
|
31
|
+
else
|
32
|
+
folder.glob("#{name}.*").find{|f| f.file?}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end # class Connection
|
37
|
+
end # class Folder
|
38
|
+
end # class Adapter
|
39
|
+
end # module Alf
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'folder'
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Alf
|
2
|
+
class Adapter
|
3
|
+
|
4
|
+
class << self
|
5
|
+
include Support::Registry
|
6
|
+
|
7
|
+
# Register an adapter class under a specific name.
|
8
|
+
#
|
9
|
+
# Registered class must implement a recognizes? method that takes an array of
|
10
|
+
# arguments; it must returns true if an adapter instance can be built using those
|
11
|
+
# arguments, false otherwise.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# Adapter.register(:sqlite, MySQLiteAdapterClass)
|
16
|
+
# Adapter.sqlite(...) # MySQLiteAdapterClass.new(...)
|
17
|
+
# Adapter.autodetect(...) # => MySQLiteAdapterClass.new(...)
|
18
|
+
#
|
19
|
+
# @see also autodetect and recognizes?
|
20
|
+
# @param [Symbol] name name of the connection kind
|
21
|
+
# @param [Class] clazz class that implemented the connection
|
22
|
+
def register(name, clazz)
|
23
|
+
super([name, clazz], Adapter)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Auto-detect the connection class to use for specific arguments.
|
27
|
+
#
|
28
|
+
# This method returns an instance of the first registered Connection class that returns
|
29
|
+
# true to an invocation of recognizes?(args). It raises an ArgumentError if no such
|
30
|
+
# class can be found.
|
31
|
+
#
|
32
|
+
# @param [Object] conn_spec a connection specification
|
33
|
+
# @return [Class] the first registered class that recognizes `conn_spec`
|
34
|
+
# @raise [ArgumentError] when no registered class recognizes the arguments
|
35
|
+
def autodetect(conn_spec)
|
36
|
+
name, clazz = registered.find{|nc| nc.last.recognizes?(conn_spec) }
|
37
|
+
unless clazz
|
38
|
+
raise ArgumentError, "No adapter for `#{conn_spec.inspect}`"
|
39
|
+
end
|
40
|
+
clazz
|
41
|
+
end
|
42
|
+
|
43
|
+
# Builds an adapter instance through the autodetection adapter mechanism.
|
44
|
+
#
|
45
|
+
# @param [Hash] conn_spec a connection specification
|
46
|
+
# @param [Module] schema a module for scope definition
|
47
|
+
# @return [Adapter] an adapter instance
|
48
|
+
def factor(conn_spec)
|
49
|
+
return conn_spec if conn_spec.is_a?(Adapter)
|
50
|
+
autodetect(conn_spec).new(conn_spec)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns true if _args_ can be used for get an adapter instance, false otherwise.
|
54
|
+
#
|
55
|
+
# When returning true, an immediate invocation of new(*args) should succeed. While
|
56
|
+
# runtime exception are admitted (no such connection, for example), argument errors
|
57
|
+
# should not occur (missing argument, wrong typing, etc.).
|
58
|
+
#
|
59
|
+
# Please be specific in the implementation of this extension point, as registered
|
60
|
+
# adapters for a chain and each of them should have a chance of being selected.
|
61
|
+
#
|
62
|
+
# @param [Array] args arguments for the Adapter constructor
|
63
|
+
# @return [Boolean] true if an adapter may be built using `args`,
|
64
|
+
# false otherwise.
|
65
|
+
def recognizes?(args)
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end # class << self
|
69
|
+
|
70
|
+
# The connection specification
|
71
|
+
attr_reader :conn_spec
|
72
|
+
|
73
|
+
# Creates an adapter instance.
|
74
|
+
#
|
75
|
+
# @param [Object] conn_spec a connection specification.
|
76
|
+
def initialize(conn_spec)
|
77
|
+
@conn_spec = conn_spec
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns a low-level connection on this adapter
|
81
|
+
def connection
|
82
|
+
Connection.new(conn_spec)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Yields the block with a connection and closes it afterwards
|
86
|
+
def connect
|
87
|
+
c = connection
|
88
|
+
yield(c)
|
89
|
+
ensure
|
90
|
+
c.close if c
|
91
|
+
end
|
92
|
+
|
93
|
+
end # class Adapter
|
94
|
+
end # module Alf
|
95
|
+
require_relative 'adapter/connection'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Alf
|
2
|
+
class Adapter
|
3
|
+
class Connection
|
4
|
+
|
5
|
+
def initialize(conn_spec)
|
6
|
+
@conn_spec = conn_spec
|
7
|
+
end
|
8
|
+
attr_reader :conn_spec
|
9
|
+
|
10
|
+
### connection, transaction, locks
|
11
|
+
|
12
|
+
# Yields the block in a transaction
|
13
|
+
def in_transaction(opts = {})
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
|
17
|
+
# Closes the connection
|
18
|
+
def close
|
19
|
+
@closed = true
|
20
|
+
end
|
21
|
+
|
22
|
+
# Checks whether the connection is closed
|
23
|
+
def closed?
|
24
|
+
defined?(@closed) && @closed
|
25
|
+
end
|
26
|
+
|
27
|
+
### schema methods
|
28
|
+
|
29
|
+
# Returns true if `name` is known, false otherwise.
|
30
|
+
def knows?(name)
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the heading of a given named variable
|
35
|
+
def heading(name)
|
36
|
+
raise NotSupportedError, "Unable to serve heading of `#{name}` in `#{self}`"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the keys of a given named variable
|
40
|
+
def keys(name)
|
41
|
+
raise NotSupportedError, "Unable to serve keys of `#{name}` in `#{self}`"
|
42
|
+
end
|
43
|
+
|
44
|
+
# Migrate the undelrying database according to adapter semantics.
|
45
|
+
def migrate!(opts)
|
46
|
+
raise NotSupportedError, "Unable to migrate using `#{self}`"
|
47
|
+
end
|
48
|
+
|
49
|
+
### read-only methods
|
50
|
+
|
51
|
+
# Returns a cog for a given name
|
52
|
+
def cog(name)
|
53
|
+
raise NotSupportedError, "Unable to serve cog `#{name}` in `#{self}`"
|
54
|
+
end
|
55
|
+
|
56
|
+
### update methods
|
57
|
+
|
58
|
+
# Locks the table with name `name`
|
59
|
+
def lock(name, mode)
|
60
|
+
yield
|
61
|
+
end
|
62
|
+
|
63
|
+
# Inserts `tuples` in the relvar called `name`
|
64
|
+
def insert(name, tuples)
|
65
|
+
raise NotSupportedError, "Unable to insert in `#{self}`"
|
66
|
+
end
|
67
|
+
|
68
|
+
# Delete from the relvar called `name`
|
69
|
+
def delete(name, predicate)
|
70
|
+
raise NotSupportedError, "Unable to delete in `#{self}`"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Updates the relvar called `name`
|
74
|
+
def update(name, computation, predicate)
|
75
|
+
raise NotSupportedError, "Unable to update in `#{self}`"
|
76
|
+
end
|
77
|
+
|
78
|
+
### compilation chain
|
79
|
+
|
80
|
+
# Returns a compiler instance
|
81
|
+
def compiler
|
82
|
+
Engine::Compiler.new
|
83
|
+
end
|
84
|
+
|
85
|
+
end # class Connection
|
86
|
+
end # class Adapter
|
87
|
+
end # module Alf
|
88
|
+
require_relative 'connection/schema_cached'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Alf
|
2
|
+
class Adapter
|
3
|
+
class Connection
|
4
|
+
class SchemaCached < Connection
|
5
|
+
|
6
|
+
def self.empty_cache
|
7
|
+
Hash.new{|h,k| h[k] = {}}
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(connection, cache = nil)
|
11
|
+
@connection = connection
|
12
|
+
@cache = cache || SchemaCached.empty_cache
|
13
|
+
end
|
14
|
+
|
15
|
+
Connection.instance_methods(false).each do |meth|
|
16
|
+
define_method(meth) do |*args, &bl|
|
17
|
+
@connection.send(meth, *args, &bl)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
[ :knows?, :heading, :keys ].each do |meth|
|
22
|
+
define_method(meth) do |name|
|
23
|
+
@cache[meth][name] ||= @connection.send(meth, name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
"#{@connection.to_s} (with cache)"
|
29
|
+
end
|
30
|
+
|
31
|
+
end # class SchemaCached
|
32
|
+
end # class Connection
|
33
|
+
end # class Database
|
34
|
+
end # module Alf
|
@@ -0,0 +1,223 @@
|
|
1
|
+
module Alf
|
2
|
+
#
|
3
|
+
# Aggregation operator.
|
4
|
+
#
|
5
|
+
# This class provides a basis for implementing aggregation operators. It should always
|
6
|
+
# be used as a superclass for such implementations.
|
7
|
+
#
|
8
|
+
# Aggregation operators are made available through factory methods on the
|
9
|
+
# Aggregator class itself:
|
10
|
+
#
|
11
|
+
# Aggregator.count
|
12
|
+
# Aggregator.sum{ qty }
|
13
|
+
#
|
14
|
+
# The coercion method should always be used for building aggregators from
|
15
|
+
# lispy source code:
|
16
|
+
#
|
17
|
+
# Aggregator.coerce("count")
|
18
|
+
# Aggregator.coerce("sum{ qty }")
|
19
|
+
#
|
20
|
+
# Once built, aggregators can be used either in black-box or white-box modes.
|
21
|
+
#
|
22
|
+
# relation = ...
|
23
|
+
# agg = Aggregator.sum{ qty }
|
24
|
+
#
|
25
|
+
# # Black box mode:
|
26
|
+
# result = agg.aggregate(relation)
|
27
|
+
#
|
28
|
+
# # White box mode:
|
29
|
+
# memo = agg.least
|
30
|
+
# relation.each do |tuple|
|
31
|
+
# memo = agg.happens(memo, tuple)
|
32
|
+
# end
|
33
|
+
# result = agg.finalize(memo)
|
34
|
+
#
|
35
|
+
class Aggregator
|
36
|
+
|
37
|
+
#
|
38
|
+
# Class-level utilities of Alf's aggregators.
|
39
|
+
#
|
40
|
+
# Subclasses of Aggregator are automatically tracked so as to add
|
41
|
+
# factory methods on the Aggregator class itself. Example:
|
42
|
+
#
|
43
|
+
# class Sum < Aggregator # will give a method Aggregator.sum
|
44
|
+
# ...
|
45
|
+
# end
|
46
|
+
# Aggregator.sum{ size }
|
47
|
+
#
|
48
|
+
# All registered aggregators are available under `Aggregator.aggregators`
|
49
|
+
# Those aggregators may also be iterated as follows:
|
50
|
+
#
|
51
|
+
# Alf::Aggregator.each do |agg_class|
|
52
|
+
#
|
53
|
+
# # agg_class is a subclass of Aggregator
|
54
|
+
#
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
class << self
|
58
|
+
include Support::Registry
|
59
|
+
|
60
|
+
# Automatically installs factory methods for inherited classes.
|
61
|
+
#
|
62
|
+
# @param [Class] clazz a class that extends Aggregator
|
63
|
+
def inherited(clazz)
|
64
|
+
register(clazz, Aggregator)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Coerces `arg` to an Aggregator
|
68
|
+
#
|
69
|
+
# Implemented coercions are:
|
70
|
+
# - Aggregator -> self
|
71
|
+
# - String -> through factory methods on self
|
72
|
+
#
|
73
|
+
# @param [Object] arg a value to coerce to an aggregator
|
74
|
+
# @return [Aggregator] the coerced aggregator
|
75
|
+
# @raise [ArgumentError] if the coercion fails
|
76
|
+
def coerce(arg)
|
77
|
+
case arg
|
78
|
+
when Aggregator
|
79
|
+
arg
|
80
|
+
when String
|
81
|
+
agg = instance_eval(arg)
|
82
|
+
agg.source = arg
|
83
|
+
agg
|
84
|
+
else
|
85
|
+
raise ArgumentError, "Invalid arg `arg` for Aggregator()"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end # class << self
|
89
|
+
|
90
|
+
# @return [Hash] Aggregation options
|
91
|
+
attr_reader :options
|
92
|
+
|
93
|
+
# @return [TupleExpression] the underlying functor
|
94
|
+
attr_reader :functor
|
95
|
+
|
96
|
+
# @return [String] source code of the aggregator, if any
|
97
|
+
attr_accessor :source
|
98
|
+
|
99
|
+
# Creates an Aggregator instance.
|
100
|
+
#
|
101
|
+
# Example:
|
102
|
+
#
|
103
|
+
# Aggregator.new{ size * price }
|
104
|
+
#
|
105
|
+
def initialize(options = {}, &block)
|
106
|
+
options, block = {}, options if options.is_a?(Symbol) && block.nil?
|
107
|
+
@options = default_options.merge(options)
|
108
|
+
@functor = Support.coerce(block, TupleExpression)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns the default options to use
|
112
|
+
#
|
113
|
+
# @return [Hash] the default aggregation options
|
114
|
+
def default_options
|
115
|
+
{}
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the least value, which is the one to use on an empty
|
119
|
+
# set.
|
120
|
+
#
|
121
|
+
# This method is intended to be overriden by subclasses; default
|
122
|
+
# implementation returns nil.
|
123
|
+
#
|
124
|
+
# @return [Object] the least value for this aggregator
|
125
|
+
def least
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
|
129
|
+
# This method is called on each aggregated tuple and must return
|
130
|
+
# an updated _memo_ value. It can be seen as the block typically
|
131
|
+
# given to Enumerable.inject.
|
132
|
+
#
|
133
|
+
# The default implementation collects the pre-value on the tuple
|
134
|
+
# and delegates to _happens.
|
135
|
+
#
|
136
|
+
# @param [Object] memo the current aggregation value
|
137
|
+
# @param [Support::TupleScope] a tuple scope bound to the current tuple
|
138
|
+
# @return [Object] updated memo value
|
139
|
+
def happens(memo, scope)
|
140
|
+
raise unless Support::TupleScope===scope
|
141
|
+
_happens(memo, @functor.evaluate(scope))
|
142
|
+
end
|
143
|
+
|
144
|
+
# This method finalizes an aggregation.
|
145
|
+
#
|
146
|
+
# Argument _memo_ is either _least_ or the result of aggregating
|
147
|
+
# through _happens_. The default implementation simply returns
|
148
|
+
# _memo_. The method is intended to be overriden for complex
|
149
|
+
# aggregations that need statefull information such as `avg`.
|
150
|
+
#
|
151
|
+
# @param [Object] memo the current aggregation value
|
152
|
+
# @return [Object] the aggregation value, as finalized
|
153
|
+
def finalize(memo)
|
154
|
+
memo
|
155
|
+
end
|
156
|
+
|
157
|
+
# Aggregates over an enumeration of tuples.
|
158
|
+
#
|
159
|
+
# @param [Enumerable<Tuple>] an enumerable of tuples
|
160
|
+
# @return [Object] the computed aggregation value
|
161
|
+
def aggregate(enum)
|
162
|
+
scope = Support::TupleScope.new
|
163
|
+
finalize(enum.inject(least){|m,t| happens(m, scope.__set_tuple(t))})
|
164
|
+
end
|
165
|
+
|
166
|
+
# Infers the resulting type from expression source code
|
167
|
+
def infer_type
|
168
|
+
Object
|
169
|
+
end
|
170
|
+
|
171
|
+
# Asserts that this aggregator knows its source code or raises a
|
172
|
+
# NotImplementedError.
|
173
|
+
#
|
174
|
+
# @return [String] the source code when known
|
175
|
+
def has_source_code!
|
176
|
+
if source.nil?
|
177
|
+
raise NotImplementedError, "No known source code for this aggregator"
|
178
|
+
else
|
179
|
+
source
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Returns a lispy expression
|
184
|
+
#
|
185
|
+
# @return [String] a lispy expression for this aggregator
|
186
|
+
def to_lispy
|
187
|
+
has_source_code!
|
188
|
+
rescue NotImplementedError
|
189
|
+
"[lispy code unavailable]"
|
190
|
+
end
|
191
|
+
|
192
|
+
# Checks equality with another aggregator
|
193
|
+
#
|
194
|
+
# @param [Aggregator] other another aggregator
|
195
|
+
# @return [Boolean] true is self and other are equal, false otherwise
|
196
|
+
def ==(other)
|
197
|
+
return false unless other.is_a?(Aggregator)
|
198
|
+
has_source_code! == other.has_source_code!
|
199
|
+
rescue NotImplementedError
|
200
|
+
super
|
201
|
+
end
|
202
|
+
|
203
|
+
protected
|
204
|
+
|
205
|
+
# @see happens.
|
206
|
+
#
|
207
|
+
# This method is intended to be overriden and returns _value_
|
208
|
+
# by default, making this aggregator a "Last(...)" aggregator.
|
209
|
+
def _happens(memo, value)
|
210
|
+
value
|
211
|
+
end
|
212
|
+
|
213
|
+
end # class Aggregator
|
214
|
+
end # module Alf
|
215
|
+
require_relative 'aggregator/count'
|
216
|
+
require_relative 'aggregator/sum'
|
217
|
+
require_relative 'aggregator/min'
|
218
|
+
require_relative 'aggregator/max'
|
219
|
+
require_relative 'aggregator/avg'
|
220
|
+
require_relative 'aggregator/variance'
|
221
|
+
require_relative 'aggregator/stddev'
|
222
|
+
require_relative 'aggregator/collect'
|
223
|
+
require_relative 'aggregator/concat'
|