veritas-optimizer 0.0.3 → 0.0.4
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/.gemtest +0 -0
- data/.rvmrc +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +20 -10
- data/Guardfile +22 -0
- data/README.rdoc +2 -0
- data/Rakefile +4 -2
- data/TODO +43 -2
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/roodi.yml +4 -4
- data/lib/veritas/optimizer/aggregate/count.rb +17 -0
- data/lib/veritas/optimizer/aggregate/maximum.rb +17 -0
- data/lib/veritas/optimizer/aggregate/mean.rb +17 -0
- data/lib/veritas/optimizer/aggregate/minimum.rb +17 -0
- data/lib/veritas/optimizer/aggregate/standard_deviation.rb +17 -0
- data/lib/veritas/optimizer/aggregate/sum.rb +17 -0
- data/lib/veritas/optimizer/aggregate/variance.rb +17 -0
- data/lib/veritas/optimizer/aggregate.rb +16 -0
- data/lib/veritas/optimizer/algebra/difference.rb +3 -1
- data/lib/veritas/optimizer/algebra/extension.rb +58 -3
- data/lib/veritas/optimizer/algebra/intersection.rb +3 -1
- data/lib/veritas/optimizer/algebra/join.rb +6 -4
- data/lib/veritas/optimizer/algebra/product.rb +3 -1
- data/lib/veritas/optimizer/algebra/projection.rb +23 -54
- data/lib/veritas/optimizer/algebra/rename.rb +55 -80
- data/lib/veritas/optimizer/algebra/restriction.rb +33 -66
- data/lib/veritas/optimizer/algebra/summarization.rb +161 -3
- data/lib/veritas/optimizer/algebra/union.rb +3 -1
- data/lib/veritas/optimizer/function/binary.rb +124 -0
- data/lib/veritas/optimizer/{logic → function}/connective/binary.rb +48 -102
- data/lib/veritas/optimizer/{logic → function}/connective/conjunction.rb +12 -11
- data/lib/veritas/optimizer/{logic → function}/connective/disjunction.rb +15 -14
- data/lib/veritas/optimizer/function/connective/negation.rb +65 -0
- data/lib/veritas/optimizer/function/numeric/absolute.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/addition.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/division.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/exponentiation.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/modulo.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/multiplication.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/square_root.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/subtraction.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/unary_minus.rb +20 -0
- data/lib/veritas/optimizer/function/numeric/unary_plus.rb +20 -0
- data/lib/veritas/optimizer/function/numeric.rb +34 -0
- data/lib/veritas/optimizer/{logic → function}/predicate/comparable.rb +6 -4
- data/lib/veritas/optimizer/{logic → function}/predicate/enumerable.rb +24 -26
- data/lib/veritas/optimizer/{logic → function}/predicate/equality.rb +6 -6
- data/lib/veritas/optimizer/{logic → function}/predicate/exclusion.rb +6 -16
- data/lib/veritas/optimizer/{logic → function}/predicate/greater_than.rb +6 -5
- data/lib/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to.rb +6 -6
- data/lib/veritas/optimizer/{logic → function}/predicate/inclusion.rb +6 -16
- data/lib/veritas/optimizer/{logic → function}/predicate/inequality.rb +6 -6
- data/lib/veritas/optimizer/{logic → function}/predicate/less_than.rb +6 -5
- data/lib/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to.rb +6 -6
- data/lib/veritas/optimizer/{logic → function}/predicate/match.rb +5 -4
- data/lib/veritas/optimizer/{logic → function}/predicate/no_match.rb +5 -4
- data/lib/veritas/optimizer/function/predicate.rb +61 -0
- data/lib/veritas/optimizer/function/string/length.rb +31 -0
- data/lib/veritas/optimizer/function/unary.rb +86 -0
- data/lib/veritas/optimizer/function.rb +87 -0
- data/lib/veritas/optimizer/optimizable.rb +6 -3
- data/lib/veritas/optimizer/relation/operation/binary.rb +36 -70
- data/lib/veritas/optimizer/relation/operation/limit.rb +1 -9
- data/lib/veritas/optimizer/relation/operation/offset.rb +1 -9
- data/lib/veritas/optimizer/relation/operation/order.rb +1 -9
- data/lib/veritas/optimizer/relation/operation/reverse.rb +1 -9
- data/lib/veritas/optimizer/relation/operation/unary.rb +50 -13
- data/lib/veritas/optimizer/version.rb +1 -1
- data/lib/veritas/optimizer.rb +43 -16
- data/spec/integration/veritas/algebra/difference/optimize_spec.rb +6 -4
- data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +6 -4
- data/spec/integration/veritas/algebra/join/optimize_spec.rb +4 -2
- data/spec/integration/veritas/algebra/product/optimize_spec.rb +2 -0
- data/spec/integration/veritas/algebra/projection/optimize_spec.rb +6 -4
- data/spec/integration/veritas/algebra/rename/optimize_spec.rb +2 -0
- data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +9 -7
- data/spec/integration/veritas/algebra/summarization/optimize_spec.rb +49 -0
- data/spec/integration/veritas/algebra/union/optimize_spec.rb +6 -4
- data/spec/integration/veritas/{logic → function}/connective/conjunction/optimize_spec.rb +33 -31
- data/spec/integration/veritas/{logic → function}/connective/disjunction/optimize_spec.rb +30 -28
- data/spec/integration/veritas/{logic → function}/connective/negation/optimize_spec.rb +7 -5
- data/spec/integration/veritas/{logic/expression → function}/optimize_spec.rb +5 -3
- data/spec/integration/veritas/{logic → function}/predicate/equality/optimize_spec.rb +9 -7
- data/spec/integration/veritas/{logic → function}/predicate/exclusion/optimize_spec.rb +13 -11
- data/spec/integration/veritas/{logic → function}/predicate/greater_than/optimize_spec.rb +17 -15
- data/spec/integration/veritas/{logic → function}/predicate/greater_than_or_equal_to/optimize_spec.rb +17 -15
- data/spec/integration/veritas/{logic → function}/predicate/inclusion/optimize_spec.rb +13 -11
- data/spec/integration/veritas/{logic → function}/predicate/inequality/optimize_spec.rb +9 -7
- data/spec/integration/veritas/{logic → function}/predicate/less_than/optimize_spec.rb +17 -15
- data/spec/integration/veritas/{logic → function}/predicate/less_than_or_equal_to/optimize_spec.rb +17 -15
- data/spec/integration/veritas/relation/empty/optimize_spec.rb +2 -0
- data/spec/integration/veritas/relation/materialized/optimize_spec.rb +2 -0
- data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +3 -1
- data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +3 -1
- data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +4 -2
- data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +4 -2
- data/spec/integration/veritas/relation/optimize_spec.rb +2 -0
- data/spec/shared/{logic_connective_binary_optimize_behavior.rb → function_connective_binary_optimize_behavior.rb} +14 -12
- data/spec/shared/idempotent_method_behavior.rb +2 -0
- data/spec/shared/optimize_method_behavior.rb +2 -0
- data/spec/support/add_method_missing.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/extension/extensions_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/algebra/extension/order_operand/optimizable_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +18 -8
- data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/projection/{set_operand → union_operand}/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/projection/{set_operand → union_operand}/optimize_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +6 -4
- data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +5 -13
- data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +17 -7
- data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +7 -5
- data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +7 -20
- data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimizable_spec.rb +23 -3
- data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimize_spec.rb +7 -5
- data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +7 -3
- data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +5 -3
- data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +5 -3
- data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimizable_spec.rb +11 -3
- data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimize_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +7 -5
- data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/optimizable_spec.rb +29 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/empty_summarize_per/optimizable_spec.rb +29 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/order_operand/optimizable_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +30 -8
- data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +12 -9
- data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/function/binary/constant_operands/optimizable_spec.rb +36 -0
- data/spec/unit/veritas/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/function/binary/left_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/function/binary/right_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/function/binary/unoptimized_operands/optimizable_spec.rb +37 -0
- data/spec/unit/veritas/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/equal_operands/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/equal_operands/optimize_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/left_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_left_operand/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_left_operand/optimize_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_right_operand/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_right_operand/optimize_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/right_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/function/connective/conjunction/contradiction/optimizable_spec.rb +64 -0
- data/spec/unit/veritas/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/{logic/connective/disjunction/contradiction_left_operand → function/connective/conjunction/left_operand_tautology}/optimizable_spec.rb +9 -7
- data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/left_operand_tautology/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +5 -3
- data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/right_operand_tautology/optimizable_spec.rb +6 -4
- data/spec/unit/veritas/optimizer/function/connective/conjunction/right_operand_tautology/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/{logic/connective/conjunction/left_operand_tautology → function/connective/disjunction/contradiction_left_operand}/optimizable_spec.rb +9 -7
- data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_left_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_right_operand/optimizable_spec.rb +6 -4
- data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_right_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +5 -3
- data/spec/unit/veritas/optimizer/function/connective/disjunction/tautology/optimizable_spec.rb +64 -0
- data/spec/unit/veritas/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/function/connective/negation/invertible_operand/optimizable_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/{logic → function}/connective/negation/operand_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/never_comparable/optimizable_spec.rb +23 -7
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/never_equivalent/optimizable_spec.rb +23 -7
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/normalizable_operands/optimizable_spec.rb +7 -5
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/normalizable_operands/optimize_spec.rb +7 -5
- data/spec/unit/veritas/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/enumerable/empty_right_operand/optimizable_spec.rb +6 -4
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/enumerable/one_right_operand/optimizable_spec.rb +9 -7
- data/spec/unit/veritas/optimizer/{logic/predicate/enumerable/unoptimized_operand → function/predicate/enumerable/unoptimized_operands}/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic/predicate/enumerable/unoptimized_operand → function/predicate/enumerable/unoptimized_operands}/optimize_spec.rb +18 -5
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/equality/tautology/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/exclusion/empty_right_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/exclusion/one_right_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than/contradiction/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than/tautology/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to/contradiction/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to/tautology/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/inclusion/empty_right_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/inclusion/one_right_operand/optimize_spec.rb +8 -6
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/inequality/contradiction/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than/contradiction/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than/tautology/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to/contradiction/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to/tautology/optimizable_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/function/unary/constant_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/function/unary/operand_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/function/unary/unoptimized_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/{logic/predicate → function}/util/class_methods/attribute_spec.rb +4 -2
- data/spec/unit/veritas/optimizer/{logic/predicate → function}/util/class_methods/constant_spec.rb +13 -5
- data/spec/unit/veritas/optimizer/function/util/class_methods/max_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/function/util/class_methods/min_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/operation_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/optimizable/class_methods/optimizer_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/optimizable/optimize_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +2 -4
- data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +2 -4
- data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +2 -5
- data/spec/unit/veritas/optimizer/relation/operation/binary/left_order_operand/optimizable_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/left_order_operand/optimize_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +2 -4
- data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/right_order_operand/optimizable_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/right_order_operand/optimize_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +2 -4
- data/spec/unit/veritas/optimizer/relation/operation/binary/{unoptimized_operand → unoptimized_operands}/optimizable_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/relation/operation/binary/{unoptimized_operand → unoptimized_operands}/optimize_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/relation/operation/combination/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +3 -1
- data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +5 -2
- data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/header_spec.rb +15 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +5 -2
- data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +2 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +8 -5
- data/spec/unit/veritas/optimizer/relation/operation/unary/order_operand/optimizable_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/unchanged_header/optimizable_spec.rb +24 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
- data/tasks/metrics/ci.rake +7 -0
- data/tasks/{quality → metrics}/flay.rake +0 -0
- data/tasks/{quality → metrics}/flog.rake +0 -0
- data/tasks/{quality → metrics}/heckle.rake +1 -0
- data/tasks/{quality → metrics}/metric_fu.rake +3 -0
- data/tasks/{quality → metrics}/reek.rake +0 -0
- data/tasks/{quality → metrics}/roodi.rake +0 -0
- data/tasks/{quality → metrics}/yardstick.rake +0 -0
- data/tasks/spec.rake +1 -0
- data/veritas-optimizer.gemspec +183 -352
- metadata +232 -357
- data/lib/veritas/optimizer/logic/connective/negation.rb +0 -71
- data/lib/veritas/optimizer/logic/predicate.rb +0 -177
- data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +0 -16
- data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +0 -26
- data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +0 -16
- data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +0 -27
- data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +0 -19
- data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimizable_spec.rb +0 -26
- data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimize_spec.rb +0 -16
- data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +0 -31
- data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +0 -26
- data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +0 -18
- data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +0 -34
- data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +0 -21
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimizable_spec.rb +0 -41
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimize_spec.rb +0 -17
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimize_spec.rb +0 -17
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimizable_spec.rb +0 -41
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimize_spec.rb +0 -17
- data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +0 -26
- data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +0 -20
- data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +0 -20
- data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +0 -29
- data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +0 -14
- data/spec/unit/veritas/optimizer/logic/predicate/contradiction/optimize_spec.rb +0 -16
- data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +0 -25
- data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +0 -25
- data/spec/unit/veritas/optimizer/logic/predicate/tautology/optimize_spec.rb +0 -16
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +0 -19
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +0 -19
- data/tasks/quality/ci.rake +0 -2
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Veritas
|
4
|
+
class Optimizer
|
5
|
+
module Function
|
6
|
+
|
7
|
+
# Abstract base class representing Predicate optimizations
|
8
|
+
class Predicate < Optimizer
|
9
|
+
include AbstractClass, Binary
|
10
|
+
|
11
|
+
# Optimize when the operands are constants
|
12
|
+
class ConstantOperands < self
|
13
|
+
include Binary::ConstantOperands
|
14
|
+
|
15
|
+
# A Predicate with constant values is equivalent to a Proposition
|
16
|
+
#
|
17
|
+
# @return [Proposition]
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
def optimize
|
21
|
+
Veritas::Function::Proposition.new(super)
|
22
|
+
end
|
23
|
+
|
24
|
+
end # class ConstantOperands
|
25
|
+
|
26
|
+
# Optimize when the operands are unoptimized
|
27
|
+
class UnoptimizedOperands < self
|
28
|
+
include Binary::UnoptimizedOperands
|
29
|
+
end # class UnoptimizedOperands
|
30
|
+
|
31
|
+
# Optimize when the operands are a contradiction
|
32
|
+
module Contradiction
|
33
|
+
|
34
|
+
# Return a contradiction
|
35
|
+
#
|
36
|
+
# @return [Contradiction]
|
37
|
+
#
|
38
|
+
# @api private
|
39
|
+
def optimize
|
40
|
+
Veritas::Function::Proposition::Contradiction.instance
|
41
|
+
end
|
42
|
+
|
43
|
+
end # module Contradiction
|
44
|
+
|
45
|
+
# Optimize when the operands are a tautology
|
46
|
+
module Tautology
|
47
|
+
|
48
|
+
# Return a tautology
|
49
|
+
#
|
50
|
+
# @return [Tautology]
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
def optimize
|
54
|
+
Veritas::Function::Proposition::Tautology.instance
|
55
|
+
end
|
56
|
+
|
57
|
+
end # module Tautology
|
58
|
+
end # class Predicate
|
59
|
+
end # module Function
|
60
|
+
end # class Optimizer
|
61
|
+
end # module Veritas
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Veritas
|
4
|
+
class Optimizer
|
5
|
+
module Function
|
6
|
+
module String
|
7
|
+
|
8
|
+
# Abstract base class representing Length optimizations
|
9
|
+
class Length < Optimizer
|
10
|
+
include Unary
|
11
|
+
|
12
|
+
# Optimize when the operand is constant
|
13
|
+
class ConstantOperand < self
|
14
|
+
include Unary::ConstantOperand
|
15
|
+
end # class ConstantOperand
|
16
|
+
|
17
|
+
# Optimize when the operand is unoptimized
|
18
|
+
class UnoptimizedOperand < self
|
19
|
+
include Unary::UnoptimizedOperand
|
20
|
+
end # class UnoptimizedOperand
|
21
|
+
|
22
|
+
Veritas::Function::String::Length.optimizer = chain(
|
23
|
+
ConstantOperand,
|
24
|
+
UnoptimizedOperand
|
25
|
+
)
|
26
|
+
|
27
|
+
end # class Length
|
28
|
+
end # module String
|
29
|
+
end # module Function
|
30
|
+
end # class Optimizer
|
31
|
+
end # module Veritas
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Veritas
|
4
|
+
class Optimizer
|
5
|
+
module Function
|
6
|
+
|
7
|
+
# Mixin for optimizations to Unary functions
|
8
|
+
module Unary
|
9
|
+
|
10
|
+
# The optimized operand
|
11
|
+
#
|
12
|
+
# @return [Relation]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
attr_reader :operand
|
16
|
+
|
17
|
+
# Initialize a Unary optimizer
|
18
|
+
#
|
19
|
+
# @return [undefined]
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
def initialize(*)
|
23
|
+
super
|
24
|
+
@operand = optimize_operand
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Optimize the operand
|
30
|
+
#
|
31
|
+
# @return [Relation]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
def optimize_operand
|
35
|
+
Function.optimize_operand(operation.operand)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Optimize when the operand is constant
|
39
|
+
module ConstantOperand
|
40
|
+
|
41
|
+
# Test if the operand is constant
|
42
|
+
#
|
43
|
+
# @return [Boolean]
|
44
|
+
#
|
45
|
+
# @api private
|
46
|
+
def optimizable?
|
47
|
+
Util.constant?(operand)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Evaluate the operand and return the constant
|
51
|
+
#
|
52
|
+
# @return [Object]
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
def optimize
|
56
|
+
operation.class.call(operand)
|
57
|
+
end
|
58
|
+
|
59
|
+
end # module ConstantOperand
|
60
|
+
|
61
|
+
# Optimize when the operand is unoptimized
|
62
|
+
module UnoptimizedOperand
|
63
|
+
|
64
|
+
# Test if the operand is unoptimized
|
65
|
+
#
|
66
|
+
# @return [Boolean]
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
def optimizable?
|
70
|
+
!operand.equal?(operation.operand)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Return a Aggregate with an optimized operand
|
74
|
+
#
|
75
|
+
# @return [Aggregate]
|
76
|
+
#
|
77
|
+
# @api private
|
78
|
+
def optimize
|
79
|
+
operation.class.new(operand)
|
80
|
+
end
|
81
|
+
|
82
|
+
end # module UnoptimizedOperand
|
83
|
+
end # class Unary
|
84
|
+
end # module Function
|
85
|
+
end # class Optimizer
|
86
|
+
end # module Veritas
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Veritas
|
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}]
|
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 Veritas
|
@@ -36,7 +36,9 @@ module Veritas
|
|
36
36
|
# @todo simplify by setting a default Noop optimizer for all relations
|
37
37
|
def optimize(optimizer = self.class.optimizer || Optimizer::Noop)
|
38
38
|
optimized = optimizer.call(self)
|
39
|
-
equal?(optimized)
|
39
|
+
equal?(optimized) ? self :
|
40
|
+
optimized.respond_to?(:optimize) ? optimized.optimize :
|
41
|
+
optimized
|
40
42
|
end
|
41
43
|
|
42
44
|
memoize :optimize
|
@@ -55,5 +57,6 @@ module Veritas
|
|
55
57
|
end # class Optimizer
|
56
58
|
end # module Veritas
|
57
59
|
|
58
|
-
Veritas::
|
59
|
-
Veritas::
|
60
|
+
Veritas::Aggregate.class_eval { include Veritas::Optimizer::Optimizable }
|
61
|
+
Veritas::Function.class_eval { include Veritas::Optimizer::Optimizable }
|
62
|
+
Veritas::Relation.class_eval { include Veritas::Optimizer::Optimizable }
|
@@ -7,51 +7,7 @@ module Veritas
|
|
7
7
|
|
8
8
|
# Abstract base class representing Binary relation optimizations
|
9
9
|
class Binary < Optimizer
|
10
|
-
|
11
|
-
# The optimized left operand
|
12
|
-
#
|
13
|
-
# @return [Relation]
|
14
|
-
#
|
15
|
-
# @api private
|
16
|
-
attr_reader :left
|
17
|
-
|
18
|
-
# The optimized right operand
|
19
|
-
#
|
20
|
-
# @return [Relation]
|
21
|
-
#
|
22
|
-
# @api private
|
23
|
-
attr_reader :right
|
24
|
-
|
25
|
-
# Initialize an Binary optimizer
|
26
|
-
#
|
27
|
-
# @return [undefined]
|
28
|
-
#
|
29
|
-
# @api private
|
30
|
-
def initialize(*)
|
31
|
-
super
|
32
|
-
@left = optimize_left
|
33
|
-
@right = optimize_right
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
# Optimize the left operand
|
39
|
-
#
|
40
|
-
# @return [Relation]
|
41
|
-
#
|
42
|
-
# @api private
|
43
|
-
def optimize_left
|
44
|
-
operation.left.optimize
|
45
|
-
end
|
46
|
-
|
47
|
-
# Optimize the right operand
|
48
|
-
#
|
49
|
-
# @return [Relation]
|
50
|
-
#
|
51
|
-
# @api private
|
52
|
-
def optimize_right
|
53
|
-
operation.right.optimize
|
54
|
-
end
|
10
|
+
include Function::Binary
|
55
11
|
|
56
12
|
# Optimize when operands are equal
|
57
13
|
module EqualOperands
|
@@ -60,6 +16,8 @@ module Veritas
|
|
60
16
|
#
|
61
17
|
# @return [Boolean]
|
62
18
|
#
|
19
|
+
# @todo do not materialize the operands to compare them
|
20
|
+
#
|
63
21
|
# @api private
|
64
22
|
def optimizable?
|
65
23
|
left.eql?(right)
|
@@ -95,72 +53,80 @@ module Veritas
|
|
95
53
|
|
96
54
|
end # module EmptyRight
|
97
55
|
|
98
|
-
# Optimize when the
|
99
|
-
class
|
56
|
+
# Optimize when the left operand is an Order
|
57
|
+
class LeftOrderOperand < self
|
100
58
|
|
101
|
-
# Test if the
|
59
|
+
# Test if the left operand is an Order
|
102
60
|
#
|
103
61
|
# @return [Boolean]
|
104
62
|
#
|
105
63
|
# @api private
|
106
64
|
def optimizable?
|
107
|
-
left.kind_of?(Veritas::Relation::
|
108
|
-
right.kind_of?(Veritas::Relation::Materialized)
|
65
|
+
left.kind_of?(Veritas::Relation::Operation::Order)
|
109
66
|
end
|
110
67
|
|
111
|
-
#
|
68
|
+
# Drop the Order and wrap the left operand
|
112
69
|
#
|
113
|
-
# @return [
|
70
|
+
# @return [Binary]
|
114
71
|
#
|
115
72
|
# @api private
|
116
73
|
def optimize
|
117
|
-
operation.
|
74
|
+
operation.class.new(left.operand, right)
|
118
75
|
end
|
119
76
|
|
120
|
-
end # class
|
77
|
+
end # class LeftOrderOperand
|
121
78
|
|
122
|
-
# Optimize when the
|
123
|
-
class
|
79
|
+
# Optimize when the right operand is an Order
|
80
|
+
class RightOrderOperand < self
|
124
81
|
|
125
|
-
# Test if the
|
82
|
+
# Test if the right operand is an Order
|
126
83
|
#
|
127
84
|
# @return [Boolean]
|
128
85
|
#
|
129
86
|
# @api private
|
130
87
|
def optimizable?
|
131
|
-
|
88
|
+
right.kind_of?(Veritas::Relation::Operation::Order)
|
132
89
|
end
|
133
90
|
|
134
|
-
#
|
91
|
+
# Drop the Order and wrap the right operand
|
135
92
|
#
|
136
|
-
# @return [
|
93
|
+
# @return [Binary]
|
137
94
|
#
|
138
95
|
# @api private
|
139
96
|
def optimize
|
140
|
-
operation.class.new(left, right)
|
97
|
+
operation.class.new(left, right.operand)
|
141
98
|
end
|
142
99
|
|
143
|
-
|
100
|
+
end # class RightOrderOperand
|
144
101
|
|
145
|
-
|
102
|
+
# Optimize when the operands are Materialized
|
103
|
+
class MaterializedOperand < self
|
104
|
+
|
105
|
+
# Test if the operands are materialized
|
146
106
|
#
|
147
107
|
# @return [Boolean]
|
148
108
|
#
|
149
109
|
# @api private
|
150
|
-
def
|
151
|
-
|
110
|
+
def optimizable?
|
111
|
+
left.kind_of?(Veritas::Relation::Materialized) &&
|
112
|
+
right.kind_of?(Veritas::Relation::Materialized)
|
152
113
|
end
|
153
114
|
|
154
|
-
#
|
115
|
+
# Return the materialized operation
|
155
116
|
#
|
156
|
-
# @return [
|
117
|
+
# @return [Relation::Materialized]
|
157
118
|
#
|
158
119
|
# @api private
|
159
|
-
def
|
160
|
-
|
120
|
+
def optimize
|
121
|
+
operation.materialize
|
161
122
|
end
|
162
123
|
|
163
|
-
end # class
|
124
|
+
end # class MaterializedOperand
|
125
|
+
|
126
|
+
# Optimize when the operands are unoptimized
|
127
|
+
class UnoptimizedOperands < self
|
128
|
+
include Function::Binary::UnoptimizedOperands
|
129
|
+
end # class UnoptimizedOperands
|
164
130
|
end # class Binary
|
165
131
|
end # module Operation
|
166
132
|
end # module Relation
|
@@ -112,15 +112,7 @@ module Veritas
|
|
112
112
|
|
113
113
|
# Optimize when operand is optimizable
|
114
114
|
class UnoptimizedOperand < self
|
115
|
-
|
116
|
-
# Test if the operand is unoptimized
|
117
|
-
#
|
118
|
-
# @return [Boolean]
|
119
|
-
#
|
120
|
-
# @api private
|
121
|
-
def optimizable?
|
122
|
-
!operand.equal?(operation.operand)
|
123
|
-
end
|
115
|
+
include Function::Unary::UnoptimizedOperand
|
124
116
|
|
125
117
|
# Return a Limit with an optimized operand
|
126
118
|
#
|
@@ -78,15 +78,7 @@ module Veritas
|
|
78
78
|
|
79
79
|
# Optimize when operand is optimizable
|
80
80
|
class UnoptimizedOperand < self
|
81
|
-
|
82
|
-
# Test if the operand is unoptimized
|
83
|
-
#
|
84
|
-
# @return [Boolean]
|
85
|
-
#
|
86
|
-
# @api private
|
87
|
-
def optimizable?
|
88
|
-
!operand.equal?(operation.operand)
|
89
|
-
end
|
81
|
+
include Function::Unary::UnoptimizedOperand
|
90
82
|
|
91
83
|
# Return an Offset with an optimized operand
|
92
84
|
#
|
@@ -59,15 +59,7 @@ module Veritas
|
|
59
59
|
|
60
60
|
# Optimize when operand is optimizable
|
61
61
|
class UnoptimizedOperand < self
|
62
|
-
|
63
|
-
# Test if the operand is unoptimized
|
64
|
-
#
|
65
|
-
# @return [Boolean]
|
66
|
-
#
|
67
|
-
# @api private
|
68
|
-
def optimizable?
|
69
|
-
!operand.equal?(operation.operand)
|
70
|
-
end
|
62
|
+
include Function::Unary::UnoptimizedOperand
|
71
63
|
|
72
64
|
# Return an Order with an optimized operand
|
73
65
|
#
|
@@ -57,15 +57,7 @@ module Veritas
|
|
57
57
|
|
58
58
|
# Optimize when operand is optimizable
|
59
59
|
class UnoptimizedOperand < self
|
60
|
-
|
61
|
-
# Test if the operand is unoptimized
|
62
|
-
#
|
63
|
-
# @return [Boolean]
|
64
|
-
#
|
65
|
-
# @api private
|
66
|
-
def optimizable?
|
67
|
-
!operand.equal?(operation.operand)
|
68
|
-
end
|
60
|
+
include Function::Unary::UnoptimizedOperand
|
69
61
|
|
70
62
|
# Return an Reverse with an optimized operand
|
71
63
|
#
|
@@ -7,13 +7,14 @@ module Veritas
|
|
7
7
|
|
8
8
|
# Abstract base class representing Unary relation optimizations
|
9
9
|
class Unary < Optimizer
|
10
|
+
include Function::Unary
|
10
11
|
|
11
|
-
# The
|
12
|
+
# The operation header
|
12
13
|
#
|
13
|
-
# @return [
|
14
|
+
# @return [Header]
|
14
15
|
#
|
15
16
|
# @api private
|
16
|
-
attr_reader :
|
17
|
+
attr_reader :header
|
17
18
|
|
18
19
|
# Initialize a Unary optimizer
|
19
20
|
#
|
@@ -22,19 +23,54 @@ module Veritas
|
|
22
23
|
# @api private
|
23
24
|
def initialize(*)
|
24
25
|
super
|
25
|
-
@
|
26
|
+
@header = operation.header
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
+
# Optimize when the operand is an Order
|
30
|
+
module OrderOperand
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
# Test if the operand is an Order
|
33
|
+
#
|
34
|
+
# @return [Boolean]
|
35
|
+
#
|
36
|
+
# @api private
|
37
|
+
def optimizable?
|
38
|
+
operand.kind_of?(Veritas::Relation::Operation::Order)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Drop the Order and wrap the operand
|
42
|
+
#
|
43
|
+
# @return [Order]
|
44
|
+
#
|
45
|
+
# @api private
|
46
|
+
def optimize
|
47
|
+
wrap_operand
|
48
|
+
end
|
49
|
+
|
50
|
+
end # module OrderOperand
|
51
|
+
|
52
|
+
# Optimize when the header is not changed
|
53
|
+
class UnchangedHeader < self
|
54
|
+
|
55
|
+
# Test if the operation header are the same as the operand's
|
56
|
+
#
|
57
|
+
# @return [Boolean]
|
58
|
+
#
|
59
|
+
# @api private
|
60
|
+
def optimizable?
|
61
|
+
header == operand.header
|
62
|
+
end
|
63
|
+
|
64
|
+
# A Projection, Rename or Extension with an unchanged header is a noop
|
65
|
+
#
|
66
|
+
# @return [Relation]
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
def optimize
|
70
|
+
operand
|
71
|
+
end
|
72
|
+
|
73
|
+
end # class UnchangedHeader
|
38
74
|
|
39
75
|
# Optimize when the operand is Empty
|
40
76
|
class EmptyOperand < self
|
@@ -81,6 +117,7 @@ module Veritas
|
|
81
117
|
end
|
82
118
|
|
83
119
|
end # class MaterializedOperand
|
120
|
+
|
84
121
|
end # class Unary
|
85
122
|
end # module Operation
|
86
123
|
end # module Relation
|