axiom-optimizer 0.1.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.
- checksums.yaml +7 -0
- data/.gemtest +0 -0
- data/.gitignore +37 -0
- data/.rspec +4 -0
- data/.rvmrc +1 -0
- data/.travis.yml +35 -0
- data/CONTRIBUTING.md +11 -0
- data/Gemfile +10 -0
- data/Gemfile.devtools +57 -0
- data/Guardfile +23 -0
- data/LICENSE +20 -0
- data/README.md +111 -0
- data/Rakefile +5 -0
- data/TODO +144 -0
- data/axiom-optimizer.gemspec +25 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +3 -0
- data/config/reek.yml +162 -0
- data/config/roodi.yml +16 -0
- data/config/yardstick.yml +2 -0
- data/lib/axiom-optimizer.rb +3 -0
- data/lib/axiom/optimizer.rb +168 -0
- data/lib/axiom/optimizer/aggregate.rb +16 -0
- data/lib/axiom/optimizer/aggregate/count.rb +17 -0
- data/lib/axiom/optimizer/aggregate/maximum.rb +17 -0
- data/lib/axiom/optimizer/aggregate/mean.rb +17 -0
- data/lib/axiom/optimizer/aggregate/minimum.rb +17 -0
- data/lib/axiom/optimizer/aggregate/standard_deviation.rb +17 -0
- data/lib/axiom/optimizer/aggregate/sum.rb +17 -0
- data/lib/axiom/optimizer/aggregate/variance.rb +17 -0
- data/lib/axiom/optimizer/algebra/difference.rb +68 -0
- data/lib/axiom/optimizer/algebra/extension.rb +97 -0
- data/lib/axiom/optimizer/algebra/intersection.rb +68 -0
- data/lib/axiom/optimizer/algebra/join.rb +184 -0
- data/lib/axiom/optimizer/algebra/product.rb +70 -0
- data/lib/axiom/optimizer/algebra/projection.rb +212 -0
- data/lib/axiom/optimizer/algebra/rename.rb +381 -0
- data/lib/axiom/optimizer/algebra/restriction.rb +373 -0
- data/lib/axiom/optimizer/algebra/summarization.rb +200 -0
- data/lib/axiom/optimizer/algebra/union.rb +68 -0
- data/lib/axiom/optimizer/function.rb +87 -0
- data/lib/axiom/optimizer/function/binary.rb +124 -0
- data/lib/axiom/optimizer/function/connective/binary.rb +245 -0
- data/lib/axiom/optimizer/function/connective/conjunction.rb +122 -0
- data/lib/axiom/optimizer/function/connective/disjunction.rb +122 -0
- data/lib/axiom/optimizer/function/connective/negation.rb +65 -0
- data/lib/axiom/optimizer/function/numeric.rb +34 -0
- data/lib/axiom/optimizer/function/numeric/absolute.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/addition.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/division.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/exponentiation.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/modulo.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/multiplication.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/square_root.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/subtraction.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/unary_minus.rb +20 -0
- data/lib/axiom/optimizer/function/numeric/unary_plus.rb +20 -0
- data/lib/axiom/optimizer/function/predicate.rb +61 -0
- data/lib/axiom/optimizer/function/predicate/comparable.rb +144 -0
- data/lib/axiom/optimizer/function/predicate/enumerable.rb +138 -0
- data/lib/axiom/optimizer/function/predicate/equality.rb +44 -0
- data/lib/axiom/optimizer/function/predicate/exclusion.rb +43 -0
- data/lib/axiom/optimizer/function/predicate/greater_than.rb +55 -0
- data/lib/axiom/optimizer/function/predicate/greater_than_or_equal_to.rb +55 -0
- data/lib/axiom/optimizer/function/predicate/inclusion.rb +43 -0
- data/lib/axiom/optimizer/function/predicate/inequality.rb +44 -0
- data/lib/axiom/optimizer/function/predicate/less_than.rb +55 -0
- data/lib/axiom/optimizer/function/predicate/less_than_or_equal_to.rb +55 -0
- data/lib/axiom/optimizer/function/predicate/match.rb +20 -0
- data/lib/axiom/optimizer/function/predicate/no_match.rb +20 -0
- data/lib/axiom/optimizer/function/string/length.rb +31 -0
- data/lib/axiom/optimizer/function/unary.rb +86 -0
- data/lib/axiom/optimizer/optimizable.rb +60 -0
- data/lib/axiom/optimizer/relation/materialized.rb +40 -0
- data/lib/axiom/optimizer/relation/operation/binary.rb +134 -0
- data/lib/axiom/optimizer/relation/operation/combination.rb +33 -0
- data/lib/axiom/optimizer/relation/operation/deletion.rb +20 -0
- data/lib/axiom/optimizer/relation/operation/insertion.rb +20 -0
- data/lib/axiom/optimizer/relation/operation/limit.rb +141 -0
- data/lib/axiom/optimizer/relation/operation/offset.rb +106 -0
- data/lib/axiom/optimizer/relation/operation/order.rb +85 -0
- data/lib/axiom/optimizer/relation/operation/reverse.rb +85 -0
- data/lib/axiom/optimizer/relation/operation/unary.rb +124 -0
- data/lib/axiom/optimizer/support/predicate_partition.rb +184 -0
- data/lib/axiom/optimizer/version.rb +10 -0
- data/spec/integration/axiom/algebra/difference/optimize_spec.rb +160 -0
- data/spec/integration/axiom/algebra/intersection/optimize_spec.rb +160 -0
- data/spec/integration/axiom/algebra/join/optimize_spec.rb +112 -0
- data/spec/integration/axiom/algebra/product/optimize_spec.rb +178 -0
- data/spec/integration/axiom/algebra/projection/optimize_spec.rb +250 -0
- data/spec/integration/axiom/algebra/rename/optimize_spec.rb +442 -0
- data/spec/integration/axiom/algebra/restriction/optimize_spec.rb +218 -0
- data/spec/integration/axiom/algebra/summarization/optimize_spec.rb +49 -0
- data/spec/integration/axiom/algebra/union/optimize_spec.rb +200 -0
- data/spec/integration/axiom/function/connective/conjunction/optimize_spec.rb +236 -0
- data/spec/integration/axiom/function/connective/disjunction/optimize_spec.rb +237 -0
- data/spec/integration/axiom/function/connective/negation/optimize_spec.rb +43 -0
- data/spec/integration/axiom/function/optimize_spec.rb +30 -0
- data/spec/integration/axiom/function/predicate/equality/optimize_spec.rb +92 -0
- data/spec/integration/axiom/function/predicate/exclusion/optimize_spec.rb +133 -0
- data/spec/integration/axiom/function/predicate/greater_than/optimize_spec.rb +102 -0
- data/spec/integration/axiom/function/predicate/greater_than_or_equal_to/optimize_spec.rb +102 -0
- data/spec/integration/axiom/function/predicate/inclusion/optimize_spec.rb +133 -0
- data/spec/integration/axiom/function/predicate/inequality/optimize_spec.rb +92 -0
- data/spec/integration/axiom/function/predicate/less_than/optimize_spec.rb +102 -0
- data/spec/integration/axiom/function/predicate/less_than_or_equal_to/optimize_spec.rb +102 -0
- data/spec/integration/axiom/relation/empty/optimize_spec.rb +13 -0
- data/spec/integration/axiom/relation/materialized/optimize_spec.rb +29 -0
- data/spec/integration/axiom/relation/operation/limit/optimize_spec.rb +142 -0
- data/spec/integration/axiom/relation/operation/offset/optimize_spec.rb +100 -0
- data/spec/integration/axiom/relation/operation/order/optimize_spec.rb +105 -0
- data/spec/integration/axiom/relation/operation/reverse/optimize_spec.rb +115 -0
- data/spec/integration/axiom/relation/optimize_spec.rb +23 -0
- data/spec/rcov.opts +7 -0
- data/spec/shared/function_connective_binary_optimize_behavior.rb +102 -0
- data/spec/shared/optimize_method_behavior.rb +16 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/add_method_missing.rb +15 -0
- data/spec/support/config_alias.rb +3 -0
- data/spec/support/ice_nine_config.rb +6 -0
- data/spec/support/lazy_enumerable.rb +18 -0
- data/spec/unit/axiom/optimizer/algebra/difference/empty_left/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/difference/empty_right/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/difference/equal_operands/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/extension/extensions_spec.rb +31 -0
- data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimizable_predicate_spec.rb +37 -0
- data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/intersection/empty_left/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/intersection/empty_right/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimizable_predicate_spec.rb +42 -0
- data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimize_spec.rb +55 -0
- data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimizable_predicate_spec.rb +42 -0
- data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimize_spec.rb +55 -0
- data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimizable_predicate_spec.rb +35 -0
- data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimize_spec.rb +25 -0
- data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/rename/aliases_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimize_spec.rb +21 -0
- data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimizable_predicate_spec.rb +30 -0
- data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_predicate_spec.rb +37 -0
- data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimizable_predicate_spec.rb +41 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimize_spec.rb +35 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimizable_predicate_spec.rb +46 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimizable_predicate_spec.rb +51 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimize_spec.rb +48 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/predicate_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimizable_predicate_spec.rb +44 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimize_spec.rb +48 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimizable_predicate_spec.rb +30 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimizable_predicate_spec.rb +30 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimize_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimizable_predicate_spec.rb +33 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimizable_predicate_spec.rb +44 -0
- data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +25 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimizable_predicate_spec.rb +49 -0
- data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +30 -0
- data/spec/unit/axiom/optimizer/algebra/union/empty_left/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/union/empty_right/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/algebra/union/equal_operands/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/class_methods/chain_spec.rb +56 -0
- data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimizable_predicate_spec.rb +36 -0
- data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/function/binary/left_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/binary/right_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimizable_predicate_spec.rb +37 -0
- data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
- data/spec/unit/axiom/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/left_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/function/connective/binary/right_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimizable_predicate_spec.rb +64 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimizable_predicate_spec.rb +61 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +76 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimizable_predicate_spec.rb +61 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +76 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimizable_predicate_spec.rb +64 -0
- data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/function/connective/negation/operand_spec.rb +14 -0
- data/spec/unit/axiom/optimizer/function/predicate/comparable/never_comparable/optimizable_predicate_spec.rb +74 -0
- data/spec/unit/axiom/optimizer/function/predicate/comparable/never_equivalent/optimizable_predicate_spec.rb +74 -0
- data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimize_spec.rb +21 -0
- data/spec/unit/axiom/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/predicate/enumerable/empty_right/optimizable_predicate_spec.rb +78 -0
- data/spec/unit/axiom/optimizer/function/predicate/enumerable/one_right/optimizable_predicate_spec.rb +78 -0
- data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimizable_predicate_spec.rb +51 -0
- data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimize_spec.rb +66 -0
- data/spec/unit/axiom/optimizer/function/predicate/equality/tautology/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/predicate/exclusion/empty_right/optimize_spec.rb +45 -0
- data/spec/unit/axiom/optimizer/function/predicate/exclusion/one_right/optimize_spec.rb +65 -0
- data/spec/unit/axiom/optimizer/function/predicate/greater_than/contradiction/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/greater_than/tautology/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/inclusion/empty_right/optimize_spec.rb +45 -0
- data/spec/unit/axiom/optimizer/function/predicate/inclusion/one_right/optimize_spec.rb +66 -0
- data/spec/unit/axiom/optimizer/function/predicate/inequality/contradiction/optimizable_predicate_spec.rb +29 -0
- data/spec/unit/axiom/optimizer/function/predicate/less_than/contradiction/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/less_than/tautology/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
- data/spec/unit/axiom/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/function/unary/operand_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/function/util/class_methods/attribute_spec.rb +21 -0
- data/spec/unit/axiom/optimizer/function/util/class_methods/constant_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/util/class_methods/max_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/function/util/class_methods/min_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/operation_spec.rb +13 -0
- data/spec/unit/axiom/optimizer/optimizable/class_methods/optimizer_spec.rb +34 -0
- data/spec/unit/axiom/optimizer/optimizable/optimize_spec.rb +38 -0
- data/spec/unit/axiom/optimizer/optimizable_predicate_spec.rb +17 -0
- data/spec/unit/axiom/optimizer/optimize_spec.rb +17 -0
- data/spec/unit/axiom/optimizer/predicate_partition/left_spec.rb +149 -0
- data/spec/unit/axiom/optimizer/predicate_partition/remainder_spec.rb +149 -0
- data/spec/unit/axiom/optimizer/predicate_partition/right_spec.rb +149 -0
- data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimizable_predicate_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimize_spec.rb +21 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/empty_left/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/empty_right/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/equal_operands/optimizable_predicate_spec.rb +31 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/left_spec.rb +15 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimizable_predicate_spec.rb +37 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/right_spec.rb +15 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimizable_predicate_spec.rb +40 -0
- data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimize_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/relation/operation/combination/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimizable_predicate_spec.rb +33 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +35 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +21 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +17 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimizable_predicate_spec.rb +33 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +18 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +19 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +17 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/header_spec.rb +15 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimizable_predicate_spec.rb +23 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +20 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/operand_spec.rb +16 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimizable_predicate_spec.rb +28 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimizable_predicate_spec.rb +24 -0
- data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
- metadata +697 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
class Aggregate
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Mean optimizations
|
|
8
|
+
class Mean < self
|
|
9
|
+
|
|
10
|
+
Axiom::Aggregate::Mean.optimizer = chain(
|
|
11
|
+
UnoptimizedOperand
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
end # class Mean
|
|
15
|
+
end # class Aggregate
|
|
16
|
+
end # class Optimizer
|
|
17
|
+
end # module Axiom
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
class Aggregate
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Minimum optimizations
|
|
8
|
+
class Minimum < self
|
|
9
|
+
|
|
10
|
+
Axiom::Aggregate::Minimum.optimizer = chain(
|
|
11
|
+
UnoptimizedOperand
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
end # class Minimum
|
|
15
|
+
end # class Aggregate
|
|
16
|
+
end # class Optimizer
|
|
17
|
+
end # module Axiom
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
class Aggregate
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing StandardDeviation optimizations
|
|
8
|
+
class StandardDeviation < self
|
|
9
|
+
|
|
10
|
+
Axiom::Aggregate::StandardDeviation.optimizer = chain(
|
|
11
|
+
UnoptimizedOperand
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
end # class StandardDeviation
|
|
15
|
+
end # class Aggregate
|
|
16
|
+
end # class Optimizer
|
|
17
|
+
end # module Axiom
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
class Aggregate
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Sum optimizations
|
|
8
|
+
class Sum < self
|
|
9
|
+
|
|
10
|
+
Axiom::Aggregate::Sum.optimizer = chain(
|
|
11
|
+
UnoptimizedOperand
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
end # class Sum
|
|
15
|
+
end # class Aggregate
|
|
16
|
+
end # class Optimizer
|
|
17
|
+
end # module Axiom
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
class Aggregate
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Variance optimizations
|
|
8
|
+
class Variance < self
|
|
9
|
+
|
|
10
|
+
Axiom::Aggregate::Variance.optimizer = chain(
|
|
11
|
+
UnoptimizedOperand
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
end # class Variance
|
|
15
|
+
end # class Aggregate
|
|
16
|
+
end # class Optimizer
|
|
17
|
+
end # module Axiom
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Difference optimizations
|
|
8
|
+
class Difference < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# A Difference with equal operands is empty
|
|
15
|
+
#
|
|
16
|
+
# @return [Relation::Empty]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimize
|
|
20
|
+
Axiom::Relation::Empty.new(operation.header, operation)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # class EqualOperands
|
|
24
|
+
|
|
25
|
+
# Optimize when the left operand is empty
|
|
26
|
+
class EmptyLeft < self
|
|
27
|
+
include Relation::Operation::Binary::EmptyLeft
|
|
28
|
+
|
|
29
|
+
# A Difference with an empty left operand is empty
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation::Empty]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
left
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # class EmptyLeft
|
|
39
|
+
|
|
40
|
+
# Optimize when the right operand is empty
|
|
41
|
+
class EmptyRight < self
|
|
42
|
+
include Relation::Operation::Binary::EmptyRight
|
|
43
|
+
|
|
44
|
+
# A Difference with an empty right operand is equivalent to the left
|
|
45
|
+
#
|
|
46
|
+
# @return [Relation]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def optimize
|
|
50
|
+
left
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # class EmptyRight
|
|
54
|
+
|
|
55
|
+
Axiom::Algebra::Difference.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyLeft,
|
|
58
|
+
EmptyRight,
|
|
59
|
+
OrderLeft,
|
|
60
|
+
OrderRight,
|
|
61
|
+
MaterializedOperands,
|
|
62
|
+
UnoptimizedOperands
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
end # class Difference
|
|
66
|
+
end # module Algebra
|
|
67
|
+
end # class Optimizer
|
|
68
|
+
end # module Axiom
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Extension optimizations
|
|
8
|
+
class Extension < Relation::Operation::Unary
|
|
9
|
+
|
|
10
|
+
# The optimized extensions
|
|
11
|
+
#
|
|
12
|
+
# @return [Hash{Attribute => Function}]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
attr_reader :extensions
|
|
16
|
+
|
|
17
|
+
# Initialize a Summarization optimizer
|
|
18
|
+
#
|
|
19
|
+
# @return [undefined]
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
def initialize(*)
|
|
23
|
+
super
|
|
24
|
+
@extensions = optimize_extensions
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# Optimize the extensions
|
|
30
|
+
#
|
|
31
|
+
# @return [Hash{Attribute => Function}]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize_extensions
|
|
35
|
+
Function.optimize_functions(operation.extensions)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Wrap the operand's operand in an Extension
|
|
39
|
+
#
|
|
40
|
+
# @return [Extension]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def wrap_operand(operand = operand.operand)
|
|
44
|
+
operand.extend(extensions)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Optimize when the operand is an Order
|
|
48
|
+
class OrderOperand < self
|
|
49
|
+
include Relation::Operation::Unary::OrderOperand
|
|
50
|
+
end # class OrderOperand
|
|
51
|
+
|
|
52
|
+
# Optimize when operands are optimizable
|
|
53
|
+
class UnoptimizedOperand < self
|
|
54
|
+
include Function::Unary::UnoptimizedOperand
|
|
55
|
+
|
|
56
|
+
# Test if the operand is unoptimized
|
|
57
|
+
#
|
|
58
|
+
# @return [Boolean]
|
|
59
|
+
#
|
|
60
|
+
# @api private
|
|
61
|
+
def optimizable?
|
|
62
|
+
super || extensions_optimizable?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Return an Extension with an optimized operand
|
|
66
|
+
#
|
|
67
|
+
# @return [Algebra::Extension]
|
|
68
|
+
#
|
|
69
|
+
# @api private
|
|
70
|
+
def optimize
|
|
71
|
+
wrap_operand(operand)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
# Test if the extensions are optimizable
|
|
77
|
+
#
|
|
78
|
+
# @return [Boolean]
|
|
79
|
+
#
|
|
80
|
+
# @api private
|
|
81
|
+
def extensions_optimizable?
|
|
82
|
+
! extensions.eql?(operation.extensions)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end # class UnoptimizedOperand
|
|
86
|
+
|
|
87
|
+
Axiom::Algebra::Extension.optimizer = chain(
|
|
88
|
+
UnchangedHeader,
|
|
89
|
+
MaterializedOperand,
|
|
90
|
+
OrderOperand,
|
|
91
|
+
UnoptimizedOperand
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
end # class Extension
|
|
95
|
+
end # module Algebra
|
|
96
|
+
end # class Optimizer
|
|
97
|
+
end # module Axiom
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Intersection optimizations
|
|
8
|
+
class Intersection < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# An Intersection with equal operands is equivalent to either operand
|
|
15
|
+
#
|
|
16
|
+
# @return [Relation]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimize
|
|
20
|
+
left
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # class EqualOperands
|
|
24
|
+
|
|
25
|
+
# Optimize when the left operand is empty
|
|
26
|
+
class EmptyLeft < self
|
|
27
|
+
include Relation::Operation::Binary::EmptyLeft
|
|
28
|
+
|
|
29
|
+
# An Intersection with an empty left operand is empty
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation::Empty]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
left
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # class EmptyLeft
|
|
39
|
+
|
|
40
|
+
# Optimize when the right operand is empty
|
|
41
|
+
class EmptyRight < self
|
|
42
|
+
include Relation::Operation::Binary::EmptyRight
|
|
43
|
+
|
|
44
|
+
# An Intersection with an empty right operand is empty
|
|
45
|
+
#
|
|
46
|
+
# @return [Relation::Empty]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def optimize
|
|
50
|
+
right
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # class EmptyRight
|
|
54
|
+
|
|
55
|
+
Axiom::Algebra::Intersection.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyLeft,
|
|
58
|
+
EmptyRight,
|
|
59
|
+
OrderLeft,
|
|
60
|
+
OrderRight,
|
|
61
|
+
MaterializedOperands,
|
|
62
|
+
UnoptimizedOperands
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
end # class Intersection
|
|
66
|
+
end # module Algebra
|
|
67
|
+
end # class Optimizer
|
|
68
|
+
end # module Axiom
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Join optimizations
|
|
8
|
+
class Join < Relation::Operation::Combination
|
|
9
|
+
|
|
10
|
+
CONTRADICTION = Axiom::Function::Proposition::Contradiction.instance
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
# Return the key to join the operations with
|
|
15
|
+
#
|
|
16
|
+
# @return [Header]
|
|
17
|
+
#
|
|
18
|
+
# @todo find a minimal key from the header
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def join_key
|
|
22
|
+
operation.join_header
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Return a predicate that matches every tuple in the materialized operand
|
|
26
|
+
#
|
|
27
|
+
# @return [Function]
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
def materialized_predicate
|
|
31
|
+
matching_projection.reduce(CONTRADICTION) { |predicate, tuple| predicate.or(tuple.predicate) }.optimize
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Optimize when operands' headers are equal
|
|
35
|
+
class EqualHeaders < self
|
|
36
|
+
|
|
37
|
+
# Test if the operands' headers are equal
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimizable?
|
|
43
|
+
left.header.eql?(right.header)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# A Join with equal headers is an Intersection
|
|
47
|
+
#
|
|
48
|
+
# @return [Algebra::Intersection]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
def optimize
|
|
52
|
+
left.intersect(right)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end # class EqualHeaders
|
|
56
|
+
|
|
57
|
+
# Optimize when operands' headers are disjoint
|
|
58
|
+
class DisjointHeaders < self
|
|
59
|
+
|
|
60
|
+
# Test if the operands' headers are disjoint
|
|
61
|
+
#
|
|
62
|
+
# @return [Boolean]
|
|
63
|
+
#
|
|
64
|
+
# @api private
|
|
65
|
+
def optimizable?
|
|
66
|
+
(left.header & right.header).none?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# A Join with disjoint headers is a Product
|
|
70
|
+
#
|
|
71
|
+
# @return [Algebra::Product]
|
|
72
|
+
#
|
|
73
|
+
# @api private
|
|
74
|
+
def optimize
|
|
75
|
+
left.product(right)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end # class EqualHeaders
|
|
79
|
+
|
|
80
|
+
# Optimize when the left operand is materialized
|
|
81
|
+
class MaterializedLeft < self
|
|
82
|
+
|
|
83
|
+
# Test if the left operand is materialized
|
|
84
|
+
#
|
|
85
|
+
# @return [Boolean]
|
|
86
|
+
#
|
|
87
|
+
# @api private
|
|
88
|
+
def optimizable?
|
|
89
|
+
left.materialized? && ! right_matching_left?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Return the join of the left and right with the right restricted
|
|
93
|
+
#
|
|
94
|
+
# @return [Algebra::Join]
|
|
95
|
+
#
|
|
96
|
+
# @api private
|
|
97
|
+
def optimize
|
|
98
|
+
left.join(right.restrict(materialized_predicate))
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
private
|
|
102
|
+
|
|
103
|
+
# Test if the right operand is a restriction matching the left
|
|
104
|
+
#
|
|
105
|
+
# @return [Boolean]
|
|
106
|
+
#
|
|
107
|
+
# @api private
|
|
108
|
+
def right_matching_left?
|
|
109
|
+
right.kind_of?(Axiom::Algebra::Restriction) && right.predicate.eql?(materialized_predicate)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Return a the matching projection of the materializd relation
|
|
113
|
+
#
|
|
114
|
+
# @return [Projection]
|
|
115
|
+
#
|
|
116
|
+
# @api private
|
|
117
|
+
def matching_projection
|
|
118
|
+
left.project(join_key)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end # class MaterializedLeft
|
|
122
|
+
|
|
123
|
+
# Optimize when the right operand is materialized
|
|
124
|
+
class MaterializedRight < self
|
|
125
|
+
|
|
126
|
+
# Test if the right operand is materialized
|
|
127
|
+
#
|
|
128
|
+
# @return [Boolean]
|
|
129
|
+
#
|
|
130
|
+
# @api private
|
|
131
|
+
def optimizable?
|
|
132
|
+
right.materialized? && ! left_matching_right?
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Return the join of the left and right with the left restricted
|
|
136
|
+
#
|
|
137
|
+
# @return [Algebra::Join]
|
|
138
|
+
#
|
|
139
|
+
# @api private
|
|
140
|
+
def optimize
|
|
141
|
+
left.restrict(materialized_predicate).join(right)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
private
|
|
145
|
+
|
|
146
|
+
# Test if the left operand is a restriction matching the right
|
|
147
|
+
#
|
|
148
|
+
# @return [Boolean]
|
|
149
|
+
#
|
|
150
|
+
# @api private
|
|
151
|
+
def left_matching_right?
|
|
152
|
+
left.kind_of?(Axiom::Algebra::Restriction) && left.predicate.eql?(materialized_predicate)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Return a the matching projection of the materializd relation
|
|
156
|
+
#
|
|
157
|
+
# @return [Projection]
|
|
158
|
+
#
|
|
159
|
+
# @api private
|
|
160
|
+
def matching_projection
|
|
161
|
+
right.project(join_key)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end # class MaterializedRight
|
|
165
|
+
|
|
166
|
+
Axiom::Algebra::Join.optimizer = chain(
|
|
167
|
+
EmptyLeft,
|
|
168
|
+
EmptyRight,
|
|
169
|
+
EqualHeaders,
|
|
170
|
+
DisjointHeaders,
|
|
171
|
+
OrderLeft,
|
|
172
|
+
OrderRight,
|
|
173
|
+
MaterializedOperands,
|
|
174
|
+
MaterializedLeft,
|
|
175
|
+
MaterializedRight,
|
|
176
|
+
UnoptimizedOperands
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
memoize :materialized_predicate
|
|
180
|
+
|
|
181
|
+
end # class Join
|
|
182
|
+
end # module Algebra
|
|
183
|
+
end # class Optimizer
|
|
184
|
+
end # module Axiom
|