veritas-optimizer 0.0.3

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 (279) hide show
  1. data/Gemfile +33 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +27 -0
  4. data/Rakefile +25 -0
  5. data/TODO +75 -0
  6. data/config/flay.yml +3 -0
  7. data/config/flog.yml +2 -0
  8. data/config/roodi.yml +16 -0
  9. data/config/site.reek +91 -0
  10. data/config/yardstick.yml +2 -0
  11. data/lib/veritas/optimizer/algebra/difference.rb +66 -0
  12. data/lib/veritas/optimizer/algebra/extension.rb +42 -0
  13. data/lib/veritas/optimizer/algebra/intersection.rb +66 -0
  14. data/lib/veritas/optimizer/algebra/join.rb +44 -0
  15. data/lib/veritas/optimizer/algebra/product.rb +70 -0
  16. data/lib/veritas/optimizer/algebra/projection.rb +174 -0
  17. data/lib/veritas/optimizer/algebra/rename.rb +396 -0
  18. data/lib/veritas/optimizer/algebra/restriction.rb +259 -0
  19. data/lib/veritas/optimizer/algebra/summarization.rb +42 -0
  20. data/lib/veritas/optimizer/algebra/union.rb +66 -0
  21. data/lib/veritas/optimizer/logic/connective/binary.rb +254 -0
  22. data/lib/veritas/optimizer/logic/connective/conjunction.rb +122 -0
  23. data/lib/veritas/optimizer/logic/connective/disjunction.rb +122 -0
  24. data/lib/veritas/optimizer/logic/connective/negation.rb +71 -0
  25. data/lib/veritas/optimizer/logic/predicate/comparable.rb +134 -0
  26. data/lib/veritas/optimizer/logic/predicate/enumerable.rb +141 -0
  27. data/lib/veritas/optimizer/logic/predicate/equality.rb +44 -0
  28. data/lib/veritas/optimizer/logic/predicate/exclusion.rb +53 -0
  29. data/lib/veritas/optimizer/logic/predicate/greater_than.rb +54 -0
  30. data/lib/veritas/optimizer/logic/predicate/greater_than_or_equal_to.rb +56 -0
  31. data/lib/veritas/optimizer/logic/predicate/inclusion.rb +53 -0
  32. data/lib/veritas/optimizer/logic/predicate/inequality.rb +44 -0
  33. data/lib/veritas/optimizer/logic/predicate/less_than.rb +54 -0
  34. data/lib/veritas/optimizer/logic/predicate/less_than_or_equal_to.rb +56 -0
  35. data/lib/veritas/optimizer/logic/predicate/match.rb +19 -0
  36. data/lib/veritas/optimizer/logic/predicate/no_match.rb +19 -0
  37. data/lib/veritas/optimizer/logic/predicate.rb +177 -0
  38. data/lib/veritas/optimizer/optimizable.rb +59 -0
  39. data/lib/veritas/optimizer/relation/materialized.rb +40 -0
  40. data/lib/veritas/optimizer/relation/operation/binary.rb +168 -0
  41. data/lib/veritas/optimizer/relation/operation/combination.rb +33 -0
  42. data/lib/veritas/optimizer/relation/operation/limit.rb +149 -0
  43. data/lib/veritas/optimizer/relation/operation/offset.rb +114 -0
  44. data/lib/veritas/optimizer/relation/operation/order.rb +96 -0
  45. data/lib/veritas/optimizer/relation/operation/reverse.rb +94 -0
  46. data/lib/veritas/optimizer/relation/operation/unary.rb +88 -0
  47. data/lib/veritas/optimizer/version.rb +7 -0
  48. data/lib/veritas/optimizer.rb +136 -0
  49. data/lib/veritas-optimizer.rb +3 -0
  50. data/spec/integration/veritas/algebra/difference/optimize_spec.rb +152 -0
  51. data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +152 -0
  52. data/spec/integration/veritas/algebra/join/optimize_spec.rb +110 -0
  53. data/spec/integration/veritas/algebra/product/optimize_spec.rb +176 -0
  54. data/spec/integration/veritas/algebra/projection/optimize_spec.rb +237 -0
  55. data/spec/integration/veritas/algebra/rename/optimize_spec.rb +440 -0
  56. data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +216 -0
  57. data/spec/integration/veritas/algebra/union/optimize_spec.rb +192 -0
  58. data/spec/integration/veritas/logic/connective/conjunction/optimize_spec.rb +234 -0
  59. data/spec/integration/veritas/logic/connective/disjunction/optimize_spec.rb +235 -0
  60. data/spec/integration/veritas/logic/connective/negation/optimize_spec.rb +41 -0
  61. data/spec/integration/veritas/logic/expression/optimize_spec.rb +42 -0
  62. data/spec/integration/veritas/logic/predicate/equality/optimize_spec.rb +90 -0
  63. data/spec/integration/veritas/logic/predicate/exclusion/optimize_spec.rb +131 -0
  64. data/spec/integration/veritas/logic/predicate/greater_than/optimize_spec.rb +100 -0
  65. data/spec/integration/veritas/logic/predicate/greater_than_or_equal_to/optimize_spec.rb +100 -0
  66. data/spec/integration/veritas/logic/predicate/inclusion/optimize_spec.rb +131 -0
  67. data/spec/integration/veritas/logic/predicate/inequality/optimize_spec.rb +90 -0
  68. data/spec/integration/veritas/logic/predicate/less_than/optimize_spec.rb +100 -0
  69. data/spec/integration/veritas/logic/predicate/less_than_or_equal_to/optimize_spec.rb +100 -0
  70. data/spec/integration/veritas/relation/empty/optimize_spec.rb +11 -0
  71. data/spec/integration/veritas/relation/materialized/optimize_spec.rb +37 -0
  72. data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +140 -0
  73. data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +98 -0
  74. data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +103 -0
  75. data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +113 -0
  76. data/spec/integration/veritas/relation/optimize_spec.rb +33 -0
  77. data/spec/rcov.opts +6 -0
  78. data/spec/shared/idempotent_method_behavior.rb +5 -0
  79. data/spec/shared/logic_connective_binary_optimize_behavior.rb +100 -0
  80. data/spec/shared/optimize_method_behavior.rb +14 -0
  81. data/spec/spec.opts +3 -0
  82. data/spec/spec_helper.rb +16 -0
  83. data/spec/support/add_method_missing.rb +13 -0
  84. data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +17 -0
  85. data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +17 -0
  86. data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +19 -0
  87. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +27 -0
  88. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +25 -0
  89. data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +17 -0
  90. data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +17 -0
  91. data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +17 -0
  92. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +27 -0
  93. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +21 -0
  94. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +25 -0
  95. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +16 -0
  96. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +25 -0
  97. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +16 -0
  98. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +25 -0
  99. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +18 -0
  100. data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +16 -0
  101. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +26 -0
  102. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +20 -0
  103. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimizable_spec.rb +27 -0
  104. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimize_spec.rb +23 -0
  105. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +26 -0
  106. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +16 -0
  107. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +26 -0
  108. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +20 -0
  109. data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +31 -0
  110. data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +27 -0
  111. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +25 -0
  112. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +17 -0
  113. data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +19 -0
  114. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +26 -0
  115. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +21 -0
  116. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +26 -0
  117. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +21 -0
  118. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +26 -0
  119. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +20 -0
  120. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +26 -0
  121. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +20 -0
  122. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimizable_spec.rb +28 -0
  123. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand/optimize_spec.rb +20 -0
  124. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +35 -0
  125. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +16 -0
  126. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +27 -0
  127. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +21 -0
  128. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +25 -0
  129. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +21 -0
  130. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +27 -0
  131. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +21 -0
  132. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimizable_spec.rb +26 -0
  133. data/spec/unit/veritas/optimizer/algebra/rename/unchanged_header/optimize_spec.rb +16 -0
  134. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +42 -0
  135. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +21 -0
  136. data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +31 -0
  137. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimizable_spec.rb +26 -0
  138. data/spec/unit/veritas/optimizer/algebra/restriction/contradiction/optimize_spec.rb +19 -0
  139. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +26 -0
  140. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +18 -0
  141. data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +16 -0
  142. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +28 -0
  143. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +22 -0
  144. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +26 -0
  145. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +18 -0
  146. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +28 -0
  147. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +22 -0
  148. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimizable_spec.rb +25 -0
  149. data/spec/unit/veritas/optimizer/algebra/restriction/tautology/optimize_spec.rb +17 -0
  150. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +42 -0
  151. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +22 -0
  152. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +27 -0
  153. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +27 -0
  154. data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +17 -0
  155. data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +17 -0
  156. data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +17 -0
  157. data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +54 -0
  158. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimizable_spec.rb +27 -0
  159. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimize_spec.rb +17 -0
  160. data/spec/unit/veritas/optimizer/logic/connective/binary/left_spec.rb +14 -0
  161. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimizable_spec.rb +26 -0
  162. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimize_spec.rb +21 -0
  163. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimizable_spec.rb +26 -0
  164. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimize_spec.rb +21 -0
  165. data/spec/unit/veritas/optimizer/logic/connective/binary/right_spec.rb +14 -0
  166. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +34 -0
  167. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +21 -0
  168. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimizable_spec.rb +41 -0
  169. data/spec/unit/veritas/optimizer/logic/connective/conjunction/contradiction/optimize_spec.rb +17 -0
  170. data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimizable_spec.rb +27 -0
  171. data/spec/unit/veritas/optimizer/logic/connective/conjunction/left_operand_tautology/optimize_spec.rb +17 -0
  172. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +27 -0
  173. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +36 -0
  174. data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimizable_spec.rb +27 -0
  175. data/spec/unit/veritas/optimizer/logic/connective/conjunction/right_operand_tautology/optimize_spec.rb +17 -0
  176. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimizable_spec.rb +27 -0
  177. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_left_operand/optimize_spec.rb +17 -0
  178. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimizable_spec.rb +27 -0
  179. data/spec/unit/veritas/optimizer/logic/connective/disjunction/contradiction_right_operand/optimize_spec.rb +17 -0
  180. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +27 -0
  181. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +36 -0
  182. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimizable_spec.rb +41 -0
  183. data/spec/unit/veritas/optimizer/logic/connective/disjunction/tautology/optimize_spec.rb +17 -0
  184. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +26 -0
  185. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +20 -0
  186. data/spec/unit/veritas/optimizer/logic/connective/negation/operand_spec.rb +12 -0
  187. data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +20 -0
  188. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_comparable/optimizable_spec.rb +58 -0
  189. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_equivalent/optimizable_spec.rb +58 -0
  190. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimizable_spec.rb +41 -0
  191. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimize_spec.rb +19 -0
  192. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +29 -0
  193. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +14 -0
  194. data/spec/unit/veritas/optimizer/logic/predicate/contradiction/optimize_spec.rb +16 -0
  195. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/empty_right_operand/optimizable_spec.rb +76 -0
  196. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/one_right_operand/optimizable_spec.rb +76 -0
  197. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimizable_spec.rb +49 -0
  198. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimize_spec.rb +53 -0
  199. data/spec/unit/veritas/optimizer/logic/predicate/equality/tautology/optimizable_spec.rb +27 -0
  200. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/empty_right_operand/optimize_spec.rb +43 -0
  201. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/one_right_operand/optimize_spec.rb +63 -0
  202. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/contradiction/optimizable_spec.rb +41 -0
  203. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/tautology/optimizable_spec.rb +26 -0
  204. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
  205. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
  206. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/empty_right_operand/optimize_spec.rb +43 -0
  207. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/one_right_operand/optimize_spec.rb +64 -0
  208. data/spec/unit/veritas/optimizer/logic/predicate/inequality/contradiction/optimizable_spec.rb +27 -0
  209. data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +25 -0
  210. data/spec/unit/veritas/optimizer/logic/predicate/less_than/contradiction/optimizable_spec.rb +41 -0
  211. data/spec/unit/veritas/optimizer/logic/predicate/less_than/tautology/optimizable_spec.rb +26 -0
  212. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/contradiction/optimizable_spec.rb +41 -0
  213. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/tautology/optimizable_spec.rb +41 -0
  214. data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +25 -0
  215. data/spec/unit/veritas/optimizer/logic/predicate/tautology/optimize_spec.rb +16 -0
  216. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/attribute_spec.rb +19 -0
  217. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/constant_spec.rb +19 -0
  218. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +19 -0
  219. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +19 -0
  220. data/spec/unit/veritas/optimizer/operation_spec.rb +11 -0
  221. data/spec/unit/veritas/optimizer/optimizable/class_methods/optimizer_spec.rb +32 -0
  222. data/spec/unit/veritas/optimizer/optimizable/optimize_spec.rb +36 -0
  223. data/spec/unit/veritas/optimizer/optimizable_spec.rb +15 -0
  224. data/spec/unit/veritas/optimizer/optimize_spec.rb +15 -0
  225. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +20 -0
  226. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +17 -0
  227. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +30 -0
  228. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +30 -0
  229. data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +34 -0
  230. data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +17 -0
  231. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +35 -0
  232. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +20 -0
  233. data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +17 -0
  234. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimizable_spec.rb +38 -0
  235. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimize_spec.rb +22 -0
  236. data/spec/unit/veritas/optimizer/relation/operation/combination/optimize_spec.rb +14 -0
  237. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +31 -0
  238. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +16 -0
  239. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimizable_spec.rb +25 -0
  240. data/spec/unit/veritas/optimizer/relation/operation/limit/limit_operand/optimize_spec.rb +33 -0
  241. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +26 -0
  242. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +20 -0
  243. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +25 -0
  244. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +18 -0
  245. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +25 -0
  246. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +19 -0
  247. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +26 -0
  248. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +20 -0
  249. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +25 -0
  250. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +15 -0
  251. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +31 -0
  252. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +16 -0
  253. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +25 -0
  254. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +20 -0
  255. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +26 -0
  256. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +21 -0
  257. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +25 -0
  258. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +20 -0
  259. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +25 -0
  260. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +17 -0
  261. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +25 -0
  262. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +22 -0
  263. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +20 -0
  264. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +15 -0
  265. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +20 -0
  266. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +18 -0
  267. data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +13 -0
  268. data/tasks/quality/ci.rake +2 -0
  269. data/tasks/quality/flay.rake +41 -0
  270. data/tasks/quality/flog.rake +45 -0
  271. data/tasks/quality/heckle.rake +203 -0
  272. data/tasks/quality/metric_fu.rake +26 -0
  273. data/tasks/quality/reek.rake +9 -0
  274. data/tasks/quality/roodi.rake +15 -0
  275. data/tasks/quality/yardstick.rake +23 -0
  276. data/tasks/spec.rake +38 -0
  277. data/tasks/yard.rake +9 -0
  278. data/veritas-optimizer.gemspec +550 -0
  279. metadata +613 -0
