veritas-optimizer 0.0.3
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/Gemfile +33 -0
- data/LICENSE +20 -0
- data/README.rdoc +27 -0
- data/Rakefile +25 -0
- data/TODO +75 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/roodi.yml +16 -0
- data/config/site.reek +91 -0
- data/config/yardstick.yml +2 -0
- data/lib/veritas/optimizer/algebra/difference.rb +66 -0
- data/lib/veritas/optimizer/algebra/extension.rb +42 -0
- data/lib/veritas/optimizer/algebra/intersection.rb +66 -0
- data/lib/veritas/optimizer/algebra/join.rb +44 -0
- data/lib/veritas/optimizer/algebra/product.rb +70 -0
- data/lib/veritas/optimizer/algebra/projection.rb +174 -0
- data/lib/veritas/optimizer/algebra/rename.rb +396 -0
- data/lib/veritas/optimizer/algebra/restriction.rb +259 -0
- data/lib/veritas/optimizer/algebra/summarization.rb +42 -0
- data/lib/veritas/optimizer/algebra/union.rb +66 -0
- data/lib/veritas/optimizer/logic/connective/binary.rb +254 -0
- data/lib/veritas/optimizer/logic/connective/conjunction.rb +122 -0
- data/lib/veritas/optimizer/logic/connective/disjunction.rb +122 -0
- data/lib/veritas/optimizer/logic/connective/negation.rb +71 -0
- data/lib/veritas/optimizer/logic/predicate/comparable.rb +134 -0
- data/lib/veritas/optimizer/logic/predicate/enumerable.rb +141 -0
- data/lib/veritas/optimizer/logic/predicate/equality.rb +44 -0
- data/lib/veritas/optimizer/logic/predicate/exclusion.rb +53 -0
- data/lib/veritas/optimizer/logic/predicate/greater_than.rb +54 -0
- data/lib/veritas/optimizer/logic/predicate/greater_than_or_equal_to.rb +56 -0
- data/lib/veritas/optimizer/logic/predicate/inclusion.rb +53 -0
- data/lib/veritas/optimizer/logic/predicate/inequality.rb +44 -0
- data/lib/veritas/optimizer/logic/predicate/less_than.rb +54 -0
- data/lib/veritas/optimizer/logic/predicate/less_than_or_equal_to.rb +56 -0
- data/lib/veritas/optimizer/logic/predicate/match.rb +19 -0
- data/lib/veritas/optimizer/logic/predicate/no_match.rb +19 -0
- data/lib/veritas/optimizer/logic/predicate.rb +177 -0
- data/lib/veritas/optimizer/optimizable.rb +59 -0
- data/lib/veritas/optimizer/relation/materialized.rb +40 -0
- data/lib/veritas/optimizer/relation/operation/binary.rb +168 -0
- data/lib/veritas/optimizer/relation/operation/combination.rb +33 -0
- data/lib/veritas/optimizer/relation/operation/limit.rb +149 -0
- data/lib/veritas/optimizer/relation/operation/offset.rb +114 -0
- data/lib/veritas/optimizer/relation/operation/order.rb +96 -0
- data/lib/veritas/optimizer/relation/operation/reverse.rb +94 -0
- data/lib/veritas/optimizer/relation/operation/unary.rb +88 -0
- data/lib/veritas/optimizer/version.rb +7 -0
- data/lib/veritas/optimizer.rb +136 -0
- data/lib/veritas-optimizer.rb +3 -0
- data/spec/integration/veritas/algebra/difference/optimize_spec.rb +152 -0
- data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +152 -0
- data/spec/integration/veritas/algebra/join/optimize_spec.rb +110 -0
- data/spec/integration/veritas/algebra/product/optimize_spec.rb +176 -0
- data/spec/integration/veritas/algebra/projection/optimize_spec.rb +237 -0
- data/spec/integration/veritas/algebra/rename/optimize_spec.rb +440 -0
- data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +216 -0
- data/spec/integration/veritas/algebra/union/optimize_spec.rb +192 -0
- data/spec/integration/veritas/logic/connective/conjunction/optimize_spec.rb +234 -0
- data/spec/integration/veritas/logic/connective/disjunction/optimize_spec.rb +235 -0
- data/spec/integration/veritas/logic/connective/negation/optimize_spec.rb +41 -0
- data/spec/integration/veritas/logic/expression/optimize_spec.rb +42 -0
- data/spec/integration/veritas/logic/predicate/equality/optimize_spec.rb +90 -0
- data/spec/integration/veritas/logic/predicate/exclusion/optimize_spec.rb +131 -0
- data/spec/integration/veritas/logic/predicate/greater_than/optimize_spec.rb +100 -0
- data/spec/integration/veritas/logic/predicate/greater_than_or_equal_to/optimize_spec.rb +100 -0
- data/spec/integration/veritas/logic/predicate/inclusion/optimize_spec.rb +131 -0
- data/spec/integration/veritas/logic/predicate/inequality/optimize_spec.rb +90 -0
- data/spec/integration/veritas/logic/predicate/less_than/optimize_spec.rb +100 -0
- data/spec/integration/veritas/logic/predicate/less_than_or_equal_to/optimize_spec.rb +100 -0
- data/spec/integration/veritas/relation/empty/optimize_spec.rb +11 -0
- data/spec/integration/veritas/relation/materialized/optimize_spec.rb +37 -0
- data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +140 -0
- data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +98 -0
- data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +103 -0
- data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +113 -0
- data/spec/integration/veritas/relation/optimize_spec.rb +33 -0
- data/spec/rcov.opts +6 -0
- data/spec/shared/idempotent_method_behavior.rb +5 -0
- data/spec/shared/logic_connective_binary_optimize_behavior.rb +100 -0
- data/spec/shared/optimize_method_behavior.rb +14 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/add_method_missing.rb +13 -0
- data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimize_spec.rb +23 -0
- data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimizable_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +35 -0
- data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +42 -0
- data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +28 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +42 -0
- data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +54 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/left_spec.rb +14 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/right_spec.rb +14 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +34 -0
- data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +36 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +36 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/logic/connective/negation/operand_spec.rb +12 -0
- data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_comparable/optimizable_spec.rb +58 -0
- data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_equivalent/optimizable_spec.rb +58 -0
- data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +29 -0
- data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +14 -0
- data/spec/unit/veritas/optimizer/logic/predicate/contradiction/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/logic/predicate/enumerable/empty_right_operand/optimizable_spec.rb +76 -0
- data/spec/unit/veritas/optimizer/logic/predicate/enumerable/one_right_operand/optimizable_spec.rb +76 -0
- data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimizable_spec.rb +49 -0
- data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimize_spec.rb +53 -0
- data/spec/unit/veritas/optimizer/logic/predicate/equality/tautology/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/predicate/exclusion/empty_right_operand/optimize_spec.rb +43 -0
- data/spec/unit/veritas/optimizer/logic/predicate/exclusion/one_right_operand/optimize_spec.rb +63 -0
- data/spec/unit/veritas/optimizer/logic/predicate/greater_than/contradiction/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/greater_than/tautology/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/inclusion/empty_right_operand/optimize_spec.rb +43 -0
- data/spec/unit/veritas/optimizer/logic/predicate/inclusion/one_right_operand/optimize_spec.rb +64 -0
- data/spec/unit/veritas/optimizer/logic/predicate/inequality/contradiction/optimizable_spec.rb +27 -0
- data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/logic/predicate/less_than/contradiction/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/less_than/tautology/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
- data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/logic/predicate/tautology/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/attribute_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/constant_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/operation_spec.rb +11 -0
- data/spec/unit/veritas/optimizer/optimizable/class_methods/optimizer_spec.rb +32 -0
- data/spec/unit/veritas/optimizer/optimizable/optimize_spec.rb +36 -0
- data/spec/unit/veritas/optimizer/optimizable_spec.rb +15 -0
- data/spec/unit/veritas/optimizer/optimize_spec.rb +15 -0
- data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +30 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +30 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +34 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +35 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimizable_spec.rb +38 -0
- data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/relation/operation/combination/optimize_spec.rb +14 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +33 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +19 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +15 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +31 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +16 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +26 -0
- data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +21 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +17 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +25 -0
- data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +22 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +15 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +20 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +18 -0
- data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +13 -0
- data/tasks/quality/ci.rake +2 -0
- data/tasks/quality/flay.rake +41 -0
- data/tasks/quality/flog.rake +45 -0
- data/tasks/quality/heckle.rake +203 -0
- data/tasks/quality/metric_fu.rake +26 -0
- data/tasks/quality/reek.rake +9 -0
- data/tasks/quality/roodi.rake +15 -0
- data/tasks/quality/yardstick.rake +23 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/veritas-optimizer.gemspec +550 -0
- metadata +613 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Binary relation optimizations
|
|
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
|
|
55
|
+
|
|
56
|
+
# Optimize when operands are equal
|
|
57
|
+
module EqualOperands
|
|
58
|
+
|
|
59
|
+
# Test if the operands are equal
|
|
60
|
+
#
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
#
|
|
63
|
+
# @api private
|
|
64
|
+
def optimizable?
|
|
65
|
+
left.eql?(right)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end # module EqualOperands
|
|
69
|
+
|
|
70
|
+
# Optimize when the left operand is Empty
|
|
71
|
+
module EmptyLeft
|
|
72
|
+
|
|
73
|
+
# Test if the left operand is empty
|
|
74
|
+
#
|
|
75
|
+
# @return [Boolean]
|
|
76
|
+
#
|
|
77
|
+
# @api private
|
|
78
|
+
def optimizable?
|
|
79
|
+
left.kind_of?(Veritas::Relation::Empty)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end # module EmptyLeft
|
|
83
|
+
|
|
84
|
+
# Optimize when the right operand is Empty
|
|
85
|
+
module EmptyRight
|
|
86
|
+
|
|
87
|
+
# Test if the right operand is empty
|
|
88
|
+
#
|
|
89
|
+
# @return [Boolean]
|
|
90
|
+
#
|
|
91
|
+
# @api private
|
|
92
|
+
def optimizable?
|
|
93
|
+
right.kind_of?(Veritas::Relation::Empty)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end # module EmptyRight
|
|
97
|
+
|
|
98
|
+
# Optimize when the operands are Materialized
|
|
99
|
+
class MaterializedOperand < self
|
|
100
|
+
|
|
101
|
+
# Test if the operands are materialized
|
|
102
|
+
#
|
|
103
|
+
# @return [Boolean]
|
|
104
|
+
#
|
|
105
|
+
# @api private
|
|
106
|
+
def optimizable?
|
|
107
|
+
left.kind_of?(Veritas::Relation::Materialized) &&
|
|
108
|
+
right.kind_of?(Veritas::Relation::Materialized)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Return the materialized operation
|
|
112
|
+
#
|
|
113
|
+
# @return [Relation::Materialized]
|
|
114
|
+
#
|
|
115
|
+
# @api private
|
|
116
|
+
def optimize
|
|
117
|
+
operation.materialize
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end # class MaterializedOperand
|
|
121
|
+
|
|
122
|
+
# Optimize when the operands are unoptimized
|
|
123
|
+
class UnoptimizedOperand < self
|
|
124
|
+
|
|
125
|
+
# Test if the operands are unoptimized
|
|
126
|
+
#
|
|
127
|
+
# @return [Boolean]
|
|
128
|
+
#
|
|
129
|
+
# @api private
|
|
130
|
+
def optimizable?
|
|
131
|
+
left_optimizable? || right_optimizable?
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Return a Relation with optimized operands
|
|
135
|
+
#
|
|
136
|
+
# @return [Relation]
|
|
137
|
+
#
|
|
138
|
+
# @api private
|
|
139
|
+
def optimize
|
|
140
|
+
operation.class.new(left, right)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
|
|
145
|
+
# Test if the left operand is optimizable
|
|
146
|
+
#
|
|
147
|
+
# @return [Boolean]
|
|
148
|
+
#
|
|
149
|
+
# @api private
|
|
150
|
+
def left_optimizable?
|
|
151
|
+
!left.equal?(operation.left)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Test if the right operand is optimizable
|
|
155
|
+
#
|
|
156
|
+
# @return [Boolean]
|
|
157
|
+
#
|
|
158
|
+
# @api private
|
|
159
|
+
def right_optimizable?
|
|
160
|
+
!right.equal?(operation.right)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end # class UnoptimizedOperand
|
|
164
|
+
end # class Binary
|
|
165
|
+
end # module Operation
|
|
166
|
+
end # module Relation
|
|
167
|
+
end # class Optimizer
|
|
168
|
+
end # module Veritas
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing combinations of relations
|
|
9
|
+
class Combination < Binary
|
|
10
|
+
|
|
11
|
+
# Any relation combined with an empty relation is an empty relation
|
|
12
|
+
#
|
|
13
|
+
# @return [Relation::Empty]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
def optimize
|
|
17
|
+
Veritas::Relation::Empty.new(operation.header)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Optimize when the left operand is Empty
|
|
21
|
+
class EmptyLeft < self
|
|
22
|
+
include Binary::EmptyLeft
|
|
23
|
+
end # class EmptyLeft
|
|
24
|
+
|
|
25
|
+
# Optimize when the right operand is Empty
|
|
26
|
+
class EmptyRight < self
|
|
27
|
+
include Binary::EmptyRight
|
|
28
|
+
end # class EmptyRight
|
|
29
|
+
end # class Combination
|
|
30
|
+
end # module Operation
|
|
31
|
+
end # module Relation
|
|
32
|
+
end # class Optimizer
|
|
33
|
+
end # module Veritas
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Limit optimizations
|
|
9
|
+
class Limit < Unary
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# Return the operation limit
|
|
14
|
+
#
|
|
15
|
+
# @return [Integer]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def limit
|
|
19
|
+
operation.limit
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Optimize when the limit is zero
|
|
23
|
+
class ZeroLimit < self
|
|
24
|
+
|
|
25
|
+
# Test if the limit is zero
|
|
26
|
+
#
|
|
27
|
+
# @return [Boolean]
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
def optimizable?
|
|
31
|
+
limit.zero?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# A Limit with a limit of zero is empty
|
|
35
|
+
#
|
|
36
|
+
# @return [Relation::Empty]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
def optimize
|
|
40
|
+
Veritas::Relation::Empty.new(operation.header)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # class ZeroLimit
|
|
44
|
+
|
|
45
|
+
# Optimize when the operand is a Limit and the limits are equal
|
|
46
|
+
class EqualLimitOperand < self
|
|
47
|
+
|
|
48
|
+
# Test if the operand is a Limit and the limits are equal
|
|
49
|
+
#
|
|
50
|
+
# @return [Boolean]
|
|
51
|
+
#
|
|
52
|
+
# @api private
|
|
53
|
+
def optimizable?
|
|
54
|
+
operand.kind_of?(operation.class) && equal_limit?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Flatten equal Limit relations into a single relation
|
|
58
|
+
#
|
|
59
|
+
# @return [Projection]
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
def optimize
|
|
63
|
+
operand
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# Test if the operation and operand limits are equal
|
|
69
|
+
#
|
|
70
|
+
# @return [Boolean]
|
|
71
|
+
#
|
|
72
|
+
# @api private
|
|
73
|
+
def equal_limit?
|
|
74
|
+
limit == operand.limit
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end # class EqualLimitOperand
|
|
78
|
+
|
|
79
|
+
# Optimize when the operand is a Limit
|
|
80
|
+
class LimitOperand < self
|
|
81
|
+
|
|
82
|
+
# Test if the operand is a Limit
|
|
83
|
+
#
|
|
84
|
+
# @return [Boolean]
|
|
85
|
+
#
|
|
86
|
+
# @api private
|
|
87
|
+
def optimizable?
|
|
88
|
+
operand.kind_of?(operation.class)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Flatten Limit operations using the minimum limit
|
|
92
|
+
#
|
|
93
|
+
# @return [Boolean]
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
def optimize
|
|
97
|
+
operation.class.new(operand.operand, min_limit)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
# Return the minimum limit between the operation and operand
|
|
103
|
+
#
|
|
104
|
+
# @return [Integer]
|
|
105
|
+
#
|
|
106
|
+
# @api private
|
|
107
|
+
def min_limit
|
|
108
|
+
[ limit, operand.limit ].min
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end # class LimitOperand
|
|
112
|
+
|
|
113
|
+
# Optimize when operand is optimizable
|
|
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
|
|
124
|
+
|
|
125
|
+
# Return a Limit with an optimized operand
|
|
126
|
+
#
|
|
127
|
+
# @return [Limit]
|
|
128
|
+
#
|
|
129
|
+
# @api private
|
|
130
|
+
def optimize
|
|
131
|
+
operation.class.new(operand, limit)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end # class UnoptimizedOperand
|
|
135
|
+
|
|
136
|
+
Veritas::Relation::Operation::Limit.optimizer = chain(
|
|
137
|
+
ZeroLimit,
|
|
138
|
+
EqualLimitOperand,
|
|
139
|
+
LimitOperand,
|
|
140
|
+
EmptyOperand,
|
|
141
|
+
MaterializedOperand,
|
|
142
|
+
UnoptimizedOperand
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
end # class Limit
|
|
146
|
+
end # module Operation
|
|
147
|
+
end # module Relation
|
|
148
|
+
end # class Optimizer
|
|
149
|
+
end # module Veritas
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Offset optimizations
|
|
9
|
+
class Offset < Unary
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# Return the operation offset
|
|
14
|
+
#
|
|
15
|
+
# @return [Integer]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def offset
|
|
19
|
+
operation.offset
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Optimize when the offset is zero
|
|
23
|
+
class ZeroOffset < self
|
|
24
|
+
|
|
25
|
+
# Test if the offset is zero
|
|
26
|
+
#
|
|
27
|
+
# @return [Boolean]
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
def optimizable?
|
|
31
|
+
offset.zero?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# An Offset with an offset of zero is a noop
|
|
35
|
+
#
|
|
36
|
+
# @return [Relation]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
def optimize
|
|
40
|
+
operand
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # class ZeroOffset
|
|
44
|
+
|
|
45
|
+
# Optimize when the operand is an Offset
|
|
46
|
+
class OffsetOperand < self
|
|
47
|
+
|
|
48
|
+
# Test if the operand is an Offset
|
|
49
|
+
#
|
|
50
|
+
# @return [Boolean]
|
|
51
|
+
#
|
|
52
|
+
# @api private
|
|
53
|
+
def optimizable?
|
|
54
|
+
operand.kind_of?(operation.class)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Flatten Offset operations using the sum of the offsets
|
|
58
|
+
#
|
|
59
|
+
# @return [Boolean]
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
def optimize
|
|
63
|
+
operation.class.new(operand.operand, sum_offset)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# Return the sum of the operation and operand offsets
|
|
69
|
+
#
|
|
70
|
+
# @return [Integer]
|
|
71
|
+
#
|
|
72
|
+
# @api private
|
|
73
|
+
def sum_offset
|
|
74
|
+
offset + operand.offset
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end # class OffsetOperand
|
|
78
|
+
|
|
79
|
+
# Optimize when operand is optimizable
|
|
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
|
|
90
|
+
|
|
91
|
+
# Return an Offset with an optimized operand
|
|
92
|
+
#
|
|
93
|
+
# @return [Offset]
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
def optimize
|
|
97
|
+
operation.class.new(operand, offset)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end # class UnoptimizedOperand
|
|
101
|
+
|
|
102
|
+
Veritas::Relation::Operation::Offset.optimizer = chain(
|
|
103
|
+
ZeroOffset,
|
|
104
|
+
OffsetOperand,
|
|
105
|
+
EmptyOperand,
|
|
106
|
+
MaterializedOperand,
|
|
107
|
+
UnoptimizedOperand
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
end # class Offset
|
|
111
|
+
end # module Operation
|
|
112
|
+
end # module Relation
|
|
113
|
+
end # class Optimizer
|
|
114
|
+
end # module Veritas
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Order optimizations
|
|
9
|
+
class Order < Unary
|
|
10
|
+
|
|
11
|
+
# Optimize when the operand is an Order
|
|
12
|
+
class OrderOperand < self
|
|
13
|
+
|
|
14
|
+
# Test if the operand is an Order
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimizable?
|
|
20
|
+
operand.kind_of?(operation.class)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Flatten Order operations using the operation directions
|
|
24
|
+
#
|
|
25
|
+
# @return [Order]
|
|
26
|
+
#
|
|
27
|
+
# @api private
|
|
28
|
+
def optimize
|
|
29
|
+
operation = self.operation
|
|
30
|
+
operation.class.new(operand.operand, operation.directions)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end # class OrderOperand
|
|
34
|
+
|
|
35
|
+
# Optimize when the operand is a Limit with a limit of 1
|
|
36
|
+
class OneLimitOperand < self
|
|
37
|
+
|
|
38
|
+
# Test if the operand is an Limit with a limit of 1
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def optimizable?
|
|
44
|
+
operand = self.operand
|
|
45
|
+
operand.kind_of?(Veritas::Relation::Operation::Limit) &&
|
|
46
|
+
operand.limit == 1
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# An Order of a Limit with a limit of 1 is a noop
|
|
50
|
+
#
|
|
51
|
+
# @return [Limit]
|
|
52
|
+
#
|
|
53
|
+
# @api private
|
|
54
|
+
def optimize
|
|
55
|
+
operand
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end # class OneLimitOperand
|
|
59
|
+
|
|
60
|
+
# Optimize when operand is optimizable
|
|
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
|
|
71
|
+
|
|
72
|
+
# Return an Order with an optimized operand
|
|
73
|
+
#
|
|
74
|
+
# @return [Offset]
|
|
75
|
+
#
|
|
76
|
+
# @api private
|
|
77
|
+
def optimize
|
|
78
|
+
operation = self.operation
|
|
79
|
+
operation.class.new(operand, operation.directions)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end # class UnoptimizedOperand
|
|
83
|
+
|
|
84
|
+
Veritas::Relation::Operation::Order.optimizer = chain(
|
|
85
|
+
OrderOperand,
|
|
86
|
+
OneLimitOperand,
|
|
87
|
+
EmptyOperand,
|
|
88
|
+
MaterializedOperand,
|
|
89
|
+
UnoptimizedOperand
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
end # class Order
|
|
93
|
+
end # module Operation
|
|
94
|
+
end # module Relation
|
|
95
|
+
end # class Optimizer
|
|
96
|
+
end # module Veritas
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
module Operation
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Reverse optimizations
|
|
9
|
+
class Reverse < Order
|
|
10
|
+
|
|
11
|
+
# Optimize when the operand is a Reverse
|
|
12
|
+
class ReverseOperand < self
|
|
13
|
+
|
|
14
|
+
# Test if the operand is a Reverse
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimizable?
|
|
20
|
+
operand.kind_of?(operation.class)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# A Reverse of a Reverse is a noop
|
|
24
|
+
#
|
|
25
|
+
# @return [Relation]
|
|
26
|
+
#
|
|
27
|
+
# @api private
|
|
28
|
+
def optimize
|
|
29
|
+
operand.operand
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class ReverseOperand
|
|
33
|
+
|
|
34
|
+
# Optimize when the operand is an Order
|
|
35
|
+
class OrderOperand < self
|
|
36
|
+
|
|
37
|
+
# Test if the operand is an Order
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimizable?
|
|
43
|
+
operand.kind_of?(Veritas::Relation::Operation::Order)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Flatten Reverse operation and Order operand into an Order
|
|
47
|
+
#
|
|
48
|
+
# @return [Order]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
def optimize
|
|
52
|
+
operand = self.operand
|
|
53
|
+
operand.class.new(operand.operand, operation.directions)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end # class OrderOperand
|
|
57
|
+
|
|
58
|
+
# Optimize when operand is optimizable
|
|
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
|
|
69
|
+
|
|
70
|
+
# Return an Reverse with an optimized operand
|
|
71
|
+
#
|
|
72
|
+
# @return [Reverse]
|
|
73
|
+
#
|
|
74
|
+
# @api private
|
|
75
|
+
def optimize
|
|
76
|
+
operation.class.new(operand)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end # class UnoptimizedOperand
|
|
80
|
+
|
|
81
|
+
Veritas::Relation::Operation::Reverse.optimizer = chain(
|
|
82
|
+
ReverseOperand,
|
|
83
|
+
OrderOperand,
|
|
84
|
+
OneLimitOperand,
|
|
85
|
+
EmptyOperand,
|
|
86
|
+
MaterializedOperand,
|
|
87
|
+
UnoptimizedOperand
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
end # class Reverse
|
|
91
|
+
end # module Operation
|
|
92
|
+
end # module Relation
|
|
93
|
+
end # class Optimizer
|
|
94
|
+
end # module Veritas
|