veritas-optimizer 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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
data/.gemtest ADDED
File without changes
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use @$(basename `pwd`) --create
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ bundler_args: --without guard metrics
2
+ script: "bundle exec rake spec"
3
+ rvm:
4
+ - ree
5
+ - 1.8.7
6
+ - 1.9.2
7
+ - ruby-head
8
+ - rbx
data/Gemfile CHANGED
@@ -1,23 +1,33 @@
1
+ # encoding: utf-8
2
+
1
3
  source :rubygems
2
4
 
3
- gem 'veritas', '0.0.3', :git => 'git://github.com/dkubb/veritas.git'
5
+ gem 'veritas', '0.0.4', :git => 'git://github.com/dkubb/veritas.git'
4
6
 
5
7
  group :development do
6
- gem 'backports', '~> 2.1.0'
7
- gem 'jeweler', '~> 1.5.2'
8
- gem 'rake', '~> 0.8.7'
8
+ gem 'backports', '~> 2.2.1'
9
+ gem 'jeweler', '~> 1.6.0'
10
+ gem 'rake', '~> 0.9.0'
9
11
  gem 'rspec', '~> 1.3.2'
10
- gem 'yard', '~> 0.6.8'
12
+ gem 'yard', '~> 0.7.1'
13
+ end
14
+
15
+ group :guard do
16
+ gem 'growl', '~> 1.0.3'
17
+ gem 'guard', '~> 0.3.4'
18
+ gem 'guard-bundler', '~> 0.1.3'
19
+ gem 'guard-ego', '~> 0.0.1'
20
+ gem 'guard-rspec', '~> 0.3.1'
11
21
  end
12
22
 
13
- group :jruby do
14
- platform :jruby do
15
- gem 'jruby-openssl', '~> 0.7.3'
23
+ platform :jruby do
24
+ group :jruby do
25
+ gem 'jruby-openssl', '~> 0.7.4'
16
26
  end
17
27
  end
18
28
 
19
29
  platforms :mri_18 do
20
- group :quality do
30
+ group :metrics do
21
31
  gem 'flay', '~> 1.4.2'
22
32
  gem 'flog', '~> 2.5.1'
23
33
  gem 'heckle', '~> 1.4.3'
@@ -28,6 +38,6 @@ platforms :mri_18 do
28
38
  gem 'reek', '~> 1.2.8', :git => 'git://github.com/dkubb/reek.git'
29
39
  gem 'roodi', '~> 2.1.0'
30
40
  gem 'ruby2ruby', '= 1.2.2'
31
- gem 'yardstick', '~> 0.3.0'
41
+ gem 'yardstick', '~> 0.4.0'
32
42
  end
33
43
  end
data/Guardfile ADDED
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ guard 'ego' do
4
+ watch('Guardfile')
5
+ end
6
+
7
+ guard 'bundler' do
8
+ watch('Gemfile')
9
+ end
10
+
11
+ guard 'rspec' do
12
+ # run all specs if the spec_helper or supporting files files are modified
13
+ watch('spec/spec_helper.rb') { 'spec' }
14
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
15
+
16
+ # run unit specs if associated lib code is modified
17
+ watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}"] }
18
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
19
+
20
+ # run a spec if it is modified
21
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
22
+ end
data/README.rdoc CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Relational algebra optimizer
4
4
 
5
+ http://travis-ci.org/dkubb/veritas-optimizer.png
6
+
5
7
  == Note on Patches/Pull Requests
6
8
 
7
9
  * If you want your code merged into the mainline, please discuss
data/Rakefile CHANGED
@@ -1,9 +1,11 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rake'
2
4
 
3
5
  require File.expand_path('../lib/veritas/optimizer/version', __FILE__)
4
6
 
5
7
  begin
6
- gem('jeweler', '~> 1.5.2') if respond_to?(:gem, true)
8
+ gem('jeweler', '~> 1.6.0') if respond_to?(:gem, true)
7
9
  require 'jeweler'
8
10
 