@@ -0,0 +1,168 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing Binary relation optimizations
9
+ class Binary < Optimizer
10
+
11
+ # The optimized left operand
12
+ #
13
+ # @return [Relation]
14
+ #
15
+ # @api private
16
+ attr_reader :left
17
+
18
+ # The optimized right operand
19
+ #
20
+ # @return [Relation]
21
+ #
22
+ # @api private
23
+ attr_reader :right
24
+
25
+ # Initialize an Binary optimizer
26
+ #
27
+ # @return [undefined]
28
+ #
29
+ # @api private
30
+ def initialize(*)
31
+ super
32
+ @left = optimize_left
33
+ @right = optimize_right
34
+ end
35
+
36
+ private
37
+
38
+ # Optimize the left operand
39
+ #
40
+ # @return [Relation]
41
+ #
42
+ # @api private
43
+ def optimize_left
44
+ operation.left.optimize
45
+ end
46
+
47
+ # Optimize the right operand
48
+ #
49
+ # @return [Relation]
50
+ #
51
+ # @api private
52
+ def optimize_right
53
+ operation.right.optimize
54
+ end
55
+
56
+ # Optimize when operands are equal
57
+ module EqualOperands
58
+
59
+ # Test if the operands are equal
60
+ #
61
+ # @return [Boolean]
62
+ #
63
+ # @api private
64
+ def optimizable?
65
+ left.eql?(right)
66
+ end
67
+
68
+ end # module EqualOperands
69
+
70
+ # Optimize when the left operand is Empty
71
+ module EmptyLeft
72
+
73
+ # Test if the left operand is empty
74
+ #
75
+ # @return [Boolean]
76
+ #
77
+ # @api private
78
+ def optimizable?
79
+ left.kind_of?(Veritas::Relation::Empty)
80
+ end
81
+
82
+ end # module EmptyLeft
83
+
84
+ # Optimize when the right operand is Empty
85
+ module EmptyRight
86
+
87
+ # Test if the right operand is empty
88
+ #
89
+ # @return [Boolean]
90
+ #
91
+ # @api private
92
+ def optimizable?
93
+ right.kind_of?(Veritas::Relation::Empty)
94
+ end
95
+
96
+ end # module EmptyRight
97
+
98
+ # Optimize when the operands are Materialized
99
+ class MaterializedOperand < self
100
+
101
+ # Test if the operands are materialized
102
+ #
103
+ # @return [Boolean]
104
+ #
105
+ # @api private
106
+ def optimizable?
107
+ left.kind_of?(Veritas::Relation::Materialized) &&
108
+ right.kind_of?(Veritas::Relation::Materialized)
109
+ end
110
+
111
+ # Return the materialized operation
112
+ #
113
+ # @return [Relation::Materialized]
114
+ #
115
+ # @api private
116
+ def optimize
117
+ operation.materialize
118
+ end
119
+
120
+ end # class MaterializedOperand
121
+
122
+ # Optimize when the operands are unoptimized
123
+ class UnoptimizedOperand < self
124
+
125
+ # Test if the operands are unoptimized
126
+ #
127
+ # @return [Boolean]
128
+ #
129
+ # @api private
130
+ def optimizable?
131
+ left_optimizable? || right_optimizable?
132
+ end
133
+
134
+ # Return a Relation with optimized operands
135
+ #
136
+ # @return [Relation]
137
+ #
138
+ # @api private
139
+ def optimize
140
+ operation.class.new(left, right)
141
+ end
142
+
143
+ private
144
+
145
+ # Test if the left operand is optimizable
146
+ #
147
+ # @return [Boolean]
148
+ #
149
+ # @api private
150
+ def left_optimizable?
151
+ !left.equal?(operation.left)
152
+ end
153
+
154
+ # Test if the right operand is optimizable
155
+ #
156
+ # @return [Boolean]
157
+ #
158
+ # @api private
159
+ def right_optimizable?
160
+ !right.equal?(operation.right)
161
+ end
162
+
163
+ end # class UnoptimizedOperand
164
+ end # class Binary
165
+ end # module Operation
166
+ end # module Relation
167
+ end # class Optimizer
168
+ end # module Veritas
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing combinations of relations
9
+ class Combination < Binary
10
+
11
+ # Any relation combined with an empty relation is an empty relation
12
+ #
13
+ # @return [Relation::Empty]
14
+ #
15
+ # @api private
16
+ def optimize
17
+ Veritas::Relation::Empty.new(operation.header)
18
+ end
19
+
20
+ # Optimize when the left operand is Empty
21
+ class EmptyLeft < self
22
+ include Binary::EmptyLeft
23
+ end # class EmptyLeft
24
+
25
+ # Optimize when the right operand is Empty
26
+ class EmptyRight < self
27
+ include Binary::EmptyRight
28
+ end # class EmptyRight
29
+ end # class Combination
30
+ end # module Operation
31
+ end # module Relation
32
+ end # class Optimizer
33
+ end # module Veritas
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing Limit optimizations
9
+ class Limit < Unary
10
+
11
+ private
12
+
13
+ # Return the operation limit
14
+ #
15
+ # @return [Integer]
16
+ #
17
+ # @api private
18
+ def limit
19
+ operation.limit
20
+ end
21
+
22
+ # Optimize when the limit is zero
23
+ class ZeroLimit < self
24
+
25
+ # Test if the limit is zero
26
+ #
27
+ # @return [Boolean]
28
+ #
29
+ # @api private
30
+ def optimizable?
31
+ limit.zero?
32
+ end
33
+
34
+ # A Limit with a limit of zero is empty
35
+ #
36
+ # @return [Relation::Empty]
37
+ #
38
+ # @api private
39
+ def optimize
40
+ Veritas::Relation::Empty.new(operation.header)
41
+ end
42
+
43
+ end # class ZeroLimit
44
+
45
+ # Optimize when the operand is a Limit and the limits are equal
46
+ class EqualLimitOperand < self
47
+
48
+ # Test if the operand is a Limit and the limits are equal
49
+ #
50
+ # @return [Boolean]
51
+ #
52
+ # @api private
53
+ def optimizable?
54
+ operand.kind_of?(operation.class) && equal_limit?
55
+ end
56
+
57
+ # Flatten equal Limit relations into a single relation
58
+ #
59
+ # @return [Projection]
60
+ #
61
+ # @api private
62
+ def optimize
63
+ operand
64
+ end
65
+
66
+ private
67
+
68
+ # Test if the operation and operand limits are equal
69
+ #
70
+ # @return [Boolean]
71
+ #
72
+ # @api private
73
+ def equal_limit?
74
+ limit == operand.limit
75
+ end
76
+
77
+ end # class EqualLimitOperand
78
+
79
+ # Optimize when the operand is a Limit
80
+ class LimitOperand < self
81
+
82
+ # Test if the operand is a Limit
83
+ #
84
+ # @return [Boolean]
85
+ #
86
+ # @api private
87
+ def optimizable?
88
+ operand.kind_of?(operation.class)
89
+ end
90
+
91
+ # Flatten Limit operations using the minimum limit
92
+ #
93
+ # @return [Boolean]
94
+ #
95
+ # @api private
96
+ def optimize
97
+ operation.class.new(operand.operand, min_limit)
98
+ end
99
+
100
+ private
101
+
102
+ # Return the minimum limit between the operation and operand
103
+ #
104
+ # @return [Integer]
105
+ #
106
+ # @api private
107
+ def min_limit
108
+ [ limit, operand.limit ].min
109
+ end
110
+
111
+ end # class LimitOperand
112
+
113
+ # Optimize when operand is optimizable
114
+ class UnoptimizedOperand < self
115
+
116
+ # Test if the operand is unoptimized
117
+ #
118
+ # @return [Boolean]
119
+ #
120
+ # @api private
121
+ def optimizable?
122
+ !operand.equal?(operation.operand)
123
+ end
124
+
125
+ # Return a Limit with an optimized operand
126
+ #
127
+ # @return [Limit]
128
+ #
129
+ # @api private
130
+ def optimize
131
+ operation.class.new(operand, limit)
132
+ end
133
+
134
+ end # class UnoptimizedOperand
135
+
136
+ Veritas::Relation::Operation::Limit.optimizer = chain(
137
+ ZeroLimit,
138
+ EqualLimitOperand,
139
+ LimitOperand,
140
+ EmptyOperand,
141
+ MaterializedOperand,
142
+ UnoptimizedOperand
143
+ )
144
+
145
+ end # class Limit
146
+ end # module Operation
147
+ end # module Relation
148
+ end # class Optimizer
149
+ end # module Veritas
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing Offset optimizations
9
+ class Offset < Unary
10
+
11
+ private
12
+
13
+ # Return the operation offset
14
+ #
15
+ # @return [Integer]
16
+ #
17
+ # @api private
18
+ def offset
19
+ operation.offset
20
+ end
21
+
22
+ # Optimize when the offset is zero
23
+ class ZeroOffset < self
24
+
25
+ # Test if the offset is zero
26
+ #
27
+ # @return [Boolean]
28
+ #
29
+ # @api private
30
+ def optimizable?
31
+ offset.zero?
32
+ end
33
+
34
+ # An Offset with an offset of zero is a noop
35
+ #
36
+ # @return [Relation]
37
+ #
38
+ # @api private
39
+ def optimize
40
+ operand
41
+ end
42
+
43
+ end # class ZeroOffset
44
+
45
+ # Optimize when the operand is an Offset
46
+ class OffsetOperand < self
47
+
48
+ # Test if the operand is an Offset
49
+ #
50
+ # @return [Boolean]
51
+ #
52
+ # @api private
53
+ def optimizable?
54
+ operand.kind_of?(operation.class)
55
+ end
56
+
57
+ # Flatten Offset operations using the sum of the offsets
58
+ #
59
+ # @return [Boolean]
60
+ #
61
+ # @api private
62
+ def optimize
63
+ operation.class.new(operand.operand, sum_offset)
64
+ end
65
+
66
+ private
67
+
68
+ # Return the sum of the operation and operand offsets
69
+ #
70
+ # @return [Integer]
71
+ #
72
+ # @api private
73
+ def sum_offset
74
+ offset + operand.offset
75
+ end
76
+
77
+ end # class OffsetOperand
78
+
79
+ # Optimize when operand is optimizable
80
+ class UnoptimizedOperand < self
81
+
82
+ # Test if the operand is unoptimized
83
+ #
84
+ # @return [Boolean]
85
+ #
86
+ # @api private
87
+ def optimizable?
88
+ !operand.equal?(operation.operand)
89
+ end
90
+
91
+ # Return an Offset with an optimized operand
92
+ #
93
+ # @return [Offset]
94
+ #
95
+ # @api private
96
+ def optimize
97
+ operation.class.new(operand, offset)
98
+ end
99
+
100
+ end # class UnoptimizedOperand
101
+
102
+ Veritas::Relation::Operation::Offset.optimizer = chain(
103
+ ZeroOffset,
104
+ OffsetOperand,
105
+ EmptyOperand,
106
+ MaterializedOperand,
107
+ UnoptimizedOperand
108
+ )
109
+
110
+ end # class Offset
111
+ end # module Operation
112
+ end # module Relation
113
+ end # class Optimizer
114
+ end # module Veritas
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing Order optimizations
9
+ class Order < Unary
10
+
11
+ # Optimize when the operand is an Order
12
+ class OrderOperand < self
13
+
14
+ # Test if the operand is an Order
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ def optimizable?
20
+ operand.kind_of?(operation.class)
21
+ end
22
+
23
+ # Flatten Order operations using the operation directions
24
+ #
25
+ # @return [Order]
26
+ #
27
+ # @api private
28
+ def optimize
29
+ operation = self.operation
30
+ operation.class.new(operand.operand, operation.directions)
31
+ end
32
+
33
+ end # class OrderOperand
34
+
35
+ # Optimize when the operand is a Limit with a limit of 1
36
+ class OneLimitOperand < self
37
+
38
+ # Test if the operand is an Limit with a limit of 1
39
+ #
40
+ # @return [Boolean]
41
+ #
42
+ # @api private
43
+ def optimizable?
44
+ operand = self.operand
45
+ operand.kind_of?(Veritas::Relation::Operation::Limit) &&
46
+ operand.limit == 1
47
+ end
48
+
49
+ # An Order of a Limit with a limit of 1 is a noop
50
+ #
51
+ # @return [Limit]
52
+ #
53
+ # @api private
54
+ def optimize
55
+ operand
56
+ end
57
+
58
+ end # class OneLimitOperand
59
+
60
+ # Optimize when operand is optimizable
61
+ class UnoptimizedOperand < self
62
+
63
+ # Test if the operand is unoptimized
64
+ #
65
+ # @return [Boolean]
66
+ #
67
+ # @api private
68
+ def optimizable?
69
+ !operand.equal?(operation.operand)
70
+ end
71
+
72
+ # Return an Order with an optimized operand
73
+ #
74
+ # @return [Offset]
75
+ #
76
+ # @api private
77
+ def optimize
78
+ operation = self.operation
79
+ operation.class.new(operand, operation.directions)
80
+ end
81
+
82
+ end # class UnoptimizedOperand
83
+
84
+ Veritas::Relation::Operation::Order.optimizer = chain(
85
+ OrderOperand,
86
+ OneLimitOperand,
87
+ EmptyOperand,
88
+ MaterializedOperand,
89
+ UnoptimizedOperand
90
+ )
91
+
92
+ end # class Order
93
+ end # module Operation
94
+ end # module Relation
95
+ end # class Optimizer
96
+ end # module Veritas
@@ -0,0 +1,94 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+ module Operation
7
+
8
+ # Abstract base class representing Reverse optimizations
9
+ class Reverse < Order
10
+
11
+ # Optimize when the operand is a Reverse
12
+ class ReverseOperand < self
13
+
14
+ # Test if the operand is a Reverse
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ def optimizable?
20
+ operand.kind_of?(operation.class)
21
+ end
22
+
23
+ # A Reverse of a Reverse is a noop
24
+ #
25
+ # @return [Relation]
26
+ #
27
+ # @api private
28
+ def optimize
29
+ operand.operand
30
+ end
31
+
32
+ end # class ReverseOperand
33
+
34
+ # Optimize when the operand is an Order
35
+ class OrderOperand < self
36
+
37
+ # Test if the operand is an Order
38
+ #
39
+ # @return [Boolean]
40
+ #
41
+ # @api private
42
+ def optimizable?
43
+ operand.kind_of?(Veritas::Relation::Operation::Order)
44
+ end
45
+
46
+ # Flatten Reverse operation and Order operand into an Order
47
+ #
48
+ # @return [Order]
49
+ #
50
+ # @api private
51
+ def optimize
52
+ operand = self.operand
53
+ operand.class.new(operand.operand, operation.directions)
54
+ end
55
+
56
+ end # class OrderOperand
57
+
58
+ # Optimize when operand is optimizable
59
+ class UnoptimizedOperand < self
60
+
61
+ # Test if the operand is unoptimized
62
+ #
63
+ # @return [Boolean]
64
+ #
65
+ # @api private
66
+ def optimizable?
67
+ !operand.equal?(operation.operand)
68
+ end
69
+
70
+ # Return an Reverse with an optimized operand
71
+ #
72
+ # @return [Reverse]
73
+ #
74
+ # @api private
75
+ def optimize
76
+ operation.class.new(operand)
77
+ end
78
+
79
+ end # class UnoptimizedOperand
80
+
81
+ Veritas::Relation::Operation::Reverse.optimizer = chain(
82
+ ReverseOperand,
83
+ OrderOperand,
84
+ OneLimitOperand,
85
+ EmptyOperand,
86
+ MaterializedOperand,
87
+ UnoptimizedOperand
88
+ )
89
+
90
+ end # class Reverse
91
+ end # module Operation
92
+ end # module Relation
93
+ end # class Optimizer
94
+ end # module Veritas