axiom-optimizer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +37 -0
  4. data/.rspec +4 -0
  5. data/.rvmrc +1 -0
  6. data/.travis.yml +35 -0
  7. data/CONTRIBUTING.md +11 -0
  8. data/Gemfile +10 -0
  9. data/Gemfile.devtools +57 -0
  10. data/Guardfile +23 -0
  11. data/LICENSE +20 -0
  12. data/README.md +111 -0
  13. data/Rakefile +5 -0
  14. data/TODO +144 -0
  15. data/axiom-optimizer.gemspec +25 -0
  16. data/config/flay.yml +3 -0
  17. data/config/flog.yml +2 -0
  18. data/config/mutant.yml +3 -0
  19. data/config/reek.yml +162 -0
  20. data/config/roodi.yml +16 -0
  21. data/config/yardstick.yml +2 -0
  22. data/lib/axiom-optimizer.rb +3 -0
  23. data/lib/axiom/optimizer.rb +168 -0
  24. data/lib/axiom/optimizer/aggregate.rb +16 -0
  25. data/lib/axiom/optimizer/aggregate/count.rb +17 -0
  26. data/lib/axiom/optimizer/aggregate/maximum.rb +17 -0
  27. data/lib/axiom/optimizer/aggregate/mean.rb +17 -0
  28. data/lib/axiom/optimizer/aggregate/minimum.rb +17 -0
  29. data/lib/axiom/optimizer/aggregate/standard_deviation.rb +17 -0
  30. data/lib/axiom/optimizer/aggregate/sum.rb +17 -0
  31. data/lib/axiom/optimizer/aggregate/variance.rb +17 -0
  32. data/lib/axiom/optimizer/algebra/difference.rb +68 -0
  33. data/lib/axiom/optimizer/algebra/extension.rb +97 -0
  34. data/lib/axiom/optimizer/algebra/intersection.rb +68 -0
  35. data/lib/axiom/optimizer/algebra/join.rb +184 -0
  36. data/lib/axiom/optimizer/algebra/product.rb +70 -0
  37. data/lib/axiom/optimizer/algebra/projection.rb +212 -0
  38. data/lib/axiom/optimizer/algebra/rename.rb +381 -0
  39. data/lib/axiom/optimizer/algebra/restriction.rb +373 -0
  40. data/lib/axiom/optimizer/algebra/summarization.rb +200 -0
  41. data/lib/axiom/optimizer/algebra/union.rb +68 -0
  42. data/lib/axiom/optimizer/function.rb +87 -0
  43. data/lib/axiom/optimizer/function/binary.rb +124 -0
  44. data/lib/axiom/optimizer/function/connective/binary.rb +245 -0
  45. data/lib/axiom/optimizer/function/connective/conjunction.rb +122 -0
  46. data/lib/axiom/optimizer/function/connective/disjunction.rb +122 -0
  47. data/lib/axiom/optimizer/function/connective/negation.rb +65 -0
  48. data/lib/axiom/optimizer/function/numeric.rb +34 -0
  49. data/lib/axiom/optimizer/function/numeric/absolute.rb +20 -0
  50. data/lib/axiom/optimizer/function/numeric/addition.rb +20 -0
  51. data/lib/axiom/optimizer/function/numeric/division.rb +20 -0
  52. data/lib/axiom/optimizer/function/numeric/exponentiation.rb +20 -0
  53. data/lib/axiom/optimizer/function/numeric/modulo.rb +20 -0
  54. data/lib/axiom/optimizer/function/numeric/multiplication.rb +20 -0
  55. data/lib/axiom/optimizer/function/numeric/square_root.rb +20 -0
  56. data/lib/axiom/optimizer/function/numeric/subtraction.rb +20 -0
  57. data/lib/axiom/optimizer/function/numeric/unary_minus.rb +20 -0
  58. data/lib/axiom/optimizer/function/numeric/unary_plus.rb +20 -0
  59. data/lib/axiom/optimizer/function/predicate.rb +61 -0
  60. data/lib/axiom/optimizer/function/predicate/comparable.rb +144 -0
  61. data/lib/axiom/optimizer/function/predicate/enumerable.rb +138 -0
  62. data/lib/axiom/optimizer/function/predicate/equality.rb +44 -0
  63. data/lib/axiom/optimizer/function/predicate/exclusion.rb +43 -0
  64. data/lib/axiom/optimizer/function/predicate/greater_than.rb +55 -0
  65. data/lib/axiom/optimizer/function/predicate/greater_than_or_equal_to.rb +55 -0
  66. data/lib/axiom/optimizer/function/predicate/inclusion.rb +43 -0
  67. data/lib/axiom/optimizer/function/predicate/inequality.rb +44 -0
  68. data/lib/axiom/optimizer/function/predicate/less_than.rb +55 -0
  69. data/lib/axiom/optimizer/function/predicate/less_than_or_equal_to.rb +55 -0
  70. data/lib/axiom/optimizer/function/predicate/match.rb +20 -0
  71. data/lib/axiom/optimizer/function/predicate/no_match.rb +20 -0
  72. data/lib/axiom/optimizer/function/string/length.rb +31 -0
  73. data/lib/axiom/optimizer/function/unary.rb +86 -0
  74. data/lib/axiom/optimizer/optimizable.rb +60 -0
  75. data/lib/axiom/optimizer/relation/materialized.rb +40 -0
  76. data/lib/axiom/optimizer/relation/operation/binary.rb +134 -0
  77. data/lib/axiom/optimizer/relation/operation/combination.rb +33 -0
  78. data/lib/axiom/optimizer/relation/operation/deletion.rb +20 -0
  79. data/lib/axiom/optimizer/relation/operation/insertion.rb +20 -0
  80. data/lib/axiom/optimizer/relation/operation/limit.rb +141 -0
  81. data/lib/axiom/optimizer/relation/operation/offset.rb +106 -0
  82. data/lib/axiom/optimizer/relation/operation/order.rb +85 -0
  83. data/lib/axiom/optimizer/relation/operation/reverse.rb +85 -0
  84. data/lib/axiom/optimizer/relation/operation/unary.rb +124 -0
  85. data/lib/axiom/optimizer/support/predicate_partition.rb +184 -0
  86. data/lib/axiom/optimizer/version.rb +10 -0
  87. data/spec/integration/axiom/algebra/difference/optimize_spec.rb +160 -0
  88. data/spec/integration/axiom/algebra/intersection/optimize_spec.rb +160 -0
  89. data/spec/integration/axiom/algebra/join/optimize_spec.rb +112 -0
  90. data/spec/integration/axiom/algebra/product/optimize_spec.rb +178 -0
  91. data/spec/integration/axiom/algebra/projection/optimize_spec.rb +250 -0
  92. data/spec/integration/axiom/algebra/rename/optimize_spec.rb +442 -0
  93. data/spec/integration/axiom/algebra/restriction/optimize_spec.rb +218 -0
  94. data/spec/integration/axiom/algebra/summarization/optimize_spec.rb +49 -0
  95. data/spec/integration/axiom/algebra/union/optimize_spec.rb +200 -0
  96. data/spec/integration/axiom/function/connective/conjunction/optimize_spec.rb +236 -0
  97. data/spec/integration/axiom/function/connective/disjunction/optimize_spec.rb +237 -0
  98. data/spec/integration/axiom/function/connective/negation/optimize_spec.rb +43 -0
  99. data/spec/integration/axiom/function/optimize_spec.rb +30 -0
  100. data/spec/integration/axiom/function/predicate/equality/optimize_spec.rb +92 -0
  101. data/spec/integration/axiom/function/predicate/exclusion/optimize_spec.rb +133 -0
  102. data/spec/integration/axiom/function/predicate/greater_than/optimize_spec.rb +102 -0
  103. data/spec/integration/axiom/function/predicate/greater_than_or_equal_to/optimize_spec.rb +102 -0
  104. data/spec/integration/axiom/function/predicate/inclusion/optimize_spec.rb +133 -0
  105. data/spec/integration/axiom/function/predicate/inequality/optimize_spec.rb +92 -0
  106. data/spec/integration/axiom/function/predicate/less_than/optimize_spec.rb +102 -0
  107. data/spec/integration/axiom/function/predicate/less_than_or_equal_to/optimize_spec.rb +102 -0
  108. data/spec/integration/axiom/relation/empty/optimize_spec.rb +13 -0
  109. data/spec/integration/axiom/relation/materialized/optimize_spec.rb +29 -0
  110. data/spec/integration/axiom/relation/operation/limit/optimize_spec.rb +142 -0
  111. data/spec/integration/axiom/relation/operation/offset/optimize_spec.rb +100 -0
  112. data/spec/integration/axiom/relation/operation/order/optimize_spec.rb +105 -0
  113. data/spec/integration/axiom/relation/operation/reverse/optimize_spec.rb +115 -0
  114. data/spec/integration/axiom/relation/optimize_spec.rb +23 -0
  115. data/spec/rcov.opts +7 -0
  116. data/spec/shared/function_connective_binary_optimize_behavior.rb +102 -0
  117. data/spec/shared/optimize_method_behavior.rb +16 -0
  118. data/spec/spec_helper.rb +38 -0
  119. data/spec/support/add_method_missing.rb +15 -0
  120. data/spec/support/config_alias.rb +3 -0
  121. data/spec/support/ice_nine_config.rb +6 -0
  122. data/spec/support/lazy_enumerable.rb +18 -0
  123. data/spec/unit/axiom/optimizer/algebra/difference/empty_left/optimize_spec.rb +19 -0
  124. data/spec/unit/axiom/optimizer/algebra/difference/empty_right/optimize_spec.rb +19 -0
  125. data/spec/unit/axiom/optimizer/algebra/difference/equal_operands/optimize_spec.rb +23 -0
  126. data/spec/unit/axiom/optimizer/algebra/extension/extensions_spec.rb +31 -0
  127. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimizable_predicate_spec.rb +23 -0
  128. data/spec/unit/axiom/optimizer/algebra/extension/order_operand/optimize_spec.rb +22 -0
  129. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimizable_predicate_spec.rb +37 -0
  130. data/spec/unit/axiom/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +27 -0
  131. data/spec/unit/axiom/optimizer/algebra/intersection/empty_left/optimize_spec.rb +19 -0
  132. data/spec/unit/axiom/optimizer/algebra/intersection/empty_right/optimize_spec.rb +19 -0
  133. data/spec/unit/axiom/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +19 -0
  134. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimizable_predicate_spec.rb +29 -0
  135. data/spec/unit/axiom/optimizer/algebra/join/disjoint_headers/optimize_spec.rb +22 -0
  136. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimizable_predicate_spec.rb +29 -0
  137. data/spec/unit/axiom/optimizer/algebra/join/equal_headers/optimize_spec.rb +23 -0
  138. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimizable_predicate_spec.rb +42 -0
  139. data/spec/unit/axiom/optimizer/algebra/join/materialized_left/optimize_spec.rb +55 -0
  140. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimizable_predicate_spec.rb +42 -0
  141. data/spec/unit/axiom/optimizer/algebra/join/materialized_right/optimize_spec.rb +55 -0
  142. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimizable_predicate_spec.rb +27 -0
  143. data/spec/unit/axiom/optimizer/algebra/product/table_dee_left/optimize_spec.rb +18 -0
  144. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimizable_predicate_spec.rb +27 -0
  145. data/spec/unit/axiom/optimizer/algebra/product/table_dee_right/optimize_spec.rb +18 -0
  146. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimizable_predicate_spec.rb +27 -0
  147. data/spec/unit/axiom/optimizer/algebra/projection/empty_operand/optimize_spec.rb +22 -0
  148. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimizable_predicate_spec.rb +35 -0
  149. data/spec/unit/axiom/optimizer/algebra/projection/extension_operand/optimize_spec.rb +22 -0
  150. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimizable_predicate_spec.rb +28 -0
  151. data/spec/unit/axiom/optimizer/algebra/projection/projection_operand/optimize_spec.rb +22 -0
  152. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimizable_predicate_spec.rb +29 -0
  153. data/spec/unit/axiom/optimizer/algebra/projection/union_operand/optimize_spec.rb +25 -0
  154. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  155. data/spec/unit/axiom/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +22 -0
  156. data/spec/unit/axiom/optimizer/algebra/rename/aliases_spec.rb +23 -0
  157. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimizable_predicate_spec.rb +27 -0
  158. data/spec/unit/axiom/optimizer/algebra/rename/empty_operand/optimize_spec.rb +21 -0
  159. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimizable_predicate_spec.rb +28 -0
  160. data/spec/unit/axiom/optimizer/algebra/rename/limit_operand/optimize_spec.rb +23 -0
  161. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimizable_predicate_spec.rb +28 -0
  162. data/spec/unit/axiom/optimizer/algebra/rename/offset_operand/optimize_spec.rb +23 -0
  163. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimizable_predicate_spec.rb +28 -0
  164. data/spec/unit/axiom/optimizer/algebra/rename/order_operand/optimize_spec.rb +22 -0
  165. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimizable_predicate_spec.rb +43 -0
  166. data/spec/unit/axiom/optimizer/algebra/rename/projection_operand/optimize_spec.rb +22 -0
  167. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimizable_predicate_spec.rb +30 -0
  168. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand/optimize_spec.rb +22 -0
  169. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_predicate_spec.rb +37 -0
  170. data/spec/unit/axiom/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +18 -0
  171. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimizable_predicate_spec.rb +29 -0
  172. data/spec/unit/axiom/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +23 -0
  173. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimizable_predicate_spec.rb +27 -0
  174. data/spec/unit/axiom/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +23 -0
  175. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimizable_predicate_spec.rb +29 -0
  176. data/spec/unit/axiom/optimizer/algebra/rename/set_operand/optimize_spec.rb +23 -0
  177. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimizable_predicate_spec.rb +29 -0
  178. data/spec/unit/axiom/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +23 -0
  179. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimizable_predicate_spec.rb +41 -0
  180. data/spec/unit/axiom/optimizer/algebra/restriction/combination_operand/optimize_spec.rb +35 -0
  181. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimizable_predicate_spec.rb +46 -0
  182. data/spec/unit/axiom/optimizer/algebra/restriction/contradiction/optimize_spec.rb +23 -0
  183. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimizable_predicate_spec.rb +51 -0
  184. data/spec/unit/axiom/optimizer/algebra/restriction/join_operand/optimize_spec.rb +48 -0
  185. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimizable_predicate_spec.rb +28 -0
  186. data/spec/unit/axiom/optimizer/algebra/restriction/order_operand/optimize_spec.rb +22 -0
  187. data/spec/unit/axiom/optimizer/algebra/restriction/predicate_spec.rb +18 -0
  188. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimizable_predicate_spec.rb +44 -0
  189. data/spec/unit/axiom/optimizer/algebra/restriction/product_operand/optimize_spec.rb +48 -0
  190. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimizable_predicate_spec.rb +30 -0
  191. data/spec/unit/axiom/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +24 -0
  192. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimizable_predicate_spec.rb +30 -0
  193. data/spec/unit/axiom/optimizer/algebra/restriction/set_operand/optimize_spec.rb +24 -0
  194. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimizable_predicate_spec.rb +33 -0
  195. data/spec/unit/axiom/optimizer/algebra/restriction/tautology/optimize_spec.rb +19 -0
  196. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimizable_predicate_spec.rb +44 -0
  197. data/spec/unit/axiom/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +24 -0
  198. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/class_methods/extension_default_spec.rb +22 -0
  199. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimizable_predicate_spec.rb +29 -0
  200. data/spec/unit/axiom/optimizer/algebra/summarization/empty_operand/optimize_spec.rb +47 -0
  201. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimizable_predicate_spec.rb +29 -0
  202. data/spec/unit/axiom/optimizer/algebra/summarization/empty_summarize_per/optimize_spec.rb +25 -0
  203. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimizable_predicate_spec.rb +23 -0
  204. data/spec/unit/axiom/optimizer/algebra/summarization/order_operand/optimize_spec.rb +22 -0
  205. data/spec/unit/axiom/optimizer/algebra/summarization/summarize_per_spec.rb +29 -0
  206. data/spec/unit/axiom/optimizer/algebra/summarization/summarizers_spec.rb +31 -0
  207. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimizable_predicate_spec.rb +49 -0
  208. data/spec/unit/axiom/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +30 -0
  209. data/spec/unit/axiom/optimizer/algebra/union/empty_left/optimize_spec.rb +19 -0
  210. data/spec/unit/axiom/optimizer/algebra/union/empty_right/optimize_spec.rb +19 -0
  211. data/spec/unit/axiom/optimizer/algebra/union/equal_operands/optimize_spec.rb +19 -0
  212. data/spec/unit/axiom/optimizer/class_methods/chain_spec.rb +56 -0
  213. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimizable_predicate_spec.rb +36 -0
  214. data/spec/unit/axiom/optimizer/function/binary/constant_operands/optimize_spec.rb +18 -0
  215. data/spec/unit/axiom/optimizer/function/binary/left_spec.rb +28 -0
  216. data/spec/unit/axiom/optimizer/function/binary/right_spec.rb +28 -0
  217. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimizable_predicate_spec.rb +37 -0
  218. data/spec/unit/axiom/optimizer/function/binary/unoptimized_operands/optimize_spec.rb +23 -0
  219. data/spec/unit/axiom/optimizer/function/class_methods/optimize_functions_spec.rb +26 -0
  220. data/spec/unit/axiom/optimizer/function/class_methods/optimize_operand_spec.rb +22 -0
  221. data/spec/unit/axiom/optimizer/function/connective/binary/constant_operands/optimize_spec.rb +16 -0
  222. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimizable_predicate_spec.rb +29 -0
  223. data/spec/unit/axiom/optimizer/function/connective/binary/equal_operands/optimize_spec.rb +19 -0
  224. data/spec/unit/axiom/optimizer/function/connective/binary/left_spec.rb +16 -0
  225. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimizable_predicate_spec.rb +28 -0
  226. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_left/optimize_spec.rb +23 -0
  227. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimizable_predicate_spec.rb +28 -0
  228. data/spec/unit/axiom/optimizer/function/connective/binary/redundant_right/optimize_spec.rb +23 -0
  229. data/spec/unit/axiom/optimizer/function/connective/binary/right_spec.rb +16 -0
  230. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimizable_predicate_spec.rb +64 -0
  231. data/spec/unit/axiom/optimizer/function/connective/conjunction/contradiction/optimize_spec.rb +19 -0
  232. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimizable_predicate_spec.rb +61 -0
  233. data/spec/unit/axiom/optimizer/function/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +76 -0
  234. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimizable_predicate_spec.rb +29 -0
  235. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_left/optimize_spec.rb +19 -0
  236. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimizable_predicate_spec.rb +29 -0
  237. data/spec/unit/axiom/optimizer/function/connective/conjunction/tautology_right/optimize_spec.rb +19 -0
  238. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimizable_predicate_spec.rb +29 -0
  239. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_left/optimize_spec.rb +19 -0
  240. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimizable_predicate_spec.rb +29 -0
  241. data/spec/unit/axiom/optimizer/function/connective/disjunction/contradiction_right/optimize_spec.rb +19 -0
  242. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimizable_predicate_spec.rb +61 -0
  243. data/spec/unit/axiom/optimizer/function/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +76 -0
  244. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimizable_predicate_spec.rb +64 -0
  245. data/spec/unit/axiom/optimizer/function/connective/disjunction/tautology/optimize_spec.rb +19 -0
  246. data/spec/unit/axiom/optimizer/function/connective/negation/constant_operand/optimize_spec.rb +16 -0
  247. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimizable_predicate_spec.rb +28 -0
  248. data/spec/unit/axiom/optimizer/function/connective/negation/invertible_operand/optimize_spec.rb +22 -0
  249. data/spec/unit/axiom/optimizer/function/connective/negation/operand_spec.rb +14 -0
  250. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_comparable/optimizable_predicate_spec.rb +74 -0
  251. data/spec/unit/axiom/optimizer/function/predicate/comparable/never_equivalent/optimizable_predicate_spec.rb +74 -0
  252. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimizable_predicate_spec.rb +43 -0
  253. data/spec/unit/axiom/optimizer/function/predicate/comparable/normalizable_operands/optimize_spec.rb +21 -0
  254. data/spec/unit/axiom/optimizer/function/predicate/constant_operands/optimize_spec.rb +16 -0
  255. data/spec/unit/axiom/optimizer/function/predicate/contradiction/optimize_spec.rb +18 -0
  256. data/spec/unit/axiom/optimizer/function/predicate/enumerable/class_methods/sort_by_value_spec.rb +27 -0
  257. data/spec/unit/axiom/optimizer/function/predicate/enumerable/empty_right/optimizable_predicate_spec.rb +78 -0
  258. data/spec/unit/axiom/optimizer/function/predicate/enumerable/one_right/optimizable_predicate_spec.rb +78 -0
  259. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimizable_predicate_spec.rb +51 -0
  260. data/spec/unit/axiom/optimizer/function/predicate/enumerable/unoptimized_operands/optimize_spec.rb +66 -0
  261. data/spec/unit/axiom/optimizer/function/predicate/equality/tautology/optimizable_predicate_spec.rb +29 -0
  262. data/spec/unit/axiom/optimizer/function/predicate/exclusion/empty_right/optimize_spec.rb +45 -0
  263. data/spec/unit/axiom/optimizer/function/predicate/exclusion/one_right/optimize_spec.rb +65 -0
  264. data/spec/unit/axiom/optimizer/function/predicate/greater_than/contradiction/optimizable_predicate_spec.rb +43 -0
  265. data/spec/unit/axiom/optimizer/function/predicate/greater_than/tautology/optimizable_predicate_spec.rb +28 -0
  266. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  267. data/spec/unit/axiom/optimizer/function/predicate/greater_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  268. data/spec/unit/axiom/optimizer/function/predicate/inclusion/empty_right/optimize_spec.rb +45 -0
  269. data/spec/unit/axiom/optimizer/function/predicate/inclusion/one_right/optimize_spec.rb +66 -0
  270. data/spec/unit/axiom/optimizer/function/predicate/inequality/contradiction/optimizable_predicate_spec.rb +29 -0
  271. data/spec/unit/axiom/optimizer/function/predicate/less_than/contradiction/optimizable_predicate_spec.rb +43 -0
  272. data/spec/unit/axiom/optimizer/function/predicate/less_than/tautology/optimizable_predicate_spec.rb +28 -0
  273. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/contradiction/optimizable_predicate_spec.rb +43 -0
  274. data/spec/unit/axiom/optimizer/function/predicate/less_than_or_equal_to/tautology/optimizable_predicate_spec.rb +43 -0
  275. data/spec/unit/axiom/optimizer/function/predicate/tautology/optimize_spec.rb +18 -0
  276. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimizable_predicate_spec.rb +27 -0
  277. data/spec/unit/axiom/optimizer/function/unary/constant_operand/optimize_spec.rb +18 -0
  278. data/spec/unit/axiom/optimizer/function/unary/operand_spec.rb +27 -0
  279. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  280. data/spec/unit/axiom/optimizer/function/unary/unoptimized_operand/optimize_spec.rb +18 -0
  281. data/spec/unit/axiom/optimizer/function/util/class_methods/attribute_spec.rb +21 -0
  282. data/spec/unit/axiom/optimizer/function/util/class_methods/constant_spec.rb +27 -0
  283. data/spec/unit/axiom/optimizer/function/util/class_methods/max_spec.rb +27 -0
  284. data/spec/unit/axiom/optimizer/function/util/class_methods/min_spec.rb +27 -0
  285. data/spec/unit/axiom/optimizer/operation_spec.rb +13 -0
  286. data/spec/unit/axiom/optimizer/optimizable/class_methods/optimizer_spec.rb +34 -0
  287. data/spec/unit/axiom/optimizer/optimizable/optimize_spec.rb +38 -0
  288. data/spec/unit/axiom/optimizer/optimizable_predicate_spec.rb +17 -0
  289. data/spec/unit/axiom/optimizer/optimize_spec.rb +17 -0
  290. data/spec/unit/axiom/optimizer/predicate_partition/left_spec.rb +149 -0
  291. data/spec/unit/axiom/optimizer/predicate_partition/remainder_spec.rb +149 -0
  292. data/spec/unit/axiom/optimizer/predicate_partition/right_spec.rb +149 -0
  293. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimizable_predicate_spec.rb +22 -0
  294. data/spec/unit/axiom/optimizer/relation/materialized/empty_operand/optimize_spec.rb +21 -0
  295. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_left/optimizable_predicate_spec.rb +28 -0
  296. data/spec/unit/axiom/optimizer/relation/operation/binary/empty_right/optimizable_predicate_spec.rb +28 -0
  297. data/spec/unit/axiom/optimizer/relation/operation/binary/equal_operands/optimizable_predicate_spec.rb +31 -0
  298. data/spec/unit/axiom/optimizer/relation/operation/binary/left_spec.rb +15 -0
  299. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimizable_predicate_spec.rb +37 -0
  300. data/spec/unit/axiom/optimizer/relation/operation/binary/materialized_operands/optimize_spec.rb +22 -0
  301. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimizable_predicate_spec.rb +23 -0
  302. data/spec/unit/axiom/optimizer/relation/operation/binary/order_left/optimize_spec.rb +23 -0
  303. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimizable_predicate_spec.rb +23 -0
  304. data/spec/unit/axiom/optimizer/relation/operation/binary/order_right/optimize_spec.rb +23 -0
  305. data/spec/unit/axiom/optimizer/relation/operation/binary/right_spec.rb +15 -0
  306. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimizable_predicate_spec.rb +40 -0
  307. data/spec/unit/axiom/optimizer/relation/operation/binary/unoptimized_operands/optimize_spec.rb +24 -0
  308. data/spec/unit/axiom/optimizer/relation/operation/combination/optimize_spec.rb +18 -0
  309. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimizable_predicate_spec.rb +33 -0
  310. data/spec/unit/axiom/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +18 -0
  311. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimizable_predicate_spec.rb +27 -0
  312. data/spec/unit/axiom/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +35 -0
  313. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  314. data/spec/unit/axiom/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +22 -0
  315. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimizable_predicate_spec.rb +27 -0
  316. data/spec/unit/axiom/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +22 -0
  317. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimizable_predicate_spec.rb +27 -0
  318. data/spec/unit/axiom/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +21 -0
  319. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  320. data/spec/unit/axiom/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +22 -0
  321. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimizable_predicate_spec.rb +27 -0
  322. data/spec/unit/axiom/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +17 -0
  323. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimizable_predicate_spec.rb +33 -0
  324. data/spec/unit/axiom/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +18 -0
  325. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimizable_predicate_spec.rb +27 -0
  326. data/spec/unit/axiom/optimizer/relation/operation/order/order_operand/optimize_spec.rb +22 -0
  327. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimizable_predicate_spec.rb +28 -0
  328. data/spec/unit/axiom/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +23 -0
  329. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimizable_predicate_spec.rb +27 -0
  330. data/spec/unit/axiom/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +22 -0
  331. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimizable_predicate_spec.rb +27 -0
  332. data/spec/unit/axiom/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +19 -0
  333. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_predicate_spec.rb +27 -0
  334. data/spec/unit/axiom/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +24 -0
  335. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimizable_predicate_spec.rb +23 -0
  336. data/spec/unit/axiom/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +17 -0
  337. data/spec/unit/axiom/optimizer/relation/operation/unary/header_spec.rb +15 -0
  338. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimizable_predicate_spec.rb +23 -0
  339. data/spec/unit/axiom/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +20 -0
  340. data/spec/unit/axiom/optimizer/relation/operation/unary/operand_spec.rb +16 -0
  341. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimizable_predicate_spec.rb +28 -0
  342. data/spec/unit/axiom/optimizer/relation/operation/unary/order_operand/optimize_spec.rb +27 -0
  343. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimizable_predicate_spec.rb +24 -0
  344. data/spec/unit/axiom/optimizer/relation/operation/unary/unchanged_header/optimize_spec.rb +14 -0
  345. metadata +697 -0
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../lib/axiom/optimizer/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = 'axiom-optimizer'
7
+ gem.version = Axiom::Optimizer::VERSION.dup
8
+ gem.authors = ['Dan Kubb']
9
+ gem.email = 'dan.kubb@gmail.com'
10
+ gem.description = 'Optimizes axiom relations'
11
+ gem.summary = gem.description
12
+ gem.homepage = 'https://github.com/dkubb/axiom-optimizer'
13
+ gem.licenses = %w[MIT]
14
+
15
+ gem.require_paths = %w[lib]
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.test_files = `git ls-files -- spec/{unit,integration}`.split($/)
18
+ gem.extra_rdoc_files = %w[LICENSE README.md CONTRIBUTING.md TODO]
19
+
20
+ gem.add_runtime_dependency('axiom', '~> 0.1.0')
21
+
22
+ gem.add_development_dependency('rake', '~> 10.0.4')
23
+ gem.add_development_dependency('rspec', '~> 2.13.0')
24
+ gem.add_development_dependency('yard', '~> 0.8.5.2')
25
+ end
data/config/flay.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ threshold: 66
3
+ total_score: 913
data/config/flog.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 19.4
data/config/mutant.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ name: axiom-optimizer
3
+ namespace: Axiom::Optimizer
data/config/reek.yml ADDED
@@ -0,0 +1,162 @@
1
+ ---
2
+ Attribute:
3
+ enabled: true
4
+ exclude:
5
+ - Axiom::Optimizer
6
+ - Axiom::Optimizer::Algebra::Extension
7
+ - Axiom::Optimizer::Algebra::Rename
8
+ - Axiom::Optimizer::Algebra::Restriction
9
+ - Axiom::Optimizer::Algebra::Summarization
10
+ - Axiom::Optimizer::Function::Binary
11
+ - Axiom::Optimizer::Function::Unary
12
+ - Axiom::Optimizer::Optimizable::ClassMethods
13
+ - Axiom::Optimizer::PredicatePartition
14
+ - Axiom::Optimizer::Relation::Operation::Unary
15
+ BooleanParameter:
16
+ enabled: true
17
+ exclude: []
18
+ ClassVariable:
19
+ enabled: true
20
+ exclude: []
21
+ ControlParameter:
22
+ enabled: true
23
+ exclude: []
24
+ DataClump:
25
+ enabled: true
26
+ exclude: []
27
+ max_copies: 2
28
+ min_clump_size: 2
29
+ DuplicateMethodCall:
30
+ enabled: true
31
+ exclude:
32
+ - Axiom::Optimizer::Algebra::Difference::EqualOperands#optimize
33
+ - Axiom::Optimizer::Algebra::Join::MaterializedLeft#right_matching_left?
34
+ - Axiom::Optimizer::Algebra::Join::MaterializedRight#left_matching_right?
35
+ - Axiom::Optimizer::Algebra::Product::TableDeeLeft#optimizable?
36
+ - Axiom::Optimizer::Algebra::Product::TableDeeRight#optimizable?
37
+ - Axiom::Optimizer::Algebra::Projection::ExtensionOperand#optimizable?
38
+ - Axiom::Optimizer::Algebra::Rename::ProjectionOperand#removed_attributes
39
+ - Axiom::Optimizer::Algebra::Restriction::CombinationOperand#partition
40
+ - Axiom::Optimizer::Algebra::Restriction::Contradiction#optimize
41
+ - Axiom::Optimizer::Algebra::Summarization::EmptySummarizePer#optimize
42
+ - Axiom::Optimizer::Function::Connective::Binary#contradiction?
43
+ - Axiom::Optimizer::Function::Connective::Binary#contradiction?
44
+ - Axiom::Optimizer::Function::Connective::Binary#left_equality?
45
+ - Axiom::Optimizer::Function::Connective::Binary#left_inequality?
46
+ - Axiom::Optimizer::Function::Connective::Binary#right_equality?
47
+ - Axiom::Optimizer::Function::Connective::Binary#right_inequality?
48
+ - Axiom::Optimizer::Function::Connective::Binary::RedundantLeft#optimizable?
49
+ - Axiom::Optimizer::Function::Connective::Binary::RedundantRight#optimizable?
50
+ - Axiom::Optimizer::Function::Predicate::Comparable::NeverEquivalent#joinable?
51
+ - Axiom::Optimizer::Function::Predicate::Enumerable#optimize_right_range
52
+ - Axiom::Optimizer::Function::Predicate::GreaterThanOrEqualTo::Tautology#optimizable?
53
+ - Axiom::Optimizer::Function::Predicate::LessThanOrEqualTo::Tautology#optimizable?
54
+ - Axiom::Optimizer::Relation::Materialized::EmptyOperand#optimize
55
+ - Axiom::Optimizer::Relation::Operation::Combination#optimize
56
+ - Axiom::Optimizer::Relation::Operation::Limit::ZeroLimit#optimize
57
+ - Axiom::Optimizer::Relation::Operation::Order::OneLimitOperand#optimizable?
58
+ max_calls: 1
59
+ allow_calls: []
60
+ FeatureEnvy:
61
+ enabled: true
62
+ exclude: []
63
+ IrresponsibleModule:
64
+ enabled: true
65
+ exclude: []
66
+ LongParameterList:
67
+ enabled: true
68
+ exclude: []
69
+ max_params: 2
70
+ overrides:
71
+ initialize:
72
+ max_params: 3
73
+ LongYieldList:
74
+ enabled: true
75
+ exclude: []
76
+ max_params: 2
77
+ NestedIterators:
78
+ enabled: true
79
+ exclude: []
80
+ max_allowed_nesting: 1
81
+ ignore_iterators: []
82
+ NilCheck:
83
+ enabled: true
84
+ exclude:
85
+ - Axiom::Optimizer::Function::Predicate::Comparable::NeverEquivalent#nil_operand?
86
+ - Axiom::Optimizer::Function::Predicate::Enumerable::EmptyRight#right_nil?
87
+ - Axiom::Optimizer::Function::Util#self.constant?
88
+ RepeatedConditional:
89
+ enabled: true
90
+ exclude: []
91
+ max_ifs: 1
92
+ TooManyInstanceVariables:
93
+ enabled: true
94
+ exclude:
95
+ - Axiom::Optimizer::PredicatePartition
96
+ max_instance_variables: 3
97
+ TooManyMethods:
98
+ enabled: true
99
+ exclude:
100
+ - Axiom::Optimizer::Function::Connective::Binary
101
+ max_methods: 10
102
+ TooManyStatements:
103
+ enabled: true
104
+ exclude:
105
+ - Axiom::Optimizer#self.link_optimizers
106
+ - Axiom::Optimizer::Algebra::Projection::ExtensionOperand#new_extensions
107
+ - Axiom::Optimizer::Algebra::Summarization::EmptyOperand#extensions
108
+ - Axiom::Optimizer::Function#self.optimize_functions
109
+ - Axiom::Optimizer::Function::Predicate::Comparable::NeverComparable#optimizable?
110
+ - Axiom::Optimizer::Function::Predicate::Comparable::NeverEquivalent#optimizable?
111
+ - Axiom::Optimizer::Function::Predicate::Enumerable#normalized_right_enumerable
112
+ - Axiom::Optimizer::Function::Predicate::Enumerable#optimize_right
113
+ - Axiom::Optimizer::Function::Predicate::Enumerable#optimize_right_enumerable
114
+ - Axiom::Optimizer::Function::Predicate::Enumerable#optimize_right_range
115
+ - Axiom::Optimizer::Optimizable#optimize
116
+ - Axiom::Optimizer::PredicatePartition#partition!
117
+ - Axiom::Optimizer::PredicatePartition#partition_binary!
118
+ - Axiom::Optimizer::PredicatePartition#partition_proposition!
119
+ - Axiom::Optimizer::PredicatePartition#partition_unary!
120
+ max_statements: 2
121
+ UncommunicativeMethodName:
122
+ enabled: true
123
+ exclude: []
124
+ reject:
125
+ - !ruby/regexp /^[a-z]$/
126
+ - !ruby/regexp /[0-9]$/
127
+ - !ruby/regexp /[A-Z]/
128
+ accept: []
129
+ UncommunicativeModuleName:
130
+ enabled: true
131
+ exclude: []
132
+ reject:
133
+ - !ruby/regexp /^.$/
134
+ - !ruby/regexp /[0-9]$/
135
+ accept: []
136
+ UncommunicativeParameterName:
137
+ enabled: true
138
+ exclude: []
139
+ reject:
140
+ - !ruby/regexp /^.$/
141
+ - !ruby/regexp /[0-9]$/
142
+ - !ruby/regexp /[A-Z]/
143
+ accept: []
144
+ UncommunicativeVariableName:
145
+ enabled: true
146
+ exclude: []
147
+ reject:
148
+ - !ruby/regexp /^.$/
149
+ - !ruby/regexp /[0-9]$/
150
+ - !ruby/regexp /[A-Z]/
151
+ accept: []
152
+ UnusedParameters:
153
+ enabled: true
154
+ exclude: []
155
+ UtilityFunction:
156
+ enabled: true
157
+ exclude:
158
+ - Axiom::Optimizer::Function::Connective::Conjunction::Contradiction#optimize
159
+ - Axiom::Optimizer::Function::Connective::Disjunction::Tautology#optimize
160
+ - Axiom::Optimizer::Function::Predicate::Contradiction#optimize
161
+ - Axiom::Optimizer::Function::Predicate::Tautology#optimize
162
+ max_helper_calls: 0
data/config/roodi.yml ADDED
@@ -0,0 +1,16 @@
1
+ ---
2
+ AbcMetricMethodCheck: { score: 10.78 }
3
+ AssignmentInConditionalCheck: { }
4
+ CaseMissingElseCheck: { }
5
+ ClassLineCountCheck: { line_count: 396 }
6
+ ClassNameCheck: { pattern: !ruby/regexp '/\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/' }
7
+ ClassVariableCheck: { }
8
+ CyclomaticComplexityBlockCheck: { complexity: 5 }
9
+ CyclomaticComplexityMethodCheck: { complexity: 6 }
10
+ EmptyRescueBodyCheck: { }
11
+ ForLoopCheck: { }
12
+ MethodLineCountCheck: { line_count: 13 }
13
+ MethodNameCheck: { pattern: !ruby/regexp '/\A(?:[a-z\d](?:_?[a-z\d])+[?!=]?|\[\]=?|==|<=>|<<|>>[+*&|-])\z/' }
14
+ ModuleLineCountCheck: { line_count: 398 }
15
+ ModuleNameCheck: { pattern: !ruby/regexp '/\A(?:[A-Z]+|[A-Z][a-z](?:[A-Z]?[a-z])+)\z/' }
16
+ ParameterNumberCheck: { parameter_count: 3 }
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 100
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+
3
+ require 'axiom/optimizer'
@@ -0,0 +1,168 @@
1
+ # encoding: utf-8
2
+
3
+ require 'axiom'
4
+
5
+ module Axiom
6
+
7
+ # A optimization for an operation
8
+ class Optimizer
9
+ include AbstractType, Adamantium
10
+
11
+ # An optimizer that returns the operation
12
+ Identity = lambda { |operation| operation }.freeze
13
+
14
+ # The operation to optimize
15
+ #
16
+ # @return [Optimizable]
17
+ #
18
+ # @api private
19
+ attr_reader :operation
20
+
21
+ # Initialize an Optimizer
22
+ #
23
+ # @param [Optimizable] operation
24
+ # the operation to optimize
25
+ #
26
+ # @return [undefined]
27
+ #
28
+ # @api private
29
+ def initialize(operation)
30
+ @operation = operation
31
+ end
32
+
33
+ # Abstract method that tests if the optimization should be applied
34
+ #
35
+ # @example
36
+ # optimizer.optimizable? # => true or false
37
+ #
38
+ # @return [Boolean]
39
+ #
40
+ # @api public
41
+ def optimizable?
42
+ raise NotImplementedError, "#{self.class}#optimizable? must be implemented"
43
+ end
44
+
45
+ # Abstract method that executes the optimization for the operation
46
+ #
47
+ # @example
48
+ # optimized = optimizer.optimize
49
+ #
50
+ # @return [Optimizable]
51
+ #
52
+ # @api public
53
+ def optimize
54
+ raise NotImplementedError, "#{self.class}#optimize must be implemented"
55
+ end
56
+
57
+ # Chain together a list of optimizer classes into a callable object
58
+ #
59
+ # @example
60
+ # Optimizer.chain(Optimizer::Foo, Optimizer::Bar)
61
+ #
62
+ # @param [Array<Class<Optimizer>>] optimizers
63
+ # a list of optimizer classes to apply
64
+ #
65
+ # @return [#call]
66
+ #
67
+ # @api public
68
+ def self.chain(*optimizers)
69
+ optimizers.reverse_each.reduce(Identity) do |successor, optimizer|
70
+ link_optimizers(optimizer, successor)
71
+ end
72
+ end
73
+
74
+ # Link an optimizer to a successor
75
+ #
76
+ # @param [Class<Optimizer>] optimizer
77
+ # the optimizer to link to the successor
78
+ # @param [#proc] successor
79
+ # the next optimizer to call if the current optimizer is not applied
80
+ #
81
+ # @return [#call]
82
+ #
83
+ # @api private
84
+ def self.link_optimizers(optimizer, successor)
85
+ lambda do |operation|
86
+ op = optimizer.new(operation)
87
+ op.optimizable? ? op.optimize : successor.call(operation)
88
+ end
89
+ end
90
+
91
+ private_class_method :link_optimizers
92
+
93
+ end # class Optimizer
94
+ end # module Axiom
95
+
96
+ require 'axiom/optimizer/version'
97
+
98
+ require 'axiom/optimizer/support/predicate_partition'
99
+
100
+ require 'axiom/optimizer/optimizable'
101
+
102
+ require 'axiom/optimizer/function'
103
+ require 'axiom/optimizer/function/binary'
104
+ require 'axiom/optimizer/function/unary'
105
+
106
+ require 'axiom/optimizer/relation/materialized'
107
+
108
+ require 'axiom/optimizer/relation/operation/binary'
109
+ require 'axiom/optimizer/relation/operation/unary'
110
+ require 'axiom/optimizer/relation/operation/combination'
111
+ require 'axiom/optimizer/relation/operation/limit'
112
+ require 'axiom/optimizer/relation/operation/offset'
113
+ require 'axiom/optimizer/relation/operation/order'
114
+ require 'axiom/optimizer/relation/operation/reverse'
115
+
116
+ require 'axiom/optimizer/algebra/difference'
117
+ require 'axiom/optimizer/algebra/extension'
118
+ require 'axiom/optimizer/algebra/intersection'
119
+ require 'axiom/optimizer/algebra/join'
120
+ require 'axiom/optimizer/algebra/product'
121
+ require 'axiom/optimizer/algebra/projection'
122
+ require 'axiom/optimizer/algebra/rename'
123
+ require 'axiom/optimizer/algebra/restriction'
124
+ require 'axiom/optimizer/algebra/summarization'
125
+ require 'axiom/optimizer/algebra/union'
126
+
127
+ require 'axiom/optimizer/relation/operation/deletion'
128
+ require 'axiom/optimizer/relation/operation/insertion'
129
+
130
+ require 'axiom/optimizer/function/connective/binary'
131
+ require 'axiom/optimizer/function/connective/conjunction'
132
+ require 'axiom/optimizer/function/connective/disjunction'
133
+ require 'axiom/optimizer/function/connective/negation'
134
+
135
+ require 'axiom/optimizer/function/predicate'
136
+ require 'axiom/optimizer/function/predicate/comparable'
137
+ require 'axiom/optimizer/function/predicate/enumerable'
138
+ require 'axiom/optimizer/function/predicate/equality'
139
+ require 'axiom/optimizer/function/predicate/exclusion'
140
+ require 'axiom/optimizer/function/predicate/greater_than'
141
+ require 'axiom/optimizer/function/predicate/greater_than_or_equal_to'
142
+ require 'axiom/optimizer/function/predicate/inequality'
143
+ require 'axiom/optimizer/function/predicate/inclusion'
144
+ require 'axiom/optimizer/function/predicate/less_than'
145
+ require 'axiom/optimizer/function/predicate/less_than_or_equal_to'
146
+
147
+ require 'axiom/optimizer/function/numeric'
148
+ require 'axiom/optimizer/function/numeric/absolute'
149
+ require 'axiom/optimizer/function/numeric/addition'
150
+ require 'axiom/optimizer/function/numeric/division'
151
+ require 'axiom/optimizer/function/numeric/exponentiation'
152
+ require 'axiom/optimizer/function/numeric/modulo'
153
+ require 'axiom/optimizer/function/numeric/multiplication'
154
+ require 'axiom/optimizer/function/numeric/square_root'
155
+ require 'axiom/optimizer/function/numeric/subtraction'
156
+ require 'axiom/optimizer/function/numeric/unary_minus'
157
+ require 'axiom/optimizer/function/numeric/unary_plus'
158
+
159
+ require 'axiom/optimizer/function/string/length'
160
+
161
+ require 'axiom/optimizer/aggregate'
162
+ require 'axiom/optimizer/aggregate/count'
163
+ require 'axiom/optimizer/aggregate/maximum'
164
+ require 'axiom/optimizer/aggregate/mean'
165
+ require 'axiom/optimizer/aggregate/minimum'
166
+ require 'axiom/optimizer/aggregate/sum'
167
+ require 'axiom/optimizer/aggregate/variance'
168
+ require 'axiom/optimizer/aggregate/standard_deviation'
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ class Optimizer
5
+
6
+ # Abstract base class representing Aggregate optimizations
7
+ class Aggregate < Optimizer
8
+ include AbstractType, 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 Axiom
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Count optimizations
8
+ class Count < self
9
+
10
+ Axiom::Aggregate::Count.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Count
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Axiom
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Axiom
4
+ class Optimizer
5
+ class Aggregate
6
+
7
+ # Abstract base class representing Maximum optimizations
8
+ class Maximum < self
9
+
10
+ Axiom::Aggregate::Maximum.optimizer = chain(
11
+ UnoptimizedOperand
12
+ )
13
+
14
+ end # class Maximum
15
+ end # class Aggregate
16
+ end # class Optimizer
17
+ end # module Axiom