9
11
  Jeweler::Tasks.new do |gem|
@@ -21,5 +23,5 @@ begin
21
23
 
22
24
  FileList['tasks/**/*.rake'].each { |task| import task }
23
25
  rescue LoadError
24
- puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.5.2'
26
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.6.0'
25
27
  end
data/TODO CHANGED
@@ -1,7 +1,32 @@
1
+ * All relations, even optimized ones, need to hold a reference to the
2
+ original (possibly optimized) operations.
3
+ * Especially "empty" relations should hold a reference to the original
4
+ relation so that insert/update can be performed on them if they are
5
+ empty not because they are valid, but because the source object is empty
6
+ * Materialized relations will need references to the original objects.
7
+
8
+ * Optimization can replace one or more AST nodes with a simpler/more efficient
9
+ structure as long as it is lossless. Just changing it to empty or
10
+ materialized, the way things are now, we lose what the original relation
11
+ was so it becomes impossible to insert/update/delete from those relations.
12
+ * A write to a materialized object should first propagate the write down
13
+ to the @operand, allowing it to raise exceptions if it's read*only,
14
+ then it should make the change in the materialized object.
15
+
1
16
  * Add further optimizations:
2
17
  * Projection
3
- * When it contains a Rename, if the renamed attributes are projected
4
- away, then the rename can be removed.
18
+ * When it contains a Rename, if the renamed attributes are removed,
19
+ then the rename can be removed.
20
+ * When it contains a Restriction, if the removed attributes are *not*
21
+ used in the predicate, then move the Restriction to contain the
22
+ Projection.
23
+ * When renames or extensions or summarizations are projected away and
24
+ not used in any intermediary operation, then they can be dropped
25
+ altogether. There's no point in going through all that work to
26
+ not bother using an attribute at all. It would be better to simplify
27
+ the renames/extensions/summarizations to not add the attribute, and
28
+ then call optimize again on the op to potentially remove the op altogether
29
+ (like in the case of an extension adding one attribute that is removed).
5
30
  * Operation Order:
6
31
  * Projection containing an Order
7
32
  * Should remove the Order, since it is a noop
@@ -73,3 +98,19 @@
73
98
  * Limit with a limit >= 1 can be factored out
74
99
  * Offset with an offset > 0 can be transformed into an empty
75
100
  relation, since at most there can be only one match.
101
+
102
+ * Summarization
103
+ * Add OrderSummarizePer for factoring out Order objects inside a Summarization
104
+ * When there are no aggregate functions, drop the Summarization and
105
+ return the summarize_per (?)
106
+ * Use the UnchangedHeader optimizer as a base class
107
+ * When summarize_per is TABLE_DEE, and it is wrapped by Order, at most only
108
+ one row can be returned, so Order can probably be dropped.
109
+ * Consider making relations that represents a 0 or 1 tuple relations
110
+ and use them in this case.
111
+
112
+ * Projection
113
+ * It does not distribute over Intersection or Difference, but see if
114
+ perhaps an exception can be made if there is a functional dependency
115
+ between the columns projected away and the one remaining. Then I *think*
116
+ it might still work, but more research will be needed.
data/config/flay.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  ---
2
- threshold: 131
3
- total_score: 905
2
+ threshold: 126
3
+ total_score: 870
data/config/flog.yml CHANGED
@@ -1,2 +1,2 @@
1
1
  ---
2
- threshold: 12.4
2
+ threshold: 11.6
data/config/roodi.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  ---
2
- AbcMetricMethodCheck: { score: 7.3 }
2
+ AbcMetricMethodCheck: { score: 8.6 }
3
3
  AssignmentInConditionalCheck: { }
4
4
  CaseMissingElseCheck: { }
5
- ClassLineCountCheck: { line_count: 390 }
5
+ ClassLineCountCheck: { line_count: 396 }
6
6
  ClassNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
7
7
  ClassVariableCheck: { }
8
8
  CyclomaticComplexityBlockCheck: { complexity: 2 }
