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,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Union optimizations
|
|
8
|
+
class Union < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# A Union with equal operands is a noop
|
|
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
|
+
# A Union with an empty left operand is equivalent to the right
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
right
|
|
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 Union 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::Union.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyRight,
|
|
58
|
+
EmptyLeft,
|
|
59
|
+
OrderLeft,
|
|
60
|
+
OrderRight,
|
|
61
|
+
MaterializedOperands,
|
|
62
|
+
UnoptimizedOperands
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
end # class Union
|
|
66
|
+
end # module Algebra
|
|
67
|
+
end # class Optimizer
|
|
68
|
+
end # module Axiom
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
|
|
6
|
+
# Mixin for function optimizations
|
|
7
|
+
module Function
|
|
8
|
+
|
|
9
|
+
# Optimize the operand if possible
|
|
10
|
+
#
|
|
11
|
+
# @param [#optimize, Object] operand
|
|
12
|
+
#
|
|
13
|
+
# @return [Object]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
def self.optimize_operand(operand)
|
|
17
|
+
operand.respond_to?(:optimize) ? operand.optimize : operand
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Optimize the summarizers
|
|
21
|
+
#
|
|
22
|
+
# @param [Hash{Attribute => Function}] functions
|
|
23
|
+
#
|
|
24
|
+
# @return [Hash{Attribute => Function}]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def self.optimize_functions(functions)
|
|
28
|
+
optimized = {}
|
|
29
|
+
functions.each do |attribute, function|
|
|
30
|
+
optimized[attribute] = optimize_operand(function)
|
|
31
|
+
end
|
|
32
|
+
optimized.freeze
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Utility methods for Function optimization
|
|
36
|
+
module Util
|
|
37
|
+
|
|
38
|
+
# Test if the operand is a constant
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def self.constant?(operand)
|
|
44
|
+
! (operand.nil? || operand.respond_to?(:call))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Test if the operand is an attribute
|
|
48
|
+
#
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
#
|
|
51
|
+
# @api private
|
|
52
|
+
def self.attribute?(operand)
|
|
53
|
+
operand.kind_of?(Attribute)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Return the minimum value for the operand
|
|
57
|
+
#
|
|
58
|
+
# @return [Object]
|
|
59
|
+
#
|
|
60
|
+
# @api private
|
|
61
|
+
def self.min(operand)
|
|
62
|
+
case operand
|
|
63
|
+
when Attribute::String then operand.min_length
|
|
64
|
+
when Attribute::Numeric then operand.range.first
|
|
65
|
+
else
|
|
66
|
+
operand
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Return the maximum value for the operand
|
|
71
|
+
#
|
|
72
|
+
# @return [Object]
|
|
73
|
+
#
|
|
74
|
+
# @api private
|
|
75
|
+
def self.max(operand)
|
|
76
|
+
case operand
|
|
77
|
+
when Attribute::String then operand.max_length
|
|
78
|
+
when Attribute::Numeric then operand.range.last
|
|
79
|
+
else
|
|
80
|
+
operand
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end # module Util
|
|
85
|
+
end # module Function
|
|
86
|
+
end # class Optimizer
|
|
87
|
+
end # module Axiom
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Function
|
|
6
|
+
|
|
7
|
+
# Mixin for optimizations to Binary functions
|
|
8
|
+
module Binary
|
|
9
|
+
|
|
10
|
+
# The optimized left operand
|
|
11
|
+
#
|
|
12
|
+
# @return [Object]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
attr_reader :left
|
|
16
|
+
|
|
17
|
+
# The optimized right operand
|
|
18
|
+
#
|
|
19
|
+
# @return [Object]
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
attr_reader :right
|
|
23
|
+
|
|
24
|
+
# Initialize an Predicate optimizer
|
|
25
|
+
#
|
|
26
|
+
# @return [undefined]
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
def initialize(*)
|
|
30
|
+
super
|
|
31
|
+
@left = optimize_left
|
|
32
|
+
@right = optimize_right
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# Optimize the left operand
|
|
38
|
+
#
|
|
39
|
+
# @return [Object]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimize_left
|
|
43
|
+
Function.optimize_operand(operation.left)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Optimize the right operand
|
|
47
|
+
#
|
|
48
|
+
# @return [Object]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
def optimize_right
|
|
52
|
+
Function.optimize_operand(operation.right)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Optimize when the operands are constants
|
|
56
|
+
module ConstantOperands
|
|
57
|
+
|
|
58
|
+
# Test if the operands are constants
|
|
59
|
+
#
|
|
60
|
+
# @return [Boolean]
|
|
61
|
+
#
|
|
62
|
+
# @api private
|
|
63
|
+
def optimizable?
|
|
64
|
+
util = Util
|
|
65
|
+
util.constant?(left) && util.constant?(right)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Evaluate the operands and return the constant
|
|
69
|
+
#
|
|
70
|
+
# @return [Object]
|
|
71
|
+
#
|
|
72
|
+
# @api private
|
|
73
|
+
def optimize
|
|
74
|
+
operation.class.call(left, right)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end # module ConstantOperands
|
|
78
|
+
|
|
79
|
+
# Optimize when the operand is unoptimized
|
|
80
|
+
module UnoptimizedOperands
|
|
81
|
+
|
|
82
|
+
# Test if the operands are unoptimized
|
|
83
|
+
#
|
|
84
|
+
# @return [Boolean]
|
|
85
|
+
#
|
|
86
|
+
# @api private
|
|
87
|
+
def optimizable?
|
|
88
|
+
left_optimizable? || right_optimizable?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Return a Binary connective with optimized operands
|
|
92
|
+
#
|
|
93
|
+
# @return [Binary]
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
def optimize
|
|
97
|
+
operation.class.new(left, right)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
# Test if the left operand is optimizable
|
|
103
|
+
#
|
|
104
|
+
# @return [Boolean]
|
|
105
|
+
#
|
|
106
|
+
# @api private
|
|
107
|
+
def left_optimizable?
|
|
108
|
+
! left.equal?(operation.left)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Test if the right operand is optimizable
|
|
112
|
+
#
|
|
113
|
+
# @return [Boolean]
|
|
114
|
+
#
|
|
115
|
+
# @api private
|
|
116
|
+
def right_optimizable?
|
|
117
|
+
! right.equal?(operation.right)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end # module UnoptimizedOperands
|
|
121
|
+
end # class Binary
|
|
122
|
+
end # module Function
|
|
123
|
+
end # class Optimizer
|
|
124
|
+
end # module Axiom
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Axiom
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Function
|
|
6
|
+
module Connective
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Binary connective optimizations
|
|
9
|
+
class Binary < Optimizer
|
|
10
|
+
include Function::Binary
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
# Test if the operands are equality/inclusion predicates for the same attribute
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def equality_with_same_attributes?
|
|
20
|
+
left_equality? &&
|
|
21
|
+
right_equality? &&
|
|
22
|
+
same_attribute? &&
|
|
23
|
+
constant_value?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Test if the operands are inequality/exclusion predicates for the same attribute
|
|
27
|
+
#
|
|
28
|
+
# @return [Boolean]
|
|
29
|
+
#
|
|
30
|
+
# @api private
|
|
31
|
+
def inequality_with_same_attributes?
|
|
32
|
+
left_inequality? &&
|
|
33
|
+
right_inequality? &&
|
|
34
|
+
same_attribute? &&
|
|
35
|
+
constant_value?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Test if the left and right predicates are for the same attribute
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def same_attribute?
|
|
44
|
+
left.left.equal?(right.left)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Test if the left and right predicates match against constant values
|
|
48
|
+
#
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
#
|
|
51
|
+
# @api private
|
|
52
|
+
def constant_value?
|
|
53
|
+
util = Util
|
|
54
|
+
util.constant?(left.right) && util.constant?(right.right)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Test if the left is an equality or inclusion
|
|
58
|
+
#
|
|
59
|
+
# @return [Boolean]
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
def left_equality?
|
|
63
|
+
util = Axiom::Function::Predicate
|
|
64
|
+
left.kind_of?(util::Equality) || left.kind_of?(util::Inclusion)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Test if the right is an equality or inclusion
|
|
68
|
+
#
|
|
69
|
+
# @return [Boolean]
|
|
70
|
+
#
|
|
71
|
+
# @api private
|
|
72
|
+
def right_equality?
|
|
73
|
+
util = Axiom::Function::Predicate
|
|
74
|
+
right.kind_of?(util::Equality) || right.kind_of?(util::Inclusion)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Test if the left is an inequality or exclusion
|
|
78
|
+
#
|
|
79
|
+
# @return [Boolean]
|
|
80
|
+
#
|
|
81
|
+
# @api private
|
|
82
|
+
def left_inequality?
|
|
83
|
+
util = Axiom::Function::Predicate
|
|
84
|
+
left.kind_of?(util::Inequality) || left.kind_of?(util::Exclusion)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Test if the right is an inequality or exclusion
|
|
88
|
+
#
|
|
89
|
+
# @return [Boolean]
|
|
90
|
+
#
|
|
91
|
+
# @api private
|
|
92
|
+
def right_inequality?
|
|
93
|
+
util = Axiom::Function::Predicate
|
|
94
|
+
right.kind_of?(util::Inequality) || right.kind_of?(util::Exclusion)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Test if the left is a tautology
|
|
98
|
+
#
|
|
99
|
+
# @return [Boolean]
|
|
100
|
+
#
|
|
101
|
+
# @api private
|
|
102
|
+
def left_tautology?
|
|
103
|
+
left.equal?(Axiom::Function::Proposition::Tautology.instance)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Test if the right is a tautology
|
|
107
|
+
#
|
|
108
|
+
# @return [Boolean]
|
|
109
|
+
#
|
|
110
|
+
# @api private
|
|
111
|
+
def right_tautology?
|
|
112
|
+
right.equal?(Axiom::Function::Proposition::Tautology.instance)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Test if the left is a contradiction
|
|
116
|
+
#
|
|
117
|
+
# @return [Boolean]
|
|
118
|
+
#
|
|
119
|
+
# @api private
|
|
120
|
+
def left_contradiction?
|
|
121
|
+
left.equal?(Axiom::Function::Proposition::Contradiction.instance)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Test if the right is a contradiction
|
|
125
|
+
#
|
|
126
|
+
# @return [Boolean]
|
|
127
|
+
#
|
|
128
|
+
# @api private
|
|
129
|
+
def right_contradiction?
|
|
130
|
+
right.equal?(Axiom::Function::Proposition::Contradiction.instance)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Test if the left and right
|
|
134
|
+
#
|
|
135
|
+
# @return [Boolean]
|
|
136
|
+
#
|
|
137
|
+
# @api private
|
|
138
|
+
def contradiction?
|
|
139
|
+
left.respond_to?(:inverse) &&
|
|
140
|
+
right.respond_to?(:inverse) &&
|
|
141
|
+
left.inverse.eql?(right)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Merge the right enumerables from the operands
|
|
145
|
+
#
|
|
146
|
+
# @return [Array]
|
|
147
|
+
#
|
|
148
|
+
# @api private
|
|
149
|
+
def merged_right_enumerables
|
|
150
|
+
[ left.right, right.right ].flatten
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Optimize when the operands are constants
|
|
154
|
+
class ConstantOperands < self
|
|
155
|
+
include Function::Binary::ConstantOperands
|
|
156
|
+
|
|
157
|
+
# A Connective with constant values is equivalent to a Proposition
|
|
158
|
+
#
|
|
159
|
+
# @return [Proposition]
|
|
160
|
+
#
|
|
161
|
+
# @api private
|
|
162
|
+
def optimize
|
|
163
|
+
Axiom::Function::Proposition.new(super)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end # class ConstantOperands
|
|
167
|
+
|
|
168
|
+
# Optimize when the operands are equal
|
|
169
|
+
class EqualOperands < self
|
|
170
|
+
|
|
171
|
+
# Test if the operands are equal
|
|
172
|
+
#
|
|
173
|
+
# @return [Boolean]
|
|
174
|
+
#
|
|
175
|
+
# @api private
|
|
176
|
+
def optimizable?
|
|
177
|
+
left.eql?(right)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# A Binary connective with equal operands is equivalent to the left
|
|
181
|
+
#
|
|
182
|
+
# @return [Function]
|
|
183
|
+
#
|
|
184
|
+
# @api private
|
|
185
|
+
def optimize
|
|
186
|
+
left
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end # class EqualOperands
|
|
190
|
+
|
|
191
|
+
# Optimize when the left operand is redundant
|
|
192
|
+
class RedundantLeft < self
|
|
193
|
+
|
|
194
|
+
# Test if the left operand is redundant
|
|
195
|
+
#
|
|
196
|
+
# @return [Boolean]
|
|
197
|
+
#
|
|
198
|
+
# @api private
|
|
199
|
+
def optimizable?
|
|
200
|
+
operation.kind_of?(left.class) && right.eql?(left.right)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# A Binary connective with a redundant left operand is equivalent to the left
|
|
204
|
+
#
|
|
205
|
+
# @return [Function]
|
|
206
|
+
#
|
|
207
|
+
# @api private
|
|
208
|
+
def optimize
|
|
209
|
+
left
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end # class RedundantLeft
|
|
213
|
+
|
|
214
|
+
# Optimize when the right operand is redundant
|
|
215
|
+
class RedundantRight < self
|
|
216
|
+
|
|
217
|
+
# Test if the right operand is redundant
|
|
218
|
+
#
|
|
219
|
+
# @return [Boolean]
|
|
220
|
+
#
|
|
221
|
+
# @api private
|
|
222
|
+
def optimizable?
|
|
223
|
+
operation.kind_of?(right.class) && left.eql?(right.left)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# A Binary connective with a redundant right operand is equivalent to the right
|
|
227
|
+
#
|
|
228
|
+
# @return [Function]
|
|
229
|
+
#
|
|
230
|
+
# @api private
|
|
231
|
+
def optimize
|
|
232
|
+
right
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
end # class RedundantRight
|
|
236
|
+
|
|
237
|
+
# Optimize when the operands are unoptimized
|
|
238
|
+
class UnoptimizedOperands < self
|
|
239
|
+
include Function::Binary::UnoptimizedOperands
|
|
240
|
+
end # class UnoptimizedOperands
|
|
241
|
+
end # class Binary
|
|
242
|
+
end # module Connective
|
|
243
|
+
end # module Function
|
|
244
|
+
end # class Optimizer
|
|
245
|
+
end # module Axiom
|