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,176 @@
1
+ require 'spec_helper'
2
+
3
+ describe Algebra::Product, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:left_body) { [ [ 1 ] ].each }
7
+ let(:right_body) { [ [ 'Dan Kubb' ] ].each }
8
+ let(:left) { Relation.new([ [ :id, Integer ] ], left_body) }
9
+ let(:right) { Relation.new([ [ :name, String ] ], right_body) }
10
+ let(:object) { described_class.new(left, right) }
11
+
12
+ context 'left is a TABLE_DUM' do
13
+ let(:left) { TABLE_DUM }
14
+
15
+ it { should eql(Relation::Empty.new(right.header)) }
16
+
17
+ it 'returns an equivalent relation to the unoptimized operation' do
18
+ should == object
19
+ end
20
+
21
+ it 'does not execute right_body#each' do
22
+ right_body.should_not_receive(:each)
23
+ subject
24
+ end
25
+
26
+ it_should_behave_like 'an optimize method'
27
+ end
28
+
29
+ context 'right is a TABLE_DUM' do
30
+ let(:right) { TABLE_DUM }
31
+
32
+ it { should eql(Relation::Empty.new(left.header)) }
33
+
34
+ it 'returns an equivalent relation to the unoptimized operation' do
35
+ should == object
36
+ end
37
+
38
+ it 'does not execute left_body#each' do
39
+ left_body.should_not_receive(:each)
40
+ subject
41
+ end
42
+
43
+ it_should_behave_like 'an optimize method'
44
+ end
45
+
46
+ context 'left is a TABLE_DUM when optimized' do
47
+ let(:left) { TABLE_DUM.project([]) }
48
+
49
+ it { should eql(Relation::Empty.new(right.header)) }
50
+
51
+ it 'returns an equivalent relation to the unoptimized operation' do
52
+ should == object
53
+ end
54
+
55
+ it 'does not execute right_body#each' do
56
+ right_body.should_not_receive(:each)
57
+ subject
58
+ end
59
+
60
+ it_should_behave_like 'an optimize method'
61
+ end
62
+
63
+ context 'right is a TABLE_DUM when optimized' do
64
+ let(:right) { TABLE_DUM.project([]) }
65
+
66
+ it { should eql(Relation::Empty.new(left.header)) }
67
+
68
+ it 'returns an equivalent relation to the unoptimized operation' do
69
+ should == object
70
+ end
71
+
72
+ it 'does not execute left_body#each' do
73
+ left_body.should_not_receive(:each)
74
+ subject
75
+ end
76
+
77
+ it_should_behave_like 'an optimize method'
78
+ end
79
+
80
+ context 'left is a TABLE_DEE' do
81
+ let(:left) { TABLE_DEE }
82
+
83
+ it { should equal(right) }
84
+
85
+ it 'returns an equivalent relation to the unoptimized operation' do
86
+ should == object
87
+ end
88
+
89
+ it 'does not execute right_body#each' do
90
+ right_body.should_not_receive(:each)
91
+ subject
92
+ end
93
+
94
+ it_should_behave_like 'an optimize method'
95
+ end
96
+
97
+ context 'right is a TABLE_DEE' do
98
+ let(:right) { TABLE_DEE }
99
+
100
+ it { should equal(left) }
101
+
102
+ it 'returns an equivalent relation to the unoptimized operation' do
103
+ should == object
104
+ end
105
+
106
+ it 'does not execute left_body#each' do
107
+ left_body.should_not_receive(:each)
108
+ subject
109
+ end
110
+
111
+ it_should_behave_like 'an optimize method'
112
+ end
113
+
114
+ context 'left is a TABLE_DEE when optimized' do
115
+ let(:left) { TABLE_DEE.project([]) }
116
+
117
+ it { should equal(right) }
118
+
119
+ it 'returns an equivalent relation to the unoptimized operation' do
120
+ should == object
121
+ end
122
+
123
+ it 'does not execute right_body#each' do
124
+ right_body.should_not_receive(:each)
125
+ subject
126
+ end
127
+
128
+ it_should_behave_like 'an optimize method'
129
+ end
130
+
131
+ context 'right is a TABLE_DEE when optimized' do
132
+ let(:right) { TABLE_DEE.project([]) }
133
+
134
+ it { should equal(left) }
135
+
136
+ it 'returns an equivalent relation to the unoptimized operation' do
137
+ should == object
138
+ end
139
+
140
+ it 'does not execute left_body#each' do
141
+ left_body.should_not_receive(:each)
142
+ subject
143
+ end
144
+
145
+ it_should_behave_like 'an optimize method'
146
+ end
147
+
148
+ context 'left and right are normal relations' do
149
+ it { should equal(object) }
150
+
151
+ it 'does not execute left_body#each' do
152
+ left_body.should_not_receive(:each)
153
+ subject
154
+ end
155
+
156
+ it 'does not execute right_body#each' do
157
+ right_body.should_not_receive(:each)
158
+ subject
159
+ end
160
+
161
+ it_should_behave_like 'an optimize method'
162
+ end
163
+
164
+ context 'left and right are materialized relations' do
165
+ let(:left) { Relation.new([ [ :id, Integer ] ], [ [ 1 ] ]) }
166
+ let(:right) { Relation.new([ [ :name, String ] ], [ [ 'Dan Kubb' ] ]) }
167
+
168
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ], [ :name, String ] ], [ [ 1, 'Dan Kubb' ] ])) }
169
+
170
+ it 'returns an equivalent relation to the unoptimized operation' do
171
+ should == object
172
+ end
173
+
174
+ it_should_behave_like 'an optimize method'
175
+ end
176
+ end
@@ -0,0 +1,237 @@
1
+ require 'spec_helper'
2
+
3
+ describe Algebra::Projection, '#optimize' do
4
+ subject { object.optimize }
5
+
6
+ let(:header) { [ [ :id, Integer ], [ :name, String ], [ :age, Integer ] ] }
7
+ let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
8
+ let(:relation) { Relation.new(header, body) }
9
+ let(:operand) { relation }
10
+ let(:object) { described_class.new(operand, attributes) }
11
+
12
+ context 'when the attributes are equivalent to the relation headers, and in the same order' do
13
+ let(:attributes) { header }
14
+
15
+ it { should equal(operand) }
16
+
17
+ it 'returns an equivalent relation to the unoptimized operation' do
18
+ should == object
19
+ end
20
+
21
+ it 'does not execute body#each' do
22
+ body.should_not_receive(:each)
23
+ subject
24
+ end
25
+
26
+ it_should_behave_like 'an optimize method'
27
+ end
28
+
29
+ context 'when the attributes are equivalent to the relation headers, and not in the same order' do
30
+ let(:attributes) { [ :name, :id ] }
31
+
32
+ it 'does not factor out the object, because tuple order is currently significant' do
33
+ should equal(object)
34
+ end
35
+
36
+ it 'does not execute body#each' do
37
+ body.should_not_receive(:each)
38
+ subject
39
+ end
40
+
41
+ it_should_behave_like 'an optimize method'
42
+ end
43
+
44
+ context 'when the attributes are different from the relation headers' do
45
+ let(:attributes) { [ :id ] }
46
+
47
+ it { should equal(object) }
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 an empty relation' do
58
+ let(:operand) { Relation::Empty.new(header) }
59
+ let(:attributes) { [ :id ] }
60
+
61
+ it { should eql(Relation::Empty.new(object.header)) }
62
+
63
+ it 'returns an equivalent relation to the unoptimized operation' do
64
+ should == object
65
+ end
66
+
67
+ it_should_behave_like 'an optimize method'
68
+ end
69
+
70
+ context 'containing an empty relation when optimized' do
71
+ let(:operand) { Algebra::Restriction.new(relation, Logic::Proposition::Contradiction.instance) }
72
+ let(:attributes) { [ :id ] }
73
+
74
+ it { should eql(Relation::Empty.new(object.header)) }
75
+
76
+ it 'returns an equivalent relation to the unoptimized operation' do
77
+ should == object
78
+ end
79
+
80
+ it 'does not execute body#each' do
81
+ body.should_not_receive(:each)
82
+ subject
83
+ end
84
+
85
+ it_should_behave_like 'an optimize method'
86
+ end
87
+
88
+ context 'containing an optimizable relation' do
89
+ let(:operand) { Algebra::Restriction.new(relation, Logic::Proposition::Tautology.instance) }
90
+ let(:attributes) { [ :id ] }
91
+
92
+ it { should_not equal(object) }
93
+
94
+ it { should be_kind_of(described_class) }
95
+
96
+ its(:operand) { should equal(relation) }
97
+
98
+ its(:header) { should == object.header }
99
+
100
+ it 'returns an equivalent relation to the unoptimized operation' do
101
+ should == object
102
+ end
103
+
104
+ it 'does not execute body#each' do
105
+ body.should_not_receive(:each)
106
+ subject
107
+ end
108
+
109
+ it_should_behave_like 'an optimize method'
110
+ end
111
+
112
+ context 'containing a projection' do
113
+ let(:operand) { relation.project([ :id, :name ]) }
114
+ let(:attributes) { [ :id ] }
115
+
116
+ it { should_not equal(object) }
117
+
118
+ it { should be_kind_of(described_class) }
119
+
120
+ its(:operand) { should equal(relation) }
121
+
122
+ its(:header) { should == object.header }
123
+
124
+ it 'returns an equivalent relation to the unoptimized operation' do
125
+ should == object
126
+ end
127
+
128
+ it 'does not execute body#each' do
129
+ body.should_not_receive(:each)
130
+ subject
131
+ end
132
+
133
+ it_should_behave_like 'an optimize method'
134
+ end
135
+
136
+ context 'containing a set operation' do
137
+ let(:left) { Relation.new([ [ :id, Integer ], [ :name, String ] ], [ [ 1, 'Dan Kubb' ] ].each) }
138
+ let(:right) { Relation.new([ [ :id, Integer ], [ :name, String ] ], [ [ 2, 'Dan Kubb' ] ].each) }
139
+ let(:operand) { left.union(right) }
140
+ let(:attributes) { [ :name ] }
141
+
142
+ it 'pushes the object to each relation' do
143
+ should eql(Algebra::Union.new(
144
+ described_class.new(left, object.header),
145
+ described_class.new(right, object.header)
146
+ ))
147
+ end
148
+
149
+ it 'returns an equivalent relation to the unoptimized operation' do
150
+ should == object
151
+ end
152
+
153
+ it 'does not execute body#each' do
154
+ body.should_not_receive(:each)
155
+ subject
156
+ end
157
+
158
+ it_should_behave_like 'an optimize method'
159
+ end
160
+
161
+ context 'containing a set operation containing a projection of relations' do
162
+ let(:left_body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
163
+ let(:right_body) { [ [ 2, 'Dan Kubb', 35 ] ].each }
164
+ let(:left) { Relation.new(header, left_body) }
165
+ let(:right) { Relation.new(header, right_body) }
166
+ let(:operand) { left.project([ :id, :name ]).union(right.project([ :id, :name ])) }
167
+ let(:attributes) { [ :name ] }
168
+
169
+ it 'pushes the object to each relation, and combine the nested objects' do
170
+ should eql(left.project([ :name ]).union(right.project([ :name ])))
171
+ end
172
+
173
+ it 'returns an equivalent relation to the unoptimized operation' do
174
+ should == object
175
+ end
176
+
177
+ it 'does not execute left_body#each' do
178
+ pending 'TODO: should only compare left and right with #eql? if they are materialized' do
179
+ left_body.should_not_receive(:each)
180
+ subject
181
+ end
182
+ end
183
+
184
+ it 'does not execute right_body#each' do
185
+ pending 'TODO: should only compare left and right with #eql? if they are materialized' do
186
+ right_body.should_not_receive(:each)
187
+ subject
188
+ end
189
+ end
190
+
191
+ it_should_behave_like 'an optimize method'
192
+ end
193
+
194
+ context 'containing a set operation containing a projection of materialized relations' do
195
+ let(:left_body) { [ [ 1, 'Dan Kubb', 35 ] ] }
196
+ let(:right_body) { [ [ 2, 'Dan Kubb', 35 ] ] }
197
+ let(:left) { Relation.new(header, left_body) }
198
+ let(:right) { Relation.new(header, right_body) }
199
+ let(:operand) { left.project([ :id, :name ]).union(right.project([ :id, :name ])) }
200
+ let(:attributes) { [ :name ] }
201
+
202
+ it 'pushes the object to each relation, and combine the nested objects, then materializes' do
203
+ should eql(Relation.new([ [ :name, String ] ], [ [ 'Dan Kubb' ] ]))
204
+ end
205
+
206
+ it 'returns an equivalent relation to the unoptimized operation' do
207
+ should == object
208
+ end
209
+
210
+ it 'executes left_body#each' do
211
+ pending 'TODO: make sure this is only received once'
212
+ left_body.should_receive(:each)
213
+ subject
214
+ end
215
+
216
+ it 'executes right_body#each' do
217
+ pending 'TODO: make sure this is only received once'
218
+ right_body.should_receive(:each)
219
+ subject
220
+ end
221
+
222
+ it_should_behave_like 'an optimize method'
223
+ end
224
+
225
+ context 'containing a materialized relation' do
226
+ let(:operand) { Relation.new(header, [ [ 1, 'Dan Kubb', 35 ] ]) }
227
+ let(:attributes) { [ :id ] }
228
+
229
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ] ], [ [ 1 ] ])) }
230
+
231
+ it 'returns an equivalent relation to the unoptimized operation' do
232
+ should == object
233
+ end
234
+
235
+ it_should_behave_like 'an optimize method'
236
+ end
237
+ end