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,259 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Algebra
|
|
6
|
+
|
|
7
|
+
# Abstract base class representing Restriction optimizations
|
|
8
|
+
class Restriction < Relation::Operation::Unary
|
|
9
|
+
|
|
10
|
+
# The optimized predicate
|
|
11
|
+
#
|
|
12
|
+
# @return [Expression]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
attr_reader :predicate
|
|
16
|
+
|
|
17
|
+
# Initialize an Restriction optimizer
|
|
18
|
+
#
|
|
19
|
+
# @return [undefined]
|
|
20
|
+
#
|
|
21
|
+
# @api private
|
|
22
|
+
def initialize(*)
|
|
23
|
+
super
|
|
24
|
+
@predicate = self.class.optimize_predicate(operation.predicate)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# Wrap the operand's operand in a Restriction
|
|
30
|
+
#
|
|
31
|
+
# @return [Restriction]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def wrap_operand
|
|
35
|
+
operation.class.new(operand.operand, predicate)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Optimize the predicate if possible
|
|
39
|
+
#
|
|
40
|
+
# @param [Expression] predicate
|
|
41
|
+
#
|
|
42
|
+
# @return [Expression]
|
|
43
|
+
#
|
|
44
|
+
# @api private
|
|
45
|
+
def self.optimize_predicate(predicate)
|
|
46
|
+
predicate.respond_to?(:optimize) ? predicate.optimize : predicate
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Optimize when the predicate is a tautology
|
|
50
|
+
class Tautology < self
|
|
51
|
+
|
|
52
|
+
# Test if the predicate is a tautology
|
|
53
|
+
#
|
|
54
|
+
# @return [Boolean]
|
|
55
|
+
#
|
|
56
|
+
# @api private
|
|
57
|
+
def optimizable?
|
|
58
|
+
predicate.equal?(Veritas::Logic::Proposition::Tautology.instance)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# A Restriction with a tautology is a noop
|
|
62
|
+
#
|
|
63
|
+
# @return [Relation]
|
|
64
|
+
#
|
|
65
|
+
# @api private
|
|
66
|
+
def optimize
|
|
67
|
+
operand
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end # class Tautology
|
|
71
|
+
|
|
72
|
+
# Optimize when the predicate is a contradiction
|
|
73
|
+
class Contradiction < self
|
|
74
|
+
|
|
75
|
+
# Test if the predicate is a contradiction
|
|
76
|
+
#
|
|
77
|
+
# @return [Boolean]
|
|
78
|
+
#
|
|
79
|
+
# @api private
|
|
80
|
+
def optimizable?
|
|
81
|
+
predicate.equal?(Veritas::Logic::Proposition::Contradiction.instance)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# A Restriction with a contradiction matches nothing
|
|
85
|
+
#
|
|
86
|
+
# @return [Relation]
|
|
87
|
+
#
|
|
88
|
+
# @api private
|
|
89
|
+
def optimize
|
|
90
|
+
Veritas::Relation::Empty.new(operation.header)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end # class Contradiction
|
|
94
|
+
|
|
95
|
+
# Optimize when the operand is a Restriction
|
|
96
|
+
class RestrictionOperand < self
|
|
97
|
+
|
|
98
|
+
# Test if the operand is a Restriction
|
|
99
|
+
#
|
|
100
|
+
# @return [Boolean]
|
|
101
|
+
#
|
|
102
|
+
# @api private
|
|
103
|
+
def optimizable?
|
|
104
|
+
operand.kind_of?(operation.class)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Flatten nested Restrictions into a single Restriction
|
|
108
|
+
#
|
|
109
|
+
# @return [Projection]
|
|
110
|
+
#
|
|
111
|
+
# @api private
|
|
112
|
+
def optimize
|
|
113
|
+
operation.class.new(operand.operand, optimized_predicate)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
# Join the operand and operation predicates and optimize them
|
|
119
|
+
#
|
|
120
|
+
# @return [Expression]
|
|
121
|
+
#
|
|
122
|
+
# @api private
|
|
123
|
+
def optimized_predicate
|
|
124
|
+
Veritas::Logic::Connective::Conjunction.new(operand.predicate, predicate).optimize
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end # class RestrictionOperand
|
|
128
|
+
|
|
129
|
+
# Optimize when the operand is a Set
|
|
130
|
+
class SetOperand < self
|
|
131
|
+
|
|
132
|
+
# Test if the operand is a Restriction
|
|
133
|
+
#
|
|
134
|
+
# @return [Boolean]
|
|
135
|
+
#
|
|
136
|
+
# @api private
|
|
137
|
+
def optimizable?
|
|
138
|
+
operand.kind_of?(Veritas::Relation::Operation::Set)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Wrap each operand in the Set in a Restriction
|
|
142
|
+
#
|
|
143
|
+
# @return [Set]
|
|
144
|
+
#
|
|
145
|
+
# @api private
|
|
146
|
+
def optimize
|
|
147
|
+
operand.class.new(wrap_left, wrap_right)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
private
|
|
151
|
+
|
|
152
|
+
# Utility method to wrap the left operand in a Restriction
|
|
153
|
+
#
|
|
154
|
+
# @return [Restriction]
|
|
155
|
+
#
|
|
156
|
+
# @api private
|
|
157
|
+
def wrap_left
|
|
158
|
+
operation.class.new(operand.left, predicate)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Utility method to wrap the right operand in a Restriction
|
|
162
|
+
#
|
|
163
|
+
# @return [Restriction]
|
|
164
|
+
#
|
|
165
|
+
# @api private
|
|
166
|
+
def wrap_right
|
|
167
|
+
operation.class.new(operand.right, predicate)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
end # class SetOperand
|
|
171
|
+
|
|
172
|
+
# Optimize when the operand is a Reverse
|
|
173
|
+
class ReverseOperand < self
|
|
174
|
+
|
|
175
|
+
# Test if the operand is a Reverse
|
|
176
|
+
#
|
|
177
|
+
# @return [Boolean]
|
|
178
|
+
#
|
|
179
|
+
# @api private
|
|
180
|
+
def optimizable?
|
|
181
|
+
operand.kind_of?(Veritas::Relation::Operation::Reverse)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Wrap the Restriction in a Reverse
|
|
185
|
+
#
|
|
186
|
+
# @return [Reverse]
|
|
187
|
+
#
|
|
188
|
+
# @api private
|
|
189
|
+
def optimize
|
|
190
|
+
operand.class.new(wrap_operand)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end # class ReverseOperand
|
|
194
|
+
|
|
195
|
+
# Optimize when the operand is an Order
|
|
196
|
+
class OrderOperand < self
|
|
197
|
+
|
|
198
|
+
# Test if the operand is an Order
|
|
199
|
+
#
|
|
200
|
+
# @return [Boolean]
|
|
201
|
+
#
|
|
202
|
+
# @api private
|
|
203
|
+
def optimizable?
|
|
204
|
+
operand.kind_of?(Veritas::Relation::Operation::Order)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Wrap the Restriction in an Order
|
|
208
|
+
#
|
|
209
|
+
# @return [Order]
|
|
210
|
+
#
|
|
211
|
+
# @api private
|
|
212
|
+
def optimize
|
|
213
|
+
operand = self.operand
|
|
214
|
+
operand.class.new(wrap_operand, operand.directions)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end # class OrderOperand
|
|
218
|
+
|
|
219
|
+
# Optimize when operand is optimizable
|
|
220
|
+
class UnoptimizedOperand < self
|
|
221
|
+
|
|
222
|
+
# Test if the operand is unoptimized
|
|
223
|
+
#
|
|
224
|
+
# @return [Boolean]
|
|
225
|
+
#
|
|
226
|
+
# @api private
|
|
227
|
+
def optimizable?
|
|
228
|
+
operation = self.operation
|
|
229
|
+
!operand.equal?(operation.operand) ||
|
|
230
|
+
!predicate.equal?(operation.predicate)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# Return a Restriction with an optimized operand
|
|
234
|
+
#
|
|
235
|
+
# @return [Rename]
|
|
236
|
+
#
|
|
237
|
+
# @api private
|
|
238
|
+
def optimize
|
|
239
|
+
operation.class.new(operand, predicate)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
end # class UnoptimizedOperand
|
|
243
|
+
|
|
244
|
+
Veritas::Algebra::Restriction.optimizer = chain(
|
|
245
|
+
Tautology,
|
|
246
|
+
Contradiction,
|
|
247
|
+
RestrictionOperand,
|
|
248
|
+
SetOperand,
|
|
249
|
+
ReverseOperand,
|
|
250
|
+
OrderOperand,
|
|
251
|
+
EmptyOperand,
|
|
252
|
+
MaterializedOperand,
|
|
253
|
+
UnoptimizedOperand
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
end # class Restriction
|
|
257
|
+
end # module Algebra
|
|
258
|
+
end # class Optimizer
|
|
259
|
+
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 Summarization optimizations
|
|
8
|
+
class Summarization < Relation::Operation::Unary
|
|
9
|
+
|
|
10
|
+
# Optimize when operand is 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 a Summarization with an optimized operand
|
|
23
|
+
#
|
|
24
|
+
# @return [Rename]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def optimize
|
|
28
|
+
operation = self.operation
|
|
29
|
+
operation.class.new(operand, operation.summarize_by, operation.summarizers)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class UnoptimizedOperand
|
|
33
|
+
|
|
34
|
+
Veritas::Algebra::Summarization.optimizer = chain(
|
|
35
|
+
MaterializedOperand,
|
|
36
|
+
UnoptimizedOperand
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
end # class Summarization
|
|
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 Difference optimizations
|
|
8
|
+
class Union < Relation::Operation::Binary
|
|
9
|
+
|
|
10
|
+
# Optimize when operands are equal
|
|
11
|
+
class EqualOperands < self
|
|
12
|
+
include Relation::Operation::Binary::EqualOperands
|
|
13
|
+
|
|
14
|
+
# A Union with equal operands is a noop
|
|
15
|
+
#
|
|
16
|
+
# @return [Relation]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimize
|
|
20
|
+
left
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # class EqualOperands
|
|
24
|
+
|
|
25
|
+
# Optimize when the left operand is empty
|
|
26
|
+
class EmptyLeft < self
|
|
27
|
+
include Relation::Operation::Binary::EmptyLeft
|
|
28
|
+
|
|
29
|
+
# A Union with an empty left operand is equivalent to the right
|
|
30
|
+
#
|
|
31
|
+
# @return [Relation]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
def optimize
|
|
35
|
+
right
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end # class EmptyLeft
|
|
39
|
+
|
|
40
|
+
# Optimize when the right operand is empty
|
|
41
|
+
class EmptyRight < self
|
|
42
|
+
include Relation::Operation::Binary::EmptyRight
|
|
43
|
+
|
|
44
|
+
# A Union with an empty right operand is equivalent to the left
|
|
45
|
+
#
|
|
46
|
+
# @return [Relation]
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def optimize
|
|
50
|
+
left
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end # class EmptyRight
|
|
54
|
+
|
|
55
|
+
Veritas::Algebra::Union.optimizer = chain(
|
|
56
|
+
EqualOperands,
|
|
57
|
+
EmptyRight,
|
|
58
|
+
EmptyLeft,
|
|
59
|
+
MaterializedOperand,
|
|
60
|
+
UnoptimizedOperand
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
end # class Union
|
|
64
|
+
end # module Algebra
|
|
65
|
+
end # class Optimizer
|
|
66
|
+
end # module Veritas
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
module Connective
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Binary connective optimizations
|
|
9
|
+
class Binary < Optimizer
|
|
10
|
+
|
|
11
|
+
# The optimized left operand
|
|
12
|
+
#
|
|
13
|
+
# @return [Expression]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
attr_reader :left
|
|
17
|
+
|
|
18
|
+
# The optimized right operand
|
|
19
|
+
#
|
|
20
|
+
# @return [Expression]
|
|
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 [Expression]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def optimize_left
|
|
44
|
+
# TODO: move Predicate.optimize_operand to a better location
|
|
45
|
+
Predicate.optimize_operand(operation.left)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Optimize the right operand
|
|
49
|
+
#
|
|
50
|
+
# @return [Expression]
|
|
51
|
+
#
|
|
52
|
+
# @api private
|
|
53
|
+
def optimize_right
|
|
54
|
+
# TODO: move Predicate.optimize_operand to a better location
|
|
55
|
+
Predicate.optimize_operand(operation.right)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Test if the operands are equality predicates for the same attribute
|
|
59
|
+
#
|
|
60
|
+
# @return [Boolean]
|
|
61
|
+
#
|
|
62
|
+
# @api private
|
|
63
|
+
def equality_with_same_attributes?
|
|
64
|
+
left.kind_of?(Veritas::Logic::Predicate::Equality) &&
|
|
65
|
+
right.kind_of?(Veritas::Logic::Predicate::Equality) &&
|
|
66
|
+
same_attribute? &&
|
|
67
|
+
constant_value?
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Test if the operands are inequality predicates for the same attribute
|
|
71
|
+
#
|
|
72
|
+
# @return [Boolean]
|
|
73
|
+
#
|
|
74
|
+
# @api private
|
|
75
|
+
def inequality_with_same_attributes?
|
|
76
|
+
left.kind_of?(Veritas::Logic::Predicate::Inequality) &&
|
|
77
|
+
right.kind_of?(Veritas::Logic::Predicate::Inequality) &&
|
|
78
|
+
same_attribute? &&
|
|
79
|
+
constant_value?
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Test if the left and right predicates are for the same attribute
|
|
83
|
+
#
|
|
84
|
+
# @return [Boolean]
|
|
85
|
+
#
|
|
86
|
+
# @api private
|
|
87
|
+
def same_attribute?
|
|
88
|
+
left.left.equal?(right.left)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Test if the left and right predicates match against constant values
|
|
92
|
+
#
|
|
93
|
+
# @return [Boolean]
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
def constant_value?
|
|
97
|
+
util = Predicate::Util
|
|
98
|
+
util.constant?(left.right) && util.constant?(right.right)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Test if the left is a tautology
|
|
102
|
+
#
|
|
103
|
+
# @return [Boolean]
|
|
104
|
+
#
|
|
105
|
+
# @api private
|
|
106
|
+
def left_tautology?
|
|
107
|
+
left.equal?(Veritas::Logic::Proposition::Tautology.instance)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Test if the right is a tautology
|
|
111
|
+
#
|
|
112
|
+
# @return [Boolean]
|
|
113
|
+
#
|
|
114
|
+
# @api private
|
|
115
|
+
def right_tautology?
|
|
116
|
+
right.equal?(Veritas::Logic::Proposition::Tautology.instance)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Test if the left is a contradiction
|
|
120
|
+
#
|
|
121
|
+
# @return [Boolean]
|
|
122
|
+
#
|
|
123
|
+
# @api private
|
|
124
|
+
def left_contradiction?
|
|
125
|
+
left.equal?(Veritas::Logic::Proposition::Contradiction.instance)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Test if the right is a contradiction
|
|
129
|
+
#
|
|
130
|
+
# @return [Boolean]
|
|
131
|
+
#
|
|
132
|
+
# @api private
|
|
133
|
+
def right_contradiction?
|
|
134
|
+
right.equal?(Veritas::Logic::Proposition::Contradiction.instance)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Optimize when the operands are equal
|
|
138
|
+
class EqualOperands < self
|
|
139
|
+
|
|
140
|
+
# Test if the operands are equal
|
|
141
|
+
#
|
|
142
|
+
# @return [Boolean]
|
|
143
|
+
#
|
|
144
|
+
# @api private
|
|
145
|
+
def optimizable?
|
|
146
|
+
left.eql?(right)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# A Binary connective with equal operands is equivalent to the left
|
|
150
|
+
#
|
|
151
|
+
# @return [Expression]
|
|
152
|
+
#
|
|
153
|
+
# @api private
|
|
154
|
+
def optimize
|
|
155
|
+
left
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end # class EqualOperands
|
|
159
|
+
|
|
160
|
+
# Optimize when the left operand is redundant
|
|
161
|
+
class RedundantLeftOperand < self
|
|
162
|
+
|
|
163
|
+
# Test if the left operand is redundant
|
|
164
|
+
#
|
|
165
|
+
# @return [Boolean]
|
|
166
|
+
#
|
|
167
|
+
# @api private
|
|
168
|
+
def optimizable?
|
|
169
|
+
left = self.left
|
|
170
|
+
operation.kind_of?(left.class) && right.eql?(left.right)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# A Binary connective with a redundant left operand is equivalent to the left
|
|
174
|
+
#
|
|
175
|
+
# @return [Expression]
|
|
176
|
+
#
|
|
177
|
+
# @api private
|
|
178
|
+
def optimize
|
|
179
|
+
left
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
end # class RedundantLeftOperand
|
|
183
|
+
|
|
184
|
+
# Optimize when the right operand is redundant
|
|
185
|
+
class RedundantRightOperand < self
|
|
186
|
+
|
|
187
|
+
# Test if the right operand is redundant
|
|
188
|
+
#
|
|
189
|
+
# @return [Boolean]
|
|
190
|
+
#
|
|
191
|
+
# @api private
|
|
192
|
+
def optimizable?
|
|
193
|
+
right = self.right
|
|
194
|
+
operation.kind_of?(right.class) && left.eql?(right.left)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# A Binary connective with a redundant right operand is equivalent to the right
|
|
198
|
+
#
|
|
199
|
+
# @return [Expression]
|
|
200
|
+
#
|
|
201
|
+
# @api private
|
|
202
|
+
def optimize
|
|
203
|
+
right
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end # class RedundantRightOperand
|
|
207
|
+
|
|
208
|
+
# Optimize when the operands are unoptimized
|
|
209
|
+
class UnoptimizedOperand < self
|
|
210
|
+
|
|
211
|
+
# Test if the operands are unoptimized
|
|
212
|
+
#
|
|
213
|
+
# @return [Boolean]
|
|
214
|
+
#
|
|
215
|
+
# @api private
|
|
216
|
+
def optimizable?
|
|
217
|
+
left_optimizable? || right_optimizable?
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Return a Binary connective with optimized operands
|
|
221
|
+
#
|
|
222
|
+
# @return [Binary]
|
|
223
|
+
#
|
|
224
|
+
# @api private
|
|
225
|
+
def optimize
|
|
226
|
+
operation.class.new(left, right)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
private
|
|
230
|
+
|
|
231
|
+
# Test if the left operand is optimizable
|
|
232
|
+
#
|
|
233
|
+
# @return [Boolean]
|
|
234
|
+
#
|
|
235
|
+
# @api private
|
|
236
|
+
def left_optimizable?
|
|
237
|
+
!left.equal?(operation.left)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# Test if the right operand is optimizable
|
|
241
|
+
#
|
|
242
|
+
# @return [Boolean]
|
|
243
|
+
#
|
|
244
|
+
# @api private
|
|
245
|
+
def right_optimizable?
|
|
246
|
+
!right.equal?(operation.right)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end # class UnoptimizedOperand
|
|
250
|
+
end # class Binary
|
|
251
|
+
end # module Connective
|
|
252
|
+
end # module Logic
|
|
253
|
+
end # class Optimizer
|
|
254
|
+
end # module Veritas
|