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.
Files changed (279) hide show
  1. data/Gemfile +33 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +27 -0
  4. data/Rakefile +25 -0
  5. data/TODO +75 -0
  6. data/config/flay.yml +3 -0
  7. data/config/flog.yml +2 -0
  8. data/config/roodi.yml +16 -0
  9. data/config/site.reek +91 -0
  10. data/config/yardstick.yml +2 -0
  11. data/lib/veritas/optimizer/algebra/difference.rb +66 -0
  12. data/lib/veritas/optimizer/algebra/extension.rb +42 -0
  13. data/lib/veritas/optimizer/algebra/intersection.rb +66 -0
  14. data/lib/veritas/optimizer/algebra/join.rb +44 -0
  15. data/lib/veritas/optimizer/algebra/product.rb +70 -0
  16. data/lib/veritas/optimizer/algebra/projection.rb +174 -0
  17. data/lib/veritas/optimizer/algebra/rename.rb +396 -0
  18. data/lib/veritas/optimizer/algebra/restriction.rb +259 -0
  19. data/lib/veritas/optimizer/algebra/summarization.rb +42 -0
  20. data/lib/veritas/optimizer/algebra/union.rb +66 -0
  21. data/lib/veritas/optimizer/logic/connective/binary.rb +254 -0
  22. data/lib/veritas/optimizer/logic/connective/conjunction.rb +122 -0
  23. data/lib/veritas/optimizer/logic/connective/disjunction.rb +122 -0
  24. data/lib/veritas/optimizer/logic/connective/negation.rb +71 -0
  25. data/lib/veritas/optimizer/logic/predicate/comparable.rb +134 -0
  26. data/lib/veritas/optimizer/logic/predicate/enumerable.rb +141 -0
  27. data/lib/veritas/optimizer/logic/predicate/equality.rb +44 -0
  28. data/lib/veritas/optimizer/logic/predicate/exclusion.rb +53 -0
  29. data/lib/veritas/optimizer/logic/predicate/greater_than.rb +54 -0
  30. data/lib/veritas/optimizer/logic/predicate/greater_than_or_equal_to.rb +56 -0
  31. data/lib/veritas/optimizer/logic/predicate/inclusion.rb +53 -0
  32. data/lib/veritas/optimizer/logic/predicate/inequality.rb +44 -0
  33. data/lib/veritas/optimizer/logic/predicate/less_than.rb +54 -0
  34. data/lib/veritas/optimizer/logic/predicate/less_than_or_equal_to.rb +56 -0
  35. data/lib/veritas/optimizer/logic/predicate/match.rb +19 -0
  36. data/lib/veritas/optimizer/logic/predicate/no_match.rb +19 -0
  37. data/lib/veritas/optimizer/logic/predicate.rb +177 -0
  38. data/lib/veritas/optimizer/optimizable.rb +59 -0
  39. data/lib/veritas/optimizer/relation/materialized.rb +40 -0
  40. data/lib/veritas/optimizer/relation/operation/binary.rb +168 -0
  41. data/lib/veritas/optimizer/relation/operation/combination.rb +33 -0
  42. data/lib/veritas/optimizer/relation/operation/limit.rb +149 -0
  43. data/lib/veritas/optimizer/relation/operation/offset.rb +114 -0
  44. data/lib/veritas/optimizer/relation/operation/order.rb +96 -0
  45. data/lib/veritas/optimizer/relation/operation/reverse.rb +94 -0
  46. data/lib/veritas/optimizer/relation/operation/unary.rb +88 -0
  47. data/lib/veritas/optimizer/version.rb +7 -0
  48. data/lib/veritas/optimizer.rb +136 -0
  49. data/lib/veritas-optimizer.rb +3 -0
  50. data/spec/integration/veritas/algebra/difference/optimize_spec.rb +152 -0
  51. data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +152 -0
  52. data/spec/integration/veritas/algebra/join/optimize_spec.rb +110 -0
  53. data/spec/integration/veritas/algebra/product/optimize_spec.rb +176 -0
  54. data/spec/integration/veritas/algebra/projection/optimize_spec.rb +237 -0
  55. data/spec/integration/veritas/algebra/rename/optimize_spec.rb +440 -0
  56. data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +216 -0
  57. data/spec/integration/veritas/algebra/union/optimize_spec.rb +192 -0
  58. data/spec/integration/veritas/logic/connective/conjunction/optimize_spec.rb +234 -0
  59. data/spec/integration/veritas/logic/connective/disjunction/optimize_spec.rb +235 -0
  60. data/spec/integration/veritas/logic/connective/negation/optimize_spec.rb +41 -0
  61. data/spec/integration/veritas/logic/expression/optimize_spec.rb +42 -0
  62. data/spec/integration/veritas/logic/predicate/equality/optimize_spec.rb +90 -0
  63. data/spec/integration/veritas/logic/predicate/exclusion/optimize_spec.rb +131 -0
  64. data/spec/integration/veritas/logic/predicate/greater_than/optimize_spec.rb +100 -0
  65. data/spec/integration/veritas/logic/predicate/greater_than_or_equal_to/optimize_spec.rb +100 -0
  66. data/spec/integration/veritas/logic/predicate/inclusion/optimize_spec.rb +131 -0
  67. data/spec/integration/veritas/logic/predicate/inequality/optimize_spec.rb +90 -0
  68. data/spec/integration/veritas/logic/predicate/less_than/optimize_spec.rb +100 -0
  69. data/spec/integration/veritas/logic/predicate/less_than_or_equal_to/optimize_spec.rb +100 -0
  70. data/spec/integration/veritas/relation/empty/optimize_spec.rb +11 -0
  71. data/spec/integration/veritas/relation/materialized/optimize_spec.rb +37 -0
  72. data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +140 -0
  73. data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +98 -0
  74. data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +103 -0
  75. data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +113 -0
  76. data/spec/integration/veritas/relation/optimize_spec.rb +33 -0
  77. data/spec/rcov.opts +6 -0
  78. data/spec/shared/idempotent_method_behavior.rb +5 -0
  79. data/spec/shared/logic_connective_binary_optimize_behavior.rb +100 -0
  80. data/spec/shared/optimize_method_behavior.rb +14 -0
  81. data/spec/spec.opts +3 -0
  82. data/spec/spec_helper.rb +16 -0
  83. data/spec/support/add_method_missing.rb +13 -0
  84. data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +17 -0
  85. data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +17 -0
  86. data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +19 -0
  87. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +27 -0
  88. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +25 -0
  89. data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +17 -0
  90. data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +17 -0
  91. data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +17 -0
  92. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +27 -0
  93. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +21 -0
  94. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +25 -0
  95. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +16 -0
  96. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +25 -0
  97. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +16 -0
  98. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +25 -0
  99. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +18 -0
  100. data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +16 -0
  101. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +26 -0
  102. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +20 -0
  103. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimizable_spec.rb +27 -0
  104. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimize_spec.rb +23 -0
  105. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +26 -0
  106. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +16 -0
  107. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +26 -0
  108. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +20 -0
  109. data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +31 -0
  110. data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +27 -0
  111. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +25 -0
  112. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +17 -0
  113. data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +19 -0
  114. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +26 -0
  115. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +21 -0
  116. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +26 -0
  117. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +21 -0
  118. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +26 -0
  119. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +20 -0
  120. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +26 -0
  121. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +20 -0
  122. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimizable_spec.rb +28 -0
  123. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimize_spec.rb +20 -0
  124. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +35 -0
  125. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +16 -0
  126. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +27 -0
  127. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +21 -0
  128. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +25 -0
  129. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +21 -0
  130. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +27 -0
  131. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +21 -0
  132. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimizable_spec.rb +26 -0
  133. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimize_spec.rb +16 -0
  134. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +42 -0
  135. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +21 -0
  136. data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +31 -0
  137. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimizable_spec.rb +26 -0
  138. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimize_spec.rb +19 -0
  139. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +26 -0
  140. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +18 -0
  141. data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +16 -0
  142. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +28 -0
  143. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +22 -0
  144. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +26 -0
  145. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +18 -0
  146. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +28 -0
  147. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +22 -0
  148. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimizable_spec.rb +25 -0
  149. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimize_spec.rb +17 -0
  150. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +42 -0
  151. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +22 -0
  152. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +27 -0
  153. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +27 -0
  154. data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +17 -0
  155. data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +17 -0
  156. data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +17 -0
  157. data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +54 -0
  158. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimizable_spec.rb +27 -0
  159. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimize_spec.rb +17 -0
  160. data/spec/unit/veritas/optimizer/logic/connective/binary/left_spec.rb +14 -0
  161. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimizable_spec.rb +26 -0
  162. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimize_spec.rb +21 -0
  163. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimizable_spec.rb +26 -0
  164. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimize_spec.rb +21 -0
  165. data/spec/unit/veritas/optimizer/logic/connective/binary/right_spec.rb +14 -0
  166. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +34 -0
  167. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +21 -0
  168. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimizable_spec.rb +41 -0
  169. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimize_spec.rb +17 -0
  170. data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimizable_spec.rb +27 -0
  171. data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimize_spec.rb +17 -0
  172. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +27 -0
  173. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +36 -0
  174. data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimizable_spec.rb +27 -0
  175. data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimize_spec.rb +17 -0
  176. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimizable_spec.rb +27 -0
  177. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimize_spec.rb +17 -0
  178. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimizable_spec.rb +27 -0
  179. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimize_spec.rb +17 -0
  180. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +27 -0
  181. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +36 -0
  182. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimizable_spec.rb +41 -0
  183. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimize_spec.rb +17 -0
  184. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +26 -0
  185. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +20 -0
  186. data/spec/unit/veritas/optimizer/logic/connective/negation/operand_spec.rb +12 -0
  187. data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +20 -0
  188. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_comparable/optimizable_spec.rb +58 -0
  189. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_equivalent/optimizable_spec.rb +58 -0
  190. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimizable_spec.rb +41 -0
  191. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimize_spec.rb +19 -0
  192. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +29 -0
  193. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +14 -0
  194. data/spec/unit/veritas/optimizer/logic/predicate/contradiction/optimize_spec.rb +16 -0
  195. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/empty_right_operand/optimizable_spec.rb +76 -0
  196. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/one_right_operand/optimizable_spec.rb +76 -0
  197. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimizable_spec.rb +49 -0
  198. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimize_spec.rb +53 -0
  199. data/spec/unit/veritas/optimizer/logic/predicate/equality/tautology/optimizable_spec.rb +27 -0
  200. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/empty_right_operand/optimize_spec.rb +43 -0
  201. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/one_right_operand/optimize_spec.rb +63 -0
  202. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/contradiction/optimizable_spec.rb +41 -0
  203. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/tautology/optimizable_spec.rb +26 -0
  204. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
  205. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
  206. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/empty_right_operand/optimize_spec.rb +43 -0
  207. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/one_right_operand/optimize_spec.rb +64 -0
  208. data/spec/unit/veritas/optimizer/logic/predicate/inequality/contradiction/optimizable_spec.rb +27 -0
  209. data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +25 -0
  210. data/spec/unit/veritas/optimizer/logic/predicate/less_than/contradiction/optimizable_spec.rb +41 -0
  211. data/spec/unit/veritas/optimizer/logic/predicate/less_than/tautology/optimizable_spec.rb +26 -0
  212. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
  213. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
  214. data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +25 -0
  215. data/spec/unit/veritas/optimizer/logic/predicate/tautology/optimize_spec.rb +16 -0
  216. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/attribute_spec.rb +19 -0
  217. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/constant_spec.rb +19 -0
  218. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +19 -0
  219. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +19 -0
  220. data/spec/unit/veritas/optimizer/operation_spec.rb +11 -0
  221. data/spec/unit/veritas/optimizer/optimizable/class_methods/optimizer_spec.rb +32 -0
  222. data/spec/unit/veritas/optimizer/optimizable/optimize_spec.rb +36 -0
  223. data/spec/unit/veritas/optimizer/optimizable_spec.rb +15 -0
  224. data/spec/unit/veritas/optimizer/optimize_spec.rb +15 -0
  225. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +20 -0
  226. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +17 -0
  227. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +30 -0
  228. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +30 -0
  229. data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +34 -0
  230. data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +17 -0
  231. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +35 -0
  232. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +20 -0
  233. data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +17 -0
  234. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimizable_spec.rb +38 -0
  235. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimize_spec.rb +22 -0
  236. data/spec/unit/veritas/optimizer/relation/operation/combination/optimize_spec.rb +14 -0
  237. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +31 -0
  238. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +16 -0
  239. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimizable_spec.rb +25 -0
  240. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +33 -0
  241. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +26 -0
  242. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +20 -0
  243. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +25 -0
  244. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +18 -0
  245. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +25 -0
  246. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +19 -0
  247. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +26 -0
  248. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +20 -0
  249. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +25 -0
  250. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +15 -0
  251. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +31 -0
  252. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +16 -0
  253. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +25 -0
  254. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +20 -0
  255. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +26 -0
  256. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +21 -0
  257. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +25 -0
  258. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +20 -0
  259. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +25 -0
  260. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +17 -0
  261. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +25 -0
  262. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +22 -0
  263. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +20 -0
  264. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +15 -0
  265. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +20 -0
  266. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +18 -0
  267. data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +13 -0
  268. data/tasks/quality/ci.rake +2 -0
  269. data/tasks/quality/flay.rake +41 -0
  270. data/tasks/quality/flog.rake +45 -0
  271. data/tasks/quality/heckle.rake +203 -0
  272. data/tasks/quality/metric_fu.rake +26 -0
  273. data/tasks/quality/reek.rake +9 -0
  274. data/tasks/quality/roodi.rake +15 -0
  275. data/tasks/quality/yardstick.rake +23 -0
  276. data/tasks/spec.rake +38 -0
  277. data/tasks/yard.rake +9 -0
  278. data/veritas-optimizer.gemspec +550 -0
  279. 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