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
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Function
6
+
7
+ # Abstract base class representing Predicate optimizations
8
+ class Predicate < Optimizer
9
+ include AbstractClass, Binary
10
+
11
+ # Optimize when the operands are constants
12
+ class ConstantOperands < self
13
+ include Binary::ConstantOperands
14
+
15
+ # A Predicate with constant values is equivalent to a Proposition
16
+ #
17
+ # @return [Proposition]
18
+ #
19
+ # @api private
20
+ def optimize
21
+ Veritas::Function::Proposition.new(super)
22
+ end
23
+
24
+ end # class ConstantOperands
25
+
26
+ # Optimize when the operands are unoptimized
27
+ class UnoptimizedOperands < self
28
+ include Binary::UnoptimizedOperands
29
+ end # class UnoptimizedOperands
30
+
31
+ # Optimize when the operands are a contradiction
32
+ module Contradiction
33
+
34
+ # Return a contradiction
35
+ #
36
+ # @return [Contradiction]
37
+ #
38
+ # @api private
39
+ def optimize
40
+ Veritas::Function::Proposition::Contradiction.instance
41
+ end
42
+
43
+ end # module Contradiction
44
+
45
+ # Optimize when the operands are a tautology
46
+ module Tautology
47
+
48
+ # Return a tautology
49
+ #
50
+ # @return [Tautology]
51
+ #
52
+ # @api private
53
+ def optimize
54
+ Veritas::Function::Proposition::Tautology.instance
55
+ end
56
+
57
+ end # module Tautology
58
+ end # class Predicate
59
+ end # module Function
60
+ end # class Optimizer
61
+ end # module Veritas
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Function
6
+ module String
7
+
8
+ # Abstract base class representing Length optimizations
9
+ class Length < Optimizer
10
+ include Unary
11
+
12
+ # Optimize when the operand is constant
13
+ class ConstantOperand < self
14
+ include Unary::ConstantOperand
15
+ end # class ConstantOperand
16
+
17
+ # Optimize when the operand is unoptimized
18
+ class UnoptimizedOperand < self
19
+ include Unary::UnoptimizedOperand
20
+ end # class UnoptimizedOperand
21
+
22
+ Veritas::Function::String::Length.optimizer = chain(
23
+ ConstantOperand,
24
+ UnoptimizedOperand
25
+ )
26
+
27
+ end # class Length
28
+ end # module String
29
+ end # module Function
30
+ end # class Optimizer
31
+ end # module Veritas
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Function
6
+
7
+ # Mixin for optimizations to Unary functions
8
+ module Unary
9
+
10
+ # The optimized operand
11
+ #
12
+ # @return [Relation]
13
+ #
14
+ # @api private
15
+ attr_reader :operand
16
+
17
+ # Initialize a Unary optimizer
18
+ #
19
+ # @return [undefined]
20
+ #
21
+ # @api private
22
+ def initialize(*)
23
+ super
24
+ @operand = optimize_operand
25
+ end
26
+
27
+ private
28
+
29
+ # Optimize the operand
30
+ #
31
+ # @return [Relation]
32
+ #
33
+ # @api private
34
+ def optimize_operand
35
+ Function.optimize_operand(operation.operand)
36
+ end
37
+
38
+ # Optimize when the operand is constant
39
+ module ConstantOperand
40
+
41
+ # Test if the operand is constant
42
+ #
43
+ # @return [Boolean]
44
+ #
45
+ # @api private
46
+ def optimizable?
47
+ Util.constant?(operand)
48
+ end
49
+
50
+ # Evaluate the operand and return the constant
51
+ #
52
+ # @return [Object]
53
+ #
54
+ # @api private
55
+ def optimize
56
+ operation.class.call(operand)
57
+ end
58
+
59
+ end # module ConstantOperand
60
+
61
+ # Optimize when the operand is unoptimized
62
+ module UnoptimizedOperand
63
+
64
+ # Test if the operand is unoptimized
65
+ #
66
+ # @return [Boolean]
67
+ #
68
+ # @api private
69
+ def optimizable?
70
+ !operand.equal?(operation.operand)
71
+ end
72
+
73
+ # Return a Aggregate with an optimized operand
74
+ #
75
+ # @return [Aggregate]
76
+ #
77
+ # @api private
78
+ def optimize
79
+ operation.class.new(operand)
80
+ end
81
+
82
+ end # module UnoptimizedOperand
83
+ end # class Unary
84
+ end # module Function
85
+ end # class Optimizer
86
+ end # module Veritas
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+
6
+ # Mixin for function optimizations
7
+ module Function
8
+
9
+ # Optimize the operand if possible
10
+ #
11
+ # @param [#optimize, Object] operand
12
+ #
13
+ # @return [Object]
14
+ #
15
+ # @api private
16
+ def self.optimize_operand(operand)
17
+ operand.respond_to?(:optimize) ? operand.optimize : operand
18
+ end
19
+
20
+ # Optimize the summarizers
21
+ #
22
+ # @param [Hash{Attribute => Function}]
23
+ #
24
+ # @return [Hash{Attribute => Function}]
25
+ #
26
+ # @api private
27
+ def self.optimize_functions(functions)
28
+ optimized = {}
29
+ functions.each do |attribute, function|
30
+ optimized[attribute] = optimize_operand(function)
31
+ end
32
+ optimized.freeze
33
+ end
34
+
35
+ # Utility methods for Function optimization
36
+ module Util
37
+
38
+ # Test if the operand is a constant
39
+ #
40
+ # @return [Boolean]
41
+ #
42
+ # @api private
43
+ def self.constant?(operand)
44
+ !operand.nil? && !operand.respond_to?(:call)
45
+ end
46
+
47
+ # Test if the operand is an attribute
48
+ #
49
+ # @return [Boolean]
50
+ #
51
+ # @api private
52
+ def self.attribute?(operand)
53
+ operand.kind_of?(Attribute)
54
+ end
55
+
56
+ # Return the minimum value for the operand
57
+ #
58
+ # @return [Object]
59
+ #
60
+ # @api private
61
+ def self.min(operand)
62
+ case operand
63
+ when Attribute::String then operand.min_length
64
+ when Attribute::Numeric then operand.range.first
65
+ else
66
+ operand
67
+ end
68
+ end
69
+
70
+ # Return the maximum value for the operand
71
+ #
72
+ # @return [Object]
73
+ #
74
+ # @api private
75
+ def self.max(operand)
76
+ case operand
77
+ when Attribute::String then operand.max_length
78
+ when Attribute::Numeric then operand.range.last
79
+ else
80
+ operand
81
+ end
82
+ end
83
+
84
+ end # module Util
85
+ end # module Function
86
+ end # class Optimizer
87
+ end # module Veritas
@@ -36,7 +36,9 @@ module Veritas
36
36
  # @todo simplify by setting a default Noop optimizer for all relations
