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
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