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,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe Logic::Predicate::LessThan, '#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 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::Tautology.instance) }
31
+
32
+ it_should_behave_like 'an optimize method'
33
+ end
34
+
35
+ context 'and left is always greater than or equal to right' do
36
+ let(:left) { attribute }
37
+ let(:right) { Attribute::Integer.new(:right, :size => 0..0) }
38
+
39
+ it { should equal(Logic::Proposition::Contradiction.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::GreaterThan.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) { 2 }
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) { 1 }
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::LessThanOrEqualTo, '#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::Tautology.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::Contradiction.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::GreaterThanOrEqualTo.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) { 2 }
93
+ let(:right) { 1 }
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,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Empty, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:object) { described_class.new([ [ :id, Integer ] ]) }
7
+
8
+ it { should equal(object) }
9
+
10
+ it_should_behave_like 'an optimize method'
11
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Materialized, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:object) { described_class.new([ [ :id, Integer ] ], body) }
7
+
8
+ context 'with an empty Array' do
9
+ let(:body) { [] }
10
+
11
+ it { should eql(Relation::Empty.new(object.header)) }
12
+
13
+ it 'returns an equivalent object to the unoptimized operation' do
14
+ should == object
15
+ end
16
+
17
+ it 'does not execute body#each' do
18
+ body.should_not_receive(:each)
19
+ subject
20
+ end
21
+
22
+ it_should_behave_like 'an optimize method'
23
+ end
24
+
25
+ context 'with an nonempty Array' do
26
+ let(:body) { [ [ 1 ] ] }
27
+
28
+ it { should equal(object) }
29
+
30
+ it 'does not execute body#each' do
31
+ body.should_not_receive(:each)
32
+ subject
33
+ end
34
+
35
+ it_should_behave_like 'an optimize method'
36
+ end
37
+ end
@@ -0,0 +1,140 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Operation::Limit, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:body) { [ [ 1 ], [ 2 ], [ 3 ] ].each }
7
+ let(:relation) { Relation.new([ [ :id, Integer ] ], body) }
8
+ let(:directions) { [ relation[:id] ] }
9
+ let(:order) { relation.order(directions) }
10
+ let(:operand) { order }
11
+ let(:limit) { 1 }
12
+ let(:object) { described_class.new(operand, limit) }
13
+
14
+ context 'when the limit is 0' do
15
+ let(:limit) { 0 }
16
+
17
+ it { should be_kind_of(Relation::Empty) }
18
+
19
+ it 'returns an equivalent relation to the unoptimized operation' do
20
+ should == object
21
+ end
22
+
23
+ it 'does not execute body#each' do
24
+ body.should_not_receive(:each)
25
+ subject
26
+ end
27
+
28
+ it_should_behave_like 'an optimize method'
29
+ end
30
+
31
+ context 'containing an order operation' do
32
+ it { should equal(object) }
33
+
34
+ it 'does not execute body#each' do
35
+ body.should_not_receive(:each)
36
+ subject
37
+ end
38
+
39
+ it_should_behave_like 'an optimize method'
40
+ end
41
+
42
+ context 'containing an optimizable order operation' do
43
+ let(:operand) { order.rename({}) }
44
+
45
+ it { should be_kind_of(described_class) }
46
+
47
+ its(:operand) { should equal(order) }
48
+
49
+ its(:limit) { should == 1 }
50
+
51
+ it 'returns an equivalent relation to the unoptimized operation' do
52
+ should == object
53
+ end
54
+
55
+ it 'does not execute body#each' do
56
+ body.should_not_receive(:each)
57
+ subject
58
+ end
59
+
60
+ it_should_behave_like 'an optimize method'
61
+ end
62
+
63
+ context 'containing a more restrictive object operation' do
64
+ let(:operand) { order.take(5) }
65
+ let(:limit) { 10 }
66
+
67
+ it { should be_kind_of(described_class) }
68
+
69
+ its(:operand) { should equal(order) }
70
+
71
+ it 'uses the more restrictive object' do
72
+ subject.limit.should == 5
73
+ end
74
+
75
+ it 'returns an equivalent relation to the unoptimized operation' do
76
+ should == object
77
+ end
78
+
79
+ it 'does not execute body#each' do
80
+ body.should_not_receive(:each)
81
+ subject
82
+ end
83
+
84
+ it_should_behave_like 'an optimize method'
85
+ end
86
+
87
+ context 'containing a less restrictive object operation' do
88
+ let(:operand) { order.take(10) }
89
+ let(:limit) { 5 }
90
+
91
+ it { should be_kind_of(described_class) }
92
+
93
+ its(:operand) { should equal(order) }
94
+
95
+ it 'uses the more restrictive object' do
96
+ subject.limit.should == 5
97
+ end
98
+
99
+ it 'returns an equivalent relation to the unoptimized operation' do
100
+ should == object
101
+ end
102
+
103
+ it 'does not execute body#each' do
104
+ body.should_not_receive(:each)
105
+ subject
106
+ end
107
+
108
+ it_should_behave_like 'an optimize method'
109
+ end
110
+
111
+ context 'containing a similar object operation' do
112
+ let(:operand) { order.take(10) }
113
+ let(:limit) { 10 }
114
+
115
+ it { should equal(operand) }
116
+
117
+ it 'returns an equivalent relation to the unoptimized operation' do
118
+ should == object
119
+ end
120
+
121
+ it 'does not execute body#each' do
122
+ body.should_not_receive(:each)
123
+ subject
124
+ end
125
+
126
+ it_should_behave_like 'an optimize method'
127
+ end
128
+
129
+ context 'containing a materialized relation' do
130
+ let(:relation) { Relation.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ], [ 3 ] ]) }
131
+
132
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ] ], [ [ 1 ] ])) }
133
+
134
+ it 'returns an equivalent relation to the unoptimized operation' do
135
+ should == object
136
+ end
137
+
138
+ it_should_behave_like 'an optimize method'
139
+ end
140
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Operation::Offset, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:body) { [ [ 1 ], [ 2 ], [ 3 ] ].each }
7
+ let(:relation) { Relation.new([ [ :id, Integer ] ], body) }
8
+ let(:directions) { [ relation[:id] ] }
9
+ let(:order) { relation.order(directions) }
10
+ let(:operand) { order }
11
+ let(:offset) { 1 }
12
+ let(:object) { described_class.new(operand, offset) }
13
+
14
+ context 'with an object of 0' do
15
+ let(:offset) { 0 }
16
+
17
+ it { should equal(order) }
18
+
19
+ it 'returns an equivalent relation to the unoptimized operation' do
20
+ should == object
21
+ end
22
+
23
+ it 'does not execute body#each' do
24
+ body.should_not_receive(:each)
25
+ subject
26
+ end
27
+
28
+ it_should_behave_like 'an optimize method'
29
+ end
30
+
31
+ context 'containing an order operation' do
32
+ it { should equal(object) }
33
+
34
+ it 'does not execute body#each' do
35
+ body.should_not_receive(:each)
36
+ subject
37
+ end
38
+
39
+ it_should_behave_like 'an optimize method'
40
+ end
41
+
42
+ context 'containing an optimizable order operation' do
43
+ let(:operand) { order.rename({}) }
44
+
45
+ it { should be_kind_of(described_class) }
46
+
47
+ its(:operand) { should equal(order) }
48
+
49
+ its(:offset) { should == 1 }
50
+
51
+ it 'returns an equivalent relation to the unoptimized operation' do
52
+ should == object
53
+ end
54
+
55
+ it 'does not execute body#each' do
56
+ body.should_not_receive(:each)
57
+ subject
58
+ end
59
+
60
+ it_should_behave_like 'an optimize method'
61
+ end
62
+
63
+ context 'containing an object operation' do
64
+ let(:operand) { order.drop(5) }
65
+ let(:offset) { 10 }
66
+
67
+ it { should be_kind_of(described_class) }
68
+
69
+ its(:operand) { should equal(order) }
70
+
71
+ it 'adds the object of the operations' do
72
+ subject.offset.should == 15
73
+ end
74
+
75
+ it 'returns an equivalent relation to the unoptimized operation' do
76
+ should == object
77
+ end
78
+
79
+ it 'does not execute body#each' do
80
+ body.should_not_receive(:each)
81
+ subject
82
+ end
83
+
84
+ it_should_behave_like 'an optimize method'
85
+ end
86
+
87
+ context 'containing a materialized relation' do
88
+ let(:relation) { Relation.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ], [ 3 ] ]) }
89
+
90
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ] ], [ [ 2 ], [ 3 ] ])) }
91
+
92
+ it 'returns an equivalent relation to the unoptimized operation' do
93
+ should == object
94
+ end
95
+
96
+ it_should_behave_like 'an optimize method'
97
+ end
98
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Operation::Order, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:body) { [ [ 1 ], [ 2 ], [ 3 ] ].each }
7
+ let(:relation) { Relation.new([ [ :id, Integer ] ], body) }
8
+ let(:operand) { relation }
9
+ let(:directions) { [ relation[:id] ] }
10
+ let(:object) { described_class.new(operand, directions) }
11
+
12
+ context 'containing a relation' do
13
+ it { should equal(object) }
14
+
15
+ it 'does not execute body#each' do
16
+ body.should_not_receive(:each)
17
+ subject
18
+ end
19
+
20
+ it_should_behave_like 'an optimize method'
21
+ end
22
+
23
+ context 'containing an optimizable relation' do
24
+ let(:operand) { relation.project(relation.header) }
25
+
26
+ it { should eql(relation.order(directions)) }
27
+
28
+ it 'returns an equivalent relation to the unoptimized operation' do
29
+ should == object
30
+ end
31
+
32
+ it 'does not execute body#each' do
33
+ body.should_not_receive(:each)
34
+ subject
35
+ end
36
+
37
+ it_should_behave_like 'an optimize method'
38
+ end
39
+
40
+ context 'containing an object operation' do
41
+ let(:operand) { relation.order { |r| [ r[:id].desc ] } }
42
+
43
+ it { should eql(relation.order(directions)) }
44
+
45
+ it 'returns an equivalent relation to the unoptimized operation' do
46
+ should == object
47
+ end
48
+
49
+ it 'does not execute body#each' do
50
+ body.should_not_receive(:each)
51
+ subject
52
+ end
53
+
54
+ it_should_behave_like 'an optimize method'
55
+ end
56
+
57
+ context 'containing a reverse operation' do
58
+ let(:operand) { relation.order.reverse }
59
+
60
+ it { should eql(relation.order) }
61
+
62
+ it 'returns an equivalent relation to the unoptimized operation' do
63
+ should == object
64
+ end
65
+
66
+ it 'does not execute body#each' do
67
+ body.should_not_receive(:each)
68
+ subject
69
+ end
70
+
71
+ it_should_behave_like 'an optimize method'
72
+ end
73
+
74
+ context 'containing a limit(1) operation' do
75
+ let(:operand) { relation.order.take(1) }
76
+
77
+ it { should equal(operand) }
78
+
79
+ it 'returns an equivalent relation to the unoptimized operation' do
80
+ should == object
81
+ end
82
+
83
+ it 'does not execute body#each' do
84
+ body.should_not_receive(:each)
85
+ subject
86
+ end
87
+
88
+ it_should_behave_like 'an optimize method'
89
+ end
90
+
91
+ context 'containing a materialized relation' do
92
+ let(:relation) { Relation.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ], [ 3 ] ]) }
93
+ let(:object) { described_class.new(relation, directions) }
94
+
95
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ], [ 3 ] ])) }
96
+
97
+ it 'returns an equivalent relation to the unoptimized operation' do
98
+ should == object
99
+ end
100
+
101
+ it_should_behave_like 'an optimize method'
102
+ end
103
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe Relation::Operation::Reverse, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:body) { [ [ 1 ], [ 2 ], [ 3 ] ].each }
7
+ let(:relation) { Relation.new([ [ :id, Integer ] ], body) }
8
+ let(:order) { relation.order }
9
+ let(:operand) { order }
10
+ let(:object) { described_class.new(operand) }
11
+
12
+ context 'with a object operation' do
13
+ let(:limit) { order.take(2) }
14
+ let(:operand) { limit.reverse }
15
+
16
+ it 'cancels out the operations and return the contained operation' do
17
+ should equal(limit)
18
+ end
19
+
20
+ it 'returns an equivalent relation to the unoptimized operation' do
21
+ should == object
22
+ end
23
+
24
+ it 'does not execute body#each' do
25
+ body.should_not_receive(:each)
26
+ subject
27
+ end
28
+
29
+ it_should_behave_like 'an optimize method'
30
+ end
31
+
32
+ context 'with a object operation when optimized' do
33
+ let(:limit) { order.take(2) }
34
+ let(:operand) { limit.reverse.rename({}) }
35
+
36
+ it 'cancels out the operations and return the contained operation' do
37
+ should equal(limit)
38
+ end
39
+
40
+ it 'returns an equivalent relation to the unoptimized operation' do
41
+ should == object
42
+ end
43
+
44
+ it 'does not execute body#each' do
45
+ body.should_not_receive(:each)
46
+ subject
47
+ end
48
+
49
+ it_should_behave_like 'an optimize method'
50
+ end
51
+
52
+ context 'with an order operation' do
53
+ it { should eql(relation.order(object.directions)) }
54
+
55
+ it 'returns an equivalent relation to the unoptimized operation' do
56
+ should == object
57
+ end
58
+
59
+ it 'does not execute body#each' do
60
+ body.should_not_receive(:each)
61
+ subject
62
+ end
63
+
64
+ it_should_behave_like 'an optimize method'
65
+ end
66
+
67
+ context 'with an order operation when optimized' do
68
+ let(:operand) { order.rename({}) }
69
+
70
+ it { should eql(relation.order(object.directions)) }
71
+
72
+ it 'returns an equivalent relation to the unoptimized operation' do
73
+ should == object
74
+ end
75
+
76
+ it 'does not execute body#each' do
77
+ body.should_not_receive(:each)
78
+ subject
79
+ end
80
+
81
+ it_should_behave_like 'an optimize method'
82
+ end
83
+
84
+ context 'with an optimizable operation' do
85
+ let(:limit) { order.take(2) }
86
+ let(:operand) { limit.rename({}) }
87
+
88
+ it { should eql(order.take(2).reverse) }
89
+
90
+ it 'returns an equivalent relation to the unoptimized operation' do
91
+ should == object
92
+ end
93
+
94
+ it 'does not execute body#each' do
95
+ body.should_not_receive(:each)
96
+ subject
97
+ end
98
+
99
+ it_should_behave_like 'an optimize method'
100
+ end
101
+
102
+ context 'containing a materialized relation' do
103
+ let(:relation) { Relation.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ], [ 3 ] ]) }
104
+
105
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ] ], [ [ 3 ], [ 2 ], [ 1 ] ])) }
106
+
107
+ it 'returns an equivalent relation to the unoptimized operation' do
108
+ should == object
109
+ end
110
+
111
+ it_should_behave_like 'an optimize method'
112
+ end
113
+ end