@@ -10,7 +10,7 @@ CyclomaticComplexityMethodCheck: { complexity: 6 }
10
10
  EmptyRescueBodyCheck: { }
11
11
  ForLoopCheck: { }
12
12
  MethodLineCountCheck: { line_count: 9 }
13
- MethodNameCheck: { pattern: !ruby/regexp /\A(?:[a-z](?:_?[a-z])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/ }
14
- ModuleLineCountCheck: { line_count: 392 }
13
+ MethodNameCheck: { pattern: !ruby/regexp /\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|[+*&|-])\z/ }
14
+ ModuleLineCountCheck: { line_count: 398 }
15
15
  ModuleNameCheck: { pattern: !ruby/regexp /\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/ }
16
16
  ParameterNumberCheck: { parameter_count: 3 }
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Count optimizations
8
+ class Count < self
9
+
10
+ Veritas::Aggregate::Count.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Count
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Maximum optimizations
8
+ class Maximum < self
9
+
10
+ Veritas::Aggregate::Maximum.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Maximum
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Mean optimizations
8
+ class Mean < self
9
+
10
+ Veritas::Aggregate::Mean.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Mean
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Minimum optimizations
8
+ class Minimum < self
9
+
10
+ Veritas::Aggregate::Minimum.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Minimum
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing StandardDeviation optimizations
8
+ class StandardDeviation < self
9
+
10
+ Veritas::Aggregate::StandardDeviation.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class StandardDeviation
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Sum optimizations
8
+ class Sum < self
9
+
10
+ Veritas::Aggregate::Sum.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Sum
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Variance optimizations
8
+ class Variance < self
9
+
10
+ Veritas::Aggregate::Variance.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Variance
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Veritas
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+
6
+ # Abstract base class representing Aggregate optimizations
7
+ class Aggregate < Optimizer
8
+ include AbstractClass, Function::Unary
9
+
10
+ # Optimize when the operands are unoptimized
11
+ class UnoptimizedOperand < self
12
+ include Function::Unary::UnoptimizedOperand
13
+ end # class UnoptimizedOperand
14
+ end # class Aggregate
15
+ end # class Optimizer
16
+ end # module Veritas
@@ -56,8 +56,10 @@ module Veritas
56
56
  EqualOperands,
57
57
  EmptyLeft,
58
58
  EmptyRight,
59
+ LeftOrderOperand,
60
+ RightOrderOperand,
59
61
  MaterializedOperand,
60
- UnoptimizedOperand
62
+ UnoptimizedOperands
61
63
  )
62
64
 
63
65
  end # class Difference
@@ -7,8 +7,51 @@ module Veritas
7
7
  # Abstract base class representing Extension optimizations
8
8
  class Extension < Relation::Operation::Unary
9
9
 
10
+ # The optimized extensions
11
+ #
12
+ # @return [Hash{Attribute => Function}]
13
+ #
14
+ # @api private
15
+ attr_reader :extensions
16
+
17
+ # Initialize a Summarization optimizer
18
+ #
19
+ # @return [undefined]
20
+ #
21
+ # @api private
22
+ def initialize(*)
23
+ super
24
+ @extensions = optimize_extensions
25
+ end
26
+
27
+ private
28
+
29
+ # Optimize the extensions
30
+ #
31
+ # @return [Hash{Attribute => Function}]
32
+ #
33
+ # @api private
34
+ def optimize_extensions
35
+ Function.optimize_functions(operation.extensions)
36
+ end
37
+
38
+ # Wrap the operand's operand in an Extension
39
+ #
40
+ # @return [Extension]
41
+ #
42
+ # @api private
43
+ def wrap_operand(operand = operand.operand)
44
+ operation.class.new(operand, extensions)
45
+ end
46
+
47
+ # Optimize when the operand is an Order
48
+ class OrderOperand < self
49
+ include Relation::Operation::Unary::OrderOperand
50
+ end # class OrderOperand
51
+
10
52
  # Optimize when operands are optimizable
