axiom-optimizer 0.1.0

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.
Files changed (345) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +37 -0
  4. data/.rspec +4 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +35 -0
  7. data/CONTRIBUTING.md +11 -0
  8. data/Gemfile +10 -0
  9. data/Gemfile.devtools +57 -0
  10. data/Guardfile +23 -0
  11. data/LICENSE +20 -0
  12. data/README.md +111 -0
  13. data/Rakefile +5 -0
  14. data/TODO +144 -0
  15. data/axiom-optimizer.gemspec +25 -0
  16. data/config/flay.yml +3 -0
  17. data/config/flog.yml +2 -0
  18. data/config/mutant.yml +3 -0
  19. data/config/reek.yml +162 -0
  20. data/config/roodi.yml +16 -0
  21. data/config/yardstick.yml +2 -0
  22. data/lib/axiom-optimizer.rb +3 -0
  23. data/lib/axiom/optimizer.rb +168 -0
  24. data/lib/axiom/optimizer/aggregate.rb +16 -0
  25. data/lib/axiom/optimizer/aggregate/count.rb +17 -0
  26. data/lib/axiom/optimizer/aggregate/maximum.rb +17 -0
  27. data/lib/axiom/optimizer/aggregate/mean.rb +17 -0
  28. data/lib/axiom/optimizer/aggregate/minimum.rb +17 -0
  29. data/lib/axiom/optimizer/aggregate/standard_deviation.rb +17 -0
  30. data/lib/axiom/optimizer/aggregate/sum.rb +17 -0
  31. data/lib/axiom/optimizer/aggregate/variance.rb +17 -0
  32. data/lib/axiom/optimizer/algebra/difference.rb +68 -0
  33. data/lib/axiom/optimizer/algebra/extension.rb +97 -0
  34. data/lib/axiom/optimizer/algebra/intersection.rb +68 -0
  35. data/lib/axiom/optimizer/algebra/join.rb +184 -0
  36. data/lib/axiom/optimizer/algebra/product.rb +70 -0
  37. data/lib/axiom/optimizer/algebra/projection.rb +212 -0
  38. data/lib/axiom/optimizer/algebra/rename.rb +381 -0
  39. data/lib/axiom/optimizer/algebra/restriction.rb +373 -0
  40. data/lib/axiom/optimizer/algebra/summarization.rb +200 -0
  41. data/lib/axiom/optimizer/algebra/union.rb +68 -0
  42. data/lib/axiom/optimizer/function.rb +87 -0
  43. data/lib/axiom/optimizer/function/binary.rb +124 -0
  44. data/lib/axiom/optimizer/function/connective/binary.rb +245 -0
  45. data/lib/axiom/optimizer/function/connective/conjunction.rb +122 -0
  46. data/lib/axiom/optimizer/function/connective/disjunction.rb +122 -0
  47. data/lib/axiom/optimizer/function/connective/negation.rb +65 -0
  48. data/lib/axiom/optimizer/function/numeric.rb +34 -0
  49. data/lib/axiom/optimizer/function/numeric/absolute.rb +20 -0
  50. data/lib/axiom/optimizer/function/numeric/addition.rb +20 -0
  51. data/lib/axiom/optimizer/function/numeric/division.rb +20 -0
  52. data/lib/axiom/optimizer/function/numeric/exponentiation.rb +20 -0
  53. data/lib/axiom/optimizer/function/numeric/modulo.rb +20 -0
  54. data/lib/axiom/optimizer/function/numeric/multiplication.rb +20 -0
  55. data/lib/axiom/optimizer/function/numeric/square_root.rb +20 -0
  56. data/lib/axiom/optimizer/function/numeric/subtraction.rb +20 -0
  57. data/lib/axiom/optimizer/function/numeric/unary_minus.rb +20 -0
  58. data/lib/axiom/optimizer/function/numeric/unary_plus.rb +20 -0
  59. data/lib/axiom/optimizer/function/predicate.rb +61 -0
  60. data/lib/axiom/optimizer/function/predicate/comparable.rb +144 -0
  61. data/lib/axiom/optimizer/function/predicate/enumerable.rb +138 -0
  62. data/lib/axiom/optimizer/function/predicate/equality.rb +44 -0
  63. data/lib/axiom/optimizer/function/predicate/exclusion.rb +43 -0
  64. data/lib/axiom/optimizer/function/predicate/greater_than.rb +55 -0
  65. data/lib/axiom/optimizer/function/predicate/greater_than_or_equal_to.rb +55 -0
  66. data/lib/axiom/optimizer/function/predicate/inclusion.rb +43 -0
  67. data/lib/axiom/optimizer/function/predicate/inequality.rb +44 -0
  68. data/lib/axiom/optimizer/function/predicate/less_than.rb +55 -0
  69. data/lib/axiom/optimizer/function/predicate/less_than_or_equal_to.rb +55 -0
  70. data/lib/axiom/optimizer/function/predicate/match.rb +20 -0
  71. data/lib/axiom/optimizer/function/predicate/no_match.rb +20 -0
  72. data/lib/axiom/optimizer/function/string/length.rb +31 -0
  73. data/lib/axiom/optimizer/function/unary.rb +86 -0
  74. data/lib/axiom/optimizer/optimizable.rb +60 -0
  75. data/lib/axiom/optimizer/relation/materialized.rb +40 -0
  76. data/lib/axiom/optimizer/relation/operation/binary.rb +134 -0
  77. data/lib/axiom/optimizer/relation/operation/combination.rb +33 -0
  78. data/lib/axiom/optimizer/relation/operation/deletion.rb +20 -0
  79. data/lib/axiom/optimizer/relation/operation/insertion.rb +20 -0
  80. data/lib/axiom/optimizer/relation/operation/limit.rb +141 -0
  81. data/lib/axiom/optimizer/relation/operation/offset.rb +106 -0
  82. data/lib/axiom/optimizer/relation/operation/order.rb +85 -0
  83. data/lib/axiom/optimizer/relation/operation/reverse.rb +85 -0
  84. data/lib/axiom/optimizer/relation/operation/unary.rb +124 -0
  85. data/lib/axiom/optimizer/support/predicate_partition.rb +184 -0
  86. data/lib/axiom/optimizer/version.rb +10 -0
  87. data/spec/integration/axiom/algebra/difference/optimize_spec.rb +160 -0
  88. data/spec/integration/axiom/algebra/intersection/optimize_spec.rb +160 -0
  89. data/spec/integration/axiom/algebra/join/optimize_spec.rb +112 -0
  90. data/spec/integration/axiom/algebra/product/optimize_spec.rb +178 -0
  91. data/spec/integration/axiom/algebra/projection/optimize_spec.rb +250 -0
  92. data/spec/integration/axiom/algebra/rename/optimize_spec.rb +442 -0
  93. data/spec/integration/axiom/algebra/restriction/optimize_spec.rb +218 -0
  94. data/spec/integration/axiom/algebra/summarization/optimize_spec.rb +49 -0
  95. data/spec/integration/axiom/algebra/union/optimize_spec.rb +200 -0
  96. data/spec/integration/axiom/function/connective/conjunction/optimize_spec.rb +236 -0
  97. data/spec/integration/axiom/function/connective/disjunction/optimize_spec.rb +237 -0
  98. data/spec/integration/axiom/function/connective/negation/optimize_spec.rb +43 -0
  99. data/spec/integration/axiom/function/optimize_spec.rb +30 -0
  100. data/spec/integration/axiom/function/predicate/equality/optimize_spec.rb +92 -0
  101. data/spec/integration/axiom/function/predicate/exclusion/optimize_spec.rb +133 -0
  102. data/spec/integration/axiom/function/predicate/greater_than/optimize_spec.rb +102 -0
  103. data/spec/integration/axiom/function/predicate/greater_than_or_equal_to/optimize_spec.rb +102 -0
  104. data/spec/integration/axiom/function/predicate/inclusion/optimize_spec.rb +133 -0
  105. data/spec/integration/axiom/function/predicate/inequality/optimize_spec.rb +92 -0
  106. data/spec/integration/axiom/function/predicate/less_than/optimize_spec.rb +102 -0
  107. data/spec/integration/axiom/function/predicate/less_than_or_equal_to/optimize_spec.rb +102 -0
  108. data/spec/integration/axiom/relation/empty/optimize_spec.rb +13 -0
  109. data/spec/integration/axiom/relation/materialized/optimize_spec.rb +29 -0
  110. data/spec/integration/axiom/relation/operation/limit/optimize_spec.rb +142 -0
  111. data/spec/integration/axiom/relation/operation/offset/optimize_spec.rb +100 -0
  112. data/spec/integration/axiom/relation/operation/order/optimize_spec.rb +105 -0
  113. data/spec/integration/axiom/relation/operation/reverse/optimize_spec.rb +115 -0
  114. data/spec/integration/axiom/relation/optimize_spec.rb +23 -0
  115. data/spec/rcov.opts +7 -0
  116. data/spec/shared/function_connective_binary_optimize_behavior.rb +102 -0
  117. data/spec/shared/optimize_method_behavior.rb +16 -0
  118. data/spec/spec_helper.rb +38 -0
  119. data/spec/support/add_method_missing.rb +15 -0
  120. data/spec/support/config_alias.rb +3 -0
  121. data/spec/support/ice_nine_config.rb +6 -0
  122. data/spec/support/lazy_enumerable.rb +18 -0
  123. data/spec/unit/axiom/optimizer/algebra/difference/empty_left/optimize_spec.rb +19 -0
  124. data/spec/unit/axiom/optimizer/algebra/difference/empty_right/optimize_spec.rb +19 -0
  125. data/spec/unit/axiom/optimizer/algebra/difference/equal_operands/optimize_spec.rb +23 -0
  126. data/spec/unit/axiom/optimizer/algebra/extension/extensions_spec.rb +31 -0
  127. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimizable_predicate_spec.rb +23 -0
  128. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
  129. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimizable_predicate_spec.rb +37 -0
  130. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +27 -0
  131. data/spec/unit/axiom/optimizer/algebra/intersection/empty_left/optimize_spec.rb +19 -0
  132. data/spec/unit/axiom/optimizer/algebra/intersection/empty_right/optimize_spec.rb +19 -0
  133. data/spec/unit/axiom/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +19 -0
  134. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimizable_predicate_spec.rb +29 -0
  135. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimize_spec.rb +22 -0
  136. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimizable_predicate_spec.rb +29 -0
  137. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimize_spec.rb +23 -0
  138. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimizable_predicate_spec.rb +42 -0
  139. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimize_spec.rb +55 -0
  140. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimizable_predicate_spec.rb +42 -0
  141. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimize_spec.rb +55 -0
  142. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimizable_predicate_spec.rb +27 -0
  143. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimize_spec.rb +18 -0
  144. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimizable_predicate_spec.rb +27 -0
  145. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimize_spec.rb +18 -0
  146. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimizable_predicate_spec.rb +27 -0
  147. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimize_spec.rb +22 -0
  148. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimizable_predicate_spec.rb +35 -0
  149. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimize_spec.rb +22 -0
  150. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimizable_predicate_spec.rb +28 -0
  151. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimize_spec.rb +22 -0
  152. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimizable_predicate_spec.rb +29 -0
  153. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimize_spec.rb +25 -0
  154. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  155. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +22 -0
  156. data/spec/unit/axiom/optimizer/algebra/rename/aliases_spec.rb +23 -0
  157. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimizable_predicate_spec.rb +27 -0
  158. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimize_spec.rb +21 -0
  159. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimizable_predicate_spec.rb +28 -0
  160. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimize_spec.rb +23 -0
  161. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimizable_predicate_spec.rb +28 -0
  162. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimize_spec.rb +23 -0
  163. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimizable_predicate_spec.rb +28 -0
  164. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimize_spec.rb +22 -0
  165. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimizable_predicate_spec.rb +43 -0
  166. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimize_spec.rb +22 -0
  167. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimizable_predicate_spec.rb +30 -0
  168. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimize_spec.rb +22 -0
  169. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_predicate_spec.rb +37 -0
  170. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +18 -0
  171. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimizable_predicate_spec.rb +29 -0
  172. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +23 -0
  173. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimizable_predicate_spec.rb +27 -0
  174. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +23 -0
  175. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimizable_predicate_spec.rb +29 -0
  176. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimize_spec.rb +23 -0
  177. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimizable_predicate_spec.rb +29 -0
  178. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +23 -0
  179. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimizable_predicate_spec.rb +41 -0
  180. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimize_spec.rb +35 -0
  181. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimizable_predicate_spec.rb +46 -0
  182. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimize_spec.rb +23 -0
  183. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimizable_predicate_spec.rb +51 -0
  184. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimize_spec.rb +48 -0
  185. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimizable_predicate_spec.rb +28 -0
  186. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimize_spec.rb +22 -0
  187. data/spec/unit/axiom/optimizer/algebra/restriction/predicate_spec.rb +18 -0
  188. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimizable_predicate_spec.rb +44 -0
  189. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimize_spec.rb +48 -0
  190. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimizable_predicate_spec.rb +30 -0
  191. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +24 -0
  192. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimizable_predicate_spec.rb +30 -0
  193. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimize_spec.rb +24 -0
  194. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimizable_predicate_spec.rb +33 -0
  195. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimize_spec.rb +19 -0
  196. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimizable_predicate_spec.rb +44 -0
  197. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +24 -0
  198. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
  199. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimizable_predicate_spec.rb +29 -0
  200. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
  201. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimizable_predicate_spec.rb +29 -0
  202. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +25 -0
  203. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimizable_predicate_spec.rb +23 -0
  204. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
  205. data/spec/unit/axiom/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
  206. data/spec/unit/axiom/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
  207. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimizable_predicate_spec.rb +49 -0
  208. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +30 -0
  209. data/spec/unit/axiom/optimizer/algebra/union/empty_left/optimize_spec.rb +19 -0
  210. data/spec/unit/axiom/optimizer/algebra/union/empty_right/optimize_spec.rb +19 -0
  211. data/spec/unit/axiom/optimizer/algebra/union/equal_operands/optimize_spec.rb +19 -0
  212. data/spec/unit/axiom/optimizer/class_methods/chain_spec.rb +56 -0
  213. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimizable_predicate_spec.rb +36 -0
  214. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
  215. data/spec/unit/axiom/optimizer/function/binary/left_spec.rb +28 -0
  216. data/spec/unit/axiom/optimizer/function/binary/right_spec.rb +28 -0
  217. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimizable_predicate_spec.rb +37 -0
  218. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
  219. data/spec/unit/axiom/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
  220. data/spec/unit/axiom/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
  221. data/spec/unit/axiom/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
  222. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimizable_predicate_spec.rb +29 -0
  223. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimize_spec.rb +19 -0
  224. data/spec/unit/axiom/optimizer/function/connective/binary/left_spec.rb +16 -0
  225. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimizable_predicate_spec.rb +28 -0
  226. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimize_spec.rb +23 -0
  227. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimizable_predicate_spec.rb +28 -0
  228. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimize_spec.rb +23 -0
  229. data/spec/unit/axiom/optimizer/function/connective/binary/right_spec.rb +16 -0
  230. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimizable_predicate_spec.rb +64 -0
  231. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
  232. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimizable_predicate_spec.rb +61 -0
  233. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +76 -0
  234. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimizable_predicate_spec.rb +29 -0
  235. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimize_spec.rb +19 -0
  236. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimizable_predicate_spec.rb +29 -0
  237. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimize_spec.rb +19 -0
  238. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimizable_predicate_spec.rb +29 -0
  239. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimize_spec.rb +19 -0
  240. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimizable_predicate_spec.rb +29 -0
  241. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimize_spec.rb +19 -0
  242. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimizable_predicate_spec.rb +61 -0
  243. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +76 -0
  244. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimizable_predicate_spec.rb +64 -0
  245. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
  246. data/spec/unit/axiom/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
  247. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimizable_predicate_spec.rb +28 -0
  248. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
  249. data/spec/unit/axiom/optimizer/function/connective/negation/operand_spec.rb +14 -0
  250. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_comparable/optimizable_predicate_spec.rb +74 -0
  251. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_equivalent/optimizable_predicate_spec.rb +74 -0
  252. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimizable_predicate_spec.rb +43 -0
  253. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimize_spec.rb +21 -0
  254. data/spec/unit/axiom/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
  255. data/spec/unit/axiom/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
  256. data/spec/unit/axiom/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
  257. data/spec/unit/axiom/optimizer/function/predicate/enumerable/empty_right/optimizable_predicate_spec.rb +78 -0
  258. data/spec/unit/axiom/optimizer/function/predicate/enumerable/one_right/optimizable_predicate_spec.rb +78 -0
  259. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimizable_predicate_spec.rb +51 -0
  260. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimize_spec.rb +66 -0
  261. data/spec/unit/axiom/optimizer/function/predicate/equality/tautology/optimizable_predicate_spec.rb +29 -0
  262. data/spec/unit/axiom/optimizer/function/predicate/exclusion/empty_right/optimize_spec.rb +45 -0
  263. data/spec/unit/axiom/optimizer/function/predicate/exclusion/one_right/optimize_spec.rb +65 -0
  264. data/spec/unit/axiom/optimizer/function/predicate/greater_than/contradiction/optimizable_predicate_spec.rb +43 -0
  265. data/spec/unit/axiom/optimizer/function/predicate/greater_than/tautology/optimizable_predicate_spec.rb +28 -0
  266. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  267. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  268. data/spec/unit/axiom/optimizer/function/predicate/inclusion/empty_right/optimize_spec.rb +45 -0
  269. data/spec/unit/axiom/optimizer/function/predicate/inclusion/one_right/optimize_spec.rb +66 -0
  270. data/spec/unit/axiom/optimizer/function/predicate/inequality/contradiction/optimizable_predicate_spec.rb +29 -0
  271. data/spec/unit/axiom/optimizer/function/predicate/less_than/contradiction/optimizable_predicate_spec.rb +43 -0
  272. data/spec/unit/axiom/optimizer/function/predicate/less_than/tautology/optimizable_predicate_spec.rb +28 -0
  273. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  274. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  275. data/spec/unit/axiom/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
  276. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimizable_predicate_spec.rb +27 -0
  277. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
  278. data/spec/unit/axiom/optimizer/function/unary/operand_spec.rb +27 -0
  279. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  280. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
  281. data/spec/unit/axiom/optimizer/function/util/class_methods/attribute_spec.rb +21 -0
  282. data/spec/unit/axiom/optimizer/function/util/class_methods/constant_spec.rb +27 -0
  283. data/spec/unit/axiom/optimizer/function/util/class_methods/max_spec.rb +27 -0
  284. data/spec/unit/axiom/optimizer/function/util/class_methods/min_spec.rb +27 -0
  285. data/spec/unit/axiom/optimizer/operation_spec.rb +13 -0
  286. data/spec/unit/axiom/optimizer/optimizable/class_methods/optimizer_spec.rb +34 -0
  287. data/spec/unit/axiom/optimizer/optimizable/optimize_spec.rb +38 -0
  288. data/spec/unit/axiom/optimizer/optimizable_predicate_spec.rb +17 -0
  289. data/spec/unit/axiom/optimizer/optimize_spec.rb +17 -0
  290. data/spec/unit/axiom/optimizer/predicate_partition/left_spec.rb +149 -0
  291. data/spec/unit/axiom/optimizer/predicate_partition/remainder_spec.rb +149 -0
  292. data/spec/unit/axiom/optimizer/predicate_partition/right_spec.rb +149 -0
  293. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimizable_predicate_spec.rb +22 -0
  294. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimize_spec.rb +21 -0
  295. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_left/optimizable_predicate_spec.rb +28 -0
  296. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_right/optimizable_predicate_spec.rb +28 -0
  297. data/spec/unit/axiom/optimizer/relation/operation/binary/equal_operands/optimizable_predicate_spec.rb +31 -0
  298. data/spec/unit/axiom/optimizer/relation/operation/binary/left_spec.rb +15 -0
  299. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimizable_predicate_spec.rb +37 -0
  300. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimize_spec.rb +22 -0
  301. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimizable_predicate_spec.rb +23 -0
  302. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimize_spec.rb +23 -0
  303. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimizable_predicate_spec.rb +23 -0
  304. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimize_spec.rb +23 -0
  305. data/spec/unit/axiom/optimizer/relation/operation/binary/right_spec.rb +15 -0
  306. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimizable_predicate_spec.rb +40 -0
  307. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimize_spec.rb +24 -0
  308. data/spec/unit/axiom/optimizer/relation/operation/combination/optimize_spec.rb +18 -0
  309. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimizable_predicate_spec.rb +33 -0
  310. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +18 -0
  311. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimizable_predicate_spec.rb +27 -0
  312. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +35 -0
  313. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  314. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +22 -0
  315. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimizable_predicate_spec.rb +27 -0
  316. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +22 -0
  317. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimizable_predicate_spec.rb +27 -0
  318. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +21 -0
  319. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  320. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +22 -0
  321. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimizable_predicate_spec.rb +27 -0
  322. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +17 -0
  323. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimizable_predicate_spec.rb +33 -0
  324. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +18 -0
  325. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimizable_predicate_spec.rb +27 -0
  326. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimize_spec.rb +22 -0
  327. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  328. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +23 -0
  329. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimizable_predicate_spec.rb +27 -0
  330. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +22 -0
  331. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimizable_predicate_spec.rb +27 -0
  332. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +19 -0
  333. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  334. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +24 -0
  335. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimizable_predicate_spec.rb +23 -0
  336. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +17 -0
  337. data/spec/unit/axiom/optimizer/relation/operation/unary/header_spec.rb +15 -0
  338. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimizable_predicate_spec.rb +23 -0
  339. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +20 -0
  340. data/spec/unit/axiom/optimizer/relation/operation/unary/operand_spec.rb +16 -0
  341. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimizable_predicate_spec.rb +28 -0
  342. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
  343. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimizable_predicate_spec.rb +24 -0
  344. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
  345. metadata +697 -0
