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,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Connective::Disjunction::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:connective) { Logic::Connective::Disjunction.new(left, right) }
8
+ let(:object) { described_class.new(connective) }
9
+
10
+ before do
11
+ object.operation.should be_kind_of(Logic::Connective::Disjunction)
12
+ end
13
+
14
+ context 'when left is a tautology' do
15
+ let(:left) { Logic::Proposition::Tautology.instance }
16
+ let(:right) { attribute.eq(1) }
17
+
18
+ it { should be(true) }
19
+ end
20
+
21
+ context 'when right is a tautology' do
22
+ let(:left) { attribute.eq(1) }
23
+ let(:right) { Logic::Proposition::Tautology.instance }
24
+
25
+ it { should be(true) }
26
+ end
27
+
28
+ context 'when left and right are inequality predicates with the same attribute and constant values' do
29
+ let(:left) { attribute.ne(1) }
30
+ let(:right) { attribute.ne(2) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left and right are inverses' do
36
+ let(:left) { attribute.eq(1) }
37
+ let(:right) { attribute.ne(1) }
38
+
39
+ it { should be(true) }
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Connective::Disjunction::Tautology, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:left) { Logic::Proposition::Tautology.instance }
8
+ let(:right) { Logic::Proposition::Tautology.instance }
9
+ let(:connective) { Logic::Connective::Disjunction.new(left, right) }
10
+ let(:object) { described_class.new(connective) }
11
+
12
+ before do
13
+ object.should be_optimizable
14
+ end
15
+
16
+ it { should equal(Logic::Proposition::Tautology.instance) }
17
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Connective::Negation::InvertibleOperand, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:negation) { Logic::Connective::Negation.new(operand) }
8
+ let(:object) { described_class.new(negation) }
9
+
10
+ before do
11
+ object.operation.should be_kind_of(Logic::Connective::Negation)
12
+ end
13
+
14
+ context 'when operand is invertible' do
15
+ let(:operand) { attribute.eq(1) }
16
+
17
+ it { should be(true) }
18
+ end
19
+
20
+ context 'when operand is not invertible' do
21
+ let(:operand) { proc { true } }
22
+
23
+ it { should be(false) }
24
+ end
25
+
26
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Connective::Negation::InvertibleOperand, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:operand) { attribute.eq(1) }
8
+ let(:negation) { Logic::Connective::Negation.new(operand) }
9
+ let(:object) { described_class.new(negation) }
10
+
11
+ before do
12
+ object.should be_optimizable
13
+ end
14
+
15
+ it { should be_kind_of(Logic::Predicate::Inequality) }
16
+
17
+ its(:left) { should equal(attribute) }
18
+
19
+ its(:right) { should == 1 }
20
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Connective::Negation, '#operand' do
4
+ subject { object.operand }
5
+
6
+ let(:optimized_operand) { mock('Optimized Operand') }
7
+ let(:operand) { mock('Operand', :optimize => optimized_operand) }
8
+ let(:negation) { mock('Negation', :operand => operand) }
9
+ let(:object) { described_class.new(negation) }
10
+
11
+ it { should equal(optimized_operand) }
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate, '.optimize_operand' do
4
+ subject { object.optimize_operand(predicate) }
5
+
6
+ let(:object) { Optimizer::Logic::Predicate }
7
+
8
+ context 'when optimizable' do
9
+ let(:optimized) { mock('Optimized') }
10
+ let(:predicate) { mock('Optimizable', :optimize => optimized) }
11
+
12
+ it { should equal(optimized) }
13
+ end
14
+
15
+ context 'when not optimizable' do
16
+ let(:predicate) { mock('Not Optimizable') }
17
+
18
+ it { should equal(predicate) }
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Comparable::NeverComparable, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:described_class) { Class.new(Optimizer::Logic::Predicate) }
7
+ let(:attribute) { Attribute::Integer.new(:id) }
8
+ let(:predicate) { Logic::Predicate::Equality.new(left, right) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Comparable::NeverComparable }
13
+
14
+ predicate.should be_kind_of(Logic::Predicate::Comparable)
15
+ end
16
+
17
+ context 'when left is a constant and is valid' do
18
+ let(:left) { 1 }
19
+ let(:right) { attribute }
20
+
21
+ it { should be(false) }
22
+ end
23
+
24
+ context 'when left is a constand and is not valid' do
25
+ let(:left) { 'a' }
26
+ let(:right) { attribute }
27
+
28
+ it { should be(true) }
29
+ end
30
+
31
+ context 'when right is a constant and is valid' do
32
+ let(:left) { attribute }
33
+ let(:right) { 1 }
34
+
35
+ it { should be(false) }
36
+ end
37
+
38
+ context 'when right is a constant and is not valid' do
39
+ let(:left) { attribute }
40
+ let(:right) { 'a' }
41
+
42
+ it { should be(true) }
43
+ end
44
+
45
+ context 'when left and right are comparable' do
46
+ let(:left) { attribute }
47
+ let(:right) { attribute }
48
+
49
+ it { should be(false) }
50
+ end
51
+
52
+ context 'when left and right are not comparable' do
53
+ let(:left) { attribute }
54
+ let(:right) { Attribute::String.new(:name) }
55
+
56
+ it { should be(true) }
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Comparable::NeverEquivalent, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:described_class) { Class.new(Optimizer::Logic::Predicate) }
7
+ let(:attribute) { Attribute::Integer.new(:id, :size => 1..10) }
8
+ let(:predicate) { Logic::Predicate::Equality.new(left, right) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Comparable::NeverEquivalent }
13
+
14
+ predicate.should be_kind_of(Logic::Predicate::Comparable)
15
+ end
16
+
17
+ context 'when left is a constant and is valid' do
18
+ let(:left) { 1 }
19
+ let(:right) { attribute }
20
+
21
+ it { should be(false) }
22
+ end
23
+
24
+ context 'when left is a constand and is not valid' do
25
+ let(:left) { 0 }
26
+ let(:right) { attribute }
27
+
28
+ it { should be(true) }
29
+ end
30
+
31
+ context 'when right is a constant and is valid' do
32
+ let(:left) { attribute }
33
+ let(:right) { 1 }
34
+
35
+ it { should be(false) }
36
+ end
37
+
38
+ context 'when right is a constant and is not valid' do
39
+ let(:left) { attribute }
40
+ let(:right) { 0 }
41
+
42
+ it { should be(true) }
43
+ end
44
+
45
+ context 'when left and right are joinable' do
46
+ let(:left) { attribute }
47
+ let(:right) { attribute }
48
+
49
+ it { should be(false) }
50
+ end
51
+
52
+ context 'when left and right are not joinable' do
53
+ let(:left) { attribute }
54
+ let(:right) { Attribute::Integer.new(:id, :size => -10..0) }
55
+
56
+ it { should be(true) }
57
+ end
58
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Comparable::NormalizableOperands, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { Logic::Predicate::Equality.new(left, right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::Comparable)
12
+ end
13
+
14
+ context 'when left and right is a constant' do
15
+ let(:left) { 1 }
16
+ let(:right) { 1 }
17
+
18
+ it { should be(false) }
19
+ end
20
+
21
+ context 'when left and right is an attribute' do
22
+ let(:left) { attribute }
23
+ let(:right) { attribute }
24
+
25
+ it { should be(false) }
26
+ end
27
+
28
+ context 'when left is a constant and right is an attribute' do
29
+ let(:left) { 1 }
30
+ let(:right) { attribute }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is an attribute and right is a constant' do
36
+ let(:left) { attribute }
37
+ let(:right) { 1 }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Comparable::NormalizableOperands, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { Logic::Predicate::Equality.new(1, attribute) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ object.should be_optimizable
12
+ end
13
+
14
+ it { should be_kind_of(Logic::Predicate::Equality) }
15
+
16
+ its(:left) { should equal(attribute) }
17
+
18
+ its(:right) { should == 1 }
19
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::ConstantOperands, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:predicate) { Logic::Predicate::Equality.new(left, right) }
7
+ let(:object) { described_class.new(predicate) }
8
+
9
+ context 'when left and right are constants' do
10
+ let(:left) { 1 }
11
+ let(:right) { 1 }
12
+
13
+ it { should be(true) }
14
+ end
15
+
16
+ context 'when left is a constant, and right is not a constant' do
17
+ let(:left) { 1 }
18
+ let(:right) { Logic::Proposition::Tautology.instance }
19
+
20
+ it { should be(false) }
21
+ end
22
+
23
+ context 'when left is not a constant, and right is a constant' do
24
+ let(:left) { Logic::Proposition::Tautology.instance }
25
+ let(:right) { 1 }
26
+
27
+ it { should be(false) }
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::ConstantOperands, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:predicate) { Logic::Predicate::Equality.new(1, 1) }
7
+ let(:object) { described_class.new(predicate) }
8
+
9
+ before do
10
+ object.should be_optimizable
11
+ end
12
+
13
+ it { should equal(Logic::Proposition::Tautology.instance) }
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Contradiction, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:described_class) { Class.new(Optimizer::Logic::Predicate) }
7
+ let(:attribute) { Attribute::Integer.new(:id) }
8
+ let(:predicate) { Logic::Predicate::Inequality.new(attribute, attribute) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Contradiction }
13
+ end
14
+
15
+ it { should equal(Logic::Proposition::Contradiction.instance) }
16
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Enumerable::EmptyRightOperand, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:described_class) { Class.new(Optimizer::Logic::Predicate) }
7
+ let(:attribute) { Attribute::Integer.new(:id, :size => 1..9) }
8
+ let(:predicate) { attribute.include(operand) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Enumerable::EmptyRightOperand }
13
+
14
+ predicate.should be_kind_of(Logic::Predicate::Enumerable)
15
+ end
16
+
17
+ context 'when the operand contains a nil' do
18
+ let(:operand) { nil }
19
+
20
+ it { should be(true) }
21
+ end
22
+
23
+ context 'when the operand contains an empty Enumerable' do
24
+ let(:operand) { [] }
25
+
26
+ it { should be(true) }
27
+ end
28
+
29
+ context 'when the operand contains an empty inclusive Range' do
30
+ let(:operand) { 1..0 }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when the operand contains an empty exclusive Range' do
36
+ let(:operand) { 1...1 }
37
+
38
+ it { should be(true) }
39
+ end
40
+
41
+ context 'when the operand is empty after filtering invalid entries' do
42
+ let(:operand) { [ 'a' ] }
43
+
44
+ it { should be(true) }
45
+ end
46
+
47
+ context 'when the operand contains an not empty Enumerable' do
48
+ let(:operand) { [ 1 ] }
49
+
50
+ it { should be(false) }
51
+ end
52
+
53
+ context 'when the operand contains an not empty inclusive Range' do
54
+ let(:operand) { 1..1 }
55
+
56
+ it { should be(false) }
57
+ end
58
+
59
+ context 'when the operand contains an not empty exclusive Range' do
60
+ let(:operand) { 1...2 }
61
+
62
+ it { should be(false) }
63
+ end
64
+
65
+ context 'when the operand is not empty after filtering invalid entries' do
66
+ let(:operand) { [ 'a', 1 ] }
67
+
68
+ it { should be(false) }
69
+ end
70
+
71
+ context 'when the operand contains a Range outside of the allowed values' do
72
+ let(:operand) { 10..100 }
73
+
74
+ it { should be(true) }
75
+ end
76
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Enumerable::OneRightOperand, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:described_class) { Class.new(Optimizer::Logic::Predicate) }
7
+ let(:attribute) { Attribute::Integer.new(:id) }
8
+ let(:predicate) { attribute.include(operand) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Enumerable::OneRightOperand }
13
+
14
+ predicate.should be_kind_of(Logic::Predicate::Enumerable)
15
+ end
16
+
17
+ context 'when the operand contains a one entry Enumerable' do
18
+ let(:operand) { [ 1 ] }
19
+
20
+ it { should be(true) }
21
+ end
22
+
23
+ context 'when the operand contains a one entry inclusive Range' do
24
+ let(:operand) { 1..1 }
25
+
26
+ it { should be(true) }
27
+ end
28
+
29
+ context 'when the operand contains a one entry exclusive Range' do
30
+ let(:operand) { 1...2 }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when the operand contains one entry after filtering invalid entries' do
36
+ let(:operand) { [ 'a', 1 ] }
37
+
38
+ it { should be(true) }
39
+ end
40
+
41
+ context 'when the operand contains one entry after filtering duplicate entries' do
42
+ let(:operand) { [ 1, 1 ] }
43
+
44
+ it { should be(true) }
45
+ end
46
+
47
+ context 'when the operand contains a more than one entry Enumerable' do
48
+ let(:operand) { [ 2, 1 ] }
49
+
50
+ it { should be(false) }
51
+ end
52
+
53
+ context 'when the operand contains a more than one entry inclusive Range' do
54
+ let(:operand) { 1..2 }
55
+
56
+ it { should be(false) }
57
+ end
58
+
59
+ context 'when the operand contains a more than one entry exclusive Range' do
60
+ let(:operand) { 1...3 }
61
+
62
+ it { should be(false) }
63
+ end
64
+
65
+ context 'when the operand contains more than one entry after filtering invalid entries' do
66
+ let(:operand) { [ 'a', 1, 2 ] }
67
+
68
+ it { should be(false) }
69
+ end
70
+
71
+ context 'when the operand contains more than one entry after filtering duplicate entries' do
72
+ let(:operand) { [ 2, 1, 2, 1 ] }
73
+
74
+ it { should be(false) }
75
+ end
76
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Enumerable::UnoptimizedOperand, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { attribute.include(operand) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::Enumerable)
12
+ end
13
+
14
+ context 'when the operand contains an unsorted Enumerable' do
15
+ let(:operand) { [ 2, 1 ] }
16
+
17
+ it { should be(true) }
18
+ end
19
+
20
+ context 'when the operand contains an exclusive Range' do
21
+ let(:operand) { 1...3 }
22
+
23
+ it { should be(true) }
24
+ end
25
+
26
+ context 'when the operand contains an Enumerable after filtering invalid entries' do
27
+ let(:operand) { [ 'a', 1, 2 ] }
28
+
29
+ it { should be(true) }
30
+ end
31
+
32
+ context 'when the operand contains an Enumerable after filtering duplicate entries' do
33
+ let(:operand) { [ 1, 1, 2, 2 ] }
34
+
35
+ it { should be(true) }
36
+ end
37
+
38
+ context 'when the operand contains a sorted Enumerable' do
39
+ let(:operand) { [ 1, 2 ] }
40
+
41
+ it { should be(false) }
42
+ end
43
+
44
+ context 'when the operand contains an inclusive Range' do
45
+ let(:operand) { 1..2 }
46
+
47
+ it { should be(false) }
48
+ end
49
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Enumerable::UnoptimizedOperand, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { attribute.include(operand) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ object.should be_optimizable
12
+ end
13
+
14
+ context 'when the operand contains an unsorted Enumerable' do
15
+ let(:operand) { [ 2, 1 ] }
16
+
17
+ it { should be_kind_of(Logic::Predicate::Inclusion) }
18
+
19
+ its(:left) { should equal(attribute) }
20
+
21
+ its(:right) { should == [ 1, 2 ] }
22
+ end
23
+
24
+ context 'when the operand contains an exclusive Range' do
25
+ let(:operand) { 1...3 }
26
+
27
+ it { should be_kind_of(Logic::Predicate::Inclusion) }
28
+
29
+ its(:left) { should equal(attribute) }
30
+
31
+ its(:right) { should == (1..2) }
32
+ end
33
+
34
+ context 'when the operand contains an Enumerable after filtering invalid entries' do
35
+ let(:operand) { [ 'a', 1, 2 ] }
36
+
37
+ it { should be_kind_of(Logic::Predicate::Inclusion) }
38
+
39
+ its(:left) { should equal(attribute) }
40
+
41
+ its(:right) { should == [ 1, 2 ] }
42
+ end
43
+
44
+ context 'when the operand contains an Enumerable after filtering duplicate entries' do
45
+ let(:operand) { [ 1, 1, 2, 2 ] }
46
+
47
+ it { should be_kind_of(Logic::Predicate::Inclusion) }
48
+
49
+ its(:left) { should equal(attribute) }
50
+
51
+ its(:right) { should == [ 1, 2 ] }
52
+ end
53
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Equality::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.eq(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::Equality)
12
+ end
13
+
14
+ context 'when left and right are equal' do
15
+ let(:left) { attribute }
16
+ let(:right) { attribute }
17
+
18
+ it { should be(true) }
19
+ end
20
+
21
+ context 'when left and right are not equal' do
22
+ let(:left) { attribute }
23
+ let(:right) { 1 }
24
+
25
+ it { should be(false) }
26
+ end
27
+ end