11
53
  class UnoptimizedOperand < self
54
+ include Function::Unary::UnoptimizedOperand
12
55
 
13
56
  # Test if the operand is unoptimized
14
57
  #
@@ -16,7 +59,7 @@ module Veritas
16
59
  #
17
60
  # @api private
18
61
  def optimizable?
19
- !operand.equal?(operation.operand)
62
+ super || extensions_optimizable?
20
63
  end
21
64
 
22
65
  # Return an Extension with an optimized operand
@@ -25,14 +68,26 @@ module Veritas
25
68
  #
26
69
  # @api private
27
70
  def optimize
28
- operation = self.operation
29
- operation.class.new(operand, operation.extensions)
71
+ wrap_operand(operand)
72
+ end
73
+
74
+ private
75
+
76
+ # Test if the extensions are optimizable
77
+ #
78
+ # @return [Boolean]
79
+ #
80
+ # @api private
81
+ def extensions_optimizable?
82
+ !extensions.eql?(operation.extensions)
30
83
  end
31
84
 
32
85
  end # class UnoptimizedOperand
33
86
 
34
87
  Veritas::Algebra::Extension.optimizer = chain(
88
+ UnchangedHeader,
35
89
  MaterializedOperand,
90
+ OrderOperand,
36
91
  UnoptimizedOperand
37
92
  )
38
93
 
@@ -56,8 +56,10 @@ module Veritas
56
56
  EqualOperands,
57
57
  EmptyLeft,
58
58
  EmptyRight,
59
+ LeftOrderOperand,
60
+ RightOrderOperand,
59
61
  MaterializedOperand,
60
- UnoptimizedOperand
62
+ UnoptimizedOperands
61
63
  )
62
64
 
63
65
  end # class Intersection
@@ -7,10 +7,10 @@ module Veritas
7
7
  # Abstract base class representing Join optimizations
8
8
  class Join < Relation::Operation::Combination
9
9
 
10
- # Optimize when operand headers are equivalent
10
+ # Optimize when operands' headers are equal
11
11
  class EqualHeaders < self
12
12
 
13
- # Test if the operands' headers are equal
13
+ # Test if the operands' headers are equal to the join's headers
14
14
  #
15
15
  # @return [Boolean]
16
16
  #
@@ -19,7 +19,7 @@ module Veritas
19
19
  left.header.eql?(right.header)
20
20
  end
21
21
 
22
- # A Join with equal headers is an Intersection
22
+ # A Join with an equal header is an Intersection
23
23
  #
24
24
  # @return [Algebra::Intersection]
25
25
  #
@@ -34,8 +34,10 @@ module Veritas
34
34
  EmptyLeft,
35
35
  EmptyRight,
36
36
  EqualHeaders,
37
+ LeftOrderOperand,
38
+ RightOrderOperand,
37
39
  MaterializedOperand,
38
- UnoptimizedOperand
40
+ UnoptimizedOperands
39
41
  )
40
42
 
41
43
  end # class Join
@@ -60,8 +60,10 @@ module Veritas
60
60
  TableDeeRight,
61
61
  EmptyLeft,
62
62
  EmptyRight,
63
+ LeftOrderOperand,
64
+ RightOrderOperand,
63
65
  MaterializedOperand,
64
- UnoptimizedOperand
66
+ UnoptimizedOperands
65
67
  )
66
68
 
67
69
  end # class Product
@@ -7,46 +7,17 @@ module Veritas
7
7
  # Abstract base class representing Projection optimizations
8
8
  class Projection < Relation::Operation::Unary
9
9
 
10
- # The projected header
11
- #
12
- # @return [Header]
13
- #
14
- # @api private
15
- attr_reader :header
10
+ private
16
11
 
17
- # Initialize an Projection optimizer
12
+ # Wrap the operand's operand in a Projection
18
13
  #
19
- # @return [undefined]
14
+ # @return [Projection]
20
15
  #
21
16
  # @api private