@@ -0,0 +1,236 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Function::Connective::Conjunction, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:attribute) { Attribute::Integer.new(:id) }
9
+ let(:object) { described_class.new(left, right) }
10
+
11
+ it_should_behave_like 'Function::Connective::Binary#optimize'
12
+
13
+ context 'left and right are predicates' do
14
+ let(:left) { attribute.gt(1) }
15
+ let(:right) { attribute.lt(3) }
16
+
17
+ it { should equal(object) }
18
+
19
+ it_should_behave_like 'an optimize method'
20
+ end
21
+
22
+ context 'left and right are inverse predicates' do
23
+ let(:left) { Function::Connective::Negation.new(attribute.gt(1)) }
24
+ let(:right) { Function::Connective::Negation.new(attribute.lt(3)) }
25
+
26
+ it { should_not equal(object) }
27
+
28
+ it 'reverses the operands' do
29
+ should eql(described_class.new(attribute.lte(1), attribute.gte(3)))
30
+ end
31
+
32
+ it_should_behave_like 'an optimize method'
33
+ end
34
+
35
+ context 'left and right are the same' do
36
+ let(:left) { attribute.gt(1) }
37
+ let(:right) { attribute.gt(1) }
38
+
39
+ it { should eql(left) }
40
+
41
+ it_should_behave_like 'an optimize method'
42
+ end
43
+
44
+ context 'left and right are tautologys' do
45
+ let(:left) { Function::Proposition::Tautology.instance }
46
+ let(:right) { Function::Proposition::Tautology.instance }
47
+
48
+ it { should equal(Function::Proposition::Tautology.instance) }
49
+
50
+ it_should_behave_like 'an optimize method'
51
+ end
52
+
53
+ context 'left and right are contradictions' do
54
+ let(:left) { Function::Proposition::Contradiction.instance }
55
+ let(:right) { Function::Proposition::Contradiction.instance }
56
+
57
+ it { should equal(Function::Proposition::Contradiction.instance) }
58
+
59
+ it_should_behave_like 'an optimize method'
60
+ end
61
+
62
+ context 'right is a tautology' do
63
+ let(:left) { attribute.gt(1) }
64
+ let(:right) { Function::Proposition::Tautology.instance }
65
+
66
+ it { should equal(left) }
67
+
68
+ it_should_behave_like 'an optimize method'
69
+ end
70
+
71
+ context 'left is a tautology' do
72
+ let(:left) { Function::Proposition::Tautology.instance }
73
+ let(:right) { attribute.lt(3) }
74
+
75
+ it { should equal(right) }
76
+
77
+ it_should_behave_like 'an optimize method'
78
+ end
79
+
80
+ context 'right is a contradiction' do
81
+ let(:left) { attribute.gt(1) }
82
+ let(:right) { Function::Proposition::Contradiction.instance }
83
+
84
+ it { should equal(Function::Proposition::Contradiction.instance) }
85
+
86
+ it_should_behave_like 'an optimize method'
87
+ end
88
+
89
+ context 'left is a contradiction' do
90
+ let(:left) { Function::Proposition::Contradiction.instance }
91
+ let(:right) { attribute.lt(3) }
92
+
93
+ it { should equal(Function::Proposition::Contradiction.instance) }
94
+
95
+ it_should_behave_like 'an optimize method'
96
+ end
97
+
98
+ context 'left and right are Equality predicates for the same attribute and different values' do
99
+ let(:left) { attribute.eq(1) }
100
+ let(:right) { attribute.eq(3) }
101
+
102
+ it { should equal(Function::Proposition::Contradiction.instance) }
103
+
104
+ it_should_behave_like 'an optimize method'
105
+ end
106
+
107
+ context 'left and right are Inequality predicates for the same attribute and different values' do
108
+ let(:left) { attribute.ne(1) }
109
+ let(:right) { attribute.ne(3) }
110
+
111
+ it { should eql(attribute.exclude([ 1, 3 ])) }
112
+
113
+ it_should_behave_like 'an optimize method'
114
+ end
115
+
116
+ context 'left is an Equality and right is an Inequality predicate for the same attribute and value' do
117
+ let(:left) { attribute.eq(1) }
118
+ let(:right) { attribute.ne(1) }
119
+
120
+ it { should equal(Function::Proposition::Contradiction.instance) }
121
+
122
+ it_should_behave_like 'an optimize method'
123
+ end
124
+
125
+ context 'left is an Inequality and right is an Equality predicate for the same attribute and value' do
126
+ let(:left) { attribute.ne(1) }
127
+ let(:right) { attribute.eq(1) }
128
+
129
+ it { should equal(Function::Proposition::Contradiction.instance) }
130
+
131
+ it_should_behave_like 'an optimize method'
132
+ end
133
+
134
+ context 'left is an Inclusion and right is an Exclusion predicate for the same attribute and value' do
135
+ let(:left) { attribute.include([ 1, 2 ]) }
136
+ let(:right) { attribute.exclude([ 1, 2 ]) }
137
+
138
+ it { should equal(Function::Proposition::Contradiction.instance) }
139
+
140
+ it_should_behave_like 'an optimize method'
141
+ end
142
+
143
+ context 'left is an Exclusion and right is an Inclusion predicate for the same attribute and value' do
144
+ let(:left) { attribute.exclude([ 1, 2 ]) }
145
+ let(:right) { attribute.include([ 1, 2 ]) }
146
+
147
+ it { should equal(Function::Proposition::Contradiction.instance) }
148
+
149
+ it_should_behave_like 'an optimize method'
150
+ end
151
+
152
+ context 'left is a GreaterThan and right is a LessThanOrEqualTo predicate for the same attribute and value' do
153
+ let(:left) { attribute.gt(1) }
154
+ let(:right) { attribute.lte(1) }
155
+
156
+ it { should equal(Function::Proposition::Contradiction.instance) }
157
+
158
+ it_should_behave_like 'an optimize method'
159
+ end
160
+
161
+ context 'left is an LessThanOrEqualTo and right is an GreaterThan predicate for the same attribute and value' do
162
+ let(:left) { attribute.lte(1) }
163
+ let(:right) { attribute.gt(1) }
164
+
165
+ it { should equal(Function::Proposition::Contradiction.instance) }
166
+
167
+ it_should_behave_like 'an optimize method'
168
+ end
169
+
170
+ context 'left is a GreaterThanOrEqualTo and right is a LessThan predicate for the same attribute and value' do
171
+ let(:left) { attribute.gte(1) }
172
+ let(:right) { attribute.lt(1) }
173
+
174
+ it { should equal(Function::Proposition::Contradiction.instance) }
175
+
176
+ it_should_behave_like 'an optimize method'
177
+ end
178
+
179
+ context 'left is an LessThan and right is an GreaterThanOrEqualTo predicate for the same attribute and value' do
180
+ let(:left) { attribute.lt(1) }
181
+ let(:right) { attribute.gte(1) }
182
+
183
+ it { should equal(Function::Proposition::Contradiction.instance) }
184
+
185
+ it_should_behave_like 'an optimize method'
186
+ end
187
+
188
+ context 'left is a Match and right is a NoMatch predicate for the same attribute and value' do
189
+ let(:attribute) { Attribute::String.new(:name) }
190
+ let(:left) { attribute.match(/Dan Kubb/) }
191
+ let(:right) { attribute.no_match(/Dan Kubb/) }
192
+
193
+ it { should equal(Function::Proposition::Contradiction.instance) }
194
+
195
+ it_should_behave_like 'an optimize method'
196
+ end
197
+
198
+ context 'left is an NoMatch and right is an Match predicate for the same attribute and value' do
199
+ let(:attribute) { Attribute::String.new(:name) }
200
+ let(:left) { attribute.no_match(/Dan Kubb/) }
201
+ let(:right) { attribute.match(/Dan Kubb/) }
202
+
203
+ it { should equal(Function::Proposition::Contradiction.instance) }
204
+
205
+ it_should_behave_like 'an optimize method'
206
+ end
207
+
208
+ context 'left and right are predicates for the same attribute and the same values' do
209
+ let(:left) { attribute.eq(1) }
210
+ let(:right) { attribute.eq(1) }
211
+
212
+ it { should eql(attribute.eq(1)) }
213
+
214
+ it_should_behave_like 'an optimize method'
215
+ end
216
+
217
+ context 'left and right are predicates for the same attribute, but left.right is an attribute' do
218
+ let(:other) { Attribute::Integer.new(:other_id) }
219
+ let(:left) { attribute.eq(other) }
220
+ let(:right) { attribute.eq(1) }
221
+
222
+ it { should equal(object) }
223
+
224
+ it_should_behave_like 'an optimize method'
225
+ end
226
+
227
+ context 'left and right are predicates for the same attribute, but right.right is an attribute' do
228
+ let(:other) { Attribute::Integer.new(:other_id) }
229
+ let(:left) { attribute.eq(1) }
230
+ let(:right) { attribute.eq(other) }
231
+
232
+ it { should equal(object) }
233
+
234
+ it_should_behave_like 'an optimize method'
235
+ end
236
+ end
@@ -0,0 +1,237 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Function::Connective::Disjunction, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:attribute) { Attribute::Integer.new(:id) }
9
+ let(:object) { described_class.new(left, right) }
10
+
11
+ it_should_behave_like 'Function::Connective::Binary#optimize'
12
+
13
+ context 'left and right are predicates' do
14
+ let(:left) { attribute.gt(1) }
15
+ let(:right) { attribute.lt(3) }
16
+
17
+ it { should equal(object) }
18
+
19
+ it_should_behave_like 'an optimize method'
20
+ end
21
+
22
+ context 'left and right are inverse predicates' do
23
+ let(:left) { Function::Connective::Negation.new(attribute.gt(1)) }
24
+ let(:right) { Function::Connective::Negation.new(attribute.lt(3)) }
25
+
26
+ it { should_not equal(object) }
27
+
28
+ it 'reverses the operands' do
29
+ should eql(Function::Connective::Disjunction.new(attribute.lte(1), attribute.gte(3)))
30
+ end
31
+
32
+ it_should_behave_like 'an optimize method'
33
+ end
34
+
35
+ context 'left and right are the same' do
36
+ let(:left) { attribute.gt(1) }
37
+ let(:right) { attribute.gt(1) }
38
+
39
+ it { should equal(left) }
40
+
41
+ it_should_behave_like 'an optimize method'
42
+ end
43
+
44
+ context 'left and right are tautologys' do
45
+ let(:left) { Function::Proposition::Tautology.instance }
46
+ let(:right) { Function::Proposition::Tautology.instance }
47
+
48
+ it { should equal(left) }
49
+
50
+ it_should_behave_like 'an optimize method'
51
+ end
52
+
53
+ context 'left and right are contradictions' do
54
+ let(:left) { Function::Proposition::Contradiction.instance }
55
+ let(:right) { Function::Proposition::Contradiction.instance }
56
+
57
+
58
+ it { should equal(left) }
59
+
60
+ it_should_behave_like 'an optimize method'
61
+ end
62
+
63
+ context 'right is a tautology' do
64
+ let(:left) { attribute.gt(1) }
65
+ let(:right) { Function::Proposition::Tautology.instance }
66
+
67
+ it { should equal(right) }
68
+
69
+ it_should_behave_like 'an optimize method'
70
+ end
71
+
72
+ context 'left is a tautology' do
73
+ let(:left) { Function::Proposition::Tautology.instance }
74
+ let(:right) { attribute.lt(3) }
75
+
76
+ it { should equal(left) }
77
+
78
+ it_should_behave_like 'an optimize method'
79
+ end
80
+
81
+ context 'right is a contradiction' do
82
+ let(:left) { attribute.gt(1) }
83
+ let(:right) { Function::Proposition::Contradiction.instance }
84
+
85
+ it { should equal(left) }
86
+
87
+ it_should_behave_like 'an optimize method'
88
+ end
89
+
90
+ context 'left is a contradiction' do
91
+ let(:left) { Function::Proposition::Contradiction.instance }
92
+ let(:right) { attribute.lt(3) }
93
+
94
+ it { should equal(right) }
95
+
96
+ it_should_behave_like 'an optimize method'
97
+ end
98
+
99
+ context 'left and right are Equality predicates for the same attribute and different values' do
100
+ let(:left) { attribute.eq(1) }
101
+ let(:right) { attribute.eq(3) }
102
+
103
+ it { should eql(attribute.include([ 1, 3 ])) }
104
+
105
+ it_should_behave_like 'an optimize method'
106
+ end
107
+
108
+ context 'left and right are Inequality predicates for the same attribute and different values' do
109
+ let(:left) { attribute.ne(1) }
110
+ let(:right) { attribute.ne(3) }
111
+
112
+ it { should equal(Function::Proposition::Tautology.instance) }
113
+
114
+ it_should_behave_like 'an optimize method'
115
+ end
116
+
117
+ context 'left is an Equality and right is an Inequality predicate for the same attribute and value' do
118
+ let(:left) { attribute.eq(1) }
119
+ let(:right) { attribute.ne(1) }
120
+
121
+ it { should equal(Function::Proposition::Tautology.instance) }
122
+
123
+ it_should_behave_like 'an optimize method'
124
+ end
125
+
126
+ context 'left is an Inequality and right is an Equality predicate for the same attribute and value' do
127
+ let(:left) { attribute.ne(1) }
128
+ let(:right) { attribute.eq(1) }
129
+
130
+ it { should equal(Function::Proposition::Tautology.instance) }
131
+
132
+ it_should_behave_like 'an optimize method'
133
+ end
134
+
135
+ context 'left is an Inclusion and right is an Exclusion predicate for the same attribute and value' do
136
+ let(:left) { attribute.include([ 1, 2 ]) }
137
+ let(:right) { attribute.exclude([ 1, 2 ]) }
138
+
139
+ it { should equal(Function::Proposition::Tautology.instance) }
140
+
141
+ it_should_behave_like 'an optimize method'
142
+ end
143
+
144
+ context 'left is an Exclusion and right is an Inclusion predicate for the same attribute and value' do
145
+ let(:left) { attribute.exclude([ 1, 2 ]) }
146
+ let(:right) { attribute.include([ 1, 2 ]) }
147
+
148
+ it { should equal(Function::Proposition::Tautology.instance) }
149
+
150
+ it_should_behave_like 'an optimize method'
151
+ end
152
+
153
+ context 'left is a GreaterThan and right is a LessThanOrEqualTo predicate for the same attribute and value' do
154
+ let(:left) { attribute.gt(1) }
155
+ let(:right) { attribute.lte(1) }
156
+
157
+ it { should equal(Function::Proposition::Tautology.instance) }
158
+
159
+ it_should_behave_like 'an optimize method'
160
+ end
161
+
162
+ context 'left is an LessThanOrEqualTo and right is an GreaterThan predicate for the same attribute and value' do
163
+ let(:left) { attribute.lte(1) }
164
+ let(:right) { attribute.gt(1) }
165
+
166
+ it { should equal(Function::Proposition::Tautology.instance) }
167
+
168
+ it_should_behave_like 'an optimize method'
169
+ end
170
+
171
+ context 'left is a GreaterThanOrEqualTo and right is a LessThan predicate for the same attribute and value' do
172
+ let(:left) { attribute.gte(1) }
173
+ let(:right) { attribute.lt(1) }
174
+
175
+ it { should equal(Function::Proposition::Tautology.instance) }
176
+
177
+ it_should_behave_like 'an optimize method'
178
+ end
179
+
180
+ context 'left is an LessThan and right is an GreaterThanOrEqualTo predicate for the same attribute and value' do
181
+ let(:left) { attribute.lt(1) }
182
+ let(:right) { attribute.gte(1) }
183
+
184
+ it { should equal(Function::Proposition::Tautology.instance) }
185
+
186
+ it_should_behave_like 'an optimize method'
187
+ end
188
+
189
+ context 'left is a Match and right is a NoMatch predicate for the same attribute and value' do
190
+ let(:attribute) { Attribute::String.new(:name) }
191
+ let(:left) { attribute.match(/Dan Kubb/) }
192
+ let(:right) { attribute.no_match(/Dan Kubb/) }
193
+
194
+ it { should equal(Function::Proposition::Tautology.instance) }
195
+
196
+ it_should_behave_like 'an optimize method'
197
+ end
198
+
199
+ context 'left is an NoMatch and right is an Match predicate for the same attribute and value' do
200
+ let(:attribute) { Attribute::String.new(:name) }
201
+ let(:left) { attribute.no_match(/Dan Kubb/) }
202
+ let(:right) { attribute.match(/Dan Kubb/) }
203
+
204
+ it { should equal(Function::Proposition::Tautology.instance) }
205
+
206
+ it_should_behave_like 'an optimize method'
207
+ end
208
+
209
+ context 'left and right are predicates for the same attribute and the same values' do
210
+ let(:left) { attribute.eq(1) }
211
+ let(:right) { attribute.eq(1) }
212
+
213
+ it { should eql(attribute.eq(1)) }
214
+
215
+ it_should_behave_like 'an optimize method'
216
+ end
217
+
218
+ context 'left and right are predicates for the same attribute, but left.right is an attribute' do
219
+ let(:other) { Attribute::Integer.new(:other_id) }
220
+ let(:left) { attribute.eq(other) }
221
+ let(:right) { attribute.eq(1) }
222
+
223
+ it { should equal(object) }
224
+
225
+ it_should_behave_like 'an optimize method'
226
+ end
227
+
228
+ context 'left and right are predicates for the same attribute, but right.right is an attribute' do
229
+ let(:other) { Attribute::Integer.new(:other_id) }
230
+ let(:left) { attribute.eq(1) }
231
+ let(:right) { attribute.eq(other) }
232
+
233
+ it { should equal(object) }
234
+
235
+ it_should_behave_like 'an optimize method'
236
+ end
237
+ end