veritas-optimizer 0.0.3 → 0.0.4

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 (349) hide show
  1. data/.gemtest +0 -0
  2. data/.rvmrc +1 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +20 -10
  5. data/Guardfile +22 -0
  6. data/README.rdoc +2 -0
  7. data/Rakefile +4 -2
  8. data/TODO +43 -2
  9. data/config/flay.yml +2 -2
  10. data/config/flog.yml +1 -1
  11. data/config/roodi.yml +4 -4
  12. data/lib/veritas/optimizer/aggregate/count.rb +17 -0
  13. data/lib/veritas/optimizer/aggregate/maximum.rb +17 -0
  14. data/lib/veritas/optimizer/aggregate/mean.rb +17 -0
  15. data/lib/veritas/optimizer/aggregate/minimum.rb +17 -0
  16. data/lib/veritas/optimizer/aggregate/standard_deviation.rb +17 -0
  17. data/lib/veritas/optimizer/aggregate/sum.rb +17 -0
  18. data/lib/veritas/optimizer/aggregate/variance.rb +17 -0
  19. data/lib/veritas/optimizer/aggregate.rb +16 -0
  20. data/lib/veritas/optimizer/algebra/difference.rb +3 -1
  21. data/lib/veritas/optimizer/algebra/extension.rb +58 -3
  22. data/lib/veritas/optimizer/algebra/intersection.rb +3 -1
  23. data/lib/veritas/optimizer/algebra/join.rb +6 -4
  24. data/lib/veritas/optimizer/algebra/product.rb +3 -1
  25. data/lib/veritas/optimizer/algebra/projection.rb +23 -54
  26. data/lib/veritas/optimizer/algebra/rename.rb +55 -80
  27. data/lib/veritas/optimizer/algebra/restriction.rb +33 -66
  28. data/lib/veritas/optimizer/algebra/summarization.rb +161 -3
  29. data/lib/veritas/optimizer/algebra/union.rb +3 -1
  30. data/lib/veritas/optimizer/function/binary.rb +124 -0
  31. data/lib/veritas/optimizer/{logic → function}/connective/binary.rb +48 -102
  32. data/lib/veritas/optimizer/{logic → function}/connective/conjunction.rb +12 -11
  33. data/lib/veritas/optimizer/{logic → function}/connective/disjunction.rb +15 -14
  34. data/lib/veritas/optimizer/function/connective/negation.rb +65 -0
  35. data/lib/veritas/optimizer/function/numeric/absolute.rb +20 -0
  36. data/lib/veritas/optimizer/function/numeric/addition.rb +20 -0
  37. data/lib/veritas/optimizer/function/numeric/division.rb +20 -0
  38. data/lib/veritas/optimizer/function/numeric/exponentiation.rb +20 -0
  39. data/lib/veritas/optimizer/function/numeric/modulo.rb +20 -0
  40. data/lib/veritas/optimizer/function/numeric/multiplication.rb +20 -0
  41. data/lib/veritas/optimizer/function/numeric/square_root.rb +20 -0
  42. data/lib/veritas/optimizer/function/numeric/subtraction.rb +20 -0
  43. data/lib/veritas/optimizer/function/numeric/unary_minus.rb +20 -0
  44. data/lib/veritas/optimizer/function/numeric/unary_plus.rb +20 -0
  45. data/lib/veritas/optimizer/function/numeric.rb +34 -0
  46. data/lib/veritas/optimizer/{logic → function}/predicate/comparable.rb +6 -4
  47. data/lib/veritas/optimizer/{logic → function}/predicate/enumerable.rb +24 -26
  48. data/lib/veritas/optimizer/{logic → function}/predicate/equality.rb +6 -6
  49. data/lib/veritas/optimizer/{logic → function}/predicate/exclusion.rb +6 -16
  50. data/lib/veritas/optimizer/{logic → function}/predicate/greater_than.rb +6 -5
  51. data/lib/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to.rb +6 -6
  52. data/lib/veritas/optimizer/{logic → function}/predicate/inclusion.rb +6 -16
  53. data/lib/veritas/optimizer/{logic → function}/predicate/inequality.rb +6 -6
  54. data/lib/veritas/optimizer/{logic → function}/predicate/less_than.rb +6 -5
  55. data/lib/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to.rb +6 -6
  56. data/lib/veritas/optimizer/{logic → function}/predicate/match.rb +5 -4
  57. data/lib/veritas/optimizer/{logic → function}/predicate/no_match.rb +5 -4
  58. data/lib/veritas/optimizer/function/predicate.rb +61 -0
  59. data/lib/veritas/optimizer/function/string/length.rb +31 -0
  60. data/lib/veritas/optimizer/function/unary.rb +86 -0
  61. data/lib/veritas/optimizer/function.rb +87 -0
  62. data/lib/veritas/optimizer/optimizable.rb +6 -3
  63. data/lib/veritas/optimizer/relation/operation/binary.rb +36 -70
  64. data/lib/veritas/optimizer/relation/operation/limit.rb +1 -9
  65. data/lib/veritas/optimizer/relation/operation/offset.rb +1 -9
  66. data/lib/veritas/optimizer/relation/operation/order.rb +1 -9
  67. data/lib/veritas/optimizer/relation/operation/reverse.rb +1 -9
  68. data/lib/veritas/optimizer/relation/operation/unary.rb +50 -13
  69. data/lib/veritas/optimizer/version.rb +1 -1
  70. data/lib/veritas/optimizer.rb +43 -16
  71. data/spec/integration/veritas/algebra/difference/optimize_spec.rb +6 -4
  72. data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +6 -4
  73. data/spec/integration/veritas/algebra/join/optimize_spec.rb +4 -2
  74. data/spec/integration/veritas/algebra/product/optimize_spec.rb +2 -0
  75. data/spec/integration/veritas/algebra/projection/optimize_spec.rb +6 -4
  76. data/spec/integration/veritas/algebra/rename/optimize_spec.rb +2 -0
  77. data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +9 -7
  78. data/spec/integration/veritas/algebra/summarization/optimize_spec.rb +49 -0
  79. data/spec/integration/veritas/algebra/union/optimize_spec.rb +6 -4
  80. data/spec/integration/veritas/{logic → function}/connective/conjunction/optimize_spec.rb +33 -31
  81. data/spec/integration/veritas/{logic → function}/connective/disjunction/optimize_spec.rb +30 -28
  82. data/spec/integration/veritas/{logic → function}/connective/negation/optimize_spec.rb +7 -5
  83. data/spec/integration/veritas/{logic/expression → function}/optimize_spec.rb +5 -3
  84. data/spec/integration/veritas/{logic → function}/predicate/equality/optimize_spec.rb +9 -7
  85. data/spec/integration/veritas/{logic → function}/predicate/exclusion/optimize_spec.rb +13 -11
  86. data/spec/integration/veritas/{logic → function}/predicate/greater_than/optimize_spec.rb +17 -15
  87. data/spec/integration/veritas/{logic → function}/predicate/greater_than_or_equal_to/optimize_spec.rb +17 -15
  88. data/spec/integration/veritas/{logic → function}/predicate/inclusion/optimize_spec.rb +13 -11
  89. data/spec/integration/veritas/{logic → function}/predicate/inequality/optimize_spec.rb +9 -7
  90. data/spec/integration/veritas/{logic → function}/predicate/less_than/optimize_spec.rb +17 -15
  91. data/spec/integration/veritas/{logic → function}/predicate/less_than_or_equal_to/optimize_spec.rb +17 -15
  92. data/spec/integration/veritas/relation/empty/optimize_spec.rb +2 -0
  93. data/spec/integration/veritas/relation/materialized/optimize_spec.rb +2 -0
  94. data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +3 -1
  95. data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +3 -1
  96. data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +4 -2
  97. data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +4 -2
  98. data/spec/integration/veritas/relation/optimize_spec.rb +2 -0
  99. data/spec/shared/{logic_connective_binary_optimize_behavior.rb → function_connective_binary_optimize_behavior.rb} +14 -12
  100. data/spec/shared/idempotent_method_behavior.rb +2 -0
  101. data/spec/shared/optimize_method_behavior.rb +2 -0
  102. data/spec/support/add_method_missing.rb +2 -0
  103. data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +2 -0
  104. data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +2 -0
  105. data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +2 -0
  106. data/spec/unit/veritas/optimizer/algebra/extension/extensions_spec.rb +31 -0
  107. data/spec/unit/veritas/optimizer/algebra/extension/order_operand/optimizable_spec.rb +23 -0
  108. data/spec/unit/veritas/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
  109. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +18 -8
  110. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +4 -2
  111. data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +2 -0
  112. data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +2 -0
  113. data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +2 -0
  114. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +2 -0
  115. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +2 -0
  116. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +2 -0
  117. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +2 -0
  118. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +2 -0
  119. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +2 -0
  120. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +2 -0
  121. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +2 -0
  122. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +2 -0
  123. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +2 -0
  124. data/spec/unit/veritas/optimizer/algebra/projection/{set_operand → union_operand}/optimizable_spec.rb +3 -1
  125. data/spec/unit/veritas/optimizer/algebra/projection/{set_operand → union_operand}/optimize_spec.rb +4 -2
  126. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +3 -1
  127. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +6 -4
  128. data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +5 -13
  129. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +2 -0
  130. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +2 -0
  131. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +2 -0
  132. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +2 -0
  133. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +2 -0
  134. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +2 -0
  135. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +2 -0
  136. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +2 -0
  137. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +17 -7
  138. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +2 -0
  139. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimizable_spec.rb +2 -0
  140. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimize_spec.rb +2 -0
  141. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +2 -0
  142. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +2 -0
  143. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +3 -1
  144. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +7 -5
  145. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +2 -0
  146. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +2 -0
  147. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +2 -0
  148. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +2 -0
  149. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +7 -20
  150. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +2 -0
  151. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimizable_spec.rb +23 -3
  152. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimize_spec.rb +7 -5
  153. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +3 -1
  154. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +7 -3
  155. data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +3 -1
  156. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +5 -3
  157. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +8 -6
  158. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +3 -1
  159. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +5 -3
  160. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimizable_spec.rb +11 -3
  161. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimize_spec.rb +4 -2
  162. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +7 -5
  163. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +2 -0
  164. data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
  165. data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/optimizable_spec.rb +29 -0
  166. data/spec/unit/veritas/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
  167. data/spec/unit/veritas/optimizer/algebra/summarization/empty_summarize_per/optimizable_spec.rb +29 -0
  168. data/spec/unit/veritas/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +23 -0
  169. data/spec/unit/veritas/optimizer/algebra/summarization/order_operand/optimizable_spec.rb +23 -0
  170. data/spec/unit/veritas/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
  171. data/spec/unit/veritas/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
  172. data/spec/unit/veritas/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
  173. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +30 -8
  174. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +12 -9
  175. data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +2 -0
  176. data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +2 -0
  177. data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +2 -0
  178. data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +2 -0
  179. data/spec/unit/veritas/optimizer/function/binary/constant_operands/optimizable_spec.rb +36 -0
  180. data/spec/unit/veritas/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
  181. data/spec/unit/veritas/optimizer/function/binary/left_spec.rb +28 -0
  182. data/spec/unit/veritas/optimizer/function/binary/right_spec.rb +28 -0
  183. data/spec/unit/veritas/optimizer/function/binary/unoptimized_operands/optimizable_spec.rb +37 -0
  184. data/spec/unit/veritas/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
  185. data/spec/unit/veritas/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
  186. data/spec/unit/veritas/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
  187. data/spec/unit/veritas/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
  188. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/equal_operands/optimizable_spec.rb +4 -2
  189. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/equal_operands/optimize_spec.rb +3 -1
  190. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/left_spec.rb +3 -1
  191. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_left_operand/optimizable_spec.rb +4 -2
  192. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_left_operand/optimize_spec.rb +4 -2
  193. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_right_operand/optimizable_spec.rb +4 -2
  194. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/redundant_right_operand/optimize_spec.rb +4 -2
  195. data/spec/unit/veritas/optimizer/{logic → function}/connective/binary/right_spec.rb +3 -1
  196. data/spec/unit/veritas/optimizer/function/connective/conjunction/contradiction/optimizable_spec.rb +64 -0
  197. data/spec/unit/veritas/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
  198. data/spec/unit/veritas/optimizer/{logic/connective/disjunction/contradiction_left_operand → function/connective/conjunction/left_operand_tautology}/optimizable_spec.rb +9 -7
  199. data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/left_operand_tautology/optimize_spec.rb +8 -6
  200. data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +4 -2
  201. data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +5 -3
  202. data/spec/unit/veritas/optimizer/{logic → function}/connective/conjunction/right_operand_tautology/optimizable_spec.rb +6 -4
  203. data/spec/unit/veritas/optimizer/function/connective/conjunction/right_operand_tautology/optimize_spec.rb +19 -0
  204. data/spec/unit/veritas/optimizer/{logic/connective/conjunction/left_operand_tautology → function/connective/disjunction/contradiction_left_operand}/optimizable_spec.rb +9 -7
  205. data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_left_operand/optimize_spec.rb +8 -6
  206. data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_right_operand/optimizable_spec.rb +6 -4
  207. data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/contradiction_right_operand/optimize_spec.rb +8 -6
  208. data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +4 -2
  209. data/spec/unit/veritas/optimizer/{logic → function}/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +5 -3
  210. data/spec/unit/veritas/optimizer/function/connective/disjunction/tautology/optimizable_spec.rb +64 -0
  211. data/spec/unit/veritas/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
  212. data/spec/unit/veritas/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
  213. data/spec/unit/veritas/optimizer/function/connective/negation/invertible_operand/optimizable_spec.rb +28 -0
  214. data/spec/unit/veritas/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
  215. data/spec/unit/veritas/optimizer/{logic → function}/connective/negation/operand_spec.rb +3 -1
  216. data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/never_comparable/optimizable_spec.rb +23 -7
  217. data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/never_equivalent/optimizable_spec.rb +23 -7
  218. data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/normalizable_operands/optimizable_spec.rb +7 -5
  219. data/spec/unit/veritas/optimizer/{logic → function}/predicate/comparable/normalizable_operands/optimize_spec.rb +7 -5
  220. data/spec/unit/veritas/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
  221. data/spec/unit/veritas/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
  222. data/spec/unit/veritas/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
  223. data/spec/unit/veritas/optimizer/{logic → function}/predicate/enumerable/empty_right_operand/optimizable_spec.rb +6 -4
  224. data/spec/unit/veritas/optimizer/{logic → function}/predicate/enumerable/one_right_operand/optimizable_spec.rb +9 -7
  225. data/spec/unit/veritas/optimizer/{logic/predicate/enumerable/unoptimized_operand → function/predicate/enumerable/unoptimized_operands}/optimizable_spec.rb +4 -2
  226. data/spec/unit/veritas/optimizer/{logic/predicate/enumerable/unoptimized_operand → function/predicate/enumerable/unoptimized_operands}/optimize_spec.rb +18 -5
  227. data/spec/unit/veritas/optimizer/{logic → function}/predicate/equality/tautology/optimizable_spec.rb +4 -2
  228. data/spec/unit/veritas/optimizer/{logic → function}/predicate/exclusion/empty_right_operand/optimize_spec.rb +8 -6
  229. data/spec/unit/veritas/optimizer/{logic → function}/predicate/exclusion/one_right_operand/optimize_spec.rb +8 -6
  230. data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than/contradiction/optimizable_spec.rb +4 -2
  231. data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than/tautology/optimizable_spec.rb +4 -2
  232. data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to/contradiction/optimizable_spec.rb +4 -2
  233. data/spec/unit/veritas/optimizer/{logic → function}/predicate/greater_than_or_equal_to/tautology/optimizable_spec.rb +4 -2
  234. data/spec/unit/veritas/optimizer/{logic → function}/predicate/inclusion/empty_right_operand/optimize_spec.rb +8 -6
  235. data/spec/unit/veritas/optimizer/{logic → function}/predicate/inclusion/one_right_operand/optimize_spec.rb +8 -6
  236. data/spec/unit/veritas/optimizer/{logic → function}/predicate/inequality/contradiction/optimizable_spec.rb +4 -2
  237. data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than/contradiction/optimizable_spec.rb +4 -2
  238. data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than/tautology/optimizable_spec.rb +4 -2
  239. data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to/contradiction/optimizable_spec.rb +4 -2
  240. data/spec/unit/veritas/optimizer/{logic → function}/predicate/less_than_or_equal_to/tautology/optimizable_spec.rb +4 -2
  241. data/spec/unit/veritas/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
  242. data/spec/unit/veritas/optimizer/function/unary/constant_operand/optimizable_spec.rb +27 -0
  243. data/spec/unit/veritas/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
  244. data/spec/unit/veritas/optimizer/function/unary/operand_spec.rb +27 -0
  245. data/spec/unit/veritas/optimizer/function/unary/unoptimized_operand/optimizable_spec.rb +27 -0
  246. data/spec/unit/veritas/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
  247. data/spec/unit/veritas/optimizer/{logic/predicate → function}/util/class_methods/attribute_spec.rb +4 -2
  248. data/spec/unit/veritas/optimizer/{logic/predicate → function}/util/class_methods/constant_spec.rb +13 -5
  249. data/spec/unit/veritas/optimizer/function/util/class_methods/max_spec.rb +27 -0
  250. data/spec/unit/veritas/optimizer/function/util/class_methods/min_spec.rb +27 -0
  251. data/spec/unit/veritas/optimizer/operation_spec.rb +2 -0
  252. data/spec/unit/veritas/optimizer/optimizable/class_methods/optimizer_spec.rb +2 -0
  253. data/spec/unit/veritas/optimizer/optimizable/optimize_spec.rb +3 -1
  254. data/spec/unit/veritas/optimizer/optimizable_spec.rb +2 -0
  255. data/spec/unit/veritas/optimizer/optimize_spec.rb +2 -0
  256. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +2 -0
  257. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +2 -0
  258. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +2 -4
  259. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +2 -4
  260. data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +2 -5
  261. data/spec/unit/veritas/optimizer/relation/operation/binary/left_order_operand/optimizable_spec.rb +23 -0
  262. data/spec/unit/veritas/optimizer/relation/operation/binary/left_order_operand/optimize_spec.rb +23 -0
  263. data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +2 -4
  264. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +2 -0
  265. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +2 -0
  266. data/spec/unit/veritas/optimizer/relation/operation/binary/right_order_operand/optimizable_spec.rb +23 -0
  267. data/spec/unit/veritas/optimizer/relation/operation/binary/right_order_operand/optimize_spec.rb +23 -0
  268. data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +2 -4
  269. data/spec/unit/veritas/optimizer/relation/operation/binary/{unoptimized_operand → unoptimized_operands}/optimizable_spec.rb +3 -1
  270. data/spec/unit/veritas/optimizer/relation/operation/binary/{unoptimized_operand → unoptimized_operands}/optimize_spec.rb +3 -1
  271. data/spec/unit/veritas/optimizer/relation/operation/combination/optimize_spec.rb +2 -0
  272. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +2 -0
  273. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +2 -0
  274. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimizable_spec.rb +2 -0
  275. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +2 -0
  276. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +2 -0
  277. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +2 -0
  278. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +2 -0
  279. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +2 -0
  280. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +2 -0
  281. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +2 -0
  282. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +2 -0
  283. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +2 -0
  284. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +2 -0
  285. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +2 -0
  286. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +2 -0
  287. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +2 -0
  288. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +2 -0
  289. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +3 -1
  290. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +2 -0
  291. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +2 -0
  292. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +2 -0
  293. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +2 -0
  294. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +2 -0
  295. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +2 -0
  296. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +2 -0
  297. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +2 -0
  298. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +5 -2
  299. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +2 -0
  300. data/spec/unit/veritas/optimizer/relation/operation/unary/header_spec.rb +15 -0
  301. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +5 -2
  302. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +2 -0
  303. data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +8 -5
  304. data/spec/unit/veritas/optimizer/relation/operation/unary/order_operand/optimizable_spec.rb +28 -0
  305. data/spec/unit/veritas/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
  306. data/spec/unit/veritas/optimizer/relation/operation/unary/unchanged_header/optimizable_spec.rb +24 -0
  307. data/spec/unit/veritas/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
  308. data/tasks/metrics/ci.rake +7 -0
  309. data/tasks/{quality → metrics}/flay.rake +0 -0
  310. data/tasks/{quality → metrics}/flog.rake +0 -0
  311. data/tasks/{quality → metrics}/heckle.rake +1 -0
  312. data/tasks/{quality → metrics}/metric_fu.rake +3 -0
  313. data/tasks/{quality → metrics}/reek.rake +0 -0
  314. data/tasks/{quality → metrics}/roodi.rake +0 -0
  315. data/tasks/{quality → metrics}/yardstick.rake +0 -0
  316. data/tasks/spec.rake +1 -0
  317. data/veritas-optimizer.gemspec +183 -352
  318. metadata +232 -357
  319. data/lib/veritas/optimizer/logic/connective/negation.rb +0 -71
  320. data/lib/veritas/optimizer/logic/predicate.rb +0 -177
  321. data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +0 -16
  322. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +0 -26
  323. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +0 -16
  324. data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +0 -27
  325. data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +0 -19
  326. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimizable_spec.rb +0 -26
  327. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimize_spec.rb +0 -16
  328. data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +0 -31
  329. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +0 -26
  330. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +0 -18
  331. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +0 -34
  332. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +0 -21
  333. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimizable_spec.rb +0 -41
  334. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimize_spec.rb +0 -17
  335. data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimize_spec.rb +0 -17
  336. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimizable_spec.rb +0 -41
  337. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimize_spec.rb +0 -17
  338. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +0 -26
  339. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +0 -20
  340. data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +0 -20
  341. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +0 -29
  342. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +0 -14
  343. data/spec/unit/veritas/optimizer/logic/predicate/contradiction/optimize_spec.rb +0 -16
  344. data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +0 -25
  345. data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +0 -25
  346. data/spec/unit/veritas/optimizer/logic/predicate/tautology/optimize_spec.rb +0 -16
  347. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +0 -19
  348. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +0 -19
  349. data/tasks/quality/ci.rake +0 -2