22
- def initialize(*)
23
- super
24
- @header = operation.header
17
+ def wrap_operand(operand = operand.operand)
18
+ operation.class.new(operand, header)
25
19
  end
26
20
 
27
- # Optimize when the headers are not changed
28
- class UnchangedHeader < self
29
-
30
- # Test if the projected headers are the same as the operand's
31
- #
32
- # @return [Boolean]
33
- #
34
- # @api private
35
- def optimizable?
36
- header.to_a == operand.header.to_a
37
- end
38
-
39
- # A Projection with unchanged headers is a noop
40
- #
41
- # @return [Relation]
42
- #
43
- # @api private
44
- def optimize
45
- operand
46
- end
47
-
48
- end # class UnchangedHeader
49
-
50
21
  # Optimize when the operand is a Projection
51
22
  class ProjectionOperand < self
52
23
 
@@ -65,24 +36,24 @@ module Veritas
65
36
  #
66
37
  # @api private
67
38
  def optimize
68
- operation.class.new(operand.operand, header)
39
+ wrap_operand
69
40
  end
70
41
 
71
42
  end # class ProjectionOperand
72
43
 
73
- # Optimize when the operand is a Set
74
- class SetOperand < self
44
+ # Optimize when the operand is a Union
45
+ class UnionOperand < self
75
46
 
76
- # Test if the operand is a Set
47
+ # Test if the operand is a Union
77
48
  #
78
49
  # @return [Boolean]
79
50
  #
80
51
  # @api private
81
52
  def optimizable?
82
- operand.kind_of?(Veritas::Relation::Operation::Set)
53
+ operand.kind_of?(Veritas::Algebra::Union)
83
54
  end
84
55
 
85
- # Wrap each operand in the Set in a Projection
56
+ # Wrap each operand in the Union in a Projection
86
57
  #
87
58
  # @return [Set]
88
59
  #
@@ -99,7 +70,7 @@ module Veritas
99
70
  #
100
71
  # @api private
101
72
  def wrap_left
102
- operation.class.new(operand.left, header)
73
+ wrap_operand(operand.left)
103
74
  end
104
75
 
105
76
  # Utility method to wrap the right operand in a Projection
@@ -108,10 +79,15 @@ module Veritas
108
79
  #
109
80
  # @api private
110
81
  def wrap_right
111
- operation.class.new(operand.right, header)
82
+ wrap_operand(operand.right)
112
83
  end
113
84
 
114
- end # class SetOperand
85
+ end # class UnionOperand
86
+
87
+ # Optimize when the operand is an Order
88
+ class OrderOperand < self
89
+ include Relation::Operation::Unary::OrderOperand
90
+ end # class OrderOperand
115
91
 
116
92
  # Optimize when the operand is Empty
117
93
  class EmptyOperand < self
@@ -138,15 +114,7 @@ module Veritas
138
114
 
139
115
  # Optimize when operand is optimizable
140
116
  class UnoptimizedOperand < self
141
-
142
- # Test if the operand is unoptimized
143
- #
144
- # @return [Boolean]
145
- #
146
- # @api private
147
- def optimizable?
148
- !operand.equal?(operation.operand)
149
- end
117
+ include Function::Unary::UnoptimizedOperand
150
118
 
151
119
  # Return a Projection with an optimized operand
152
120
  #
@@ -154,7 +122,7 @@ module Veritas
154
122
  #
155
123
  # @api private
156
124
  def optimize
157
- operation.class.new(operand, header)
125
+ wrap_operand(operand)
158
126
  end
159
127
 
160
128
  end # class UnoptimizedOperand
@@ -162,7 +130,8 @@ module Veritas
162
130
  Veritas::Algebra::Projection.optimizer = chain(
163
131
  UnchangedHeader,
164
132
  ProjectionOperand,
165
- SetOperand,
133
+ UnionOperand,
134
+ OrderOperand,
166
135
  EmptyOperand,
167
136
  MaterializedOperand,
168
137
  UnoptimizedOperand