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,54 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing GreaterThan optimizations
|
|
9
|
+
class GreaterThan < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operands are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Predicate::Contradiction
|
|
15
|
+
|
|
16
|
+
# Test if the operands are a contradiction
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def optimizable?
|
|
22
|
+
left.equal?(right) ||
|
|
23
|
+
GreaterThanOrEqualTo::Contradiction.new(operation).optimizable?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end # class Contradiction
|
|
27
|
+
|
|
28
|
+
# Optimize when the operands are a tautology
|
|
29
|
+
class Tautology < self
|
|
30
|
+
include Predicate::Tautology
|
|
31
|
+
|
|
32
|
+
# Test if the operands are a tautology
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
def optimizable?
|
|
38
|
+
operation.class.call(Predicate::Util.min(left), Predicate::Util.max(right))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end # class Tautology
|
|
42
|
+
|
|
43
|
+
Veritas::Logic::Predicate::GreaterThan.optimizer = chain(
|
|
44
|
+
ConstantOperands,
|
|
45
|
+
Contradiction,
|
|
46
|
+
Tautology,
|
|
47
|
+
NormalizableOperands
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
end # class GreaterThan
|
|
51
|
+
end # class Predicate
|
|
52
|
+
end # module Logic
|
|
53
|
+
end # class Optimizer
|
|
54
|
+
end # module Veritas
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing GreaterThanOrEqualTo optimizations
|
|
9
|
+
class GreaterThanOrEqualTo < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operands are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Comparable::NeverComparable
|
|
15
|
+
include Predicate::Contradiction
|
|
16
|
+
|
|
17
|
+
# Test if the operands are a contradiction
|
|
18
|
+
#
|
|
19
|
+
# @return [Boolean]
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
def optimizable?
|
|
23
|
+
super || LessThan::Tautology.new(operation.inverse).optimizable?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end # class Contradiction
|
|
27
|
+
|
|
28
|
+
# Optimize when the operands are a tautology
|
|
29
|
+
class Tautology < self
|
|
30
|
+
include Predicate::Tautology
|
|
31
|
+
|
|
32
|
+
# Test if the operands are a tautology
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
def optimizable?
|
|
38
|
+
operation = self.operation
|
|
39
|
+
GreaterThan::Tautology.new(operation).optimizable? ||
|
|
40
|
+
Equality::Tautology.new(operation).optimizable?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # class Tautology
|
|
44
|
+
|
|
45
|
+
Veritas::Logic::Predicate::GreaterThanOrEqualTo.optimizer = chain(
|
|
46
|
+
ConstantOperands,
|
|
47
|
+
Contradiction,
|
|
48
|
+
Tautology,
|
|
49
|
+
NormalizableOperands
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
end # class GreaterThanOrEqualTo
|
|
53
|
+
end # class Predicate
|
|
54
|
+
end # module Logic
|
|
55
|
+
end # class Optimizer
|
|
56
|
+
end # module Veritas
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Inclusion optimizations
|
|
9
|
+
class Inclusion < self
|
|
10
|
+
include Enumerable
|
|
11
|
+
|
|
12
|
+
# Optimize when the right operand is empty
|
|
13
|
+
class EmptyRightOperand < self
|
|
14
|
+
include Enumerable::EmptyRightOperand
|
|
15
|
+
|
|
16
|
+
# An Inclusion with an empty right operand matches nothing
|
|
17
|
+
#
|
|
18
|
+
# @return [Contradiction]
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def optimize
|
|
22
|
+
Veritas::Logic::Proposition::Contradiction.instance
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end # class EmptyRightOperand
|
|
26
|
+
|
|
27
|
+
# Optimize when the right operand has one entry
|
|
28
|
+
class OneRightOperand < self
|
|
29
|
+
include Enumerable::OneRightOperand
|
|
30
|
+
|
|
31
|
+
# An Inclusion with a single right operand is equivalent to an Equality
|
|
32
|
+
#
|
|
33
|
+
# @return [Equality]
|
|
34
|
+
#
|
|
35
|
+
# @api private
|
|
36
|
+
def optimize
|
|
37
|
+
Veritas::Logic::Predicate::Equality.new(left, right.first)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end # class OneRightOperand
|
|
41
|
+
|
|
42
|
+
Veritas::Logic::Predicate::Inclusion.optimizer = chain(
|
|
43
|
+
ConstantOperands,
|
|
44
|
+
EmptyRightOperand,
|
|
45
|
+
OneRightOperand,
|
|
46
|
+
UnoptimizedOperand
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
end # class Inclusion
|
|
50
|
+
end # class Predicate
|
|
51
|
+
end # module Logic
|
|
52
|
+
end # class Optimizer
|
|
53
|
+
end # module Veritas
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Inequality optimizations
|
|
9
|
+
class Inequality < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operand are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Predicate::Contradiction
|
|
15
|
+
|
|
16
|
+
# Test if the operands are a contradiction
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def optimizable?
|
|
22
|
+
left.equal?(right)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end # class Contradiction
|
|
26
|
+
|
|
27
|
+
# Optimize when the operand are a tautology
|
|
28
|
+
class Tautology < self
|
|
29
|
+
include Comparable::NeverEquivalent
|
|
30
|
+
include Predicate::Tautology
|
|
31
|
+
end # class Tautology
|
|
32
|
+
|
|
33
|
+
Veritas::Logic::Predicate::Inequality.optimizer = chain(
|
|
34
|
+
ConstantOperands,
|
|
35
|
+
Contradiction,
|
|
36
|
+
Tautology,
|
|
37
|
+
NormalizableOperands
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
end # class Inequality
|
|
41
|
+
end # class Predicate
|
|
42
|
+
end # module Logic
|
|
43
|
+
end # class Optimizer
|
|
44
|
+
end # module Veritas
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing LessThan optimizations
|
|
9
|
+
class LessThan < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operands are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Predicate::Contradiction
|
|
15
|
+
|
|
16
|
+
# Test if the operands are a contradiction
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def optimizable?
|
|
22
|
+
left.equal?(right) ||
|
|
23
|
+
LessThanOrEqualTo::Contradiction.new(operation).optimizable?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end # class Contradiction
|
|
27
|
+
|
|
28
|
+
# Optimize when the operands are a tautology
|
|
29
|
+
class Tautology < self
|
|
30
|
+
include Predicate::Tautology
|
|
31
|
+
|
|
32
|
+
# Test if the operands are a tautology
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
def optimizable?
|
|
38
|
+
operation.class.call(Predicate::Util.max(left), Predicate::Util.min(right))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end # class Tautology
|
|
42
|
+
|
|
43
|
+
Veritas::Logic::Predicate::LessThan.optimizer = chain(
|
|
44
|
+
ConstantOperands,
|
|
45
|
+
Contradiction,
|
|
46
|
+
Tautology,
|
|
47
|
+
NormalizableOperands
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
end # class LessThan
|
|
51
|
+
end # class Predicate
|
|
52
|
+
end # module Logic
|
|
53
|
+
end # class Optimizer
|
|
54
|
+
end # module Veritas
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing LessThanOrEqualTo optimizations
|
|
9
|
+
class LessThanOrEqualTo < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operands are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Comparable::NeverComparable
|
|
15
|
+
include Predicate::Contradiction
|
|
16
|
+
|
|
17
|
+
# Test if the operands are a contradiction
|
|
18
|
+
#
|
|
19
|
+
# @return [Boolean]
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
def optimizable?
|
|
23
|
+
super || GreaterThan::Tautology.new(operation.inverse).optimizable?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end # class Contradiction
|
|
27
|
+
|
|
28
|
+
# Optimize when the operands are a tautology
|
|
29
|
+
class Tautology < self
|
|
30
|
+
include Predicate::Tautology
|
|
31
|
+
|
|
32
|
+
# Test if the operands are a tautology
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
def optimizable?
|
|
38
|
+
operation = self.operation
|
|
39
|
+
LessThan::Tautology.new(operation).optimizable? ||
|
|
40
|
+
Equality::Tautology.new(operation).optimizable?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # class Tautology
|
|
44
|
+
|
|
45
|
+
Veritas::Logic::Predicate::LessThanOrEqualTo.optimizer = chain(
|
|
46
|
+
ConstantOperands,
|
|
47
|
+
Contradiction,
|
|
48
|
+
Tautology,
|
|
49
|
+
NormalizableOperands
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
end # class LessThanOrEqualTo
|
|
53
|
+
end # class Predicate
|
|
54
|
+
end # module Logic
|
|
55
|
+
end # class Optimizer
|
|
56
|
+
end # module Veritas
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Match optimizations
|
|
9
|
+
class Match < self
|
|
10
|
+
|
|
11
|
+
Veritas::Logic::Predicate::Match.optimizer = chain(
|
|
12
|
+
ConstantOperands
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
end # class Match
|
|
16
|
+
end # class Predicate
|
|
17
|
+
end # module Logic
|
|
18
|
+
end # class Optimizer
|
|
19
|
+
end # module Veritas
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing NoMatch optimizations
|
|
9
|
+
class NoMatch < self
|
|
10
|
+
|
|
11
|
+
Veritas::Logic::Predicate::NoMatch.optimizer = chain(
|
|
12
|
+
ConstantOperands
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
end # class NoMatch
|
|
16
|
+
end # class Predicate
|
|
17
|
+
end # module Logic
|
|
18
|
+
end # class Optimizer
|
|
19
|
+
end # module Veritas
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Predicate optimizations
|
|
8
|
+
class Predicate < Optimizer
|
|
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
|
+
self.class.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
|
+
self.class.optimize_operand(operation.right)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Optimize the operand if possible
|
|
56
|
+
#
|
|
57
|
+
# @param [#optimize, Object] operand
|
|
58
|
+
#
|
|
59
|
+
# @return [Object]
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
def self.optimize_operand(operand)
|
|
63
|
+
operand.respond_to?(:optimize) ? operand.optimize : operand
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Optimize when the operands are constants
|
|
67
|
+
class ConstantOperands < self
|
|
68
|
+
|
|
69
|
+
# Test if the operands are constants
|
|
70
|
+
#
|
|
71
|
+
# @return [Boolean]
|
|
72
|
+
#
|
|
73
|
+
# @api private
|
|
74
|
+
def optimizable?
|
|
75
|
+
util = Util
|
|
76
|
+
util.constant?(left) && util.constant?(right)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# A Predicate with constant values is equivalent to a Proposition
|
|
80
|
+
#
|
|
81
|
+
# @return [Proposition]
|
|
82
|
+
#
|
|
83
|
+
# @api private
|
|
84
|
+
def optimize
|
|
85
|
+
Veritas::Logic::Proposition.new(operation.class.call(left, right))
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end # class ConstantOperands
|
|
89
|
+
|
|
90
|
+
# Optimize when the operands are a contradiction
|
|
91
|
+
module Contradiction
|
|
92
|
+
|
|
93
|
+
# Return a contradiction
|
|
94
|
+
#
|
|
95
|
+
# @return [Contradiction]
|
|
96
|
+
#
|
|
97
|
+
# @api private
|
|
98
|
+
def optimize
|
|
99
|
+
Veritas::Logic::Proposition::Contradiction.instance
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end # module Contradiction
|
|
103
|
+
|
|
104
|
+
# Optimize when the operands are a tautology
|
|
105
|
+
module Tautology
|
|
106
|
+
|
|
107
|
+
# Return a tautology
|
|
108
|
+
#
|
|
109
|
+
# @return [Tautology]
|
|
110
|
+
#
|
|
111
|
+
# @api private
|
|
112
|
+
def optimize
|
|
113
|
+
Veritas::Logic::Proposition::Tautology.instance
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end # module Tautology
|
|
117
|
+
|
|
118
|
+
# Utility methods for Predicate optimization
|
|
119
|
+
module Util
|
|
120
|
+
|
|
121
|
+
# Test if the operand is a constant
|
|
122
|
+
#
|
|
123
|
+
# @return [Boolean]
|
|
124
|
+
#
|
|
125
|
+
# @api private
|
|
126
|
+
def self.constant?(operand)
|
|
127
|
+
!operand.respond_to?(:call)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Test if the operand is an attribute
|
|
131
|
+
#
|
|
132
|
+
# @return [Boolean]
|
|
133
|
+
#
|
|
134
|
+
# @api private
|
|
135
|
+
def self.attribute?(operand)
|
|
136
|
+
operand.kind_of?(Attribute)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Return the minimum value for the operand
|
|
140
|
+
#
|
|
141
|
+
# @return [Object]
|
|
142
|
+
#
|
|
143
|
+
# @api private
|
|
144
|
+
def self.min(operand)
|
|
145
|
+
range_or_operand(operand, :first)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Return the maximum value for the operand
|
|
149
|
+
#
|
|
150
|
+
# @return [Object]
|
|
151
|
+
#
|
|
152
|
+
# @api private
|
|
153
|
+
def self.max(operand)
|
|
154
|
+
range_or_operand(operand, :last)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Return the minimum/maximum of the operand range, or the operand
|
|
158
|
+
#
|
|
159
|
+
# @param [Object] operand
|
|
160
|
+
# the object to extract the minimum/maximum value from
|
|
161
|
+
# @param [Symbol] method
|
|
162
|
+
# the method to execute on the operand range, if any
|
|
163
|
+
#
|
|
164
|
+
# @return [Object]
|
|
165
|
+
#
|
|
166
|
+
# @api private
|
|
167
|
+
def self.range_or_operand(operand, method)
|
|
168
|
+
operand.respond_to?(:range) ? operand.range.send(method) : operand
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
private_class_method :range_or_operand
|
|
172
|
+
|
|
173
|
+
end # module Util
|
|
174
|
+
end # class Predicate
|
|
175
|
+
end # module Logic
|
|
176
|
+
end # class Optimizer
|
|
177
|
+
end # module Veritas
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
|
|
6
|
+
# Allow operations to be optimizable
|
|
7
|
+
module Optimizable
|
|
8
|
+
include Immutable
|
|
9
|
+
|
|
10
|
+
# Hook called when module is included
|
|
11
|
+
#
|
|
12
|
+
# @param [Module] descendant
|
|
13
|
+
# the module or class including Optimizable
|
|
14
|
+
#
|
|
15
|
+
# @return [self]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def self.included(descendant)
|
|
19
|
+
descendant.extend ClassMethods
|
|
20
|
+
self
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Optimize the operation
|
|
24
|
+
#
|
|
25
|
+
# @example
|
|
26
|
+
# optimized = operation.optimize
|
|
27
|
+
#
|
|
28
|
+
# @param [Optimizer] optimizer
|
|
29
|
+
# optional optimizer
|
|
30
|
+
#
|
|
31
|
+
# @return [Optimizable]
|
|
32
|
+
# the optimized operation
|
|
33
|
+
#
|
|
34
|
+
# @api public
|
|
35
|
+
#
|
|
36
|
+
# @todo simplify by setting a default Noop optimizer for all relations
|
|
37
|
+
def optimize(optimizer = self.class.optimizer || Optimizer::Noop)
|
|
38
|
+
optimized = optimizer.call(self)
|
|
39
|
+
equal?(optimized) ? self : optimized.optimize
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
memoize :optimize
|
|
43
|
+
|
|
44
|
+
module ClassMethods
|
|
45
|
+
|
|
46
|
+
# The Optimizer for the operation
|
|
47
|
+
#
|
|
48
|
+
# @return [Optimizable]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
attr_accessor :optimizer
|
|
52
|
+
|
|
53
|
+
end # module ClassMethods
|
|
54
|
+
end # module Optimizable
|
|
55
|
+
end # class Optimizer
|
|
56
|
+
end # module Veritas
|
|
57
|
+
|
|
58
|
+
Veritas::Relation.class_eval { include Veritas::Optimizer::Optimizable }
|
|
59
|
+
Veritas::Logic::Expression.class_eval { include Veritas::Optimizer::Optimizable }
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Relation
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Materialized optimizations
|
|
8
|
+
class Materialized < Optimizer
|
|
9
|
+
|
|
10
|
+
# Optimize when the operand is Empty
|
|
11
|
+
class EmptyOperand < self
|
|
12
|
+
|
|
13
|
+
# Test if the operand is empty
|
|
14
|
+
#
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def optimizable?
|
|
19
|
+
operation.empty?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Return a new Empty relation with the operation's headers
|
|
23
|
+
#
|
|
24
|
+
# @return [Empty]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def optimize
|
|
28
|
+
Veritas::Relation::Empty.new(operation.header)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end # class EmptyOperand
|
|
32
|
+
|
|
33
|
+
Veritas::Relation::Materialized.optimizer = chain(
|
|
34
|
+
EmptyOperand
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
end # class Materialized
|
|
38
|
+
end # module Relation
|
|
39
|
+
end # class Optimizer
|
|
40
|
+
end # module Veritas
|