37
37
  def optimize(optimizer = self.class.optimizer || Optimizer::Noop)
38
38
  optimized = optimizer.call(self)
39
- equal?(optimized) ? self : optimized.optimize
39
+ equal?(optimized) ? self :
40
+ optimized.respond_to?(:optimize) ? optimized.optimize :
41
+ optimized
40
42
  end
41
43
 
42
44
  memoize :optimize
@@ -55,5 +57,6 @@ module Veritas
55
57
  end # class Optimizer
56
58
  end # module Veritas
57
59
 
58
- Veritas::Relation.class_eval { include Veritas::Optimizer::Optimizable }
59
- Veritas::Logic::Expression.class_eval { include Veritas::Optimizer::Optimizable }
60
+ Veritas::Aggregate.class_eval { include Veritas::Optimizer::Optimizable }
61
+ Veritas::Function.class_eval { include Veritas::Optimizer::Optimizable }
62
+ Veritas::Relation.class_eval { include Veritas::Optimizer::Optimizable }
@@ -7,51 +7,7 @@ module Veritas
7
7
 
8
8
  # Abstract base class representing Binary relation optimizations
9
9
  class Binary < Optimizer
10
-
11
- # The optimized left operand
12
- #
13
- # @return [Relation]
14
- #
15
- # @api private
16
- attr_reader :left
17
-
18
- # The optimized right operand
19
- #
20
- # @return [Relation]
21
- #
22
- # @api private
23
- attr_reader :right
24
-
25
- # Initialize an Binary optimizer
26
- #
27
- # @return [undefined]
28
- #
29
- # @api private
30
- def initialize(*)
31
- super
32
- @left = optimize_left
33
- @right = optimize_right
34
- end
35
-
36
- private
37
-
38
- # Optimize the left operand
39
- #
40
- # @return [Relation]
41
- #
42
- # @api private
43
- def optimize_left
44
- operation.left.optimize
45
- end
46
-
47
- # Optimize the right operand
48
- #
49
- # @return [Relation]
50
- #
51
- # @api private
52
- def optimize_right
53
- operation.right.optimize
54
- end
10
+ include Function::Binary
55
11
 
