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,122 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
module Connective
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Conjunction optimizations
|
|
9
|
+
class Conjunction < Binary
|
|
10
|
+
|
|
11
|
+
# Optimize when the left operand is a tautology
|
|
12
|
+
class LeftOperandTautology < self
|
|
13
|
+
|
|
14
|
+
# Test if the left operand is a tautology
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimizable?
|
|
20
|
+
left_tautology?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# A Conjunction with a tautology left operand is equivalent to the right
|
|
24
|
+
#
|
|
25
|
+
# @return [Expression]
|
|
26
|
+
#
|
|
27
|
+
# @api private
|
|
28
|
+
def optimize
|
|
29
|
+
right
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class LeftOperandTautology
|
|
33
|
+
|
|
34
|
+
# Optimize when the right operand is a tautology
|
|
35
|
+
class RightOperandTautology < self
|
|
36
|
+
|
|
37
|
+
# Test if the right operand is a tautology
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimizable?
|
|
43
|
+
right_tautology?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# A Conjunction with a tautology right operand is equivalent to the left
|
|
47
|
+
#
|
|
48
|
+
# @return [Expression]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
def optimize
|
|
52
|
+
left
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end # class RightOperandTautology
|
|
56
|
+
|
|
57
|
+
# Optimize when the operands are inequality predicates for the same attribute
|
|
58
|
+
class OptimizableToExclusion < self
|
|
59
|
+
|
|
60
|
+
# Test if the operands are inequality predicates for the same attribute
|
|
61
|
+
#
|
|
62
|
+
# @return [Boolean]
|
|
63
|
+
#
|
|
64
|
+
# @api private
|
|
65
|
+
def optimizable?
|
|
66
|
+
inequality_with_same_attributes?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Return an Exclusion for an attribute against a set of values
|
|
70
|
+
#
|
|
71
|
+
# @return [Exclusion]
|
|
72
|
+
#
|
|
73
|
+
# @api private
|
|
74
|
+
def optimize
|
|
75
|
+
left = self.left
|
|
76
|
+
Veritas::Logic::Predicate::Exclusion.new(left.left, [ left.right, right.right ]).optimize
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end # class OptimizableToExclusion
|
|
80
|
+
|
|
81
|
+
# Optimize when the operands are a contradiction
|
|
82
|
+
class Contradiction < self
|
|
83
|
+
|
|
84
|
+
# Test if the operands are a contradiction
|
|
85
|
+
#
|
|
86
|
+
# @return [Boolean]
|
|
87
|
+
#
|
|
88
|
+
# @api private
|
|
89
|
+
def optimizable?
|
|
90
|
+
left_contradiction? ||
|
|
91
|
+
right_contradiction? ||
|
|
92
|
+
equality_with_same_attributes? ||
|
|
93
|
+
left.inverse.eql?(right)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Return a contradiction
|
|
97
|
+
#
|
|
98
|
+
# @return [Contradiction]
|
|
99
|
+
#
|
|
100
|
+
# @api private
|
|
101
|
+
def optimize
|
|
102
|
+
Veritas::Logic::Proposition::Contradiction.instance
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end # class Contradiction
|
|
106
|
+
|
|
107
|
+
Veritas::Logic::Connective::Conjunction.optimizer = chain(
|
|
108
|
+
LeftOperandTautology,
|
|
109
|
+
RightOperandTautology,
|
|
110
|
+
OptimizableToExclusion,
|
|
111
|
+
EqualOperands,
|
|
112
|
+
RedundantLeftOperand,
|
|
113
|
+
RedundantRightOperand,
|
|
114
|
+
Contradiction,
|
|
115
|
+
UnoptimizedOperand
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
end # class Conjunction
|
|
119
|
+
end # module Connective
|
|
120
|
+
end # module Logic
|
|
121
|
+
end # class Optimizer
|
|
122
|
+
end # module Veritas
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
module Connective
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Disjunction optimizations
|
|
9
|
+
class Disjunction < Binary
|
|
10
|
+
|
|
11
|
+
# Optimize when the left operand is a contradiction
|
|
12
|
+
class ContradictionLeftOperand < self
|
|
13
|
+
|
|
14
|
+
# Test if the left operand is a contradiction
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimizable?
|
|
20
|
+
left_contradiction?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# A Disjunction with a contradiction left operand is equivalent to the right
|
|
24
|
+
#
|
|
25
|
+
# @return [Expression]
|
|
26
|
+
#
|
|
27
|
+
# @api private
|
|
28
|
+
def optimize
|
|
29
|
+
right
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end # class ContradictionLeftOperand
|
|
33
|
+
|
|
34
|
+
# Optimize when the right operand is a contradiction
|
|
35
|
+
class ContradictionRightOperand < self
|
|
36
|
+
|
|
37
|
+
# Test if the right operand is a contradiction
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
#
|
|
41
|
+
# @api private
|
|
42
|
+
def optimizable?
|
|
43
|
+
right_contradiction?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# A Disjunction with a contradiction right operand is equivalent to the left
|
|
47
|
+
#
|
|
48
|
+
# @return [Expression]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
def optimize
|
|
52
|
+
left
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end # class ContradictionRightOperand
|
|
56
|
+
|
|
57
|
+
# Optimize when the operands are equality predicates for the same attribute
|
|
58
|
+
class OptimizableToInclusion < self
|
|
59
|
+
|
|
60
|
+
# Test if the operands are equality predicates for the same attribute
|
|
61
|
+
#
|
|
62
|
+
# @return [Boolean]
|
|
63
|
+
#
|
|
64
|
+
# @api private
|
|
65
|
+
def optimizable?
|
|
66
|
+
equality_with_same_attributes?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Return an Inclusion for an attribute having a set of values
|
|
70
|
+
#
|
|
71
|
+
# @return [Inclusion]
|
|
72
|
+
#
|
|
73
|
+
# @api private
|
|
74
|
+
def optimize
|
|
75
|
+
left = self.left
|
|
76
|
+
Veritas::Logic::Predicate::Inclusion.new(left.left, [ left.right, right.right ]).optimize
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end # class OptimizableToInclusion
|
|
80
|
+
|
|
81
|
+
# Optimize when the operands are a tuatology
|
|
82
|
+
class Tautology < self
|
|
83
|
+
|
|
84
|
+
# Test if the operands are a tuatology
|
|
85
|
+
#
|
|
86
|
+
# @return [Boolean]
|
|
87
|
+
#
|
|
88
|
+
# @api private
|
|
89
|
+
def optimizable?
|
|
90
|
+
left_tautology? ||
|
|
91
|
+
right_tautology? ||
|
|
92
|
+
inequality_with_same_attributes? ||
|
|
93
|
+
left.inverse.eql?(right)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Return a tuatology
|
|
97
|
+
#
|
|
98
|
+
# @return [Tautology]
|
|
99
|
+
#
|
|
100
|
+
# @api private
|
|
101
|
+
def optimize
|
|
102
|
+
Veritas::Logic::Proposition::Tautology.instance
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end # class Tautology
|
|
106
|
+
|
|
107
|
+
Veritas::Logic::Connective::Disjunction.optimizer = chain(
|
|
108
|
+
ContradictionLeftOperand,
|
|
109
|
+
ContradictionRightOperand,
|
|
110
|
+
OptimizableToInclusion,
|
|
111
|
+
EqualOperands,
|
|
112
|
+
RedundantLeftOperand,
|
|
113
|
+
RedundantRightOperand,
|
|
114
|
+
Tautology,
|
|
115
|
+
UnoptimizedOperand
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
end # class Disjunction
|
|
119
|
+
end # module Connective
|
|
120
|
+
end # module Logic
|
|
121
|
+
end # class Optimizer
|
|
122
|
+
end # module Veritas
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
module Connective
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Negation optimizations
|
|
9
|
+
class Negation < Optimizer
|
|
10
|
+
|
|
11
|
+
# The optimized operand
|
|
12
|
+
#
|
|
13
|
+
# @return [Expression]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
attr_reader :operand
|
|
17
|
+
|
|
18
|
+
# Initialize a Unary optimizer
|
|
19
|
+
#
|
|
20
|
+
# @return [undefined]
|
|
21
|
+
#
|
|
22
|
+
# @api private
|
|
23
|
+
def initialize(*)
|
|
24
|
+
super
|
|
25
|
+
@operand = optimize_operand
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# Optimize the operand
|
|
31
|
+
#
|
|
32
|
+
# @return [Expression]
|
|
33
|
+
#
|
|
34
|
+
# @api private
|
|
35
|
+
def optimize_operand
|
|
36
|
+
# TODO: move Predicate.optimize_operand to a better location
|
|
37
|
+
Predicate.optimize_operand(operation.operand)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Optimize when the operand can be inverted
|
|
41
|
+
class InvertibleOperand < self
|
|
42
|
+
|
|
43
|
+
# Test if the operand can be inverted
|
|
44
|
+
#
|
|
45
|
+
# @return [Boolean]
|
|
46
|
+
#
|
|
47
|
+
# @api private
|
|
48
|
+
def optimizable?
|
|
49
|
+
operand.respond_to?(:inverse)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# A Negation of an Expression is equivalent to the inverted Expression
|
|
53
|
+
#
|
|
54
|
+
# @return [Expression]
|
|
55
|
+
#
|
|
56
|
+
# @api private
|
|
57
|
+
def optimize
|
|
58
|
+
operand.inverse
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end # class InvertibleOperand
|
|
62
|
+
|
|
63
|
+
Veritas::Logic::Connective::Negation.optimizer = chain(
|
|
64
|
+
InvertibleOperand
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
end # class Negation
|
|
68
|
+
end # module Connective
|
|
69
|
+
end # module Logic
|
|
70
|
+
end # class Optimizer
|
|
71
|
+
end # module Veritas
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Comparable predicate optimizations
|
|
9
|
+
module Comparable
|
|
10
|
+
|
|
11
|
+
# Optimize when the operands can be normalized
|
|
12
|
+
class NormalizableOperands < Predicate
|
|
13
|
+
|
|
14
|
+
# Test if the operands can be normalized
|
|
15
|
+
#
|
|
16
|
+
# @return [Boolean]
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
def optimizable?
|
|
20
|
+
util = Util
|
|
21
|
+
util.constant?(left) && util.attribute?(right)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Normalize the predicate by reversing the operands
|
|
25
|
+
#
|
|
26
|
+
# @return [Predicate]
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
def optimize
|
|
30
|
+
operation.class.reverse.new(right, left)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end # class NormalizableOperands
|
|
34
|
+
|
|
35
|
+
# Optimize when the operands will never be equivalent
|
|
36
|
+
module NeverEquivalent
|
|
37
|
+
|
|
38
|
+
# Test if the operands will never be equivalent
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
def optimizable?
|
|
44
|
+
util = Util
|
|
45
|
+
if util.constant?(left) then left_invalid_constant?
|
|
46
|
+
elsif util.constant?(right) then right_invalid_constant?
|
|
47
|
+
else
|
|
48
|
+
not_joinable?
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
# Test if the left operand is an invalid constant
|
|
55
|
+
#
|
|
56
|
+
# @return [Boolean]
|
|
57
|
+
#
|
|
58
|
+
# @api private
|
|
59
|
+
def left_invalid_constant?
|
|
60
|
+
!right.valid_value?(left)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Test if the right operand is an invalid constant
|
|
64
|
+
#
|
|
65
|
+
# @return [Boolean]
|
|
66
|
+
#
|
|
67
|
+
# @api private
|
|
68
|
+
def right_invalid_constant?
|
|
69
|
+
!left.valid_value?(right)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Test if the left and right operand are not joinable
|
|
73
|
+
#
|
|
74
|
+
# @return [Boolean]
|
|
75
|
+
#
|
|
76
|
+
# @api private
|
|
77
|
+
def not_joinable?
|
|
78
|
+
!left.joinable?(right)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end # module NeverEquivalent
|
|
82
|
+
|
|
83
|
+
# Optimize when the operands will never be comparable
|
|
84
|
+
module NeverComparable
|
|
85
|
+
|
|
86
|
+
# Test if the operands will never be comparable
|
|
87
|
+
#
|
|
88
|
+
# @return [Boolean]
|
|
89
|
+
#
|
|
90
|
+
# @api private
|
|
91
|
+
def optimizable?
|
|
92
|
+
util = Util
|
|
93
|
+
if util.constant?(left) then left_invalid_constant?
|
|
94
|
+
elsif util.constant?(right) then right_invalid_constant?
|
|
95
|
+
else
|
|
96
|
+
not_comparable?
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
# Test if the left operand is an invalid constant
|
|
103
|
+
#
|
|
104
|
+
# @return [Boolean]
|
|
105
|
+
#
|
|
106
|
+
# @api private
|
|
107
|
+
def left_invalid_constant?
|
|
108
|
+
!right.valid_primitive?(left)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Test if the right operand is an invalid constant
|
|
112
|
+
#
|
|
113
|
+
# @return [Boolean]
|
|
114
|
+
#
|
|
115
|
+
# @api private
|
|
116
|
+
def right_invalid_constant?
|
|
117
|
+
!left.valid_primitive?(right)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Test if the left and right operand are not comparable
|
|
121
|
+
#
|
|
122
|
+
# @return [Boolean]
|
|
123
|
+
#
|
|
124
|
+
# @api private
|
|
125
|
+
def not_comparable?
|
|
126
|
+
!left.comparable?(right)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end # module NeverComparable
|
|
130
|
+
end # module Comparable
|
|
131
|
+
end # class Predicate
|
|
132
|
+
end # module Logic
|
|
133
|
+
end # class Optimizer
|
|
134
|
+
end # module Veritas
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Veritas
|
|
4
|
+
class Optimizer
|
|
5
|
+
module Logic
|
|
6
|
+
class Predicate
|
|
7
|
+
|
|
8
|
+
# Abstract base class representing Enumerable predicate optimizations
|
|
9
|
+
module Enumerable
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# Optimize the right operand
|
|
14
|
+
#
|
|
15
|
+
# @return [Object]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
def optimize_right
|
|
19
|
+
right = operation.right
|
|
20
|
+
|
|
21
|
+
if right.respond_to?(:to_inclusive)
|
|
22
|
+
optimize_right_range
|
|
23
|
+
elsif right.respond_to?(:select)
|
|
24
|
+
optimize_right_enumerable
|
|
25
|
+
else
|
|
26
|
+
right
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Optimize the right range operand
|
|
31
|
+
#
|
|
32
|
+
# @return [Range]
|
|
33
|
+
#
|
|
34
|
+
# @api private
|
|
35
|
+
def optimize_right_range
|
|
36
|
+
right = operation.right
|
|
37
|
+
right.to_inclusive if right.overlaps?(left.range)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Optimize the right enumerable operand
|
|
41
|
+
#
|
|
42
|
+
# @return [Enumerable]
|
|
43
|
+
#
|
|
44
|
+
# @api private
|
|
45
|
+
def optimize_right_enumerable
|
|
46
|
+
enumerable = normalized_right_enumerable
|
|
47
|
+
right = operation.right
|
|
48
|
+
|
|
49
|
+
right.eql?(enumerable) ? right : enumerable
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Normalize the right enumerable to only include unique, sorted, valid values
|
|
53
|
+
#
|
|
54
|
+
# @return [Enumerable]
|
|
55
|
+
#
|
|
56
|
+
# @api private
|
|
57
|
+
def normalized_right_enumerable
|
|
58
|
+
enumerable = operation.right.select { |value| left.valid_value?(value) }
|
|
59
|
+
enumerable.sort!
|
|
60
|
+
enumerable.uniq!
|
|
61
|
+
enumerable
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Optimize when the right operand is empty
|
|
65
|
+
module EmptyRightOperand
|
|
66
|
+
include Enumerable
|
|
67
|
+
|
|
68
|
+
# Test if the right operand is empty
|
|
69
|
+
#
|
|
70
|
+
# @return [Boolean]
|
|
71
|
+
#
|
|
72
|
+
# @api private
|
|
73
|
+
def optimizable?
|
|
74
|
+
right_nil? || right_none?
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# Test if the right operand is nil
|
|
80
|
+
#
|
|
81
|
+
# @return [Boolean]
|
|
82
|
+
#
|
|
83
|
+
# @api private
|
|
84
|
+
def right_nil?
|
|
85
|
+
right.nil?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Test if the right operand has no entries
|
|
89
|
+
#
|
|
90
|
+
# @return [Boolean]
|
|
91
|
+
#
|
|
92
|
+
# @api private
|
|
93
|
+
def right_none?
|
|
94
|
+
right.none? { true }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end # module EmptyRightOperand
|
|
98
|
+
|
|
99
|
+
# Optimize when the right operand has one entry
|
|
100
|
+
module OneRightOperand
|
|
101
|
+
include Enumerable
|
|
102
|
+
|
|
103
|
+
# Test if the right operand has one entry
|
|
104
|
+
#
|
|
105
|
+
# @return [Boolean]
|
|
106
|
+
#
|
|
107
|
+
# @api private
|
|
108
|
+
def optimizable?
|
|
109
|
+
right.one? { true }
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end # module OneRightOperand
|
|
113
|
+
|
|
114
|
+
# Optimize when the operands are unoptimized
|
|
115
|
+
class UnoptimizedOperand < Predicate
|
|
116
|
+
include Enumerable
|
|
117
|
+
|
|
118
|
+
# Test if the operands are unoptimized
|
|
119
|
+
#
|
|
120
|
+
# @return [Boolean]
|
|
121
|
+
#
|
|
122
|
+
# @api private
|
|
123
|
+
def optimizable?
|
|
124
|
+
!right.equal?(operation.right)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Return a Enumerable predicate with optimized operands
|
|
128
|
+
#
|
|
129
|
+
# @return [Binary]
|
|
130
|
+
#
|
|
131
|
+
# @api private
|
|
132
|
+
def optimize
|
|
133
|
+
operation.class.new(left, right)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end # class UnoptimizedOperand
|
|
137
|
+
end # module Enumerable
|
|
138
|
+
end # class Predicate
|
|
139
|
+
end # module Logic
|
|
140
|
+
end # class Optimizer
|
|
141
|
+
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 Equality optimizations
|
|
9
|
+
class Equality < self
|
|
10
|
+
include Comparable
|
|
11
|
+
|
|
12
|
+
# Optimize when the operand are a contradiction
|
|
13
|
+
class Contradiction < self
|
|
14
|
+
include Comparable::NeverEquivalent
|
|
15
|
+
include Predicate::Contradiction
|
|
16
|
+
end # class Contradiction
|
|
17
|
+
|
|
18
|
+
# Optimize when the operand are a tautology
|
|
19
|
+
class Tautology < self
|
|
20
|
+
include Predicate::Tautology
|
|
21
|
+
|
|
22
|
+
# Test if the operands are a tautology
|
|
23
|
+
#
|
|
24
|
+
# @return [Boolean]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
def optimizable?
|
|
28
|
+
left.equal?(right)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end # class Tautology
|
|
32
|
+
|
|
33
|
+
Veritas::Logic::Predicate::Equality.optimizer = chain(
|
|
34
|
+
ConstantOperands,
|
|
35
|
+
Contradiction,
|
|
36
|
+
Tautology,
|
|
37
|
+
NormalizableOperands
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
end # class Equality
|
|
41
|
+
end # class Predicate
|
|
42
|
+
end # module Logic
|
|
43
|
+
end # class Optimizer
|
|
44
|
+
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 Exclusion optimizations
|
|
9
|
+
class Exclusion < self
|
|
10
|
+
include Enumerable
|
|
11
|
+
|
|
12
|
+
# Optimize when the right operand is empty
|
|
13
|
+
class EmptyRightOperand < self
|
|
14
|
+
include Enumerable::EmptyRightOperand
|
|
15
|
+
|
|
16
|
+
# An Exclusion with an empty right operand matches everything
|
|
17
|
+
#
|
|
18
|
+
# @return [Tautology]
|
|
19
|
+
#
|
|
20
|
+
# @api private
|
|
21
|
+
def optimize
|
|
22
|
+
Veritas::Logic::Proposition::Tautology.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 Exclusion with a single right operand is equivalent to an Inequality
|
|
32
|
+
#
|
|
33
|
+
# @return [Inequality]
|
|
34
|
+
#
|
|
35
|
+
# @api private
|
|
36
|
+
def optimize
|
|
37
|
+
Veritas::Logic::Predicate::Inequality.new(left, right.first)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end # class OneRightOperand
|
|
41
|
+
|
|
42
|
+
Veritas::Logic::Predicate::Exclusion.optimizer = chain(
|
|
43
|
+
ConstantOperands,
|
|
44
|
+
EmptyRightOperand,
|
|
45
|
+
OneRightOperand,
|
|
46
|
+
UnoptimizedOperand
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
end # class Exclusion
|
|
50
|
+
end # class Predicate
|
|
51
|
+
end # module Logic
|
|
52
|
+
end # class Optimizer
|
|
53
|
+
end # module Veritas
|