@@ -1,71 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Veritas
4
- class Optimizer
5
- module Logic
6
- module Connective
7
-
8
- # Abstract base class representing Negation optimizations
9
- class Negation < Optimizer
10
-
11
- # The optimized operand
12
- #
13
- # @return [Expression]
14
- #
15
- # @api private
16
- attr_reader :operand
17
-
18
- # Initialize a Unary optimizer
19
- #
20
- # @return [undefined]
21
- #
22
- # @api private
23
- def initialize(*)
24
- super
25
- @operand = optimize_operand
26
- end
27
-
28
- private
29
-
30
- # Optimize the operand
31
- #
32
- # @return [Expression]
33
- #
34
- # @api private
35
- def optimize_operand
36
- # TODO: move Predicate.optimize_operand to a better location
37
- Predicate.optimize_operand(operation.operand)
38
- end
39
-
40
- # Optimize when the operand can be inverted
41
- class InvertibleOperand < self
42
-
43
- # Test if the operand can be inverted
44
- #
45
- # @return [Boolean]
46
- #
47
- # @api private
48
- def optimizable?
49
- operand.respond_to?(:inverse)
50
- end
51
-
52
- # A Negation of an Expression is equivalent to the inverted Expression
53
- #
54
- # @return [Expression]
55
- #
56
- # @api private
57
- def optimize
58
- operand.inverse
59
- end
60
-
61
- end # class InvertibleOperand
62
-
63
- Veritas::Logic::Connective::Negation.optimizer = chain(
64
- InvertibleOperand
65
- )
66
-
67
- end # class Negation
68
- end # module Connective
69
- end # module Logic
70
- end # class Optimizer
71
- end # module Veritas
@@ -1,177 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Veritas
4
- class Optimizer
5
- module Logic
6
-
7
- # Abstract base class representing Predicate optimizations
8
- class Predicate < Optimizer
9
-
10
- # The optimized left operand
11
- #
12
- # @return [Object]
13
- #
14
- # @api private
15
- attr_reader :left
16
-
17
- # The optimized right operand
18
- #
19
- # @return [Object]
20
- #
21
- # @api private
22
- attr_reader :right
23
-
24
- # Initialize an Predicate optimizer
25
- #
26
- # @return [undefined]
27
- #
28
- # @api private
29
- def initialize(*)
30
- super
31
- @left = optimize_left
32
- @right = optimize_right
33
- end
34
-
35
- private
36
-
37
- # Optimize the left operand
38
- #
39
- # @return [Object]
40
- #
41
- # @api private
42
- def optimize_left
43
- self.class.optimize_operand(operation.left)
44
- end
45
-
46
- # Optimize the right operand
47
- #
48
- # @return [Object]
49
- #
50
- # @api private
51
- def optimize_right
52
- self.class.optimize_operand(operation.right)
53
- end
54
-
55
- # Optimize the operand if possible
56
- #
57
- # @param [#optimize, Object] operand
58
- #
59
- # @return [Object]
60
- #
61
- # @api private
62
- def self.optimize_operand(operand)
63
- operand.respond_to?(:optimize) ? operand.optimize : operand
64
- end
65
-
66
- # Optimize when the operands are constants
67
- class ConstantOperands < self
68
-
69
- # Test if the operands are constants
70
- #
71
- # @return [Boolean]
72
- #
73
- # @api private
74
- def optimizable?
75
- util = Util
76
- util.constant?(left) && util.constant?(right)
77
- end
78
-
79
- # A Predicate with constant values is equivalent to a Proposition
80
- #
81
- # @return [Proposition]
82
- #
83
- # @api private
84
- def optimize
85
- Veritas::Logic::Proposition.new(operation.class.call(left, right))
86
- end
87
-
88
- end # class ConstantOperands
89
-
90
- # Optimize when the operands are a contradiction
91
- module Contradiction
92
-
93
- # Return a contradiction
94
- #
95
- # @return [Contradiction]
96
- #
97
- # @api private
98
- def optimize
99
- Veritas::Logic::Proposition::Contradiction.instance
100
- end
101
-
102
- end # module Contradiction
103
-
104
- # Optimize when the operands are a tautology
105
- module Tautology
106
-
107
- # Return a tautology
108
- #
109
- # @return [Tautology]
110
- #
111
- # @api private
112
- def optimize
113
- Veritas::Logic::Proposition::Tautology.instance
114
- end
115
-
116
- end # module Tautology
117
-
118
- # Utility methods for Predicate optimization
119
- module Util
120
-
121
- # Test if the operand is a constant
122
- #
123
- # @return [Boolean]
124
- #
125
- # @api private
126
- def self.constant?(operand)
127
- !operand.respond_to?(:call)
128
- end
129
-
130
- # Test if the operand is an attribute
131
- #
132
- # @return [Boolean]
133
- #
134
- # @api private
135
- def self.attribute?(operand)
136
- operand.kind_of?(Attribute)
137
- end
138
-
139
- # Return the minimum value for the operand
140
- #
141
- # @return [Object]
142
- #
143
- # @api private
144
- def self.min(operand)
145
- range_or_operand(operand, :first)
146
- end
147
-
148
- # Return the maximum value for the operand
149
- #
150
- # @return [Object]
151
- #
152
- # @api private
153
- def self.max(operand)
154
- range_or_operand(operand, :last)
155
- end
156
-
157
- # Return the minimum/maximum of the operand range, or the operand
158
- #
159
- # @param [Object] operand
160
- # the object to extract the minimum/maximum value from
161
- # @param [Symbol] method
162
- # the method to execute on the operand range, if any
163
- #
164
- # @return [Object]
165
- #
166
- # @api private
167
- def self.range_or_operand(operand, method)
168
- operand.respond_to?(:range) ? operand.range.send(method) : operand
169
- end
170
-
171
- private_class_method :range_or_operand
172
-
173
- end # module Util
174
- end # class Predicate
175
- end # module Logic
176
- end # class Optimizer
177
- end # module Veritas
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Projection, '#header' do
4
- subject { object.header }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ], [ :name, String ] ]) }
7
- let(:operand) { Relation.new(header, [ [ 1, 'Dan Kubb' ] ]) }
8
- let(:relation) { operand.project([ :id ]) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.operation.should be_kind_of(Algebra::Projection)
13
- end
14
-
15
- it { should equal(relation.header) }
16
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Projection::UnchangedHeader, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ], [ :name, String ] ]) }
7
- let(:base) { Relation.new(header, [ [ 1, 'Dan Kubb' ] ].each) }
8
- let(:relation) { base.project(new_header) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.operation.should be_kind_of(Algebra::Projection)
13
- end
14
-
15
- context 'when the header is not changed' do
16
- let(:new_header) { header }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when the header is changed' do
22
- let(:new_header) { [ :id ] }
23
-
24
- it { should be(false) }
25
- end
26
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Projection::UnchangedHeader, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ], [ :name, String ] ]) }
7
- let(:base) { Relation.new(header, [ [ 1, 'Dan Kubb' ] ].each) }
8
- let(:relation) { base.project(header) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.should be_optimizable
13
- end
14
-
15
- it { should equal(base) }
16
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Rename, '.union_aliases' do
4
- subject { object.union_aliases(aliases, operand) }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:header) { Relation::Header.new([ [ :id, Integer ] ]) }
8
- let(:base) { Relation.new(header, [ [ 1 ] ].each) }
9
- let(:aliases) { relation.aliases }
10
- let(:object) { Optimizer::Algebra::Rename }
11
-
12
- context 'when the operand is a rename' do
13
- let(:operand) { base.rename(:id => :other_id) }
14
- let(:relation) { operand.rename(:other_id => :another_id) }
15
-
16
- it { should be_kind_of(Algebra::Rename::Aliases) }
17
-
18
- it { should == { attribute => attribute.rename(:another_id) } }
19
- end
20
-
21
- context 'when the operand is not a rename' do
22
- let(:operand) { base }
23
- let(:relation) { operand.rename(:id => :other_id) }
24
-
25
- it { should equal(aliases) }
26
- end
27
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Rename, '#header' do
4
- subject { object.header }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ] ]) }
7
- let(:base) { Relation.new(header, [ [ 1 ] ].each) }
8
- let(:aliases) { { :id => :other_id } }
9
- let(:relation) { base.rename(aliases) }
10
- let(:object) { described_class.new(relation) }
11
-
12
- before do
13
- object.operation.should be_kind_of(Algebra::Rename)
14
- end
15
-
16
- it { should be_kind_of(Relation::Header) }
17
-
18
- it { should == [ [ :other_id, Integer ] ] }
19
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Rename::UnchangedHeader, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ], [ :name, String ] ]) }
7
- let(:base) { Relation.new(header, [ [ 1, 'Dan Kubb' ] ].each) }
8
- let(:relation) { base.rename(new_aliases) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.operation.should be_kind_of(Algebra::Rename)
13
- end
14
-
15
- context 'when the header is not changed' do
16
- let(:new_aliases) { {} }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when the header is changed' do
22
- let(:new_aliases) { { :id => :other_id } }
23
-
24
- it { should be(false) }
25
- end
26
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Rename::UnchangedHeader, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:header) { Relation::Header.new([ [ :id, Integer ], [ :name, String ] ]) }
7
- let(:base) { Relation.new(header, [ [ 1, 'Dan Kubb' ] ].each) }
8
- let(:relation) { base.rename({}) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.should be_optimizable
13
- end
14
-
15
- it { should equal(base) }
16
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Restriction, '.optimize_predicate' do
4
- subject { object.optimize_predicate(predicate) }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:predicate) { attribute.eq(1) }
8
- let(:object) { Optimizer::Algebra::Restriction }
9
-
10
- context 'when the predicate is optimizable' do
11
- let(:predicate) { Logic::Connective::Negation.new(attribute.eq(1)) }
12
-
13
- it { should be_kind_of(Logic::Predicate::Inequality) }
14
-
15
- its(:left) { should equal(attribute) }
16
-
17
- its(:right) { should == 1 }
18
- end
19
-
20
- context 'when the predicate is optimizable, but already optimized' do
21
- let(:predicate) { attribute.eq(1) }
22
-
23
- it { should equal(predicate) }
24
- end
25
-
26
- context 'when the predicate is not optimizable' do
27
- let(:predicate) { lambda { |tuple| tuple[:id] == 1 } }
28
-
29
- it { should equal(predicate) }
30
- end
31
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Restriction::ReverseOperand, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:base) { Relation.new([ [ :id, Integer ] ], [ [ 1 ] ].each).order }
7
- let(:predicate) { base[:id].eq(1) }
8
- let(:relation) { operand.restrict(predicate) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.operation.should be_kind_of(Algebra::Restriction)
13
- end
14
-
15
- context 'when the operand is a reverse operation' do
16
- let(:operand) { base.take(2).reverse }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when the operand is not a reverse operation' do
22
- let(:operand) { base }
23
-
24
- it { should be(false) }
25
- end
26
- end
@@ -1,18 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Algebra::Restriction::ReverseOperand, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:order) { Relation.new([ [ :id, Integer ] ], [ [ 1 ] ].each).order }
7
- let(:predicate) { order[:id].eq(1) }
8
- let(:relation) { order.take(2).reverse.restrict(predicate) }
9
- let(:object) { described_class.new(relation) }
10
-
11
- before do
12
- object.should be_optimizable
13
- end
14
-
15
- it { should be_kind_of(Relation::Operation::Reverse) }
16
-
17
- its(:operand) { should eql(order.take(2).restrict(predicate)) }
18
- end
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Binary::UnoptimizedOperand, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:connective) { left.and(right) }
8
- let(:object) { described_class.new(connective) }
9
-
10
- before do
11
- object.operation.should be_kind_of(Logic::Connective::Binary)
12
- end
13
-
14
- context 'when left is optimizable' do
15
- let(:left) { attribute.include([ 1 ]) }
16
- let(:right) { attribute.ne(2) }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when right is optimizable' do
22
- let(:left) { attribute.eq(1) }
23
- let(:right) { attribute.exclude([ 2 ]) }
24
-
25
- it { should be(true) }
26
- end
27
-
28
- context 'when left and right are not optimizable' do
29
- let(:left) { attribute.eq(1) }
30
- let(:right) { attribute.ne(2) }
31
-
32
- it { should be(false) }
33
- end
34
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Binary::UnoptimizedOperand, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:left) { attribute.include([ 1 ]) }
8
- let(:right) { attribute.exclude([ 2 ]) }
9
- let(:connective) { left.and(right) }
10
- let(:object) { described_class.new(connective) }
11
-
12
- before do
13
- object.should be_optimizable
14
- end
15
-
16
- it { should be_kind_of(Logic::Connective::Conjunction) }
17
-
18
- its(:left) { should eql(attribute.eq(1)) }
19
-
20
- its(:right) { should eql(attribute.ne(2)) }
21
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Conjunction::Contradiction, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:connective) { Logic::Connective::Conjunction.new(left, right) }
8
- let(:object) { described_class.new(connective) }
9
-
10
- before do
11
- object.operation.should be_kind_of(Logic::Connective::Conjunction)
12
- end
13
-
14
- context 'when left is a contradiction' do
15
- let(:left) { Logic::Proposition::Contradiction.instance }
16
- let(:right) { attribute.eq(1) }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when right is a contradiction' do
22
- let(:left) { attribute.eq(1) }
23
- let(:right) { Logic::Proposition::Contradiction.instance }
24
-
25
- it { should be(true) }
26
- end
27
-
28
- context 'when left and right are equality predicates with the same attribute and constant values' do
29
- let(:left) { attribute.eq(1) }
30
- let(:right) { attribute.eq(2) }
31
-
32
- it { should be(true) }
33
- end
34
-
35
- context 'when left and right are inverses' do
36
- let(:left) { attribute.eq(1) }
37
- let(:right) { attribute.ne(1) }
38
-
39
- it { should be(true) }
40
- end
41
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Conjunction::Contradiction, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:left) { Logic::Proposition::Contradiction.instance }
8
- let(:right) { Logic::Proposition::Contradiction.instance }
9
- let(:connective) { Logic::Connective::Conjunction.new(left, right) }
10
- let(:object) { described_class.new(connective) }
11
-
12
- before do
13
- object.should be_optimizable
14
- end
15
-
16
- it { should equal(Logic::Proposition::Contradiction.instance) }
17
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Conjunction::RightOperandTautology, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:left) { attribute.eq(1) }
8
- let(:right) { Logic::Proposition::Tautology.instance }
9
- let(:connective) { left.and(right) }
10
- let(:object) { described_class.new(connective) }
11
-
12
- before do
13
- object.should be_optimizable
14
- end
15
-
16
- it { should equal(left) }
17
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Disjunction::Tautology, '#optimizable?' do
4
- subject { object.optimizable? }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:connective) { Logic::Connective::Disjunction.new(left, right) }
8
- let(:object) { described_class.new(connective) }
9
-
10
- before do
11
- object.operation.should be_kind_of(Logic::Connective::Disjunction)
12
- end
13
-
14
- context 'when left is a tautology' do
15
- let(:left) { Logic::Proposition::Tautology.instance }
16
- let(:right) { attribute.eq(1) }
17
-
18
- it { should be(true) }
19
- end
20
-
21
- context 'when right is a tautology' do
22
- let(:left) { attribute.eq(1) }
23
- let(:right) { Logic::Proposition::Tautology.instance }
24
-
25
- it { should be(true) }
26
- end
27
-
28
- context 'when left and right are inequality predicates with the same attribute and constant values' do
29
- let(:left) { attribute.ne(1) }
30
- let(:right) { attribute.ne(2) }
31
-
32
- it { should be(true) }
33
- end
34
-
35
- context 'when left and right are inverses' do
36
- let(:left) { attribute.eq(1) }
37
- let(:right) { attribute.ne(1) }
38
-
39
- it { should be(true) }
40
- end
41
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Optimizer::Logic::Connective::Disjunction::Tautology, '#optimize' do
4
- subject { object.optimize }
5
-
6
- let(:attribute) { Attribute::Integer.new(:id) }
7
- let(:left) { Logic::Proposition::Tautology.instance }
8
- let(:right) { Logic::Proposition::Tautology.instance }
9
- let(:connective) { Logic::Connective::Disjunction.new(left, right) }
10
- let(:object) { described_class.new(connective) }
11
-
12
- before do
13
- object.should be_optimizable
14
- end
15
-
16
- it { should equal(Logic::Proposition::Tautology.instance) }
17
- end