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,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Exclusion::EmptyRightOperand, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { attribute.exclude(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 a nil' do
15
+ let(:operand) { nil }
16
+
17
+ it { should equal(Logic::Proposition::Tautology.instance) }
18
+ end
19
+
20
+ context 'when the operand contains an empty Enumerable' do
21
+ let(:operand) { [] }
22
+
23
+ it { should equal(Logic::Proposition::Tautology.instance) }
24
+ end
25
+
26
+ context 'when the operand contains an empty inclusive Range' do
27
+ let(:operand) { 1..0 }
28
+
29
+ it { should equal(Logic::Proposition::Tautology.instance) }
30
+ end
31
+
32
+ context 'when the operand contains an empty exclusive Range' do
33
+ let(:operand) { 1...1 }
34
+
35
+ it { should equal(Logic::Proposition::Tautology.instance) }
36
+ end
37
+
38
+ context 'when the operand is empty after filtering invalid entries' do
39
+ let(:operand) { [ 'a' ] }
40
+
41
+ it { should equal(Logic::Proposition::Tautology.instance) }
42
+ end
43
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Exclusion::OneRightOperand, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { attribute.exclude(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 a one entry Enumerable' do
15
+ let(:operand) { [ 1 ] }
16
+
17
+ it { should be_kind_of(Logic::Predicate::Inequality) }
18
+
19
+ its(:left) { should equal(attribute) }
20
+
21
+ its(:right) { should == 1 }
22
+ end
23
+
24
+ context 'when the operand contains a one entry inclusive Range' do
25
+ let(:operand) { 1..1 }
26
+
27
+ it { should be_kind_of(Logic::Predicate::Inequality) }
28
+
29
+ its(:left) { should equal(attribute) }
30
+
31
+ its(:right) { should == 1 }
32
+ end
33
+
34
+ context 'when the operand contains a one entry exclusive Range' do
35
+ let(:operand) { 1...2 }
36
+
37
+ it { should be_kind_of(Logic::Predicate::Inequality) }
38
+
39
+ its(:left) { should equal(attribute) }
40
+
41
+ its(:right) { should == 1 }
42
+ end
43
+
44
+ context 'when the operand contains one entry after filtering invalid entries' do
45
+ let(:operand) { [ 'a', 1 ] }
46
+
47
+ it { should be_kind_of(Logic::Predicate::Inequality) }
48
+
49
+ its(:left) { should equal(attribute) }
50
+
51
+ its(:right) { should == 1 }
52
+ end
53
+
54
+ context 'when the operand contains one entry after filtering duplicate entries' do
55
+ let(:operand) { [ 1, 1 ] }
56
+
57
+ it { should be_kind_of(Logic::Predicate::Inequality) }
58
+
59
+ its(:left) { should equal(attribute) }
60
+
61
+ its(:right) { should == 1 }
62
+ end
63
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::GreaterThan::Contradiction, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.gt(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::GreaterThan)
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 different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(true) }
26
+ end
27
+
28
+ context 'when left is always less than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 1..9) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 10..20) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is equivalent to the right' do
36
+ let(:left) { Attribute::Integer.new(:id) }
37
+ let(:right) { Attribute::Integer.new(:id) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::GreaterThan::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:predicate) { left.gt(right) }
7
+ let(:object) { described_class.new(predicate) }
8
+
9
+ before do
10
+ predicate.should be_kind_of(Logic::Predicate::GreaterThan)
11
+ end
12
+
13
+ context 'when left is always greater than right' do
14
+ let(:left) { Attribute::Integer.new(:id, :size => 10..20) }
15
+ let(:right) { Attribute::Integer.new(:id, :size => 1..9) }
16
+
17
+ it { should be(true) }
18
+ end
19
+
20
+ context 'when left is equivalent to the right' do
21
+ let(:left) { Attribute::Integer.new(:id) }
22
+ let(:right) { Attribute::Integer.new(:id) }
23
+
24
+ it { should be(false) }
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::GreaterThanOrEqualTo::Contradiction, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.gte(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::GreaterThanOrEqualTo)
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(false) }
19
+ end
20
+
21
+ context 'when left and right are different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(true) }
26
+ end
27
+
28
+ context 'when left is always less than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 1..9) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 10..20) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is equivalent to the right' do
36
+ let(:left) { Attribute::Integer.new(:id) }
37
+ let(:right) { Attribute::Integer.new(:id) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::GreaterThanOrEqualTo::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.gt(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::GreaterThan)
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 different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(false) }
26
+ end
27
+
28
+ context 'when left is always greater than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 10..20) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 1..9) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is not equivalent to the right' do
36
+ let(:left) { attribute }
37
+ let(:right) { Attribute::String.new(:name) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Inclusion::EmptyRightOperand, '#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 a nil' do
15
+ let(:operand) { nil }
16
+
17
+ it { should equal(Logic::Proposition::Contradiction.instance) }
18
+ end
19
+
20
+ context 'when the operand contains an empty Enumerable' do
21
+ let(:operand) { [] }
22
+
23
+ it { should equal(Logic::Proposition::Contradiction.instance) }
24
+ end
25
+
26
+ context 'when the operand contains an empty inclusive Range' do
27
+ let(:operand) { 1..0 }
28
+
29
+ it { should equal(Logic::Proposition::Contradiction.instance) }
30
+ end
31
+
32
+ context 'when the operand contains an empty exclusive Range' do
33
+ let(:operand) { 1...1 }
34
+
35
+ it { should equal(Logic::Proposition::Contradiction.instance) }
36
+ end
37
+
38
+ context 'when the operand is empty after filtering invalid entries' do
39
+ let(:operand) { [ 'a' ] }
40
+
41
+ it { should equal(Logic::Proposition::Contradiction.instance) }
42
+ end
43
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Inclusion::OneRightOperand, '#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 a one entry Enumerable' do
15
+ let(:operand) { [ 1 ] }
16
+
17
+ it { should be_kind_of(Logic::Predicate::Equality) }
18
+
19
+ its(:left) { should equal(attribute) }
20
+
21
+ its(:right) { should == 1 }
22
+
23
+ end
24
+
25
+ context 'when the operand contains a one entry inclusive Range' do
26
+ let(:operand) { 1..1 }
27
+
28
+ it { should be_kind_of(Logic::Predicate::Equality) }
29
+
30
+ its(:left) { should equal(attribute) }
31
+
32
+ its(:right) { should == 1 }
33
+ end
34
+
35
+ context 'when the operand contains a one entry exclusive Range' do
36
+ let(:operand) { 1...2 }
37
+
38
+ it { should be_kind_of(Logic::Predicate::Equality) }
39
+
40
+ its(:left) { should equal(attribute) }
41
+
42
+ its(:right) { should == 1 }
43
+ end
44
+
45
+ context 'when the operand contains one entry after filtering invalid entries' do
46
+ let(:operand) { [ 'a', 1 ] }
47
+
48
+ it { should be_kind_of(Logic::Predicate::Equality) }
49
+
50
+ its(:left) { should equal(attribute) }
51
+
52
+ its(:right) { should == 1 }
53
+ end
54
+
55
+ context 'when the operand contains one entry after filtering duplicate entries' do
56
+ let(:operand) { [ 1, 1 ] }
57
+
58
+ it { should be_kind_of(Logic::Predicate::Equality) }
59
+
60
+ its(:left) { should equal(attribute) }
61
+
62
+ its(:right) { should == 1 }
63
+ end
64
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Inequality::Contradiction, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.ne(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::Inequality)
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
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate, '#left' do
4
+ subject { object.left }
5
+
6
+ let(:right) { 'Right' }
7
+ let(:predicate) { Class.new(Logic::Predicate).new(left, right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ context 'when left operand is frozen' do
11
+ let(:left) { 'Left'.freeze }
12
+
13
+ it { should equal(left) }
14
+ end
15
+
16
+ context 'when left operand is not frozen' do
17
+ let(:left) { 'Left' }
18
+
19
+ it { should_not equal(left) }
20
+
21
+ it { should be_frozen }
22
+
23
+ it { should == left }
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::LessThan::Contradiction, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.lt(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::LessThan)
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 different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(true) }
26
+ end
27
+
28
+ context 'when left is always greater than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 10..20) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 1..9) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is equivalent to the right' do
36
+ let(:left) { Attribute::Integer.new(:id) }
37
+ let(:right) { Attribute::Integer.new(:id) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::LessThan::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:predicate) { left.lt(right) }
7
+ let(:object) { described_class.new(predicate) }
8
+
9
+ before do
10
+ predicate.should be_kind_of(Logic::Predicate::LessThan)
11
+ end
12
+
13
+ context 'when left is always less than right' do
14
+ let(:left) { Attribute::Integer.new(:id, :size => 1..9) }
15
+ let(:right) { Attribute::Integer.new(:id, :size => 10..20) }
16
+
17
+ it { should be(true) }
18
+ end
19
+
20
+ context 'when left is equivalent to the right' do
21
+ let(:left) { Attribute::Integer.new(:id) }
22
+ let(:right) { Attribute::Integer.new(:id) }
23
+
24
+ it { should be(false) }
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::LessThanOrEqualTo::Contradiction, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.lte(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::LessThanOrEqualTo)
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(false) }
19
+ end
20
+
21
+ context 'when left and right are different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(true) }
26
+ end
27
+
28
+ context 'when left is always greater than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 10..20) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 1..9) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is equivalent to the right' do
36
+ let(:left) { Attribute::Integer.new(:id) }
37
+ let(:right) { Attribute::Integer.new(:id) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::LessThanOrEqualTo::Tautology, '#optimizable?' do
4
+ subject { object.optimizable? }
5
+
6
+ let(:attribute) { Attribute::Integer.new(:id) }
7
+ let(:predicate) { left.lte(right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ before do
11
+ predicate.should be_kind_of(Logic::Predicate::LessThanOrEqualTo)
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 different types' do
22
+ let(:left) { attribute }
23
+ let(:right) { Attribute::String.new(:name) }
24
+
25
+ it { should be(false) }
26
+ end
27
+
28
+ context 'when left is always less than right' do
29
+ let(:left) { Attribute::Integer.new(:id, :size => 1..9) }
30
+ let(:right) { Attribute::Integer.new(:id, :size => 10..20) }
31
+
32
+ it { should be(true) }
33
+ end
34
+
35
+ context 'when left is not equivalent to the right' do
36
+ let(:left) { attribute }
37
+ let(:right) { Attribute::String.new(:name) }
38
+
39
+ it { should be(false) }
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate, '#right' do
4
+ subject { object.right }
5
+
6
+ let(:left) { 'Left' }
7
+ let(:predicate) { Class.new(Logic::Predicate).new(left, right) }
8
+ let(:object) { described_class.new(predicate) }
9
+
10
+ context 'when right operand is frozen' do
11
+ let(:right) { 'Right'.freeze }
12
+
13
+ it { should equal(right) }
14
+ end
15
+
16
+ context 'when right operand is not frozen' do
17
+ let(:right) { 'Right' }
18
+
19
+ it { should_not equal(right) }
20
+
21
+ it { should be_frozen }
22
+
23
+ it { should == right }
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Tautology, '#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::Equality.new(attribute, attribute) }
9
+ let(:object) { described_class.new(predicate) }
10
+
11
+ before do
12
+ described_class.class_eval { include Optimizer::Logic::Predicate::Tautology }
13
+ end
14
+
15
+ it { should equal(Logic::Proposition::Tautology.instance) }
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Util, '.attribute?' do
4
+ subject { object.attribute?(operand) }
5
+
6
+ let(:object) { Optimizer::Logic::Predicate::Util }
7
+
8
+ context 'with an attribute' do
9
+ let(:operand) { Attribute::Integer.new(:id) }
10
+
11
+ it { should be(true) }
12
+ end
13
+
14
+ context 'with a constant' do
15
+ let(:operand) { 1 }
16
+
17
+ it { should be(false) }
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Util, '.constant?' do
4
+ subject { object.constant?(operand) }
5
+
6
+ let(:object) { Optimizer::Logic::Predicate::Util }
7
+
8
+ context 'with an attribute' do
9
+ let(:operand) { Attribute::Integer.new(:id) }
10
+
11
+ it { should be(false) }
12
+ end
13
+
14
+ context 'with a constant' do
15
+ let(:operand) { 1 }
16
+
17
+ it { should be(true) }
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optimizer::Logic::Predicate::Util, '.max' do
4
+ subject { object.max(operand) }
5
+
6
+ let(:object) { Optimizer::Logic::Predicate::Util }
7
+
8
+ context 'with an attribute' do
9
+ let(:operand) { Attribute::Integer.new(:id, :size => 1..10) }
10
+
11
+ it { should == 10 }
12
+ end
13
+
14
+ context 'with a constant' do
15
+ let(:operand) { 1 }
16
+
17
+ it { should == 1 }
18
+ end
19
+ end