axiom-optimizer 0.1.0

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 (345) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +37 -0
  4. data/.rspec +4 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +35 -0
  7. data/CONTRIBUTING.md +11 -0
  8. data/Gemfile +10 -0
  9. data/Gemfile.devtools +57 -0
  10. data/Guardfile +23 -0
  11. data/LICENSE +20 -0
  12. data/README.md +111 -0
  13. data/Rakefile +5 -0
  14. data/TODO +144 -0
  15. data/axiom-optimizer.gemspec +25 -0
  16. data/config/flay.yml +3 -0
  17. data/config/flog.yml +2 -0
  18. data/config/mutant.yml +3 -0
  19. data/config/reek.yml +162 -0
  20. data/config/roodi.yml +16 -0
  21. data/config/yardstick.yml +2 -0
  22. data/lib/axiom-optimizer.rb +3 -0
  23. data/lib/axiom/optimizer.rb +168 -0
  24. data/lib/axiom/optimizer/aggregate.rb +16 -0
  25. data/lib/axiom/optimizer/aggregate/count.rb +17 -0
  26. data/lib/axiom/optimizer/aggregate/maximum.rb +17 -0
  27. data/lib/axiom/optimizer/aggregate/mean.rb +17 -0
  28. data/lib/axiom/optimizer/aggregate/minimum.rb +17 -0
  29. data/lib/axiom/optimizer/aggregate/standard_deviation.rb +17 -0
  30. data/lib/axiom/optimizer/aggregate/sum.rb +17 -0
  31. data/lib/axiom/optimizer/aggregate/variance.rb +17 -0
  32. data/lib/axiom/optimizer/algebra/difference.rb +68 -0
  33. data/lib/axiom/optimizer/algebra/extension.rb +97 -0
  34. data/lib/axiom/optimizer/algebra/intersection.rb +68 -0
  35. data/lib/axiom/optimizer/algebra/join.rb +184 -0
  36. data/lib/axiom/optimizer/algebra/product.rb +70 -0
  37. data/lib/axiom/optimizer/algebra/projection.rb +212 -0
  38. data/lib/axiom/optimizer/algebra/rename.rb +381 -0
  39. data/lib/axiom/optimizer/algebra/restriction.rb +373 -0
  40. data/lib/axiom/optimizer/algebra/summarization.rb +200 -0
  41. data/lib/axiom/optimizer/algebra/union.rb +68 -0
  42. data/lib/axiom/optimizer/function.rb +87 -0
  43. data/lib/axiom/optimizer/function/binary.rb +124 -0
  44. data/lib/axiom/optimizer/function/connective/binary.rb +245 -0
  45. data/lib/axiom/optimizer/function/connective/conjunction.rb +122 -0
  46. data/lib/axiom/optimizer/function/connective/disjunction.rb +122 -0
  47. data/lib/axiom/optimizer/function/connective/negation.rb +65 -0
  48. data/lib/axiom/optimizer/function/numeric.rb +34 -0
  49. data/lib/axiom/optimizer/function/numeric/absolute.rb +20 -0
  50. data/lib/axiom/optimizer/function/numeric/addition.rb +20 -0
  51. data/lib/axiom/optimizer/function/numeric/division.rb +20 -0
  52. data/lib/axiom/optimizer/function/numeric/exponentiation.rb +20 -0
  53. data/lib/axiom/optimizer/function/numeric/modulo.rb +20 -0
  54. data/lib/axiom/optimizer/function/numeric/multiplication.rb +20 -0
  55. data/lib/axiom/optimizer/function/numeric/square_root.rb +20 -0
  56. data/lib/axiom/optimizer/function/numeric/subtraction.rb +20 -0
  57. data/lib/axiom/optimizer/function/numeric/unary_minus.rb +20 -0
  58. data/lib/axiom/optimizer/function/numeric/unary_plus.rb +20 -0
  59. data/lib/axiom/optimizer/function/predicate.rb +61 -0
  60. data/lib/axiom/optimizer/function/predicate/comparable.rb +144 -0
  61. data/lib/axiom/optimizer/function/predicate/enumerable.rb +138 -0
  62. data/lib/axiom/optimizer/function/predicate/equality.rb +44 -0
  63. data/lib/axiom/optimizer/function/predicate/exclusion.rb +43 -0
  64. data/lib/axiom/optimizer/function/predicate/greater_than.rb +55 -0
  65. data/lib/axiom/optimizer/function/predicate/greater_than_or_equal_to.rb +55 -0
  66. data/lib/axiom/optimizer/function/predicate/inclusion.rb +43 -0
  67. data/lib/axiom/optimizer/function/predicate/inequality.rb +44 -0
  68. data/lib/axiom/optimizer/function/predicate/less_than.rb +55 -0
  69. data/lib/axiom/optimizer/function/predicate/less_than_or_equal_to.rb +55 -0
  70. data/lib/axiom/optimizer/function/predicate/match.rb +20 -0
  71. data/lib/axiom/optimizer/function/predicate/no_match.rb +20 -0
  72. data/lib/axiom/optimizer/function/string/length.rb +31 -0
  73. data/lib/axiom/optimizer/function/unary.rb +86 -0
  74. data/lib/axiom/optimizer/optimizable.rb +60 -0
  75. data/lib/axiom/optimizer/relation/materialized.rb +40 -0
  76. data/lib/axiom/optimizer/relation/operation/binary.rb +134 -0
  77. data/lib/axiom/optimizer/relation/operation/combination.rb +33 -0
  78. data/lib/axiom/optimizer/relation/operation/deletion.rb +20 -0
  79. data/lib/axiom/optimizer/relation/operation/insertion.rb +20 -0
  80. data/lib/axiom/optimizer/relation/operation/limit.rb +141 -0
  81. data/lib/axiom/optimizer/relation/operation/offset.rb +106 -0
  82. data/lib/axiom/optimizer/relation/operation/order.rb +85 -0
  83. data/lib/axiom/optimizer/relation/operation/reverse.rb +85 -0
  84. data/lib/axiom/optimizer/relation/operation/unary.rb +124 -0
  85. data/lib/axiom/optimizer/support/predicate_partition.rb +184 -0
  86. data/lib/axiom/optimizer/version.rb +10 -0
  87. data/spec/integration/axiom/algebra/difference/optimize_spec.rb +160 -0
  88. data/spec/integration/axiom/algebra/intersection/optimize_spec.rb +160 -0
  89. data/spec/integration/axiom/algebra/join/optimize_spec.rb +112 -0
  90. data/spec/integration/axiom/algebra/product/optimize_spec.rb +178 -0
  91. data/spec/integration/axiom/algebra/projection/optimize_spec.rb +250 -0
  92. data/spec/integration/axiom/algebra/rename/optimize_spec.rb +442 -0
  93. data/spec/integration/axiom/algebra/restriction/optimize_spec.rb +218 -0
  94. data/spec/integration/axiom/algebra/summarization/optimize_spec.rb +49 -0
  95. data/spec/integration/axiom/algebra/union/optimize_spec.rb +200 -0
  96. data/spec/integration/axiom/function/connective/conjunction/optimize_spec.rb +236 -0
  97. data/spec/integration/axiom/function/connective/disjunction/optimize_spec.rb +237 -0
  98. data/spec/integration/axiom/function/connective/negation/optimize_spec.rb +43 -0
  99. data/spec/integration/axiom/function/optimize_spec.rb +30 -0
  100. data/spec/integration/axiom/function/predicate/equality/optimize_spec.rb +92 -0
  101. data/spec/integration/axiom/function/predicate/exclusion/optimize_spec.rb +133 -0
  102. data/spec/integration/axiom/function/predicate/greater_than/optimize_spec.rb +102 -0
  103. data/spec/integration/axiom/function/predicate/greater_than_or_equal_to/optimize_spec.rb +102 -0
  104. data/spec/integration/axiom/function/predicate/inclusion/optimize_spec.rb +133 -0
  105. data/spec/integration/axiom/function/predicate/inequality/optimize_spec.rb +92 -0
  106. data/spec/integration/axiom/function/predicate/less_than/optimize_spec.rb +102 -0
  107. data/spec/integration/axiom/function/predicate/less_than_or_equal_to/optimize_spec.rb +102 -0
  108. data/spec/integration/axiom/relation/empty/optimize_spec.rb +13 -0
  109. data/spec/integration/axiom/relation/materialized/optimize_spec.rb +29 -0
  110. data/spec/integration/axiom/relation/operation/limit/optimize_spec.rb +142 -0
  111. data/spec/integration/axiom/relation/operation/offset/optimize_spec.rb +100 -0
  112. data/spec/integration/axiom/relation/operation/order/optimize_spec.rb +105 -0
  113. data/spec/integration/axiom/relation/operation/reverse/optimize_spec.rb +115 -0
  114. data/spec/integration/axiom/relation/optimize_spec.rb +23 -0
  115. data/spec/rcov.opts +7 -0
  116. data/spec/shared/function_connective_binary_optimize_behavior.rb +102 -0
  117. data/spec/shared/optimize_method_behavior.rb +16 -0
  118. data/spec/spec_helper.rb +38 -0
  119. data/spec/support/add_method_missing.rb +15 -0
  120. data/spec/support/config_alias.rb +3 -0
  121. data/spec/support/ice_nine_config.rb +6 -0
  122. data/spec/support/lazy_enumerable.rb +18 -0
  123. data/spec/unit/axiom/optimizer/algebra/difference/empty_left/optimize_spec.rb +19 -0
  124. data/spec/unit/axiom/optimizer/algebra/difference/empty_right/optimize_spec.rb +19 -0
  125. data/spec/unit/axiom/optimizer/algebra/difference/equal_operands/optimize_spec.rb +23 -0
  126. data/spec/unit/axiom/optimizer/algebra/extension/extensions_spec.rb +31 -0
  127. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimizable_predicate_spec.rb +23 -0
  128. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
  129. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimizable_predicate_spec.rb +37 -0
  130. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +27 -0
  131. data/spec/unit/axiom/optimizer/algebra/intersection/empty_left/optimize_spec.rb +19 -0
  132. data/spec/unit/axiom/optimizer/algebra/intersection/empty_right/optimize_spec.rb +19 -0
  133. data/spec/unit/axiom/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +19 -0
  134. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimizable_predicate_spec.rb +29 -0
  135. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimize_spec.rb +22 -0
  136. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimizable_predicate_spec.rb +29 -0
  137. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimize_spec.rb +23 -0
  138. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimizable_predicate_spec.rb +42 -0
  139. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimize_spec.rb +55 -0
  140. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimizable_predicate_spec.rb +42 -0
  141. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimize_spec.rb +55 -0
  142. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimizable_predicate_spec.rb +27 -0
  143. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimize_spec.rb +18 -0
  144. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimizable_predicate_spec.rb +27 -0
  145. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimize_spec.rb +18 -0
  146. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimizable_predicate_spec.rb +27 -0
  147. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimize_spec.rb +22 -0
  148. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimizable_predicate_spec.rb +35 -0
  149. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimize_spec.rb +22 -0
  150. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimizable_predicate_spec.rb +28 -0
  151. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimize_spec.rb +22 -0
  152. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimizable_predicate_spec.rb +29 -0
  153. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimize_spec.rb +25 -0
  154. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  155. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +22 -0
  156. data/spec/unit/axiom/optimizer/algebra/rename/aliases_spec.rb +23 -0
  157. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimizable_predicate_spec.rb +27 -0
  158. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimize_spec.rb +21 -0
  159. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimizable_predicate_spec.rb +28 -0
  160. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimize_spec.rb +23 -0
  161. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimizable_predicate_spec.rb +28 -0
  162. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimize_spec.rb +23 -0
  163. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimizable_predicate_spec.rb +28 -0
  164. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimize_spec.rb +22 -0
  165. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimizable_predicate_spec.rb +43 -0
  166. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimize_spec.rb +22 -0
  167. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimizable_predicate_spec.rb +30 -0
  168. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimize_spec.rb +22 -0
  169. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_predicate_spec.rb +37 -0
  170. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +18 -0
  171. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimizable_predicate_spec.rb +29 -0
  172. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +23 -0
  173. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimizable_predicate_spec.rb +27 -0
  174. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +23 -0
  175. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimizable_predicate_spec.rb +29 -0
  176. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimize_spec.rb +23 -0
  177. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimizable_predicate_spec.rb +29 -0
  178. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +23 -0
  179. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimizable_predicate_spec.rb +41 -0
  180. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimize_spec.rb +35 -0
  181. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimizable_predicate_spec.rb +46 -0
  182. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimize_spec.rb +23 -0
  183. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimizable_predicate_spec.rb +51 -0
  184. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimize_spec.rb +48 -0
  185. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimizable_predicate_spec.rb +28 -0
  186. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimize_spec.rb +22 -0
  187. data/spec/unit/axiom/optimizer/algebra/restriction/predicate_spec.rb +18 -0
  188. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimizable_predicate_spec.rb +44 -0
  189. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimize_spec.rb +48 -0
  190. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimizable_predicate_spec.rb +30 -0
  191. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +24 -0
  192. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimizable_predicate_spec.rb +30 -0
  193. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimize_spec.rb +24 -0
  194. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimizable_predicate_spec.rb +33 -0
  195. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimize_spec.rb +19 -0
  196. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimizable_predicate_spec.rb +44 -0
  197. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +24 -0
  198. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
  199. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimizable_predicate_spec.rb +29 -0
  200. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
  201. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimizable_predicate_spec.rb +29 -0
  202. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +25 -0
  203. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimizable_predicate_spec.rb +23 -0
  204. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
  205. data/spec/unit/axiom/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
  206. data/spec/unit/axiom/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
  207. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimizable_predicate_spec.rb +49 -0
  208. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +30 -0
  209. data/spec/unit/axiom/optimizer/algebra/union/empty_left/optimize_spec.rb +19 -0
  210. data/spec/unit/axiom/optimizer/algebra/union/empty_right/optimize_spec.rb +19 -0
  211. data/spec/unit/axiom/optimizer/algebra/union/equal_operands/optimize_spec.rb +19 -0
  212. data/spec/unit/axiom/optimizer/class_methods/chain_spec.rb +56 -0
  213. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimizable_predicate_spec.rb +36 -0
  214. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
  215. data/spec/unit/axiom/optimizer/function/binary/left_spec.rb +28 -0
  216. data/spec/unit/axiom/optimizer/function/binary/right_spec.rb +28 -0
  217. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimizable_predicate_spec.rb +37 -0
  218. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
  219. data/spec/unit/axiom/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
  220. data/spec/unit/axiom/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
  221. data/spec/unit/axiom/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
  222. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimizable_predicate_spec.rb +29 -0
  223. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimize_spec.rb +19 -0
  224. data/spec/unit/axiom/optimizer/function/connective/binary/left_spec.rb +16 -0
  225. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimizable_predicate_spec.rb +28 -0
  226. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimize_spec.rb +23 -0
  227. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimizable_predicate_spec.rb +28 -0
  228. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimize_spec.rb +23 -0
  229. data/spec/unit/axiom/optimizer/function/connective/binary/right_spec.rb +16 -0
  230. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimizable_predicate_spec.rb +64 -0
  231. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
  232. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimizable_predicate_spec.rb +61 -0
  233. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +76 -0
  234. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimizable_predicate_spec.rb +29 -0
  235. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimize_spec.rb +19 -0
  236. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimizable_predicate_spec.rb +29 -0
  237. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimize_spec.rb +19 -0
  238. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimizable_predicate_spec.rb +29 -0
  239. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimize_spec.rb +19 -0
  240. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimizable_predicate_spec.rb +29 -0
  241. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimize_spec.rb +19 -0
  242. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimizable_predicate_spec.rb +61 -0
  243. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +76 -0
  244. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimizable_predicate_spec.rb +64 -0
  245. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
  246. data/spec/unit/axiom/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
  247. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimizable_predicate_spec.rb +28 -0
  248. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
  249. data/spec/unit/axiom/optimizer/function/connective/negation/operand_spec.rb +14 -0
  250. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_comparable/optimizable_predicate_spec.rb +74 -0
  251. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_equivalent/optimizable_predicate_spec.rb +74 -0
  252. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimizable_predicate_spec.rb +43 -0
  253. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimize_spec.rb +21 -0
  254. data/spec/unit/axiom/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
  255. data/spec/unit/axiom/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
  256. data/spec/unit/axiom/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
  257. data/spec/unit/axiom/optimizer/function/predicate/enumerable/empty_right/optimizable_predicate_spec.rb +78 -0
  258. data/spec/unit/axiom/optimizer/function/predicate/enumerable/one_right/optimizable_predicate_spec.rb +78 -0
  259. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimizable_predicate_spec.rb +51 -0
  260. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimize_spec.rb +66 -0
  261. data/spec/unit/axiom/optimizer/function/predicate/equality/tautology/optimizable_predicate_spec.rb +29 -0
  262. data/spec/unit/axiom/optimizer/function/predicate/exclusion/empty_right/optimize_spec.rb +45 -0
  263. data/spec/unit/axiom/optimizer/function/predicate/exclusion/one_right/optimize_spec.rb +65 -0
  264. data/spec/unit/axiom/optimizer/function/predicate/greater_than/contradiction/optimizable_predicate_spec.rb +43 -0
  265. data/spec/unit/axiom/optimizer/function/predicate/greater_than/tautology/optimizable_predicate_spec.rb +28 -0
  266. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  267. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  268. data/spec/unit/axiom/optimizer/function/predicate/inclusion/empty_right/optimize_spec.rb +45 -0
  269. data/spec/unit/axiom/optimizer/function/predicate/inclusion/one_right/optimize_spec.rb +66 -0
  270. data/spec/unit/axiom/optimizer/function/predicate/inequality/contradiction/optimizable_predicate_spec.rb +29 -0
  271. data/spec/unit/axiom/optimizer/function/predicate/less_than/contradiction/optimizable_predicate_spec.rb +43 -0
  272. data/spec/unit/axiom/optimizer/function/predicate/less_than/tautology/optimizable_predicate_spec.rb +28 -0
  273. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  274. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  275. data/spec/unit/axiom/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
  276. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimizable_predicate_spec.rb +27 -0
  277. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
  278. data/spec/unit/axiom/optimizer/function/unary/operand_spec.rb +27 -0
  279. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  280. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
  281. data/spec/unit/axiom/optimizer/function/util/class_methods/attribute_spec.rb +21 -0
  282. data/spec/unit/axiom/optimizer/function/util/class_methods/constant_spec.rb +27 -0
  283. data/spec/unit/axiom/optimizer/function/util/class_methods/max_spec.rb +27 -0
  284. data/spec/unit/axiom/optimizer/function/util/class_methods/min_spec.rb +27 -0
  285. data/spec/unit/axiom/optimizer/operation_spec.rb +13 -0
  286. data/spec/unit/axiom/optimizer/optimizable/class_methods/optimizer_spec.rb +34 -0
  287. data/spec/unit/axiom/optimizer/optimizable/optimize_spec.rb +38 -0
  288. data/spec/unit/axiom/optimizer/optimizable_predicate_spec.rb +17 -0
  289. data/spec/unit/axiom/optimizer/optimize_spec.rb +17 -0
  290. data/spec/unit/axiom/optimizer/predicate_partition/left_spec.rb +149 -0
  291. data/spec/unit/axiom/optimizer/predicate_partition/remainder_spec.rb +149 -0
  292. data/spec/unit/axiom/optimizer/predicate_partition/right_spec.rb +149 -0
  293. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimizable_predicate_spec.rb +22 -0
  294. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimize_spec.rb +21 -0
  295. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_left/optimizable_predicate_spec.rb +28 -0
  296. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_right/optimizable_predicate_spec.rb +28 -0
  297. data/spec/unit/axiom/optimizer/relation/operation/binary/equal_operands/optimizable_predicate_spec.rb +31 -0
  298. data/spec/unit/axiom/optimizer/relation/operation/binary/left_spec.rb +15 -0
  299. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimizable_predicate_spec.rb +37 -0
  300. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimize_spec.rb +22 -0
  301. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimizable_predicate_spec.rb +23 -0
  302. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimize_spec.rb +23 -0
  303. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimizable_predicate_spec.rb +23 -0
  304. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimize_spec.rb +23 -0
  305. data/spec/unit/axiom/optimizer/relation/operation/binary/right_spec.rb +15 -0
  306. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimizable_predicate_spec.rb +40 -0
  307. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimize_spec.rb +24 -0
  308. data/spec/unit/axiom/optimizer/relation/operation/combination/optimize_spec.rb +18 -0
  309. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimizable_predicate_spec.rb +33 -0
  310. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +18 -0
  311. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimizable_predicate_spec.rb +27 -0
  312. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +35 -0
  313. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  314. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +22 -0
  315. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimizable_predicate_spec.rb +27 -0
  316. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +22 -0
  317. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimizable_predicate_spec.rb +27 -0
  318. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +21 -0
  319. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  320. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +22 -0
  321. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimizable_predicate_spec.rb +27 -0
  322. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +17 -0
  323. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimizable_predicate_spec.rb +33 -0
  324. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +18 -0
  325. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimizable_predicate_spec.rb +27 -0
  326. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimize_spec.rb +22 -0
  327. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  328. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +23 -0
  329. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimizable_predicate_spec.rb +27 -0
  330. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +22 -0
  331. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimizable_predicate_spec.rb +27 -0
  332. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +19 -0
  333. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  334. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +24 -0
  335. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimizable_predicate_spec.rb +23 -0
  336. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +17 -0
  337. data/spec/unit/axiom/optimizer/relation/operation/unary/header_spec.rb +15 -0
  338. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimizable_predicate_spec.rb +23 -0
  339. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +20 -0
  340. data/spec/unit/axiom/optimizer/relation/operation/unary/operand_spec.rb +16 -0
  341. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimizable_predicate_spec.rb +28 -0
  342. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
  343. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimizable_predicate_spec.rb +24 -0
  344. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
  345. metadata +697 -0
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ class Optimizer
5
+
6
+ # Gem version
7
+ VERSION = '0.1.0'.freeze
8
+
9
+ end # class Optimizer
10
+ end # module Axiom
@@ -0,0 +1,160 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Algebra::Difference, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:header) { [ [ :id, Integer ] ] }
9
+ let(:left_body) { LazyEnumerable.new([ [ 1 ] ]) }
10
+ let(:right_body) { LazyEnumerable.new([ [ 2 ] ]) }
11
+ let(:original_left) { Relation.new(header, left_body) }
12
+ let(:original_right) { Relation.new(header, right_body) }
13
+ let(:object) { described_class.new(left, right) }
14
+
15
+ before do
16
+ # skip dup of the left and right body to avoid clearing the method stubs
17
+ left_body.stub!(:frozen?).and_return(true)
18
+ right_body.stub!(:frozen?).and_return(true)
19
+ end
20
+
21
+ context 'left is an empty relation' do
22
+ let(:left) { Relation::Empty.new(header) }
23
+ let(:right) { original_right }
24
+
25
+ it { should equal(left) }
26
+
27
+ it 'returns an equivalent relation to the unoptimized operation' do
28
+ should == object
29
+ end
30
+
31
+ it 'does not execute right_body#each' do
32
+ right_body.should_not_receive(:each)
33
+ subject
34
+ end
35
+
36
+ it_should_behave_like 'an optimize method'
37
+ end
38
+
39
+ context 'right is an empty relation' do
40
+ let(:left) { original_left }
41
+ let(:right) { Relation::Empty.new(header) }
42
+
43
+ it { should equal(left) }
44
+
45
+ it 'returns an equivalent relation to the unoptimized operation' do
46
+ should == object
47
+ end
48
+
49
+ it 'does not execute left_body#each' do
50
+ left_body.should_not_receive(:each)
51
+ subject
52
+ end
53
+
54
+ it_should_behave_like 'an optimize method'
55
+ end
56
+
57
+ context 'left is an empty relation when optimized' do
58
+ let(:left) { Algebra::Restriction.new(original_left, Function::Proposition::Contradiction.instance) }
59
+ let(:right) { original_right }
60
+
61
+ it { should eql(Relation::Empty.new(left.header | right.header)) }
62
+
63
+ it 'returns an equivalent relation to the unoptimized operation' do
64
+ should == object
65
+ end
66
+
67
+ it 'does not execute left_body#each' do
68
+ left_body.should_not_receive(:each)
69
+ subject
70
+ end
71
+
72
+ it 'does not execute right_body#each' do
73
+ right_body.should_not_receive(:each)
74
+ subject
75
+ end
76
+
77
+ it_should_behave_like 'an optimize method'
78
+ end
79
+
80
+ context 'right is an empty relation when optimized' do
81
+ let(:left) { original_left }
82
+ let(:right) { Algebra::Restriction.new(original_right, Function::Proposition::Contradiction.instance) }
83
+
84
+ it { should equal(left) }
85
+
86
+ it 'returns an equivalent relation to the unoptimized operation' do
87
+ should == object
88
+ end
89
+
90
+ it 'does not execute left_body#each' do
91
+ left_body.should_not_receive(:each)
92
+ subject
93
+ end
94
+
95
+ it 'does not execute right_body#each' do
96
+ right_body.should_not_receive(:each)
97
+ subject
98
+ end
99
+
100
+ it_should_behave_like 'an optimize method'
101
+ end
102
+
103
+ unless defined?(JRUBY_VERSION) && JRUBY_VERSION < '1.6'
104
+ context 'left and right are equivalent relations' do
105
+ let(:right_body) { LazyEnumerable.new([ [ 1 ] ]) }
106
+ let(:left) { original_left }
107
+ let(:right) { original_right }
108
+
109
+ it { should eql(Relation::Empty.new(header)) }
110
+
111
+ it 'returns an equivalent relation to the unoptimized operation' do
112
+ should == object
113
+ end
114
+
115
+ it 'executes left_body#each' do
116
+ left_body.should_receive(:each)
117
+ subject
118
+ end
119
+
120
+ it 'executes right_body#each' do
121
+ right_body.should_receive(:each)
122
+ subject
123
+ end
124
+
125
+ it_should_behave_like 'an optimize method'
126
+ end
127
+ end
128
+
129
+ context 'left and right are not empty relations' do
130
+ let(:left) { original_left }
131
+ let(:right) { original_right }
132
+
133
+ it { should equal(object) }
134
+
135
+ it 'executes left_body#each' do
136
+ left_body.should_receive(:each)
137
+ subject
138
+ end
139
+
140
+ it 'executes right_body#each' do
141
+ right_body.should_receive(:each)
142
+ subject
143
+ end
144
+
145
+ it_should_behave_like 'an optimize method'
146
+ end
147
+
148
+ context 'left and right are materialized relations' do
149
+ let(:left) { Relation.new(header, [ [ 1 ], [ 2 ] ]) }
150
+ let(:right) { Relation.new(header, [ [ 1 ] ]) }
151
+
152
+ it { should eql(Relation::Materialized.new(header, [ [ 2 ] ])) }
153
+
154
+ it 'returns an equivalent relation to the unoptimized operation' do
155
+ should == object
156
+ end
157
+
158
+ it_should_behave_like 'an optimize method'
159
+ end
160
+ end
@@ -0,0 +1,160 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Algebra::Intersection, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:header) { [ [ :id, Integer ] ] }
9
+ let(:left_body) { LazyEnumerable.new([ [ 1 ] ]) }
10
+ let(:right_body) { LazyEnumerable.new([ [ 2 ] ]) }
11
+ let(:original_left) { Relation.new(header, left_body) }
12
+ let(:original_right) { Relation.new(header, right_body) }
13
+ let(:object) { described_class.new(left, right) }
14
+
15
+ before do
16
+ # skip dup of the left and right body to avoid clearing the method stubs
17
+ left_body.stub!(:frozen?).and_return(true)
18
+ right_body.stub!(:frozen?).and_return(true)
19
+ end
20
+
21
+ context 'left is an empty relation' do
22
+ let(:left) { Relation::Empty.new(header) }
23
+ let(:right) { original_right }
24
+
25
+ it { should equal(left) }
26
+
27
+ it 'returns an equivalent relation to the unoptimized operation' do
28
+ should == object
29
+ end
30
+
31
+ it 'does not execute right_body#each' do
32
+ right_body.should_not_receive(:each)
33
+ subject
34
+ end
35
+
36
+ it_should_behave_like 'an optimize method'
37
+ end
38
+
39
+ context 'right is an empty relation' do
40
+ let(:left) { original_left }
41
+ let(:right) { Relation::Empty.new(header) }
42
+
43
+ it { should equal(right) }
44
+
45
+ it 'returns an equivalent relation to the unoptimized operation' do
46
+ should == object
47
+ end
48
+
49
+ it 'does not execute left_body#each' do
50
+ left_body.should_not_receive(:each)
51
+ subject
52
+ end
53
+
54
+ it_should_behave_like 'an optimize method'
55
+ end
56
+
57
+ context 'left is an empty relation when optimized' do
58
+ let(:left) { Algebra::Restriction.new(original_left, Function::Proposition::Contradiction.instance) }
59
+ let(:right) { original_right }
60
+
61
+ it { should eql(Relation::Empty.new(left.header | right.header)) }
62
+
63
+ it 'returns an equivalent relation to the unoptimized operation' do
64
+ should == object
65
+ end
66
+
67
+ it 'does not execute left_body#each' do
68
+ left_body.should_not_receive(:each)
69
+ subject
70
+ end
71
+
72
+ it 'does not execute right_body#each' do
73
+ right_body.should_not_receive(:each)
74
+ subject
75
+ end
76
+
77
+ it_should_behave_like 'an optimize method'
78
+ end
79
+
80
+ context 'right is an empty relation when optimized' do
81
+ let(:left) { original_left }
82
+ let(:right) { Algebra::Restriction.new(original_right, Function::Proposition::Contradiction.instance) }
83
+
84
+ it { should eql(Relation::Empty.new(left.header | right.header)) }
85
+
86
+ it 'returns an equivalent relation to the unoptimized operation' do
87
+ should == object
88
+ end
89
+
90
+ it 'does not execute left_body#each' do
91
+ left_body.should_not_receive(:each)
92
+ subject
93
+ end
94
+
95
+ it 'does not execute right_body#each' do
96
+ right_body.should_not_receive(:each)
97
+ subject
98
+ end
99
+
100
+ it_should_behave_like 'an optimize method'
101
+ end
102
+
103
+ unless defined?(JRUBY_VERSION) && JRUBY_VERSION < '1.6'
104
+ context 'left and right are equivalent relations' do
105
+ let(:right_body) { LazyEnumerable.new([ [ 1 ] ]) }
106
+ let(:left) { original_left }
107
+ let(:right) { original_right }
108
+
109
+ it { should equal(left) }
110
+
111
+ it 'returns an equivalent relation to the unoptimized operation' do
112
+ should == object
113
+ end
114
+
115
+ it 'executes left_body#each' do
116
+ left_body.should_receive(:each)
117
+ subject
118
+ end
119
+
120
+ it 'executes right_body#each' do
121
+ right_body.should_receive(:each)
122
+ subject
123
+ end
124
+
125
+ it_should_behave_like 'an optimize method'
126
+ end
127
+ end
128
+
129
+ context 'left and right are not empty relations' do
130
+ let(:left) { original_left }
131
+ let(:right) { original_right }
132
+
133
+ it { should equal(object) }
134
+
135
+ it 'executed left_body#each' do
136
+ left_body.should_receive(:each)
137
+ subject
138
+ end
139
+
140
+ it 'executed right_body#each' do
141
+ right_body.should_receive(:each)
142
+ subject
143
+ end
144
+
145
+ it_should_behave_like 'an optimize method'
146
+ end
147
+
148
+ context 'left and right are materialized relations' do
149
+ let(:left) { Relation.new(header, [ [ 1 ], [ 2 ] ]) }
150
+ let(:right) { Relation.new(header, [ [ 1 ] ]) }
151
+
152
+ it { should eql(Relation::Materialized.new(header, [ [ 1 ] ])) }
153
+
154
+ it 'returns an equivalent relation to the unoptimized operation' do
155
+ should == object
156
+ end
157
+
158
+ it_should_behave_like 'an optimize method'
159
+ end
160
+ end
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Algebra::Join, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:left_body) { LazyEnumerable.new([ [ 1 ], [ 2 ] ]) }
9
+ let(:right_body) { LazyEnumerable.new([ [ 2, 'Dan Kubb' ] ]) }
10
+ let(:original_left) { Relation.new([ [ :id, Integer ] ], left_body) }
11
+ let(:original_right) { Relation.new([ [ :id, Integer ], [ :name, String ] ], right_body) }
12
+ let(:left) { original_left }
13
+ let(:right) { original_right }
14
+ let(:object) { described_class.new(left, right) }
15
+
16
+ context 'left is an empty relation' do
17
+ let(:left) { Relation::Empty.new(original_left.header) }
18
+
19
+ it { should eql(Relation::Empty.new(right.header)) }
20
+
21
+ it 'returns an equivalent relation to the unoptimized operation' do
22
+ should == object
23
+ end
24
+
25
+ it 'does not execute right_body#each' do
26
+ right_body.should_not_receive(:each)
27
+ subject
28
+ end
29
+
30
+ it_should_behave_like 'an optimize method'
31
+ end
32
+
33
+ context 'right is an empty relation' do
34
+ let(:right) { Relation::Empty.new(original_right.header) }
35
+
36
+ it { should eql(Relation::Empty.new(right.header)) }
37
+
38
+ it 'returns an equivalent relation to the unoptimized operation' do
39
+ should == object
40
+ end
41
+
42
+ it 'does not execute left_body#each' do
43
+ left_body.should_not_receive(:each)
44
+ subject
45
+ end
46
+
47
+ it_should_behave_like 'an optimize method'
48
+ end
49
+
50
+ context 'left is an empty relation when optimized' do
51
+ let(:left) { Algebra::Restriction.new(original_left, Function::Proposition::Contradiction.instance) }
52
+
53
+ it { should eql(Relation::Empty.new(right.header)) }
54
+
55
+ it 'returns an equivalent relation to the unoptimized operation' do
56
+ should == object
57
+ end
58
+
59
+ it 'does not execute right_body#each' do
60
+ right_body.should_not_receive(:each)
61
+ subject
62
+ end
63
+
64
+ it_should_behave_like 'an optimize method'
65
+ end
66
+
67
+ context 'right is an empty relation when optimized' do
68
+ let(:right) { Algebra::Restriction.new(original_right, Function::Proposition::Contradiction.instance) }
69
+
70
+ it { should eql(Relation::Empty.new(right.header)) }
71
+
72
+ it 'returns an equivalent relation to the unoptimized operation' do
73
+ should == object
74
+ end
75
+
76
+ it 'does not execute left_body#each' do
77
+ left_body.should_not_receive(:each)
78
+ subject
79
+ end
80
+
81
+ it_should_behave_like 'an optimize method'
82
+ end
83
+
84
+ context 'left and right are not empty relations' do
85
+ it { should equal(object) }
86
+
87
+ it 'does not execute left_body#each' do
88
+ left_body.should_not_receive(:each)
89
+ subject
90
+ end
91
+
92
+ it 'does not execute right_body#each' do
93
+ right_body.should_not_receive(:each)
94
+ subject
95
+ end
96
+
97
+ it_should_behave_like 'an optimize method'
98
+ end
99
+
100
+ context 'left and right are materialized relations' do
101
+ let(:left) { Relation.new([ [ :id, Integer ] ], [ [ 1 ], [ 2 ] ]) }
102
+ let(:right) { Relation.new([ [ :id, Integer ], [ :name, String ] ], [ [ 2, 'Dan Kubb' ] ]) }
103
+
104
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ], [ :name, String ] ], [ [ 2, 'Dan Kubb' ] ])) }
105
+
106
+ it 'returns an equivalent relation to the unoptimized operation' do
107
+ should == object
108
+ end
109
+
110
+ it_should_behave_like 'an optimize method'
111
+ end
112
+ end
@@ -0,0 +1,178 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Algebra::Product, '#optimize' do
6
+ subject { object.optimize }
7
+
8
+ let(:left_body) { LazyEnumerable.new([ [ 1 ] ]) }
9
+ let(:right_body) { LazyEnumerable.new([ [ 'Dan Kubb' ] ]) }
10
+ let(:left) { Relation.new([ [ :id, Integer ] ], left_body) }
11
+ let(:right) { Relation.new([ [ :name, String ] ], right_body) }
12
+ let(:object) { described_class.new(left, right) }
13
+
14
+ context 'left is a TABLE_DUM' do
15
+ let(:left) { TABLE_DUM }
16
+
17
+ it { should eql(Relation::Empty.new(right.header)) }
18
+
19
+ it 'returns an equivalent relation to the unoptimized operation' do
20
+ should == object
21
+ end
22
+
23
+ it 'does not execute right_body#each' do
24
+ right_body.should_not_receive(:each)
25
+ subject
26
+ end
27
+
28
+ it_should_behave_like 'an optimize method'
29
+ end
30
+
31
+ context 'right is a TABLE_DUM' do
32
+ let(:right) { TABLE_DUM }
33
+
34
+ it { should eql(Relation::Empty.new(left.header)) }
35
+
36
+ it 'returns an equivalent relation to the unoptimized operation' do
37
+ should == object
38
+ end
39
+
40
+ it 'does not execute left_body#each' do
41
+ left_body.should_not_receive(:each)
42
+ subject
43
+ end
44
+
45
+ it_should_behave_like 'an optimize method'
46
+ end
47
+
48
+ context 'left is a TABLE_DUM when optimized' do
49
+ let(:left) { TABLE_DUM.project([]) }
50
+
51
+ it { should eql(Relation::Empty.new(right.header)) }
52
+
53
+ it 'returns an equivalent relation to the unoptimized operation' do
54
+ should == object
55
+ end
56
+
57
+ it 'does not execute right_body#each' do
58
+ right_body.should_not_receive(:each)
59
+ subject
60
+ end
61
+
62
+ it_should_behave_like 'an optimize method'
63
+ end
64
+
65
+ context 'right is a TABLE_DUM when optimized' do
66
+ let(:right) { TABLE_DUM.project([]) }
67
+
68
+ it { should eql(Relation::Empty.new(left.header)) }
69
+
70
+ it 'returns an equivalent relation to the unoptimized operation' do
71
+ should == object
72
+ end
73
+
74
+ it 'does not execute left_body#each' do
75
+ left_body.should_not_receive(:each)
76
+ subject
77
+ end
78
+
79
+ it_should_behave_like 'an optimize method'
80
+ end
81
+
82
+ context 'left is a TABLE_DEE' do
83
+ let(:left) { TABLE_DEE }
84
+
85
+ it { should equal(right) }
86
+
87
+ it 'returns an equivalent relation to the unoptimized operation' do
88
+ should == object
89
+ end
90
+
91
+ it 'does not execute right_body#each' do
92
+ right_body.should_not_receive(:each)
93
+ subject
94
+ end
95
+
96
+ it_should_behave_like 'an optimize method'
97
+ end
98
+
99
+ context 'right is a TABLE_DEE' do
100
+ let(:right) { TABLE_DEE }
101
+
102
+ it { should equal(left) }
103
+
104
+ it 'returns an equivalent relation to the unoptimized operation' do
105
+ should == object
106
+ end
107
+
108
+ it 'does not execute left_body#each' do
109
+ left_body.should_not_receive(:each)
110
+ subject
111
+ end
112
+
113
+ it_should_behave_like 'an optimize method'
114
+ end
115
+
116
+ context 'left is a TABLE_DEE when optimized' do
117
+ let(:left) { TABLE_DEE.project([]) }
118
+
119
+ it { should equal(right) }
120
+
121
+ it 'returns an equivalent relation to the unoptimized operation' do
122
+ should == object
123
+ end
124
+
125
+ it 'does not execute right_body#each' do
126
+ right_body.should_not_receive(:each)
127
+ subject
128
+ end
129
+
130
+ it_should_behave_like 'an optimize method'
131
+ end
132
+
133
+ context 'right is a TABLE_DEE when optimized' do
134
+ let(:right) { TABLE_DEE.project([]) }
135
+
136
+ it { should equal(left) }
137
+
138
+ it 'returns an equivalent relation to the unoptimized operation' do
139
+ should == object
140
+ end
141
+
142
+ it 'does not execute left_body#each' do
143
+ left_body.should_not_receive(:each)
144
+ subject
145
+ end
146
+
147
+ it_should_behave_like 'an optimize method'
148
+ end
149
+
150
+ context 'left and right are normal relations' do
151
+ it { should equal(object) }
152
+
153
+ it 'does not execute left_body#each' do
154
+ left_body.should_not_receive(:each)
155
+ subject
156
+ end
157
+
158
+ it 'does not execute right_body#each' do
159
+ right_body.should_not_receive(:each)
160
+ subject
161
+ end
162
+
163
+ it_should_behave_like 'an optimize method'
164
+ end
165
+
166
+ context 'left and right are materialized relations' do
167
+ let(:left) { Relation.new([ [ :id, Integer ] ], [ [ 1 ] ]) }
168
+ let(:right) { Relation.new([ [ :name, String ] ], [ [ 'Dan Kubb' ] ]) }
169
+
170
+ it { should eql(Relation::Materialized.new([ [ :id, Integer ], [ :name, String ] ], [ [ 1, 'Dan Kubb' ] ])) }
171
+
172
+ it 'returns an equivalent relation to the unoptimized operation' do
173
+ should == object
174
+ end
175
+
176
+ it_should_behave_like 'an optimize method'
177
+ end
178
+ end