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
data/Gemfile
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
source :rubygems
|
|
2
|
+
|
|
3
|
+
gem 'veritas', '0.0.3', :git => 'git://github.com/dkubb/veritas.git'
|
|
4
|
+
|
|
5
|
+
group :development do
|
|
6
|
+
gem 'backports', '~> 2.1.0'
|
|
7
|
+
gem 'jeweler', '~> 1.5.2'
|
|
8
|
+
gem 'rake', '~> 0.8.7'
|
|
9
|
+
gem 'rspec', '~> 1.3.2'
|
|
10
|
+
gem 'yard', '~> 0.6.8'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
group :jruby do
|
|
14
|
+
platform :jruby do
|
|
15
|
+
gem 'jruby-openssl', '~> 0.7.3'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
platforms :mri_18 do
|
|
20
|
+
group :quality do
|
|
21
|
+
gem 'flay', '~> 1.4.2'
|
|
22
|
+
gem 'flog', '~> 2.5.1'
|
|
23
|
+
gem 'heckle', '~> 1.4.3'
|
|
24
|
+
gem 'json', '~> 1.5.1'
|
|
25
|
+
gem 'metric_fu', '~> 2.1.1'
|
|
26
|
+
gem 'mspec', '~> 1.5.17'
|
|
27
|
+
gem 'rcov', '~> 0.9.9'
|
|
28
|
+
gem 'reek', '~> 1.2.8', :git => 'git://github.com/dkubb/reek.git'
|
|
29
|
+
gem 'roodi', '~> 2.1.0'
|
|
30
|
+
gem 'ruby2ruby', '= 1.2.2'
|
|
31
|
+
gem 'yardstick', '~> 0.3.0'
|
|
32
|
+
end
|
|
33
|
+
end
|
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2011 Dan Kubb
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
= Veritas Optimizer
|
|
2
|
+
|
|
3
|
+
Relational algebra optimizer
|
|
4
|
+
|
|
5
|
+
== Note on Patches/Pull Requests
|
|
6
|
+
|
|
7
|
+
* If you want your code merged into the mainline, please discuss
|
|
8
|
+
the proposed changes with me before doing any work on it. This
|
|
9
|
+
library is still in early development, and it may not always be
|
|
10
|
+
clear the direction it is going. Some features may not be appropriate
|
|
11
|
+
yet, may need to be deferred until later when the foundation for
|
|
12
|
+
them is laid, or may be more applicable in a plugin.
|
|
13
|
+
* Fork the project.
|
|
14
|
+
* Make your feature addition or bug fix.
|
|
15
|
+
* Follow this {style guide}[https://github.com/dkubb/styleguide].
|
|
16
|
+
* Add specs for it. This is important so I don't break it in a
|
|
17
|
+
future version unintentionally. Tests must cover all branches
|
|
18
|
+
within the code, and code must be fully covered.
|
|
19
|
+
* Commit, do not mess with Rakefile, version, or history.
|
|
20
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
|
21
|
+
* Run "rake ci". This must pass and not show any regressions in the
|
|
22
|
+
metrics for the code to be merged.
|
|
23
|
+
* Send me a pull request. Bonus points for topic branches.
|
|
24
|
+
|
|
25
|
+
== Copyright
|
|
26
|
+
|
|
27
|
+
Copyright (c) 2011 Dan Kubb. See LICENSE for details.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../lib/veritas/optimizer/version', __FILE__)
|
|
4
|
+
|
|
5
|
+
begin
|
|
6
|
+
gem('jeweler', '~> 1.5.2') if respond_to?(:gem, true)
|
|
7
|
+
require 'jeweler'
|
|
8
|
+
|
|
9
|
+
Jeweler::Tasks.new do |gem|
|
|
10
|
+
gem.name = 'veritas-optimizer'
|
|
11
|
+
gem.summary = 'Relational algebra optimizer'
|
|
12
|
+
gem.description = 'Optimizes veritas relations'
|
|
13
|
+
gem.email = 'dan.kubb@gmail.com'
|
|
14
|
+
gem.homepage = 'https://github.com/dkubb/veritas-optimizer'
|
|
15
|
+
gem.authors = [ 'Dan Kubb' ]
|
|
16
|
+
|
|
17
|
+
gem.version = Veritas::Optimizer::VERSION
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Jeweler::GemcutterTasks.new
|
|
21
|
+
|
|
22
|
+
FileList['tasks/**/*.rake'].each { |task| import task }
|
|
23
|
+
rescue LoadError
|
|
24
|
+
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.5.2'
|
|
25
|
+
end
|
data/TODO
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
* Add further optimizations:
|
|
2
|
+
* Projection
|
|
3
|
+
* When it contains a Rename, if the renamed attributes are projected
|
|
4
|
+
away, then the rename can be removed.
|
|
5
|
+
* Operation Order:
|
|
6
|
+
* Projection containing an Order
|
|
7
|
+
* Should remove the Order, since it is a noop
|
|
8
|
+
* Projection should follow Rename
|
|
9
|
+
* When a Projection contains a Restriction, wrap the Projection
|
|
10
|
+
in the Restriction, projecting away any attributes not used in
|
|
11
|
+
the restriction. If there are any remaining attributes, then
|
|
12
|
+
wrap the operation in a Projection removing those attributes.
|
|
13
|
+
* If all attributes are being used in the Restriction do nothing
|
|
14
|
+
* When a Projection contains a Join, wrap the Join with a Projection
|
|
15
|
+
of all the headers, minus those used in the Join. If there were
|
|
16
|
+
any used, then wrap the whole operation in a Projection with
|
|
17
|
+
the remaining attributes.
|
|
18
|
+
* If all the attributes are used in the Join, do nothing
|
|
19
|
+
* Try to use the same approach for Product
|
|
20
|
+
* Test if it's possible to fully distribute projections over
|
|
21
|
+
joins rather than splitting it up like this.
|
|
22
|
+
* Restriction should follow Projection
|
|
23
|
+
* Restriction optimizations:
|
|
24
|
+
* "attr > ? OR attr > ?" -> "attr > ?", with the least restrictive value
|
|
25
|
+
* Do the same for >=, <, <=
|
|
26
|
+
* "attr > ? AND attr > ?" -> "attr > ?", with the most restrictive value
|
|
27
|
+
* Do the same for >=, <, <=
|
|
28
|
+
* "attr > 5 OR attr == 5" -> "attr >= 5"
|
|
29
|
+
* "attr < 5 OR attr == 5" -> "attr <= 5"
|
|
30
|
+
* "attr" = "string" AND "attr" =~ /string/ -> "attr" = "string"
|
|
31
|
+
* If the regexp matches the constant, then it should be
|
|
32
|
+
optimized down to a constant match. If it does not match
|
|
33
|
+
then it should be optimized to a Contradiction.
|
|
34
|
+
* Constant folding, eg:
|
|
35
|
+
"attr1 > attr2 AND attr1 = 5" -> "5 > attr2 AND attr1 = 5"
|
|
36
|
+
* This will probably only work across Conjunctions.
|
|
37
|
+
* "attr > 5 AND attr = 6" -> "attr = 6", because attr must be
|
|
38
|
+
equal to 6. this will probably be related to constant folding;
|
|
39
|
+
the first expression will become 6 > 5, which evaluates to a
|
|
40
|
+
Tautology, then the expression is a Tautology AND attr = 6,
|
|
41
|
+
which simplifies down to attr = 6.
|
|
42
|
+
* "attr < 5 AND attr = 6" -> "Contradiction", because attr must be equal to
|
|
43
|
+
6, and 6 < 5 evaluates to a Contradiction. A Contradiction AND attr = 6
|
|
44
|
+
simplifies down to a Contradiction.
|
|
45
|
+
* Figure out how to reorganize the Restriction predicates so that all
|
|
46
|
+
similar operations are closer together to allow more efficient
|
|
47
|
+
optimizations. This would allow optimizations of stuff like this:
|
|
48
|
+
|
|
49
|
+
"attr1 = ? OR attr2 = ? OR attr1 = ?"
|
|
50
|
+
|
|
51
|
+
Into:
|
|
52
|
+
|
|
53
|
+
"attr1 IN(..) OR attr2 = ?"
|
|
54
|
+
* Rename should distribute over Join, Product and Set operations
|
|
55
|
+
* The goal should be to push Rename as close to the base tables
|
|
56
|
+
as possible so that the names of attribute will be consistent
|
|
57
|
+
throughout the whole tree.
|
|
58
|
+
* A Union of relations with the same base, header, and restrictions should
|
|
59
|
+
try to combine into a single relation with the restrictions using OR.
|
|
60
|
+
* An Intersection of relations with the same base, header, and restrictions
|
|
61
|
+
should try to combine into a single relation with the restrictions using
|
|
62
|
+
AND.
|
|
63
|
+
* A Difference of relations with the same base and restrictions should
|
|
64
|
+
try to combine into a single relation with the restrictions using NOT.
|
|
65
|
+
* Join Optimizations
|
|
66
|
+
* When a Join contains a Join, and the size of the base relations is
|
|
67
|
+
known, join the smallest with the largest, and then join that result
|
|
68
|
+
with the remaining relation.
|
|
69
|
+
* Make sure the smallest relation (with a known size) is always the
|
|
70
|
+
right-most operation.
|
|
71
|
+
* When a restriction uses a unique index:
|
|
72
|
+
* Order can be factored out
|
|
73
|
+
* Limit with a limit >= 1 can be factored out
|
|
74
|
+
* Offset with an offset > 0 can be transformed into an empty
|
|
75
|
+
relation, since at most there can be only one match.
|
data/config/flay.yml
ADDED
data/config/flog.yml
ADDED
data/config/roodi.yml
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
AbcMetricMethodCheck: { score: 7.3 }
|
|
3
|
+
AssignmentInConditionalCheck: { }
|
|
4
|
+
CaseMissingElseCheck: { }
|
|
5
|
+
ClassLineCountCheck: { line_count: 390 }
|
|
6
|
+
ClassNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
|
|
7
|
+
ClassVariableCheck: { }
|
|
8
|
+
CyclomaticComplexityBlockCheck: { complexity: 2 }
|
|
9
|
+
CyclomaticComplexityMethodCheck: { complexity: 6 }
|
|
10
|
+
EmptyRescueBodyCheck: { }
|
|
11
|
+
ForLoopCheck: { }
|
|
12
|
+
MethodLineCountCheck: { line_count: 9 }
|
|
13
|
+
MethodNameCheck: { pattern: !ruby/regexp /\A(?:[a-z](?:_?[a-z])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/ }
|
|
14
|
+
ModuleLineCountCheck: { line_count: 392 }
|
|
15
|
+
ModuleNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
|
|
16
|
+
ParameterNumberCheck: { parameter_count: 3 }
|
data/config/site.reek
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
UncommunicativeParameterName:
|
|
3
|
+
accept: []
|
|
4
|
+
exclude: []
|
|
5
|
+
enabled: true
|
|
6
|
+
reject:
|
|
7
|
+
- !ruby/regexp /^.$/
|
|
8
|
+
- !ruby/regexp /[0-9]$/
|
|
9
|
+
- !ruby/regexp /[A-Z]/
|
|
10
|
+
LargeClass:
|
|
11
|
+
max_methods: 11 # TODO: decrease max_methods to 10-15 or less
|
|
12
|
+
exclude: []
|
|
13
|
+
enabled: true
|
|
14
|
+
max_instance_variables: 2
|
|
15
|
+
UncommunicativeMethodName:
|
|
16
|
+
accept: []
|
|
17
|
+
exclude: []
|
|
18
|
+
enabled: true
|
|
19
|
+
reject:
|
|
20
|
+
- !ruby/regexp /^[a-z]$/
|
|
21
|
+
- !ruby/regexp /[0-9]$/
|
|
22
|
+
- !ruby/regexp /[A-Z]/
|
|
23
|
+
LongParameterList:
|
|
24
|
+
max_params: 3
|
|
25
|
+
exclude: []
|
|
26
|
+
enabled: true
|
|
27
|
+
overrides: {}
|
|
28
|
+
FeatureEnvy:
|
|
29
|
+
exclude: []
|
|
30
|
+
enabled: true
|
|
31
|
+
ClassVariable:
|
|
32
|
+
exclude: []
|
|
33
|
+
enabled: true
|
|
34
|
+
BooleanParameter:
|
|
35
|
+
exclude: []
|
|
36
|
+
enabled: true
|
|
37
|
+
IrresponsibleModule:
|
|
38
|
+
exclude: []
|
|
39
|
+
enabled: true
|
|
40
|
+
UncommunicativeModuleName:
|
|
41
|
+
accept: []
|
|
42
|
+
exclude: []
|
|
43
|
+
enabled: true
|
|
44
|
+
reject:
|
|
45
|
+
- !ruby/regexp /^.$/
|
|
46
|
+
- !ruby/regexp /[0-9]$/
|
|
47
|
+
NestedIterators:
|
|
48
|
+
ignore_iterators: []
|
|
49
|
+
exclude: []
|
|
50
|
+
enabled: true
|
|
51
|
+
max_allowed_nesting: 1
|
|
52
|
+
LongMethod:
|
|
53
|
+
max_statements: 7
|
|
54
|
+
exclude: []
|
|
55
|
+
enabled: true
|
|
56
|
+
Duplication:
|
|
57
|
+
allow_calls: []
|
|
58
|
+
exclude: []
|
|
59
|
+
enabled: true
|
|
60
|
+
max_calls: 1
|
|
61
|
+
UtilityFunction:
|
|
62
|
+
max_helper_calls: 1
|
|
63
|
+
exclude: []
|
|
64
|
+
enabled: true
|
|
65
|
+
Attribute:
|
|
66
|
+
exclude: []
|
|
67
|
+
enabled: false
|
|
68
|
+
UncommunicativeVariableName:
|
|
69
|
+
accept: []
|
|
70
|
+
exclude: []
|
|
71
|
+
enabled: true
|
|
72
|
+
reject:
|
|
73
|
+
- !ruby/regexp /^.$/
|
|
74
|
+
- !ruby/regexp /[0-9]$/
|
|
75
|
+
- !ruby/regexp /[A-Z]/
|
|
76
|
+
SimulatedPolymorphism:
|
|
77
|
+
exclude: []
|
|
78
|
+
enabled: true
|
|
79
|
+
max_ifs: 1
|
|
80
|
+
DataClump:
|
|
81
|
+
exclude: []
|
|
82
|
+
enabled: true
|
|
83
|
+
max_copies: 1
|
|
84
|
+
min_clump_size: 2
|
|
85
|
+
ControlCouple:
|
|
86
|
+
exclude: []
|
|
87
|
+
enabled: true
|
|
88
|
+
LongYieldList:
|
|
89
|
+
max_params: 1
|
|
90
|
+
exclude: []
|
|
91
|
+
enabled: true
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Difference optimizations
|
|
8
|
+
class Difference < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# A Difference with equal operands is empty
|
|
15
|
+
#
|
|
16
|
+
# @return [Relation::Empty]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimize
|
|
20
|
+
Veritas::Relation::Empty.new(operation.header)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # class EqualOperands
|
|
24
|
+
|
|
25
|
+
# Optimize when the left operand is empty
|
|
26
|
+
class EmptyLeft < self
|
|
27
|
+
include Relation::Operation::Binary::EmptyLeft
|
|
28
|
+
|
|
29
|
+
# A Difference with an empty left operand is empty
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation::Empty]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
left
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # class EmptyLeft
|
|
39
|
+
|
|
40
|
+
# Optimize when the right operand is empty
|
|
41
|
+
class EmptyRight < self
|
|
42
|
+
include Relation::Operation::Binary::EmptyRight
|
|
43
|
+
|
|
44
|
+
# A Difference with an empty right operand is equivalent to the left
|
|
45
|
+
#
|
|
46
|
+
# @return [Relation]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def optimize
|
|
50
|
+
left
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # class EmptyRight
|
|
54
|
+
|
|
55
|
+
Veritas::Algebra::Difference.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyLeft,
|
|
58
|
+
EmptyRight,
|
|
59
|
+
MaterializedOperand,
|
|
60
|
+
UnoptimizedOperand
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
end # class Difference
|
|
64
|
+
end # module Algebra
|
|
65
|
+
end # class Optimizer
|
|
66
|
+
end # module Veritas
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Extension optimizations
|
|
8
|
+
class Extension < Relation::Operation::Unary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are optimizable
|
|
11
|
+
class UnoptimizedOperand < self
|
|
12
|
+
|
|
13
|
+
# Test if the operand is unoptimized
|
|
14
|
+
#
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def optimizable?
|
|
19
|
+
!operand.equal?(operation.operand)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Return an Extension with an optimized operand
|
|
23
|
+
#
|
|
24
|
+
# @return [Algebra::Extension]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def optimize
|
|
28
|
+
operation = self.operation
|
|
29
|
+
operation.class.new(operand, operation.extensions)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class UnoptimizedOperand
|
|
33
|
+
|
|
34
|
+
Veritas::Algebra::Extension.optimizer = chain(
|
|
35
|
+
MaterializedOperand,
|
|
36
|
+
UnoptimizedOperand
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
end # class Extension
|
|
40
|
+
end # module Algebra
|
|
41
|
+
end # class Optimizer
|
|
42
|
+
end # module Veritas
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Intersection optimizations
|
|
8
|
+
class Intersection < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# An Intersection with equal operands is equivalent to either operand
|
|
15
|
+
#
|
|
16
|
+
# @return [Relation]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimize
|
|
20
|
+
left
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # class EqualOperands
|
|
24
|
+
|
|
25
|
+
# Optimize when the left operand is empty
|
|
26
|
+
class EmptyLeft < self
|
|
27
|
+
include Relation::Operation::Binary::EmptyLeft
|
|
28
|
+
|
|
29
|
+
# An Intersection with an empty left operand is empty
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation::Empty]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
left
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # class EmptyLeft
|
|
39
|
+
|
|
40
|
+
# Optimize when the right operand is empty
|
|
41
|
+
class EmptyRight < self
|
|
42
|
+
include Relation::Operation::Binary::EmptyRight
|
|
43
|
+
|
|
44
|
+
# An Intersection with an empty right operand is empty
|
|
45
|
+
#
|
|
46
|
+
# @return [Relation::Empty]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def optimize
|
|
50
|
+
right
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # class EmptyRight
|
|
54
|
+
|
|
55
|
+
Veritas::Algebra::Intersection.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyLeft,
|
|
58
|
+
EmptyRight,
|
|
59
|
+
MaterializedOperand,
|
|
60
|
+
UnoptimizedOperand
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
end # class Intersection
|
|
64
|
+
end # module Algebra
|
|
65
|
+
end # class Optimizer
|
|
66
|
+
end # module Veritas
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Join optimizations
|
|
8
|
+
class Join < Relation::Operation::Combination
|
|
9
|
+
|
|
10
|
+
# Optimize when operand headers are equivalent
|
|
11
|
+
class EqualHeaders < self
|
|
12
|
+
|
|
13
|
+
# Test if the operands' headers are equal
|
|
14
|
+
#
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def optimizable?
|
|
19
|
+
left.header.eql?(right.header)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# A Join with equal headers is an Intersection
|
|
23
|
+
#
|
|
24
|
+
# @return [Algebra::Intersection]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def optimize
|
|
28
|
+
Veritas::Algebra::Intersection.new(left, right)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end # class EqualHeaders
|
|
32
|
+
|
|
33
|
+
Veritas::Algebra::Join.optimizer = chain(
|
|
34
|
+
EmptyLeft,
|
|
35
|
+
EmptyRight,
|
|
36
|
+
EqualHeaders,
|
|
37
|
+
MaterializedOperand,
|
|
38
|
+
UnoptimizedOperand
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
end # class Join
|
|
42
|
+
end # module Algebra
|
|
43
|
+
end # class Optimizer
|
|
44
|
+
end # module Veritas
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Product optimizations
|
|
8
|
+
class Product < Relation::Operation::Combination
|
|
9
|
+
|
|
10
|
+
# Optimize when left operand is a TABLE DEE
|
|
11
|
+
class TableDeeLeft < self
|
|
12
|
+
|
|
13
|
+
# Test if the left operand is a TABLE DEE
|
|
14
|
+
#
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def optimizable?
|
|
19
|
+
left = self.left
|
|
20
|
+
left.header.empty? && !left.kind_of?(Veritas::Relation::Empty)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# A Product with a left TABLE DEE is equivalent to the right operand
|
|
24
|
+
#
|
|
25
|
+
# @return [Relation]
|
|
26
|
+
#
|
|
27
|
+
# @api private
|
|
28
|
+
def optimize
|
|
29
|
+
right
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class TableDeeLeft
|
|
33
|
+
|
|
34
|
+
# Optimize when right operand is a TABLE DEE
|
|
35
|
+
class TableDeeRight < self
|
|
36
|
+
|
|
37
|
+
# Test if the right operand is a TABLE DEE
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimizable?
|
|
43
|
+
right = self.right
|
|
44
|
+
right.header.empty? && !right.kind_of?(Veritas::Relation::Empty)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# A Product with a right TABLE DEE is equivalent to the left operand
|
|
48
|
+
#
|
|
49
|
+
# @return [Relation]
|
|
50
|
+
#
|
|
51
|
+
# @api private
|
|
52
|
+
def optimize
|
|
53
|
+
left
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end # class TableDeeRight
|
|
57
|
+
|
|
58
|
+
Veritas::Algebra::Product.optimizer = chain(
|
|
59
|
+
TableDeeLeft,
|
|
60
|
+
TableDeeRight,
|
|
61
|
+
EmptyLeft,
|
|
62
|
+
EmptyRight,
|
|
63
|
+
MaterializedOperand,
|
|
64
|
+
UnoptimizedOperand
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
end # class Product
|
|
68
|
+
end # module Algebra
|
|
69
|
+
end # class Optimizer
|
|
70
|
+
end # module Veritas
|