56
12
  # Optimize when operands are equal
57
13
  module EqualOperands
@@ -60,6 +16,8 @@ module Veritas
60
16
  #
61
17
  # @return [Boolean]
62
18
  #
19
+ # @todo do not materialize the operands to compare them
20
+ #
63
21
  # @api private
64
22
  def optimizable?
65
23
  left.eql?(right)
@@ -95,72 +53,80 @@ module Veritas
95
53
 
96
54
  end # module EmptyRight
97
55
 
98
- # Optimize when the operands are Materialized
99
- class MaterializedOperand < self
56
+ # Optimize when the left operand is an Order
57
+ class LeftOrderOperand < self
100
58
 
101
- # Test if the operands are materialized
59
+ # Test if the left operand is an Order
102
60
  #
103
61
  # @return [Boolean]
104
62
  #
105
63
  # @api private
106
64
  def optimizable?
107
- left.kind_of?(Veritas::Relation::Materialized) &&
108
- right.kind_of?(Veritas::Relation::Materialized)
65
+ left.kind_of?(Veritas::Relation::Operation::Order)
109
66
  end
110
67
 
111
- # Return the materialized operation
68
+ # Drop the Order and wrap the left operand
112
69
  #
113
- # @return [Relation::Materialized]
70
+ # @return [Binary]
114
71
  #
115
72
  # @api private
116
73
  def optimize
117
- operation.materialize
74
+ operation.class.new(left.operand, right)
118
75
  end
119
76
 
120
- end # class MaterializedOperand
77
+ end # class LeftOrderOperand
121
78
 
122
- # Optimize when the operands are unoptimized
123
- class UnoptimizedOperand < self
79
+ # Optimize when the right operand is an Order
80
+ class RightOrderOperand < self
124
81
 
125
- # Test if the operands are unoptimized
82
+ # Test if the right operand is an Order
126
83
  #
127
84
  # @return [Boolean]
128
85
  #
129
86
  # @api private
130
87
  def optimizable?
131
- left_optimizable? || right_optimizable?
88
+ right.kind_of?(Veritas::Relation::Operation::Order)
132
89
  end
133
90
 
134
- # Return a Relation with optimized operands
91
+ # Drop the Order and wrap the right operand
135
92
  #
136
- # @return [Relation]
93
+ # @return [Binary]
137
94
  #
138
95
  # @api private
139
96
  def optimize
140
- operation.class.new(left, right)
97
+ operation.class.new(left, right.operand)
141
98
  end
142
99
 
143
- private
100
+ end # class RightOrderOperand
144
101
 
145
- # Test if the left operand is optimizable
102
+ # Optimize when the operands are Materialized
103
+ class MaterializedOperand < self
104
+
105
+ # Test if the operands are materialized
146
106
  #
147
107
  # @return [Boolean]
148
108
  #
149
109
  # @api private
150
- def left_optimizable?
151
- !left.equal?(operation.left)
110
+ def optimizable?
111
+ left.kind_of?(Veritas::Relation::Materialized) &&
112
+ right.kind_of?(Veritas::Relation::Materialized)
152
113
  end
153
114
 
154
- # Test if the right operand is optimizable
115
+ # Return the materialized operation
155
116
  #
156
- # @return [Boolean]
117
+ # @return [Relation::Materialized]
157
118
  #
158
119
  # @api private
159
- def right_optimizable?
160
- !right.equal?(operation.right)
120
+ def optimize
121
+ operation.materialize
161
122
  end
162
123
 
163
- end # class UnoptimizedOperand
124
+ end # class MaterializedOperand
125
+
126
+ # Optimize when the operands are unoptimized
127
+ class UnoptimizedOperands < self
128
+ include Function::Binary::UnoptimizedOperands
129
+ end # class UnoptimizedOperands
164
130
  end # class Binary
165
131
  end # module Operation
166
132
  end # module Relation
@@ -112,15 +112,7 @@ module Veritas
112
112
 
113
113
  # Optimize when operand is optimizable
114
114
  class UnoptimizedOperand < self
