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,54 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing GreaterThan optimizations
9
+ class GreaterThan < self
10
+ include Comparable
11
+
12
+ # Optimize when the operands are a contradiction
13
+ class Contradiction < self
14
+ include Predicate::Contradiction
15
+
16
+ # Test if the operands are a contradiction
17
+ #
18
+ # @return [Boolean]
19
+ #
20
+ # @api private
21
+ def optimizable?
22
+ left.equal?(right) ||
23
+ GreaterThanOrEqualTo::Contradiction.new(operation).optimizable?
24
+ end
25
+
26
+ end # class Contradiction
27
+
28
+ # Optimize when the operands are a tautology
29
+ class Tautology < self
30
+ include Predicate::Tautology
31
+
32
+ # Test if the operands are a tautology
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ # @api private
37
+ def optimizable?
38
+ operation.class.call(Predicate::Util.min(left), Predicate::Util.max(right))
39
+ end
40
+
41
+ end # class Tautology
42
+
43
+ Veritas::Logic::Predicate::GreaterThan.optimizer = chain(
44
+ ConstantOperands,
45
+ Contradiction,
46
+ Tautology,
47
+ NormalizableOperands
48
+ )
49
+
50
+ end # class GreaterThan
51
+ end # class Predicate
52
+ end # module Logic
53
+ end # class Optimizer
54
+ end # module Veritas
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing GreaterThanOrEqualTo optimizations
9
+ class GreaterThanOrEqualTo < self
10
+ include Comparable
11
+
12
+ # Optimize when the operands are a contradiction
13
+ class Contradiction < self
14
+ include Comparable::NeverComparable
15
+ include Predicate::Contradiction
16
+
17
+ # Test if the operands are a contradiction
18
+ #
19
+ # @return [Boolean]
20
+ #
21
+ # @api private
22
+ def optimizable?
23
+ super || LessThan::Tautology.new(operation.inverse).optimizable?
24
+ end
25
+
26
+ end # class Contradiction
27
+
28
+ # Optimize when the operands are a tautology
29
+ class Tautology < self
30
+ include Predicate::Tautology
31
+
32
+ # Test if the operands are a tautology
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ # @api private
37
+ def optimizable?
38
+ operation = self.operation
39
+ GreaterThan::Tautology.new(operation).optimizable? ||
40
+ Equality::Tautology.new(operation).optimizable?
41
+ end
42
+
43
+ end # class Tautology
44
+
45
+ Veritas::Logic::Predicate::GreaterThanOrEqualTo.optimizer = chain(
46
+ ConstantOperands,
47
+ Contradiction,
48
+ Tautology,
49
+ NormalizableOperands
50
+ )
51
+
52
+ end # class GreaterThanOrEqualTo
53
+ end # class Predicate
54
+ end # module Logic
55
+ end # class Optimizer
56
+ end # module Veritas
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing Inclusion optimizations
9
+ class Inclusion < self
10
+ include Enumerable
11
+
12
+ # Optimize when the right operand is empty
13
+ class EmptyRightOperand < self
14
+ include Enumerable::EmptyRightOperand
15
+
16
+ # An Inclusion with an empty right operand matches nothing
17
+ #
18
+ # @return [Contradiction]
19
+ #
20
+ # @api private
21
+ def optimize
22
+ Veritas::Logic::Proposition::Contradiction.instance
23
+ end
24
+
25
+ end # class EmptyRightOperand
26
+
27
+ # Optimize when the right operand has one entry
28
+ class OneRightOperand < self
29
+ include Enumerable::OneRightOperand
30
+
31
+ # An Inclusion with a single right operand is equivalent to an Equality
32
+ #
33
+ # @return [Equality]
34
+ #
35
+ # @api private
36
+ def optimize
37
+ Veritas::Logic::Predicate::Equality.new(left, right.first)
38
+ end
39
+
40
+ end # class OneRightOperand
41
+
42
+ Veritas::Logic::Predicate::Inclusion.optimizer = chain(
43
+ ConstantOperands,
44
+ EmptyRightOperand,
45
+ OneRightOperand,
46
+ UnoptimizedOperand
47
+ )
48
+
49
+ end # class Inclusion
50
+ end # class Predicate
51
+ end # module Logic
52
+ end # class Optimizer
53
+ end # module Veritas
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing Inequality optimizations
9
+ class Inequality < self
10
+ include Comparable
11
+
12
+ # Optimize when the operand are a contradiction
13
+ class Contradiction < self
14
+ include Predicate::Contradiction
15
+
16
+ # Test if the operands are a contradiction
17
+ #
18
+ # @return [Boolean]
19
+ #
20
+ # @api private
21
+ def optimizable?
22
+ left.equal?(right)
23
+ end
24
+
25
+ end # class Contradiction
26
+
27
+ # Optimize when the operand are a tautology
28
+ class Tautology < self
29
+ include Comparable::NeverEquivalent
30
+ include Predicate::Tautology
31
+ end # class Tautology
32
+
33
+ Veritas::Logic::Predicate::Inequality.optimizer = chain(
34
+ ConstantOperands,
35
+ Contradiction,
36
+ Tautology,
37
+ NormalizableOperands
38
+ )
39
+
40
+ end # class Inequality
41
+ end # class Predicate
42
+ end # module Logic
43
+ end # class Optimizer
44
+ end # module Veritas
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing LessThan optimizations
9
+ class LessThan < self
10
+ include Comparable
11
+
12
+ # Optimize when the operands are a contradiction
13
+ class Contradiction < self
14
+ include Predicate::Contradiction
15
+
16
+ # Test if the operands are a contradiction
17
+ #
18
+ # @return [Boolean]
19
+ #
20
+ # @api private
21
+ def optimizable?
22
+ left.equal?(right) ||
23
+ LessThanOrEqualTo::Contradiction.new(operation).optimizable?
24
+ end
25
+
26
+ end # class Contradiction
27
+
28
+ # Optimize when the operands are a tautology
29
+ class Tautology < self
30
+ include Predicate::Tautology
31
+
32
+ # Test if the operands are a tautology
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ # @api private
37
+ def optimizable?
38
+ operation.class.call(Predicate::Util.max(left), Predicate::Util.min(right))
39
+ end
40
+
41
+ end # class Tautology
42
+
43
+ Veritas::Logic::Predicate::LessThan.optimizer = chain(
44
+ ConstantOperands,
45
+ Contradiction,
46
+ Tautology,
47
+ NormalizableOperands
48
+ )
49
+
50
+ end # class LessThan
51
+ end # class Predicate
52
+ end # module Logic
53
+ end # class Optimizer
54
+ end # module Veritas
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing LessThanOrEqualTo optimizations
9
+ class LessThanOrEqualTo < self
10
+ include Comparable
11
+
12
+ # Optimize when the operands are a contradiction
13
+ class Contradiction < self
14
+ include Comparable::NeverComparable
15
+ include Predicate::Contradiction
16
+
17
+ # Test if the operands are a contradiction
18
+ #
19
+ # @return [Boolean]
20
+ #
21
+ # @api private
22
+ def optimizable?
23
+ super || GreaterThan::Tautology.new(operation.inverse).optimizable?
24
+ end
25
+
26
+ end # class Contradiction
27
+
28
+ # Optimize when the operands are a tautology
29
+ class Tautology < self
30
+ include Predicate::Tautology
31
+
32
+ # Test if the operands are a tautology
33
+ #
34
+ # @return [Boolean]
35
+ #
36
+ # @api private
37
+ def optimizable?
38
+ operation = self.operation
39
+ LessThan::Tautology.new(operation).optimizable? ||
40
+ Equality::Tautology.new(operation).optimizable?
41
+ end
42
+
43
+ end # class Tautology
44
+
45
+ Veritas::Logic::Predicate::LessThanOrEqualTo.optimizer = chain(
46
+ ConstantOperands,
47
+ Contradiction,
48
+ Tautology,
49
+ NormalizableOperands
50
+ )
51
+
52
+ end # class LessThanOrEqualTo
53
+ end # class Predicate
54
+ end # module Logic
55
+ end # class Optimizer
56
+ end # module Veritas
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing Match optimizations
9
+ class Match < self
10
+
11
+ Veritas::Logic::Predicate::Match.optimizer = chain(
12
+ ConstantOperands
13
+ )
14
+
15
+ end # class Match
16
+ end # class Predicate
17
+ end # module Logic
18
+ end # class Optimizer
19
+ end # module Veritas
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing NoMatch optimizations
9
+ class NoMatch < self
10
+
11
+ Veritas::Logic::Predicate::NoMatch.optimizer = chain(
12
+ ConstantOperands
13
+ )
14
+
15
+ end # class NoMatch
16
+ end # class Predicate
17
+ end # module Logic
18
+ end # class Optimizer
19
+ end # module Veritas
@@ -0,0 +1,177 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+
7
+ # Abstract base class representing Predicate optimizations
8
+ class Predicate < Optimizer
9
+
10
+ # The optimized left operand
11
+ #
12
+ # @return [Object]
13
+ #
14
+ # @api private
15
+ attr_reader :left
16
+
17
+ # The optimized right operand
18
+ #
19
+ # @return [Object]
20
+ #
21
+ # @api private
22
+ attr_reader :right
23
+
24
+ # Initialize an Predicate optimizer
25
+ #
26
+ # @return [undefined]
27
+ #
28
+ # @api private
29
+ def initialize(*)
30
+ super
31
+ @left = optimize_left
32
+ @right = optimize_right
33
+ end
34
+
35
+ private
36
+
37
+ # Optimize the left operand
38
+ #
39
+ # @return [Object]
40
+ #
41
+ # @api private
42
+ def optimize_left
43
+ self.class.optimize_operand(operation.left)
44
+ end
45
+
46
+ # Optimize the right operand
47
+ #
48
+ # @return [Object]
49
+ #
50
+ # @api private
51
+ def optimize_right
52
+ self.class.optimize_operand(operation.right)
53
+ end
54
+
55
+ # Optimize the operand if possible
56
+ #
57
+ # @param [#optimize, Object] operand
58
+ #
59
+ # @return [Object]
60
+ #
61
+ # @api private
62
+ def self.optimize_operand(operand)
63
+ operand.respond_to?(:optimize) ? operand.optimize : operand
64
+ end
65
+
66
+ # Optimize when the operands are constants
67
+ class ConstantOperands < self
68
+
69
+ # Test if the operands are constants
70
+ #
71
+ # @return [Boolean]
72
+ #
73
+ # @api private
74
+ def optimizable?
75
+ util = Util
76
+ util.constant?(left) && util.constant?(right)
77
+ end
78
+
79
+ # A Predicate with constant values is equivalent to a Proposition
80
+ #
81
+ # @return [Proposition]
82
+ #
83
+ # @api private
84
+ def optimize
85
+ Veritas::Logic::Proposition.new(operation.class.call(left, right))
86
+ end
87
+
88
+ end # class ConstantOperands
89
+
90
+ # Optimize when the operands are a contradiction
91
+ module Contradiction
92
+
93
+ # Return a contradiction
94
+ #
95
+ # @return [Contradiction]
96
+ #
97
+ # @api private
98
+ def optimize
99
+ Veritas::Logic::Proposition::Contradiction.instance
100
+ end
101
+
102
+ end # module Contradiction
103
+
104
+ # Optimize when the operands are a tautology
105
+ module Tautology
106
+
107
+ # Return a tautology
108
+ #
109
+ # @return [Tautology]
110
+ #
111
+ # @api private
112
+ def optimize
113
+ Veritas::Logic::Proposition::Tautology.instance
114
+ end
115
+
116
+ end # module Tautology
117
+
118
+ # Utility methods for Predicate optimization
119
+ module Util
120
+
121
+ # Test if the operand is a constant
122
+ #
123
+ # @return [Boolean]
124
+ #
125
+ # @api private
126
+ def self.constant?(operand)
127
+ !operand.respond_to?(:call)
128
+ end
129
+
130
+ # Test if the operand is an attribute
131
+ #
132
+ # @return [Boolean]
133
+ #
134
+ # @api private
135
+ def self.attribute?(operand)
136
+ operand.kind_of?(Attribute)
137
+ end
138
+
139
+ # Return the minimum value for the operand
140
+ #
141
+ # @return [Object]
142
+ #
143
+ # @api private
144
+ def self.min(operand)
145
+ range_or_operand(operand, :first)
146
+ end
147
+
148
+ # Return the maximum value for the operand
149
+ #
150
+ # @return [Object]
151
+ #
152
+ # @api private
153
+ def self.max(operand)
154
+ range_or_operand(operand, :last)
155
+ end
156
+
157
+ # Return the minimum/maximum of the operand range, or the operand
158
+ #
159
+ # @param [Object] operand
160
+ # the object to extract the minimum/maximum value from
161
+ # @param [Symbol] method
162
+ # the method to execute on the operand range, if any
163
+ #
164
+ # @return [Object]
165
+ #
166
+ # @api private
167
+ def self.range_or_operand(operand, method)
168
+ operand.respond_to?(:range) ? operand.range.send(method) : operand
169
+ end
170
+
171
+ private_class_method :range_or_operand
172
+
173
+ end # module Util
174
+ end # class Predicate
175
+ end # module Logic
176
+ end # class Optimizer
177
+ end # module Veritas
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+
6
+ # Allow operations to be optimizable
7
+ module Optimizable
8
+ include Immutable
9
+
10
+ # Hook called when module is included
11
+ #
12
+ # @param [Module] descendant
13
+ # the module or class including Optimizable
14
+ #
15
+ # @return [self]
16
+ #
17
+ # @api private
18
+ def self.included(descendant)
19
+ descendant.extend ClassMethods
20
+ self
21
+ end
22
+
23
+ # Optimize the operation
24
+ #
25
+ # @example
26
+ # optimized = operation.optimize
27
+ #
28
+ # @param [Optimizer] optimizer
29
+ # optional optimizer
30
+ #
31
+ # @return [Optimizable]
32
+ # the optimized operation
33
+ #
34
+ # @api public
35
+ #
36
+ # @todo simplify by setting a default Noop optimizer for all relations
37
+ def optimize(optimizer = self.class.optimizer || Optimizer::Noop)
38
+ optimized = optimizer.call(self)
39
+ equal?(optimized) ? self : optimized.optimize
40
+ end
41
+
42
+ memoize :optimize
43
+
44
+ module ClassMethods
45
+
46
+ # The Optimizer for the operation
47
+ #
48
+ # @return [Optimizable]
49
+ #
50
+ # @api private
51
+ attr_accessor :optimizer
52
+
53
+ end # module ClassMethods
54
+ end # module Optimizable
55
+ end # class Optimizer
56
+ end # module Veritas
57
+
58
+ Veritas::Relation.class_eval { include Veritas::Optimizer::Optimizable }
59
+ Veritas::Logic::Expression.class_eval { include Veritas::Optimizer::Optimizable }
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Relation
6
+
7
+ # Abstract base class representing Materialized optimizations
8
+ class Materialized < Optimizer
9
+
10
+ # Optimize when the operand is Empty
11
+ class EmptyOperand < self
12
+
13
+ # Test if the operand is empty
14
+ #
15
+ # @return [Boolean]
16
+ #
17
+ # @api private
18
+ def optimizable?
19
+ operation.empty?
20
+ end
21
+
22
+ # Return a new Empty relation with the operation's headers
23
+ #
24
+ # @return [Empty]
25
+ #
26
+ # @api private
27
+ def optimize
28
+ Veritas::Relation::Empty.new(operation.header)
29
+ end
30
+
31
+ end # class EmptyOperand
32
+
33
+ Veritas::Relation::Materialized.optimizer = chain(
34
+ EmptyOperand
35
+ )
36
+
37
+ end # class Materialized
38
+ end # module Relation
39
+ end # class Optimizer
40
+ end # module Veritas