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,122 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ module Connective
7
+
8
+ # Abstract base class representing Conjunction optimizations
9
+ class Conjunction < Binary
10
+
11
+ # Optimize when the left operand is a tautology
12
+ class LeftOperandTautology < self
13
+
14
+ # Test if the left operand is a tautology
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ def optimizable?
20
+ left_tautology?
21
+ end
22
+
23
+ # A Conjunction with a tautology left operand is equivalent to the right
24
+ #
25
+ # @return [Expression]
26
+ #
27
+ # @api private
28
+ def optimize
29
+ right
30
+ end
31
+
32
+ end # class LeftOperandTautology
33
+
34
+ # Optimize when the right operand is a tautology
35
+ class RightOperandTautology < self
36
+
37
+ # Test if the right operand is a tautology
38
+ #
39
+ # @return [Boolean]
40
+ #
41
+ # @api private
42
+ def optimizable?
43
+ right_tautology?
44
+ end
45
+
46
+ # A Conjunction with a tautology right operand is equivalent to the left
47
+ #
48
+ # @return [Expression]
49
+ #
50
+ # @api private
51
+ def optimize
52
+ left
53
+ end
54
+
55
+ end # class RightOperandTautology
56
+
57
+ # Optimize when the operands are inequality predicates for the same attribute
58
+ class OptimizableToExclusion < self
59
+
60
+ # Test if the operands are inequality predicates for the same attribute
61
+ #
62
+ # @return [Boolean]
63
+ #
64
+ # @api private
65
+ def optimizable?
66
+ inequality_with_same_attributes?
67
+ end
68
+
69
+ # Return an Exclusion for an attribute against a set of values
70
+ #
71
+ # @return [Exclusion]
72
+ #
73
+ # @api private
74
+ def optimize
75
+ left = self.left
76
+ Veritas::Logic::Predicate::Exclusion.new(left.left, [ left.right, right.right ]).optimize
77
+ end
78
+
79
+ end # class OptimizableToExclusion
80
+
81
+ # Optimize when the operands are a contradiction
82
+ class Contradiction < self
83
+
84
+ # Test if the operands are a contradiction
85
+ #
86
+ # @return [Boolean]
87
+ #
88
+ # @api private
89
+ def optimizable?
90
+ left_contradiction? ||
91
+ right_contradiction? ||
92
+ equality_with_same_attributes? ||
93
+ left.inverse.eql?(right)
94
+ end
95
+
96
+ # Return a contradiction
97
+ #
98
+ # @return [Contradiction]
99
+ #
100
+ # @api private
101
+ def optimize
102
+ Veritas::Logic::Proposition::Contradiction.instance
103
+ end
104
+
105
+ end # class Contradiction
106
+
107
+ Veritas::Logic::Connective::Conjunction.optimizer = chain(
108
+ LeftOperandTautology,
109
+ RightOperandTautology,
110
+ OptimizableToExclusion,
111
+ EqualOperands,
112
+ RedundantLeftOperand,
113
+ RedundantRightOperand,
114
+ Contradiction,
115
+ UnoptimizedOperand
116
+ )
117
+
118
+ end # class Conjunction
119
+ end # module Connective
120
+ end # module Logic
121
+ end # class Optimizer
122
+ end # module Veritas
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ module Connective
7
+
8
+ # Abstract base class representing Disjunction optimizations
9
+ class Disjunction < Binary
10
+
11
+ # Optimize when the left operand is a contradiction
12
+ class ContradictionLeftOperand < self
13
+
14
+ # Test if the left operand is a contradiction
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ def optimizable?
20
+ left_contradiction?
21
+ end
22
+
23
+ # A Disjunction with a contradiction left operand is equivalent to the right
24
+ #
25
+ # @return [Expression]
26
+ #
27
+ # @api private
28
+ def optimize
29
+ right
30
+ end
31
+
32
+ end # class ContradictionLeftOperand
33
+
34
+ # Optimize when the right operand is a contradiction
35
+ class ContradictionRightOperand < self
36
+
37
+ # Test if the right operand is a contradiction
38
+ #
39
+ # @return [Boolean]
40
+ #
41
+ # @api private
42
+ def optimizable?
43
+ right_contradiction?
44
+ end
45
+
46
+ # A Disjunction with a contradiction right operand is equivalent to the left
47
+ #
48
+ # @return [Expression]
49
+ #
50
+ # @api private
51
+ def optimize
52
+ left
53
+ end
54
+
55
+ end # class ContradictionRightOperand
56
+
57
+ # Optimize when the operands are equality predicates for the same attribute
58
+ class OptimizableToInclusion < self
59
+
60
+ # Test if the operands are equality predicates for the same attribute
61
+ #
62
+ # @return [Boolean]
63
+ #
64
+ # @api private
65
+ def optimizable?
66
+ equality_with_same_attributes?
67
+ end
68
+
69
+ # Return an Inclusion for an attribute having a set of values
70
+ #
71
+ # @return [Inclusion]
72
+ #
73
+ # @api private
74
+ def optimize
75
+ left = self.left
76
+ Veritas::Logic::Predicate::Inclusion.new(left.left, [ left.right, right.right ]).optimize
77
+ end
78
+
79
+ end # class OptimizableToInclusion
80
+
81
+ # Optimize when the operands are a tuatology
82
+ class Tautology < self
83
+
84
+ # Test if the operands are a tuatology
85
+ #
86
+ # @return [Boolean]
87
+ #
88
+ # @api private
89
+ def optimizable?
90
+ left_tautology? ||
91
+ right_tautology? ||
92
+ inequality_with_same_attributes? ||
93
+ left.inverse.eql?(right)
94
+ end
95
+
96
+ # Return a tuatology
97
+ #
98
+ # @return [Tautology]
99
+ #
100
+ # @api private
101
+ def optimize
102
+ Veritas::Logic::Proposition::Tautology.instance
103
+ end
104
+
105
+ end # class Tautology
106
+
107
+ Veritas::Logic::Connective::Disjunction.optimizer = chain(
108
+ ContradictionLeftOperand,
109
+ ContradictionRightOperand,
110
+ OptimizableToInclusion,
111
+ EqualOperands,
112
+ RedundantLeftOperand,
113
+ RedundantRightOperand,
114
+ Tautology,
115
+ UnoptimizedOperand
116
+ )
117
+
118
+ end # class Disjunction
119
+ end # module Connective
120
+ end # module Logic
121
+ end # class Optimizer
122
+ end # module Veritas
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ module Connective
7
+
8
+ # Abstract base class representing Negation optimizations
9
+ class Negation < Optimizer
10
+
11
+ # The optimized operand
12
+ #
13
+ # @return [Expression]
14
+ #
15
+ # @api private
16
+ attr_reader :operand
17
+
18
+ # Initialize a Unary optimizer
19
+ #
20
+ # @return [undefined]
21
+ #
22
+ # @api private
23
+ def initialize(*)
24
+ super
25
+ @operand = optimize_operand
26
+ end
27
+
28
+ private
29
+
30
+ # Optimize the operand
31
+ #
32
+ # @return [Expression]
33
+ #
34
+ # @api private
35
+ def optimize_operand
36
+ # TODO: move Predicate.optimize_operand to a better location
37
+ Predicate.optimize_operand(operation.operand)
38
+ end
39
+
40
+ # Optimize when the operand can be inverted
41
+ class InvertibleOperand < self
42
+
43
+ # Test if the operand can be inverted
44
+ #
45
+ # @return [Boolean]
46
+ #
47
+ # @api private
48
+ def optimizable?
49
+ operand.respond_to?(:inverse)
50
+ end
51
+
52
+ # A Negation of an Expression is equivalent to the inverted Expression
53
+ #
54
+ # @return [Expression]
55
+ #
56
+ # @api private
57
+ def optimize
58
+ operand.inverse
59
+ end
60
+
61
+ end # class InvertibleOperand
62
+
63
+ Veritas::Logic::Connective::Negation.optimizer = chain(
64
+ InvertibleOperand
65
+ )
66
+
67
+ end # class Negation
68
+ end # module Connective
69
+ end # module Logic
70
+ end # class Optimizer
71
+ end # module Veritas
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing Comparable predicate optimizations
9
+ module Comparable
10
+
11
+ # Optimize when the operands can be normalized
12
+ class NormalizableOperands < Predicate
13
+
14
+ # Test if the operands can be normalized
15
+ #
16
+ # @return [Boolean]
17
+ #
18
+ # @api private
19
+ def optimizable?
20
+ util = Util
21
+ util.constant?(left) && util.attribute?(right)
22
+ end
23
+
24
+ # Normalize the predicate by reversing the operands
25
+ #
26
+ # @return [Predicate]
27
+ #
28
+ # @api private
29
+ def optimize
30
+ operation.class.reverse.new(right, left)
31
+ end
32
+
33
+ end # class NormalizableOperands
34
+
35
+ # Optimize when the operands will never be equivalent
36
+ module NeverEquivalent
37
+
38
+ # Test if the operands will never be equivalent
39
+ #
40
+ # @return [Boolean]
41
+ #
42
+ # @api private
43
+ def optimizable?
44
+ util = Util
45
+ if util.constant?(left) then left_invalid_constant?
46
+ elsif util.constant?(right) then right_invalid_constant?
47
+ else
48
+ not_joinable?
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ # Test if the left operand is an invalid constant
55
+ #
56
+ # @return [Boolean]
57
+ #
58
+ # @api private
59
+ def left_invalid_constant?
60
+ !right.valid_value?(left)
61
+ end
62
+
63
+ # Test if the right operand is an invalid constant
64
+ #
65
+ # @return [Boolean]
66
+ #
67
+ # @api private
68
+ def right_invalid_constant?
69
+ !left.valid_value?(right)
70
+ end
71
+
72
+ # Test if the left and right operand are not joinable
73
+ #
74
+ # @return [Boolean]
75
+ #
76
+ # @api private
77
+ def not_joinable?
78
+ !left.joinable?(right)
79
+ end
80
+
81
+ end # module NeverEquivalent
82
+
83
+ # Optimize when the operands will never be comparable
84
+ module NeverComparable
85
+
86
+ # Test if the operands will never be comparable
87
+ #
88
+ # @return [Boolean]
89
+ #
90
+ # @api private
91
+ def optimizable?
92
+ util = Util
93
+ if util.constant?(left) then left_invalid_constant?
94
+ elsif util.constant?(right) then right_invalid_constant?
95
+ else
96
+ not_comparable?
97
+ end
98
+ end
99
+
100
+ private
101
+
102
+ # Test if the left operand is an invalid constant
103
+ #
104
+ # @return [Boolean]
105
+ #
106
+ # @api private
107
+ def left_invalid_constant?
108
+ !right.valid_primitive?(left)
109
+ end
110
+
111
+ # Test if the right operand is an invalid constant
112
+ #
113
+ # @return [Boolean]
114
+ #
115
+ # @api private
116
+ def right_invalid_constant?
117
+ !left.valid_primitive?(right)
118
+ end
119
+
120
+ # Test if the left and right operand are not comparable
121
+ #
122
+ # @return [Boolean]
123
+ #
124
+ # @api private
125
+ def not_comparable?
126
+ !left.comparable?(right)
127
+ end
128
+
129
+ end # module NeverComparable
130
+ end # module Comparable
131
+ end # class Predicate
132
+ end # module Logic
133
+ end # class Optimizer
134
+ end # module Veritas
@@ -0,0 +1,141 @@
1
+ # encoding: utf-8
2
+
3
+ module Veritas
4
+ class Optimizer
5
+ module Logic
6
+ class Predicate
7
+
8
+ # Abstract base class representing Enumerable predicate optimizations
9
+ module Enumerable
10
+
11
+ private
12
+
13
+ # Optimize the right operand
14
+ #
15
+ # @return [Object]
16
+ #
17
+ # @api private
18
+ def optimize_right
19
+ right = operation.right
20
+
21
+ if right.respond_to?(:to_inclusive)
22
+ optimize_right_range
23
+ elsif right.respond_to?(:select)
24
+ optimize_right_enumerable
25
+ else
26
+ right
27
+ end
28
+ end
29
+
30
+ # Optimize the right range operand
31
+ #
32
+ # @return [Range]
33
+ #
34
+ # @api private
35
+ def optimize_right_range
36
+ right = operation.right
37
+ right.to_inclusive if right.overlaps?(left.range)
38
+ end
39
+
40
+ # Optimize the right enumerable operand
41
+ #
42
+ # @return [Enumerable]
43
+ #
44
+ # @api private
45
+ def optimize_right_enumerable
46
+ enumerable = normalized_right_enumerable
47
+ right = operation.right
48
+
49
+ right.eql?(enumerable) ? right : enumerable
50
+ end
51
+
52
+ # Normalize the right enumerable to only include unique, sorted, valid values
53
+ #
54
+ # @return [Enumerable]
55
+ #
56
+ # @api private
57
+ def normalized_right_enumerable
58
+ enumerable = operation.right.select { |value| left.valid_value?(value) }
59
+ enumerable.sort!
60
+ enumerable.uniq!
61
+ enumerable
62
+ end
63
+
64
+ # Optimize when the right operand is empty
65
+ module EmptyRightOperand
66
+ include Enumerable
67
+
68
+ # Test if the right operand is empty
69
+ #
70
+ # @return [Boolean]
71
+ #
72
+ # @api private
73
+ def optimizable?
74
+ right_nil? || right_none?
75
+ end
76
+
77
+ private
78
+
79
+ # Test if the right operand is nil
80
+ #
81
+ # @return [Boolean]
82
+ #
83
+ # @api private
84
+ def right_nil?
85
+ right.nil?
86
+ end
87
+
88
+ # Test if the right operand has no entries
89
+ #
90
+ # @return [Boolean]
91
+ #
92
+ # @api private
93
+ def right_none?
94
+ right.none? { true }
95
+ end
96
+
97
+ end # module EmptyRightOperand
98
+
99
+ # Optimize when the right operand has one entry
100
+ module OneRightOperand
101
+ include Enumerable
102
+
103
+ # Test if the right operand has one entry
104
+ #
105
+ # @return [Boolean]
106
+ #
107
+ # @api private
108
+ def optimizable?
109
+ right.one? { true }
110
+ end
111
+
112
+ end # module OneRightOperand
113
+
114
+ # Optimize when the operands are unoptimized
115
+ class UnoptimizedOperand < Predicate
116
+ include Enumerable
117
+
118
+ # Test if the operands are unoptimized
119
+ #
120
+ # @return [Boolean]
121
+ #
122
+ # @api private
123
+ def optimizable?
124
+ !right.equal?(operation.right)
125
+ end
126
+
127
+ # Return a Enumerable predicate with optimized operands
128
+ #
129
+ # @return [Binary]
130
+ #
131
+ # @api private
132
+ def optimize
133
+ operation.class.new(left, right)
134
+ end
135
+
136
+ end # class UnoptimizedOperand
137
+ end # module Enumerable
138
+ end # class Predicate
139
+ end # module Logic
140
+ end # class Optimizer
141
+ 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 Equality optimizations
9
+ class Equality < self
10
+ include Comparable
11
+
12
+ # Optimize when the operand are a contradiction
13
+ class Contradiction < self
14
+ include Comparable::NeverEquivalent
15
+ include Predicate::Contradiction
16
+ end # class Contradiction
17
+
18
+ # Optimize when the operand are a tautology
19
+ class Tautology < self
20
+ include Predicate::Tautology
21
+
22
+ # Test if the operands are a tautology
23
+ #
24
+ # @return [Boolean]
25
+ #
26
+ # @api private
27
+ def optimizable?
28
+ left.equal?(right)
29
+ end
30
+
31
+ end # class Tautology
32
+
33
+ Veritas::Logic::Predicate::Equality.optimizer = chain(
34
+ ConstantOperands,
35
+ Contradiction,
36
+ Tautology,
37
+ NormalizableOperands
38
+ )
39
+
40
+ end # class Equality
41
+ end # class Predicate
42
+ end # module Logic
43
+ end # class Optimizer
44
+ 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 Exclusion optimizations
9
+ class Exclusion < self
10
+ include Enumerable
11
+
12
+ # Optimize when the right operand is empty
13
+ class EmptyRightOperand < self
14
+ include Enumerable::EmptyRightOperand
15
+
16
+ # An Exclusion with an empty right operand matches everything
17
+ #
18
+ # @return [Tautology]
19
+ #
20
+ # @api private
21
+ def optimize
22
+ Veritas::Logic::Proposition::Tautology.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 Exclusion with a single right operand is equivalent to an Inequality
32
+ #
33
+ # @return [Inequality]
34
+ #
35
+ # @api private
36
+ def optimize
37
+ Veritas::Logic::Predicate::Inequality.new(left, right.first)
38
+ end
39
+
40
+ end # class OneRightOperand
41
+
42
+ Veritas::Logic::Predicate::Exclusion.optimizer = chain(
43
+ ConstantOperands,
44
+ EmptyRightOperand,
45
+ OneRightOperand,
46
+ UnoptimizedOperand
47
+ )
48
+
49
+ end # class Exclusion
50
+ end # class Predicate
51
+ end # module Logic
52
+ end # class Optimizer
53
+ end # module Veritas