115
-
116
- # Test if the operand is unoptimized
117
- #
118
- # @return [Boolean]
119
- #
120
- # @api private
121
- def optimizable?
122
- !operand.equal?(operation.operand)
123
- end
115
+ include Function::Unary::UnoptimizedOperand
124
116
 
125
117
  # Return a Limit with an optimized operand
126
118
  #
@@ -78,15 +78,7 @@ module Veritas
78
78
 
79
79
  # Optimize when operand is optimizable
80
80
  class UnoptimizedOperand < self
81
-
82
- # Test if the operand is unoptimized
83
- #
84
- # @return [Boolean]
85
- #
86
- # @api private
87
- def optimizable?
88
- !operand.equal?(operation.operand)
89
- end
81
+ include Function::Unary::UnoptimizedOperand
90
82
 
91
83
  # Return an Offset with an optimized operand
92
84
  #
@@ -59,15 +59,7 @@ module Veritas
59
59
 
60
60
  # Optimize when operand is optimizable
61
61
  class UnoptimizedOperand < self
62
-
63
- # Test if the operand is unoptimized
64
- #
65
- # @return [Boolean]
66
- #
67
- # @api private
68
- def optimizable?
69
- !operand.equal?(operation.operand)
70
- end
62
+ include Function::Unary::UnoptimizedOperand
71
63
 
72
64
  # Return an Order with an optimized operand
73
65
  #
@@ -57,15 +57,7 @@ module Veritas
57
57
 
58
58
  # Optimize when operand is optimizable
59
59
  class UnoptimizedOperand < self
60
-
61
- # Test if the operand is unoptimized
62
- #
63
- # @return [Boolean]
64
- #
65
- # @api private
66
- def optimizable?
67
- !operand.equal?(operation.operand)
68
- end
60
+ include Function::Unary::UnoptimizedOperand
69
61
 
70
62
  # Return an Reverse with an optimized operand
71
63
  #
@@ -7,13 +7,14 @@ module Veritas
7
7
 
8
8
  # Abstract base class representing Unary relation optimizations
9
9
  class Unary < Optimizer
10
+ include Function::Unary
10
11
 
11
- # The optimized operand
12
+ # The operation header
12
13
  #
13
- # @return [Relation]
14
+ # @return [Header]
14
15
  #
15
16
  # @api private
16
- attr_reader :operand
17
+ attr_reader :header
17
18
 
18
19
  # Initialize a Unary optimizer
19
20
  #
@@ -22,19 +23,54 @@ module Veritas
22
23
  # @api private
23
24
  def initialize(*)
24
25
  super
25
- @operand = optimize_operand
26
+ @header = operation.header
26
27
  end
27
28
 
28
- private
29
+ # Optimize when the operand is an Order
30
+ module OrderOperand
29
31
 
30
- # Optimize the operand
31
- #
32
- # @return [Relation]
33
- #
34
- # @api private
35
- def optimize_operand
36
- operation.operand.optimize
37
- end
32
+ # Test if the operand is an Order
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ # @api private
37
+ def optimizable?
38
+ operand.kind_of?(Veritas::Relation::Operation::Order)
39
+ end
40
+
41
+ # Drop the Order and wrap the operand
42
+ #
43
+ # @return [Order]
44
+ #
45
+ # @api private
46
+ def optimize
47
+ wrap_operand
48
+ end
49
+
50
+ end # module OrderOperand
51
+
52
+ # Optimize when the header is not changed
53
+ class UnchangedHeader < self
54
+
55
+ # Test if the operation header are the same as the operand's
56
+ #
57
+ # @return [Boolean]
58
+ #
59
+ # @api private
60
+ def optimizable?
61
+ header == operand.header
62
+ end
63
+
64
+ # A Projection, Rename or Extension with an unchanged header is a noop
65
+ #
66
+ # @return [Relation]
67
+ #
68
+ # @api private
69
+ def optimize
70
+ operand
71
+ end
72
+
73
+ end # class UnchangedHeader
38
74
 
39
75
  # Optimize when the operand is Empty
40
76
  class EmptyOperand < self
@@ -81,6 +117,7 @@ module Veritas
81
117
  end
82
118
 
83
119
  end # class MaterializedOperand
120
+
84
121
  end # class Unary
85
122
  end # module Operation
86
123
  end # module Relation
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Veritas
4
4
  class Optimizer
5
- VERSION = '0.0.3'
5
+ VERSION = '0.0.4'
6
6
  end # class Optimizer
7
7
  end # module Veritas