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,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Expression, '#optimize' do
|
|
4
|
+
subject { object.optimize(*args) }
|
|
5
|
+
|
|
6
|
+
let(:described_class) { Class.new(Logic::Expression) }
|
|
7
|
+
let(:object) { described_class.new }
|
|
8
|
+
|
|
9
|
+
before do
|
|
10
|
+
described_class.class_eval do
|
|
11
|
+
def eql?(other)
|
|
12
|
+
instance_of?(other.class)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'with no optimizer' do
|
|
18
|
+
let(:args) { [] }
|
|
19
|
+
|
|
20
|
+
it 'calls self.class.optimizer' do
|
|
21
|
+
described_class.should_receive(:optimizer).and_return(nil)
|
|
22
|
+
subject
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'returns self' do
|
|
26
|
+
should equal(object)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it_should_behave_like 'an optimize method'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'with an optimizer' do
|
|
33
|
+
let(:optimized) { described_class.new }
|
|
34
|
+
let(:args) { [ lambda { |relation| optimized } ] }
|
|
35
|
+
|
|
36
|
+
it 'returns an optimized expression' do
|
|
37
|
+
should equal(optimized)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it_should_behave_like 'an optimize method'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::Equality, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:attribute) { Attribute::Integer.new(:id) }
|
|
7
|
+
let(:left) { attribute }
|
|
8
|
+
let(:right) { attribute }
|
|
9
|
+
let(:object) { described_class.new(left, right) }
|
|
10
|
+
|
|
11
|
+
context 'left and right are attributes' do
|
|
12
|
+
context 'and equivalent' do
|
|
13
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
14
|
+
|
|
15
|
+
it_should_behave_like 'an optimize method'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context 'and are not joinable' do
|
|
19
|
+
let(:right) { Attribute::String.new(:other) }
|
|
20
|
+
|
|
21
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
22
|
+
|
|
23
|
+
it_should_behave_like 'an optimize method'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'and are joinable' do
|
|
27
|
+
let(:right) { Attribute::Numeric.new(:other) }
|
|
28
|
+
|
|
29
|
+
it { should equal(object) }
|
|
30
|
+
|
|
31
|
+
it_should_behave_like 'an optimize method'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'left is an attribute' do
|
|
36
|
+
context 'right is a valid value' do
|
|
37
|
+
let(:right) { 1 }
|
|
38
|
+
|
|
39
|
+
it { should equal(object) }
|
|
40
|
+
|
|
41
|
+
it_should_behave_like 'an optimize method'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context 'right is an invalid value' do
|
|
45
|
+
let(:right) { 'a' }
|
|
46
|
+
|
|
47
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
48
|
+
|
|
49
|
+
it_should_behave_like 'an optimize method'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'right is an attribute' do
|
|
54
|
+
context 'left is a valid value' do
|
|
55
|
+
let(:left) { 1 }
|
|
56
|
+
|
|
57
|
+
it { should eql(described_class.new(attribute, 1)) }
|
|
58
|
+
|
|
59
|
+
it_should_behave_like 'an optimize method'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context 'left is an invalid value' do
|
|
63
|
+
let(:left) { 'a' }
|
|
64
|
+
|
|
65
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
66
|
+
|
|
67
|
+
it_should_behave_like 'an optimize method'
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'left and right are constants' do
|
|
72
|
+
context 'that will evaluate to a tautology' do
|
|
73
|
+
let(:left) { 1 }
|
|
74
|
+
let(:right) { 1 }
|
|
75
|
+
|
|
76
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
77
|
+
|
|
78
|
+
it_should_behave_like 'an optimize method'
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'that will evaluate to a contradiction' do
|
|
82
|
+
let(:left) { 1 }
|
|
83
|
+
let(:right) { 2 }
|
|
84
|
+
|
|
85
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
86
|
+
|
|
87
|
+
it_should_behave_like 'an optimize method'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::Exclusion, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:left) { Attribute::Integer.new(:id) }
|
|
7
|
+
let(:object) { described_class.new(left, right) }
|
|
8
|
+
|
|
9
|
+
context 'right is a Range' do
|
|
10
|
+
context 'that is inclusive' do
|
|
11
|
+
context 'and empty' do
|
|
12
|
+
let(:right) { 1..0 }
|
|
13
|
+
|
|
14
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
15
|
+
|
|
16
|
+
it_should_behave_like 'an optimize method'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'and not empty' do
|
|
20
|
+
let(:right) { 1..10 }
|
|
21
|
+
|
|
22
|
+
it { should equal(object) }
|
|
23
|
+
|
|
24
|
+
it_should_behave_like 'an optimize method'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'that is exclusive' do
|
|
29
|
+
context 'and empty' do
|
|
30
|
+
let(:right) { 1...1 }
|
|
31
|
+
|
|
32
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
33
|
+
|
|
34
|
+
it_should_behave_like 'an optimize method'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'and not empty' do
|
|
38
|
+
let(:right) { 1...10 }
|
|
39
|
+
|
|
40
|
+
it 'changes the Range to be inclusive' do
|
|
41
|
+
should eql(left.exclude(1..9))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it_should_behave_like 'an optimize method'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'using an attribute that is not comparable' do
|
|
49
|
+
let(:left) { Attribute::String.new(:string) }
|
|
50
|
+
let(:right) { 'a'..'z' }
|
|
51
|
+
|
|
52
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
53
|
+
|
|
54
|
+
it_should_behave_like 'an optimize method'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'that is greater than the left range' do
|
|
58
|
+
let(:right) { 2**31..2**31 }
|
|
59
|
+
|
|
60
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
61
|
+
|
|
62
|
+
it_should_behave_like 'an optimize method'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'that is less than the left range' do
|
|
66
|
+
let(:right) { -1..-1 }
|
|
67
|
+
|
|
68
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
69
|
+
|
|
70
|
+
it_should_behave_like 'an optimize method'
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context 'right is an Enumerable' do
|
|
75
|
+
context 'that is empty' do
|
|
76
|
+
let(:right) { [] }
|
|
77
|
+
|
|
78
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
79
|
+
|
|
80
|
+
it_should_behave_like 'an optimize method'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'that is empty after filtering invalid entries' do
|
|
84
|
+
let(:right) { [ 'a' ] }
|
|
85
|
+
|
|
86
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
87
|
+
|
|
88
|
+
it_should_behave_like 'an optimize method'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'that is not empty after filtering invalid entries' do
|
|
92
|
+
let(:right) { [ 'a', 1, 2 ] }
|
|
93
|
+
|
|
94
|
+
it { should eql(left.exclude([ 1, 2 ])) }
|
|
95
|
+
|
|
96
|
+
it_should_behave_like 'an optimize method'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context 'that has duplicate entries' do
|
|
100
|
+
let(:right) { [ 1, 2, 2 ] }
|
|
101
|
+
|
|
102
|
+
it { should eql(left.exclude([ 1, 2 ])) }
|
|
103
|
+
|
|
104
|
+
it_should_behave_like 'an optimize method'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'that has one entry' do
|
|
108
|
+
let(:right) { [ 1 ] }
|
|
109
|
+
|
|
110
|
+
it { should eql(left.ne(1)) }
|
|
111
|
+
|
|
112
|
+
it_should_behave_like 'an optimize method'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'that has unsorted entries' do
|
|
116
|
+
let(:right) { [ 2, 1 ] }
|
|
117
|
+
|
|
118
|
+
it { should eql(left.exclude([ 1, 2 ])) }
|
|
119
|
+
|
|
120
|
+
it_should_behave_like 'an optimize method'
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'right is a nil' do
|
|
125
|
+
let(:right) { nil }
|
|
126
|
+
|
|
127
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
128
|
+
|
|
129
|
+
it_should_behave_like 'an optimize method'
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::GreaterThan, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:attribute) { Attribute::Integer.new(:id, :required => false) }
|
|
7
|
+
let(:left) { attribute }
|
|
8
|
+
let(:right) { attribute }
|
|
9
|
+
let(:object) { described_class.new(left, right) }
|
|
10
|
+
|
|
11
|
+
context 'left and right are attributes' do
|
|
12
|
+
context 'and equivalent' do
|
|
13
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
14
|
+
|
|
15
|
+
it_should_behave_like 'an optimize method'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context 'and are not comparable' do
|
|
19
|
+
let(:right) { Attribute::Float.new(:float) }
|
|
20
|
+
|
|
21
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
22
|
+
|
|
23
|
+
it_should_behave_like 'an optimize method'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'and left is always less than or equal to right' do
|
|
27
|
+
let(:left) { attribute }
|
|
28
|
+
let(:right) { Attribute::Integer.new(:right, :size => 2**31-1..2**31-1) }
|
|
29
|
+
|
|
30
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
31
|
+
|
|
32
|
+
it_should_behave_like 'an optimize method'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'and left is always greater than right' do
|
|
36
|
+
let(:left) { attribute }
|
|
37
|
+
let(:right) { Attribute::Integer.new(:right, :size => -1..-1) }
|
|
38
|
+
|
|
39
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
40
|
+
|
|
41
|
+
it_should_behave_like 'an optimize method'
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'left is an attribute' do
|
|
46
|
+
context 'right is a valid value' do
|
|
47
|
+
let(:right) { 1 }
|
|
48
|
+
|
|
49
|
+
it { should equal(object) }
|
|
50
|
+
|
|
51
|
+
it_should_behave_like 'an optimize method'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'right is an invalid primitive' do
|
|
55
|
+
let(:right) { nil }
|
|
56
|
+
|
|
57
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
58
|
+
|
|
59
|
+
it_should_behave_like 'an optimize method'
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context 'right is an attribute' do
|
|
64
|
+
context 'left is a valid value' do
|
|
65
|
+
let(:left) { 1 }
|
|
66
|
+
|
|
67
|
+
it { should eql(Logic::Predicate::LessThan.new(attribute, 1)) }
|
|
68
|
+
|
|
69
|
+
it_should_behave_like 'an optimize method'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'left is an invalid primitive' do
|
|
73
|
+
let(:left) { nil }
|
|
74
|
+
|
|
75
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
76
|
+
|
|
77
|
+
it_should_behave_like 'an optimize method'
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'left and right are constants' do
|
|
82
|
+
context 'that will evaluate to a tautology' do
|
|
83
|
+
let(:left) { 2 }
|
|
84
|
+
let(:right) { 1 }
|
|
85
|
+
|
|
86
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
87
|
+
|
|
88
|
+
it_should_behave_like 'an optimize method'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'that will evaluate to a contradiction' do
|
|
92
|
+
let(:left) { 1 }
|
|
93
|
+
let(:right) { 2 }
|
|
94
|
+
|
|
95
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
96
|
+
|
|
97
|
+
it_should_behave_like 'an optimize method'
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::GreaterThanOrEqualTo, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:attribute) { Attribute::Integer.new(:id, :required => false) }
|
|
7
|
+
let(:left) { attribute }
|
|
8
|
+
let(:right) { attribute }
|
|
9
|
+
let(:object) { described_class.new(left, right) }
|
|
10
|
+
|
|
11
|
+
context 'left and right are attributes' do
|
|
12
|
+
context 'and equivalent' do
|
|
13
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
14
|
+
|
|
15
|
+
it_should_behave_like 'an optimize method'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context 'and are not comparable' do
|
|
19
|
+
let(:right) { Attribute::Float.new(:float) }
|
|
20
|
+
|
|
21
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
22
|
+
|
|
23
|
+
it_should_behave_like 'an optimize method'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'and left is always less than right' do
|
|
27
|
+
let(:left) { attribute }
|
|
28
|
+
let(:right) { Attribute::Integer.new(:right, :size => 2**31..2**31) }
|
|
29
|
+
|
|
30
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
31
|
+
|
|
32
|
+
it_should_behave_like 'an optimize method'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'and left is always greater than right' do
|
|
36
|
+
let(:left) { attribute }
|
|
37
|
+
let(:right) { Attribute::Integer.new(:right, :size => -1..-1) }
|
|
38
|
+
|
|
39
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
40
|
+
|
|
41
|
+
it_should_behave_like 'an optimize method'
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'left is an attribute' do
|
|
46
|
+
context 'right is a valid value' do
|
|
47
|
+
let(:right) { 1 }
|
|
48
|
+
|
|
49
|
+
it { should equal(object) }
|
|
50
|
+
|
|
51
|
+
it_should_behave_like 'an optimize method'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'right is an invalid primitive' do
|
|
55
|
+
let(:right) { nil }
|
|
56
|
+
|
|
57
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
58
|
+
|
|
59
|
+
it_should_behave_like 'an optimize method'
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context 'right is an attribute' do
|
|
64
|
+
context 'left is a valid value' do
|
|
65
|
+
let(:left) { 1 }
|
|
66
|
+
|
|
67
|
+
it { should eql(Logic::Predicate::LessThanOrEqualTo.new(attribute, 1)) }
|
|
68
|
+
|
|
69
|
+
it_should_behave_like 'an optimize method'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'left is an invalid primitive' do
|
|
73
|
+
let(:left) { nil }
|
|
74
|
+
|
|
75
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
76
|
+
|
|
77
|
+
it_should_behave_like 'an optimize method'
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'left and right are constants' do
|
|
82
|
+
context 'that will evaluate to a tautology' do
|
|
83
|
+
let(:left) { 1 }
|
|
84
|
+
let(:right) { 1 }
|
|
85
|
+
|
|
86
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
87
|
+
|
|
88
|
+
it_should_behave_like 'an optimize method'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'that will evaluate to a contradiction' do
|
|
92
|
+
let(:left) { 1 }
|
|
93
|
+
let(:right) { 2 }
|
|
94
|
+
|
|
95
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
96
|
+
|
|
97
|
+
it_should_behave_like 'an optimize method'
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::Inclusion, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:left) { Attribute::Integer.new(:id) }
|
|
7
|
+
let(:object) { described_class.new(left, right) }
|
|
8
|
+
|
|
9
|
+
context 'right is a Range' do
|
|
10
|
+
context 'that is inclusive' do
|
|
11
|
+
context 'and empty' do
|
|
12
|
+
let(:right) { 1..0 }
|
|
13
|
+
|
|
14
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
15
|
+
|
|
16
|
+
it_should_behave_like 'an optimize method'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'and not empty' do
|
|
20
|
+
let(:right) { 1..10 }
|
|
21
|
+
|
|
22
|
+
it { should equal(object) }
|
|
23
|
+
|
|
24
|
+
it_should_behave_like 'an optimize method'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'that is exclusive' do
|
|
29
|
+
context 'and empty' do
|
|
30
|
+
let(:right) { 1...1 }
|
|
31
|
+
|
|
32
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
33
|
+
|
|
34
|
+
it_should_behave_like 'an optimize method'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'and not empty' do
|
|
38
|
+
let(:right) { 1...10 }
|
|
39
|
+
|
|
40
|
+
it 'changes the Range to be inclusive' do
|
|
41
|
+
should eql(left.include(1..9))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it_should_behave_like 'an optimize method'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'using an attribute that is not comparable' do
|
|
49
|
+
let(:left) { Attribute::String.new(:string) }
|
|
50
|
+
let(:right) { 'a'..'z' }
|
|
51
|
+
|
|
52
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
53
|
+
|
|
54
|
+
it_should_behave_like 'an optimize method'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'that is greater than the left range' do
|
|
58
|
+
let(:right) { 2**31..2**31 }
|
|
59
|
+
|
|
60
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
61
|
+
|
|
62
|
+
it_should_behave_like 'an optimize method'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'that is less than the left range' do
|
|
66
|
+
let(:right) { -1..-1 }
|
|
67
|
+
|
|
68
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
69
|
+
|
|
70
|
+
it_should_behave_like 'an optimize method'
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context 'right is an Enumerable' do
|
|
75
|
+
context 'that is empty' do
|
|
76
|
+
let(:right) { [] }
|
|
77
|
+
|
|
78
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
79
|
+
|
|
80
|
+
it_should_behave_like 'an optimize method'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'that is empty after filtering invalid entries' do
|
|
84
|
+
let(:right) { [ 'a' ] }
|
|
85
|
+
|
|
86
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
87
|
+
|
|
88
|
+
it_should_behave_like 'an optimize method'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context 'that is not empty after filtering invalid entries' do
|
|
92
|
+
let(:right) { [ 'a', 1, 2 ] }
|
|
93
|
+
|
|
94
|
+
it { should eql(left.include([ 1, 2 ])) }
|
|
95
|
+
|
|
96
|
+
it_should_behave_like 'an optimize method'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context 'that has duplicate entries' do
|
|
100
|
+
let(:right) { [ 1, 2, 2 ] }
|
|
101
|
+
|
|
102
|
+
it { should eql(left.include([ 1, 2 ])) }
|
|
103
|
+
|
|
104
|
+
it_should_behave_like 'an optimize method'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'that has one entry' do
|
|
108
|
+
let(:right) { [ 1 ] }
|
|
109
|
+
|
|
110
|
+
it { should eql(left.eq(1)) }
|
|
111
|
+
|
|
112
|
+
it_should_behave_like 'an optimize method'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'that has unsorted entries' do
|
|
116
|
+
let(:right) { [ 2, 1 ] }
|
|
117
|
+
|
|
118
|
+
it { should eql(left.include([ 1, 2 ])) }
|
|
119
|
+
|
|
120
|
+
it_should_behave_like 'an optimize method'
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'right is a nil' do
|
|
125
|
+
let(:right) { nil }
|
|
126
|
+
|
|
127
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
128
|
+
|
|
129
|
+
it_should_behave_like 'an optimize method'
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Logic::Predicate::Inequality, '#optimize' do
|
|
4
|
+
subject { object.optimize }
|
|
5
|
+
|
|
6
|
+
let(:attribute) { Attribute::Integer.new(:id) }
|
|
7
|
+
let(:left) { attribute }
|
|
8
|
+
let(:right) { attribute }
|
|
9
|
+
let(:object) { described_class.new(left, right) }
|
|
10
|
+
|
|
11
|
+
context 'left and right are attributes' do
|
|
12
|
+
context 'and equivalent' do
|
|
13
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
14
|
+
|
|
15
|
+
it_should_behave_like 'an optimize method'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context 'and are not joinable' do
|
|
19
|
+
let(:right) { Attribute::String.new(:other) }
|
|
20
|
+
|
|
21
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
22
|
+
|
|
23
|
+
it_should_behave_like 'an optimize method'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'and are joinable' do
|
|
27
|
+
let(:right) { Attribute::Numeric.new(:other) }
|
|
28
|
+
|
|
29
|
+
it { should equal(object) }
|
|
30
|
+
|
|
31
|
+
it_should_behave_like 'an optimize method'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'left is an attribute' do
|
|
36
|
+
context 'right is a valid value' do
|
|
37
|
+
let(:right) { 1 }
|
|
38
|
+
|
|
39
|
+
it { should equal(object) }
|
|
40
|
+
|
|
41
|
+
it_should_behave_like 'an optimize method'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context 'right is an invalid value' do
|
|
45
|
+
let(:right) { 'a' }
|
|
46
|
+
|
|
47
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
48
|
+
|
|
49
|
+
it_should_behave_like 'an optimize method'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'right is an attribute' do
|
|
54
|
+
context 'left is a valid value' do
|
|
55
|
+
let(:left) { 1 }
|
|
56
|
+
|
|
57
|
+
it { should eql(described_class.new(attribute, 1)) }
|
|
58
|
+
|
|
59
|
+
it_should_behave_like 'an optimize method'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context 'left is an invalid value' do
|
|
63
|
+
let(:left) { 'a' }
|
|
64
|
+
|
|
65
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
66
|
+
|
|
67
|
+
it_should_behave_like 'an optimize method'
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'left and right are constants' do
|
|
72
|
+
context 'that will evaluate to a tautology' do
|
|
73
|
+
let(:left) { 1 }
|
|
74
|
+
let(:right) { 2 }
|
|
75
|
+
|
|
76
|
+
it { should equal(Logic::Proposition::Tautology.instance) }
|
|
77
|
+
|
|
78
|
+
it_should_behave_like 'an optimize method'
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context 'that will evaluate to a contradiction' do
|
|
82
|
+
let(:left) { 1 }
|
|
83
|
+
let(:right) { 1 }
|
|
84
|
+
|
|
85
|
+
it { should equal(Logic::Proposition::Contradiction.instance) }
|
|
86
|
+
|
|
87
|
+
it_should_behave_like 'an optimize method'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|