veritas 0.0.1

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 (724) hide show
  1. data/.autotest +42 -0
  2. data/.document +5 -0
  3. data/.gitignore +34 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +122 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +143 -0
  8. data/Rakefile +31 -0
  9. data/TODO +126 -0
  10. data/benchmarks/memory.rb +175 -0
  11. data/benchmarks/speed.rb +101 -0
  12. data/config/flay.yml +3 -0
  13. data/config/flog.yml +2 -0
  14. data/config/roodi.yml +18 -0
  15. data/config/site.reek +96 -0
  16. data/config/yardstick.yml +2 -0
  17. data/lib/veritas/algebra/difference.rb +53 -0
  18. data/lib/veritas/algebra/extension.rb +121 -0
  19. data/lib/veritas/algebra/intersection.rb +53 -0
  20. data/lib/veritas/algebra/join.rb +198 -0
  21. data/lib/veritas/algebra/product.rb +90 -0
  22. data/lib/veritas/algebra/projection.rb +113 -0
  23. data/lib/veritas/algebra/rename/aliases.rb +199 -0
  24. data/lib/veritas/algebra/rename.rb +91 -0
  25. data/lib/veritas/algebra/restriction.rb +96 -0
  26. data/lib/veritas/algebra/summarization.rb +166 -0
  27. data/lib/veritas/algebra/union.rb +54 -0
  28. data/lib/veritas/algebra.rb +10 -0
  29. data/lib/veritas/attribute/boolean.rb +39 -0
  30. data/lib/veritas/attribute/class.rb +21 -0
  31. data/lib/veritas/attribute/comparable.rb +32 -0
  32. data/lib/veritas/attribute/date.rb +36 -0
  33. data/lib/veritas/attribute/date_time.rb +36 -0
  34. data/lib/veritas/attribute/decimal.rb +21 -0
  35. data/lib/veritas/attribute/float.rb +21 -0
  36. data/lib/veritas/attribute/integer.rb +21 -0
  37. data/lib/veritas/attribute/numeric.rb +86 -0
  38. data/lib/veritas/attribute/object.rb +25 -0
  39. data/lib/veritas/attribute/orderable.rb +33 -0
  40. data/lib/veritas/attribute/string.rb +88 -0
  41. data/lib/veritas/attribute/time.rb +36 -0
  42. data/lib/veritas/attribute.rb +256 -0
  43. data/lib/veritas/core_ext/date.rb +16 -0
  44. data/lib/veritas/core_ext/range.rb +35 -0
  45. data/lib/veritas/core_ext/time.rb +16 -0
  46. data/lib/veritas/logic/connective/binary.rb +54 -0
  47. data/lib/veritas/logic/connective/conjunction.rb +70 -0
  48. data/lib/veritas/logic/connective/disjunction.rb +70 -0
  49. data/lib/veritas/logic/connective/negation.rb +78 -0
  50. data/lib/veritas/logic/connective/unary.rb +52 -0
  51. data/lib/veritas/logic/connective.rb +31 -0
  52. data/lib/veritas/logic/expression.rb +99 -0
  53. data/lib/veritas/logic/predicate/comparable.rb +57 -0
  54. data/lib/veritas/logic/predicate/enumerable.rb +25 -0
  55. data/lib/veritas/logic/predicate/equality.rb +65 -0
  56. data/lib/veritas/logic/predicate/exclusion.rb +72 -0
  57. data/lib/veritas/logic/predicate/greater_than.rb +65 -0
  58. data/lib/veritas/logic/predicate/greater_than_or_equal_to.rb +65 -0
  59. data/lib/veritas/logic/predicate/inclusion.rb +72 -0
  60. data/lib/veritas/logic/predicate/inequality.rb +80 -0
  61. data/lib/veritas/logic/predicate/less_than.rb +65 -0
  62. data/lib/veritas/logic/predicate/less_than_or_equal_to.rb +65 -0
  63. data/lib/veritas/logic/predicate/match.rb +53 -0
  64. data/lib/veritas/logic/predicate/no_match.rb +68 -0
  65. data/lib/veritas/logic/predicate.rb +97 -0
  66. data/lib/veritas/logic/proposition/false.rb +63 -0
  67. data/lib/veritas/logic/proposition/true.rb +63 -0
  68. data/lib/veritas/logic/proposition.rb +110 -0
  69. data/lib/veritas/logic.rb +5 -0
  70. data/lib/veritas/optimizer/algebra/difference.rb +64 -0
  71. data/lib/veritas/optimizer/algebra/extension.rb +40 -0
  72. data/lib/veritas/optimizer/algebra/intersection.rb +64 -0
  73. data/lib/veritas/optimizer/algebra/join.rb +42 -0
  74. data/lib/veritas/optimizer/algebra/product.rb +68 -0
  75. data/lib/veritas/optimizer/algebra/projection.rb +172 -0
  76. data/lib/veritas/optimizer/algebra/rename.rb +370 -0
  77. data/lib/veritas/optimizer/algebra/restriction.rb +257 -0
  78. data/lib/veritas/optimizer/algebra/summarization.rb +40 -0
  79. data/lib/veritas/optimizer/algebra/union.rb +64 -0
  80. data/lib/veritas/optimizer/algebra.rb +10 -0
  81. data/lib/veritas/optimizer/logic/connective/binary.rb +252 -0
  82. data/lib/veritas/optimizer/logic/connective/conjunction.rb +120 -0
  83. data/lib/veritas/optimizer/logic/connective/disjunction.rb +120 -0
  84. data/lib/veritas/optimizer/logic/connective/negation.rb +69 -0
  85. data/lib/veritas/optimizer/logic/connective.rb +5 -0
  86. data/lib/veritas/optimizer/logic/predicate/comparable.rb +132 -0
  87. data/lib/veritas/optimizer/logic/predicate/enumerable.rb +139 -0
  88. data/lib/veritas/optimizer/logic/predicate/equality.rb +42 -0
  89. data/lib/veritas/optimizer/logic/predicate/exclusion.rb +51 -0
  90. data/lib/veritas/optimizer/logic/predicate/greater_than.rb +52 -0
  91. data/lib/veritas/optimizer/logic/predicate/greater_than_or_equal_to.rb +54 -0
  92. data/lib/veritas/optimizer/logic/predicate/inclusion.rb +51 -0
  93. data/lib/veritas/optimizer/logic/predicate/inequality.rb +42 -0
  94. data/lib/veritas/optimizer/logic/predicate/less_than.rb +52 -0
  95. data/lib/veritas/optimizer/logic/predicate/less_than_or_equal_to.rb +54 -0
  96. data/lib/veritas/optimizer/logic/predicate/match.rb +17 -0
  97. data/lib/veritas/optimizer/logic/predicate/no_match.rb +17 -0
  98. data/lib/veritas/optimizer/logic/predicate.rb +187 -0
  99. data/lib/veritas/optimizer/logic.rb +2 -0
  100. data/lib/veritas/optimizer/relation/materialized.rb +38 -0
  101. data/lib/veritas/optimizer/relation/operation/binary.rb +166 -0
  102. data/lib/veritas/optimizer/relation/operation/combine.rb +31 -0
  103. data/lib/veritas/optimizer/relation/operation/limit.rb +156 -0
  104. data/lib/veritas/optimizer/relation/operation/offset.rb +112 -0
  105. data/lib/veritas/optimizer/relation/operation/order.rb +94 -0
  106. data/lib/veritas/optimizer/relation/operation/reverse.rb +92 -0
  107. data/lib/veritas/optimizer/relation/operation/unary.rb +86 -0
  108. data/lib/veritas/optimizer/relation/operation.rb +8 -0
  109. data/lib/veritas/optimizer/relation.rb +2 -0
  110. data/lib/veritas/optimizer.rb +94 -0
  111. data/lib/veritas/relation/empty.rb +22 -0
  112. data/lib/veritas/relation/header.rb +267 -0
  113. data/lib/veritas/relation/materialized.rb +62 -0
  114. data/lib/veritas/relation/operation/binary.rb +77 -0
  115. data/lib/veritas/relation/operation/combine.rb +35 -0
  116. data/lib/veritas/relation/operation/limit.rb +190 -0
  117. data/lib/veritas/relation/operation/offset.rb +153 -0
  118. data/lib/veritas/relation/operation/order/direction.rb +209 -0
  119. data/lib/veritas/relation/operation/order/direction_set.rb +246 -0
  120. data/lib/veritas/relation/operation/order.rb +138 -0
  121. data/lib/veritas/relation/operation/reverse.rb +85 -0
  122. data/lib/veritas/relation/operation/set.rb +76 -0
  123. data/lib/veritas/relation/operation/unary.rb +25 -0
  124. data/lib/veritas/relation/operation.rb +10 -0
  125. data/lib/veritas/relation.rb +210 -0
  126. data/lib/veritas/support/abstract_class.rb +40 -0
  127. data/lib/veritas/support/aliasable.rb +29 -0
  128. data/lib/veritas/support/evaluator.rb +52 -0
  129. data/lib/veritas/support/immutable.rb +299 -0
  130. data/lib/veritas/support/operation/binary.rb +73 -0
  131. data/lib/veritas/support/operation/unary.rb +59 -0
  132. data/lib/veritas/support/optimizable.rb +51 -0
  133. data/lib/veritas/tuple.rb +181 -0
  134. data/lib/veritas/version.rb +3 -0
  135. data/lib/veritas.rb +54 -0
  136. data/spec/integration/veritas/algebra/difference/optimize_spec.rb +151 -0
  137. data/spec/integration/veritas/algebra/intersection/optimize_spec.rb +151 -0
  138. data/spec/integration/veritas/algebra/join/optimize_spec.rb +111 -0
  139. data/spec/integration/veritas/algebra/join_spec.rb +14 -0
  140. data/spec/integration/veritas/algebra/product/optimize_spec.rb +177 -0
  141. data/spec/integration/veritas/algebra/product_spec.rb +14 -0
  142. data/spec/integration/veritas/algebra/projection/optimize_spec.rb +238 -0
  143. data/spec/integration/veritas/algebra/projection_spec.rb +16 -0
  144. data/spec/integration/veritas/algebra/rename/optimize_spec.rb +441 -0
  145. data/spec/integration/veritas/algebra/restriction/optimize_spec.rb +301 -0
  146. data/spec/integration/veritas/algebra/union/optimize_spec.rb +193 -0
  147. data/spec/integration/veritas/logic/connective/conjunction/optimize_spec.rb +235 -0
  148. data/spec/integration/veritas/logic/connective/disjunction/optimize_spec.rb +236 -0
  149. data/spec/integration/veritas/logic/connective/negation/optimize_spec.rb +42 -0
  150. data/spec/integration/veritas/logic/expression/optimize_spec.rb +34 -0
  151. data/spec/integration/veritas/logic/predicate/equality/optimize_spec.rb +91 -0
  152. data/spec/integration/veritas/logic/predicate/exclusion/optimize_spec.rb +132 -0
  153. data/spec/integration/veritas/logic/predicate/greater_than/optimize_spec.rb +101 -0
  154. data/spec/integration/veritas/logic/predicate/greater_than_or_equal_to/optimize_spec.rb +101 -0
  155. data/spec/integration/veritas/logic/predicate/inclusion/optimize_spec.rb +132 -0
  156. data/spec/integration/veritas/logic/predicate/inequality/optimize_spec.rb +91 -0
  157. data/spec/integration/veritas/logic/predicate/less_than/optimize_spec.rb +101 -0
  158. data/spec/integration/veritas/logic/predicate/less_than_or_equal_to/optimize_spec.rb +101 -0
  159. data/spec/integration/veritas/relation/efficient_enumerable_spec.rb +56 -0
  160. data/spec/integration/veritas/relation/empty/optimize_spec.rb +12 -0
  161. data/spec/integration/veritas/relation/materialized/optimize_spec.rb +38 -0
  162. data/spec/integration/veritas/relation/operation/limit/optimize_spec.rb +141 -0
  163. data/spec/integration/veritas/relation/operation/offset/optimize_spec.rb +99 -0
  164. data/spec/integration/veritas/relation/operation/order/optimize_spec.rb +104 -0
  165. data/spec/integration/veritas/relation/operation/reverse/optimize_spec.rb +114 -0
  166. data/spec/integration/veritas/relation/optimize_spec.rb +30 -0
  167. data/spec/rcov.opts +6 -0
  168. data/spec/shared/idempotent_method_behavior.rb +5 -0
  169. data/spec/shared/logic_connective_binary_optimize_behavior.rb +100 -0
  170. data/spec/shared/optimize_method_behavior.rb +13 -0
  171. data/spec/spec.opts +3 -0
  172. data/spec/spec_helper.rb +14 -0
  173. data/spec/support/add_method_missing.rb +13 -0
  174. data/spec/unit/date/pred_spec.rb +15 -0
  175. data/spec/unit/range/overlaps_spec.rb +190 -0
  176. data/spec/unit/range/to_inclusive_spec.rb +29 -0
  177. data/spec/unit/time/pred_spec.rb +15 -0
  178. data/spec/unit/veritas/abstract_class/class_methods/new_spec.rb +18 -0
  179. data/spec/unit/veritas/abstract_class/fixtures/classes.rb +7 -0
  180. data/spec/unit/veritas/algebra/difference/each_spec.rb +30 -0
  181. data/spec/unit/veritas/algebra/difference/methods/difference_spec.rb +17 -0
  182. data/spec/unit/veritas/algebra/extension/class_methods/new_spec.rb +20 -0
  183. data/spec/unit/veritas/algebra/extension/each_spec.rb +17 -0
  184. data/spec/unit/veritas/algebra/extension/extensions_spec.rb +14 -0
  185. data/spec/unit/veritas/algebra/extension/header_spec.rb +16 -0
  186. data/spec/unit/veritas/algebra/extension/methods/extend_spec.rb +14 -0
  187. data/spec/unit/veritas/algebra/extension/operand_spec.rb +14 -0
  188. data/spec/unit/veritas/algebra/intersection/each_spec.rb +30 -0
  189. data/spec/unit/veritas/algebra/intersection/methods/intersect_spec.rb +17 -0
  190. data/spec/unit/veritas/algebra/join/class_methods/new_spec.rb +26 -0
  191. data/spec/unit/veritas/algebra/join/each_spec.rb +18 -0
  192. data/spec/unit/veritas/algebra/join/methods/join_spec.rb +46 -0
  193. data/spec/unit/veritas/algebra/product/class_methods/new_spec.rb +26 -0
  194. data/spec/unit/veritas/algebra/product/each_spec.rb +19 -0
  195. data/spec/unit/veritas/algebra/product/methods/product_spec.rb +12 -0
  196. data/spec/unit/veritas/algebra/projection/directions_spec.rb +29 -0
  197. data/spec/unit/veritas/algebra/projection/each_spec.rb +17 -0
  198. data/spec/unit/veritas/algebra/projection/header_spec.rb +15 -0
  199. data/spec/unit/veritas/algebra/projection/methods/project_spec.rb +13 -0
  200. data/spec/unit/veritas/algebra/projection/methods/remove_spec.rb +15 -0
  201. data/spec/unit/veritas/algebra/rename/aliases/class_methods/coerce_spec.rb +49 -0
  202. data/spec/unit/veritas/algebra/rename/aliases/each_spec.rb +17 -0
  203. data/spec/unit/veritas/algebra/rename/aliases/element_reference_spec.rb +22 -0
  204. data/spec/unit/veritas/algebra/rename/aliases/empty_spec.rb +21 -0
  205. data/spec/unit/veritas/algebra/rename/aliases/eql_spec.rb +50 -0
  206. data/spec/unit/veritas/algebra/rename/aliases/equal_value_spec.rb +50 -0
  207. data/spec/unit/veritas/algebra/rename/aliases/hash_spec.rb +16 -0
  208. data/spec/unit/veritas/algebra/rename/aliases/to_hash_spec.rb +27 -0
  209. data/spec/unit/veritas/algebra/rename/aliases/union_spec.rb +65 -0
  210. data/spec/unit/veritas/algebra/rename/aliases_spec.rb +12 -0
  211. data/spec/unit/veritas/algebra/rename/directions_spec.rb +29 -0
  212. data/spec/unit/veritas/algebra/rename/each_spec.rb +21 -0
  213. data/spec/unit/veritas/algebra/rename/eql_spec.rb +50 -0
  214. data/spec/unit/veritas/algebra/rename/header_spec.rb +15 -0
  215. data/spec/unit/veritas/algebra/rename/methods/rename_spec.rb +12 -0
  216. data/spec/unit/veritas/algebra/restriction/each_spec.rb +16 -0
  217. data/spec/unit/veritas/algebra/restriction/eql_spec.rb +49 -0
  218. data/spec/unit/veritas/algebra/restriction/methods/restrict_spec.rb +38 -0
  219. data/spec/unit/veritas/algebra/restriction/predicate_spec.rb +14 -0
  220. data/spec/unit/veritas/algebra/summarization/class_methods/summarize_spec.rb +26 -0
  221. data/spec/unit/veritas/algebra/summarization/each_spec.rb +17 -0
  222. data/spec/unit/veritas/algebra/summarization/header_spec.rb +16 -0
  223. data/spec/unit/veritas/algebra/summarization/methods/summarize_spec.rb +30 -0
  224. data/spec/unit/veritas/algebra/summarization/summarize_by_spec.rb +14 -0
  225. data/spec/unit/veritas/algebra/summarization/summarizers_spec.rb +14 -0
  226. data/spec/unit/veritas/algebra/union/each_spec.rb +30 -0
  227. data/spec/unit/veritas/algebra/union/methods/union_spec.rb +17 -0
  228. data/spec/unit/veritas/aliasable/fixtures/classes.rb +7 -0
  229. data/spec/unit/veritas/aliasable/inheritable_alias_spec.rb +48 -0
  230. data/spec/unit/veritas/attribute/boolean/class_methods/primitive_spec.rb +7 -0
  231. data/spec/unit/veritas/attribute/boolean/valid_value_spec.rb +25 -0
  232. data/spec/unit/veritas/attribute/call_spec.rb +11 -0
  233. data/spec/unit/veritas/attribute/class/class_methods/primitive_spec.rb +7 -0
  234. data/spec/unit/veritas/attribute/class_methods/coerce_spec.rb +29 -0
  235. data/spec/unit/veritas/attribute/class_methods/name_from_spec.rb +29 -0
  236. data/spec/unit/veritas/attribute/class_methods/new_spec.rb +33 -0
  237. data/spec/unit/veritas/attribute/comparable/comparable_spec.rb +49 -0
  238. data/spec/unit/veritas/attribute/comparable/fixtures/classes.rb +5 -0
  239. data/spec/unit/veritas/attribute/date/class_methods/primitive_spec.rb +7 -0
  240. data/spec/unit/veritas/attribute/date/range_spec.rb +9 -0
  241. data/spec/unit/veritas/attribute/date_time/class_methods/primitive_spec.rb +7 -0
  242. data/spec/unit/veritas/attribute/date_time/range_spec.rb +9 -0
  243. data/spec/unit/veritas/attribute/decimal/class_methods/primitive_spec.rb +7 -0
  244. data/spec/unit/veritas/attribute/eql_spec.rb +48 -0
  245. data/spec/unit/veritas/attribute/equal_value_spec.rb +48 -0
  246. data/spec/unit/veritas/attribute/float/class_methods/primitive_spec.rb +7 -0
  247. data/spec/unit/veritas/attribute/hash_spec.rb +15 -0
  248. data/spec/unit/veritas/attribute/inspect_spec.rb +11 -0
  249. data/spec/unit/veritas/attribute/integer/class_methods/primitive_spec.rb +7 -0
  250. data/spec/unit/veritas/attribute/joinable_spec.rb +47 -0
  251. data/spec/unit/veritas/attribute/name_spec.rb +10 -0
  252. data/spec/unit/veritas/attribute/numeric/class_methods/primitive_spec.rb +7 -0
  253. data/spec/unit/veritas/attribute/numeric/joinable_spec.rb +37 -0
  254. data/spec/unit/veritas/attribute/numeric/size_spec.rb +19 -0
  255. data/spec/unit/veritas/attribute/numeric/valid_value_spec.rb +33 -0
  256. data/spec/unit/veritas/attribute/object/class_methods/primitive_spec.rb +7 -0
  257. data/spec/unit/veritas/attribute/options_spec.rb +32 -0
  258. data/spec/unit/veritas/attribute/orderable/asc_spec.rb +10 -0
  259. data/spec/unit/veritas/attribute/orderable/desc_spec.rb +10 -0
  260. data/spec/unit/veritas/attribute/orderable/fixtures/classes.rb +5 -0
  261. data/spec/unit/veritas/attribute/rename_spec.rb +25 -0
  262. data/spec/unit/veritas/attribute/required_spec.rb +23 -0
  263. data/spec/unit/veritas/attribute/string/class_methods/primitive_spec.rb +7 -0
  264. data/spec/unit/veritas/attribute/string/joinable_spec.rb +37 -0
  265. data/spec/unit/veritas/attribute/string/length_spec.rb +19 -0
  266. data/spec/unit/veritas/attribute/string/valid_value_spec.rb +33 -0
  267. data/spec/unit/veritas/attribute/time/class_methods/primitive_spec.rb +7 -0
  268. data/spec/unit/veritas/attribute/time/range_spec.rb +9 -0
  269. data/spec/unit/veritas/attribute/valid_primitive_spec.rb +19 -0
  270. data/spec/unit/veritas/attribute/valid_value_spec.rb +35 -0
  271. data/spec/unit/veritas/evaluator/expression/add_spec.rb +22 -0
  272. data/spec/unit/veritas/evaluator/expression/expressions_spec.rb +14 -0
  273. data/spec/unit/veritas/immutable/class_methods/freeze_object_spec.rb +45 -0
  274. data/spec/unit/veritas/immutable/class_methods/new_spec.rb +12 -0
  275. data/spec/unit/veritas/immutable/dup_spec.rb +11 -0
  276. data/spec/unit/veritas/immutable/fixtures/classes.rb +26 -0
  277. data/spec/unit/veritas/immutable/memoize_methods/freeze_spec.rb +46 -0
  278. data/spec/unit/veritas/immutable/memoize_methods/memoize_spec.rb +20 -0
  279. data/spec/unit/veritas/immutable/memoize_methods/memoized_spec.rb +27 -0
  280. data/spec/unit/veritas/immutable/memoize_spec.rb +13 -0
  281. data/spec/unit/veritas/immutable/memory/element_reference_spec.rb +24 -0
  282. data/spec/unit/veritas/immutable/memory/element_set_spec.rb +17 -0
  283. data/spec/unit/veritas/immutable/module_methods/included_spec.rb +14 -0
  284. data/spec/unit/veritas/immutable/module_methods/memoize_spec.rb +78 -0
  285. data/spec/unit/veritas/logic/connective/binary/call_spec.rb +20 -0
  286. data/spec/unit/veritas/logic/connective/binary/fixtures/classes.rb +8 -0
  287. data/spec/unit/veritas/logic/connective/binary/rename_spec.rb +41 -0
  288. data/spec/unit/veritas/logic/connective/conjunction/class_methods/call_spec.rb +33 -0
  289. data/spec/unit/veritas/logic/connective/conjunction/inspect_spec.rb +12 -0
  290. data/spec/unit/veritas/logic/connective/conjunction/methods/and_spec.rb +16 -0
  291. data/spec/unit/veritas/logic/connective/conjunction/methods/fixtures/classes.rb +5 -0
  292. data/spec/unit/veritas/logic/connective/disjunction/class_methods/call_spec.rb +33 -0
  293. data/spec/unit/veritas/logic/connective/disjunction/inspect_spec.rb +12 -0
  294. data/spec/unit/veritas/logic/connective/disjunction/methods/fixtures/classes.rb +5 -0
  295. data/spec/unit/veritas/logic/connective/disjunction/methods/or_spec.rb +16 -0
  296. data/spec/unit/veritas/logic/connective/inspect_spec.rb +10 -0
  297. data/spec/unit/veritas/logic/connective/inverse_spec.rb +26 -0
  298. data/spec/unit/veritas/logic/connective/negation/class_methods/call_spec.rb +19 -0
  299. data/spec/unit/veritas/logic/connective/negation/inspect_spec.rb +12 -0
  300. data/spec/unit/veritas/logic/connective/negation/inverse_spec.rb +20 -0
  301. data/spec/unit/veritas/logic/connective/negation/methods/fixtures/classes.rb +6 -0
  302. data/spec/unit/veritas/logic/connective/negation/methods/not_spec.rb +23 -0
  303. data/spec/unit/veritas/logic/connective/unary/call_spec.rb +19 -0
  304. data/spec/unit/veritas/logic/connective/unary/fixtures/classes.rb +8 -0
  305. data/spec/unit/veritas/logic/connective/unary/rename_spec.rb +25 -0
  306. data/spec/unit/veritas/logic/expression/class_methods/call_spec.rb +15 -0
  307. data/spec/unit/veritas/logic/expression/eql_spec.rb +11 -0
  308. data/spec/unit/veritas/logic/expression/equal_value_spec.rb +65 -0
  309. data/spec/unit/veritas/logic/expression/fixtures/classes.rb +4 -0
  310. data/spec/unit/veritas/logic/expression/hash_spec.rb +10 -0
  311. data/spec/unit/veritas/logic/expression/inspect_spec.rb +10 -0
  312. data/spec/unit/veritas/logic/expression/inverse_spec.rb +15 -0
  313. data/spec/unit/veritas/logic/expression/rename_spec.rb +13 -0
  314. data/spec/unit/veritas/logic/predicate/call_spec.rb +16 -0
  315. data/spec/unit/veritas/logic/predicate/class_methods/call_spec.rb +7 -0
  316. data/spec/unit/veritas/logic/predicate/class_methods/extract_value_spec.rb +20 -0
  317. data/spec/unit/veritas/logic/predicate/comparable/class_methods/call_spec.rb +8 -0
  318. data/spec/unit/veritas/logic/predicate/comparable/fixtures/classes.rb +21 -0
  319. data/spec/unit/veritas/logic/predicate/comparable/inspect_spec.rb +11 -0
  320. data/spec/unit/veritas/logic/predicate/eql_spec.rb +50 -0
  321. data/spec/unit/veritas/logic/predicate/equality/class_methods/call_spec.rb +19 -0
  322. data/spec/unit/veritas/logic/predicate/equality/class_methods/inverse_spec.rb +7 -0
  323. data/spec/unit/veritas/logic/predicate/equality/class_methods/operation_spec.rb +7 -0
  324. data/spec/unit/veritas/logic/predicate/equality/class_methods/reverse_spec.rb +7 -0
  325. data/spec/unit/veritas/logic/predicate/equality/inspect_spec.rb +10 -0
  326. data/spec/unit/veritas/logic/predicate/equality/inverse_spec.rb +16 -0
  327. data/spec/unit/veritas/logic/predicate/equality/methods/eq_spec.rb +10 -0
  328. data/spec/unit/veritas/logic/predicate/equality/methods/fixtures/classes.rb +5 -0
  329. data/spec/unit/veritas/logic/predicate/exclusion/class_methods/call_spec.rb +19 -0
  330. data/spec/unit/veritas/logic/predicate/exclusion/class_methods/inverse_spec.rb +7 -0
  331. data/spec/unit/veritas/logic/predicate/exclusion/inspect_spec.rb +13 -0
  332. data/spec/unit/veritas/logic/predicate/exclusion/inverse_spec.rb +16 -0
  333. data/spec/unit/veritas/logic/predicate/exclusion/methods/exclude_spec.rb +11 -0
  334. data/spec/unit/veritas/logic/predicate/exclusion/methods/fixtures/classes.rb +5 -0
  335. data/spec/unit/veritas/logic/predicate/fixtures/classes.rb +12 -0
  336. data/spec/unit/veritas/logic/predicate/greater_than/class_methods/call_spec.rb +26 -0
  337. data/spec/unit/veritas/logic/predicate/greater_than/class_methods/inverse_spec.rb +7 -0
  338. data/spec/unit/veritas/logic/predicate/greater_than/class_methods/operation_spec.rb +7 -0
  339. data/spec/unit/veritas/logic/predicate/greater_than/class_methods/reverse_spec.rb +7 -0
  340. data/spec/unit/veritas/logic/predicate/greater_than/inspect_spec.rb +10 -0
  341. data/spec/unit/veritas/logic/predicate/greater_than/inverse_spec.rb +16 -0
  342. data/spec/unit/veritas/logic/predicate/greater_than/methods/fixtures/classes.rb +5 -0
  343. data/spec/unit/veritas/logic/predicate/greater_than/methods/gt_spec.rb +10 -0
  344. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/class_methods/call_spec.rb +26 -0
  345. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/class_methods/inverse_spec.rb +7 -0
  346. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/class_methods/operation_spec.rb +7 -0
  347. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/class_methods/reverse_spec.rb +7 -0
  348. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/inspect_spec.rb +10 -0
  349. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/inverse_spec.rb +16 -0
  350. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/methods/fixtures/classes.rb +5 -0
  351. data/spec/unit/veritas/logic/predicate/greater_than_or_equal_to/methods/gte_spec.rb +10 -0
  352. data/spec/unit/veritas/logic/predicate/hash_spec.rb +15 -0
  353. data/spec/unit/veritas/logic/predicate/inclusion/class_methods/call_spec.rb +19 -0
  354. data/spec/unit/veritas/logic/predicate/inclusion/class_methods/inverse_spec.rb +7 -0
  355. data/spec/unit/veritas/logic/predicate/inclusion/inspect_spec.rb +13 -0
  356. data/spec/unit/veritas/logic/predicate/inclusion/inverse_spec.rb +16 -0
  357. data/spec/unit/veritas/logic/predicate/inclusion/methods/fixtures/classes.rb +5 -0
  358. data/spec/unit/veritas/logic/predicate/inclusion/methods/include_spec.rb +11 -0
  359. data/spec/unit/veritas/logic/predicate/inequality/class_methods/call_spec.rb +19 -0
  360. data/spec/unit/veritas/logic/predicate/inequality/class_methods/inverse_spec.rb +7 -0
  361. data/spec/unit/veritas/logic/predicate/inequality/class_methods/operation_spec.rb +7 -0
  362. data/spec/unit/veritas/logic/predicate/inequality/class_methods/reverse_spec.rb +7 -0
  363. data/spec/unit/veritas/logic/predicate/inequality/inspect_spec.rb +10 -0
  364. data/spec/unit/veritas/logic/predicate/inequality/inverse_spec.rb +16 -0
  365. data/spec/unit/veritas/logic/predicate/inequality/methods/fixtures/classes.rb +5 -0
  366. data/spec/unit/veritas/logic/predicate/inequality/methods/ne_spec.rb +10 -0
  367. data/spec/unit/veritas/logic/predicate/inspect_spec.rb +11 -0
  368. data/spec/unit/veritas/logic/predicate/inverse_spec.rb +31 -0
  369. data/spec/unit/veritas/logic/predicate/less_than/class_methods/call_spec.rb +26 -0
  370. data/spec/unit/veritas/logic/predicate/less_than/class_methods/inverse_spec.rb +7 -0
  371. data/spec/unit/veritas/logic/predicate/less_than/class_methods/operation_spec.rb +7 -0
  372. data/spec/unit/veritas/logic/predicate/less_than/class_methods/reverse_spec.rb +7 -0
  373. data/spec/unit/veritas/logic/predicate/less_than/inspect_spec.rb +10 -0
  374. data/spec/unit/veritas/logic/predicate/less_than/inverse_spec.rb +16 -0
  375. data/spec/unit/veritas/logic/predicate/less_than/methods/fixtures/classes.rb +5 -0
  376. data/spec/unit/veritas/logic/predicate/less_than/methods/lt_spec.rb +10 -0
  377. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/class_methods/call_spec.rb +26 -0
  378. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/class_methods/inverse_spec.rb +7 -0
  379. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/class_methods/operation_spec.rb +7 -0
  380. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/class_methods/reverse_spec.rb +7 -0
  381. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/inspect_spec.rb +10 -0
  382. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/inverse_spec.rb +16 -0
  383. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/methods/fixtures/classes.rb +5 -0
  384. data/spec/unit/veritas/logic/predicate/less_than_or_equal_to/methods/lte_spec.rb +10 -0
  385. data/spec/unit/veritas/logic/predicate/match/class_methods/call_spec.rb +19 -0
  386. data/spec/unit/veritas/logic/predicate/match/class_methods/inverse_spec.rb +7 -0
  387. data/spec/unit/veritas/logic/predicate/match/class_methods/operation_spec.rb +7 -0
  388. data/spec/unit/veritas/logic/predicate/match/inspect_spec.rb +10 -0
  389. data/spec/unit/veritas/logic/predicate/match/inverse_spec.rb +16 -0
  390. data/spec/unit/veritas/logic/predicate/match/methods/fixtures/classes.rb +5 -0
  391. data/spec/unit/veritas/logic/predicate/match/methods/match_spec.rb +10 -0
  392. data/spec/unit/veritas/logic/predicate/no_match/class_methods/call_spec.rb +19 -0
  393. data/spec/unit/veritas/logic/predicate/no_match/class_methods/inverse_spec.rb +7 -0
  394. data/spec/unit/veritas/logic/predicate/no_match/class_methods/operation_spec.rb +7 -0
  395. data/spec/unit/veritas/logic/predicate/no_match/inspect_spec.rb +10 -0
  396. data/spec/unit/veritas/logic/predicate/no_match/inverse_spec.rb +16 -0
  397. data/spec/unit/veritas/logic/predicate/no_match/methods/fixtures/classes.rb +5 -0
  398. data/spec/unit/veritas/logic/predicate/no_match/methods/no_match_spec.rb +10 -0
  399. data/spec/unit/veritas/logic/predicate/rename_spec.rb +43 -0
  400. data/spec/unit/veritas/logic/proposition/call_spec.rb +14 -0
  401. data/spec/unit/veritas/logic/proposition/class_methods/call_spec.rb +7 -0
  402. data/spec/unit/veritas/logic/proposition/class_methods/new_spec.rb +23 -0
  403. data/spec/unit/veritas/logic/proposition/eql_spec.rb +28 -0
  404. data/spec/unit/veritas/logic/proposition/false/and_spec.rb +10 -0
  405. data/spec/unit/veritas/logic/proposition/false/class_methods/call_spec.rb +7 -0
  406. data/spec/unit/veritas/logic/proposition/false/class_methods/inverse_spec.rb +7 -0
  407. data/spec/unit/veritas/logic/proposition/false/inspect_spec.rb +9 -0
  408. data/spec/unit/veritas/logic/proposition/false/inverse_spec.rb +15 -0
  409. data/spec/unit/veritas/logic/proposition/false/or_spec.rb +10 -0
  410. data/spec/unit/veritas/logic/proposition/fixtures/classes.rb +8 -0
  411. data/spec/unit/veritas/logic/proposition/hash_spec.rb +19 -0
  412. data/spec/unit/veritas/logic/proposition/inspect_spec.rb +10 -0
  413. data/spec/unit/veritas/logic/proposition/inverse_spec.rb +27 -0
  414. data/spec/unit/veritas/logic/proposition/true/and_spec.rb +10 -0
  415. data/spec/unit/veritas/logic/proposition/true/class_methods/call_spec.rb +7 -0
  416. data/spec/unit/veritas/logic/proposition/true/class_methods/inverse_spec.rb +7 -0
  417. data/spec/unit/veritas/logic/proposition/true/inspect_spec.rb +9 -0
  418. data/spec/unit/veritas/logic/proposition/true/inverse_spec.rb +15 -0
  419. data/spec/unit/veritas/logic/proposition/true/or_spec.rb +10 -0
  420. data/spec/unit/veritas/operation/binary/eql_spec.rb +52 -0
  421. data/spec/unit/veritas/operation/binary/hash_spec.rb +16 -0
  422. data/spec/unit/veritas/operation/binary/left_spec.rb +12 -0
  423. data/spec/unit/veritas/operation/binary/right_spec.rb +12 -0
  424. data/spec/unit/veritas/operation/unary/eql_spec.rb +51 -0
  425. data/spec/unit/veritas/operation/unary/hash_spec.rb +15 -0
  426. data/spec/unit/veritas/operation/unary/operand_spec.rb +11 -0
  427. data/spec/unit/veritas/optimizable/class_methods/optimizer_spec.rb +34 -0
  428. data/spec/unit/veritas/optimizable/optimize_spec.rb +36 -0
  429. data/spec/unit/veritas/optimizer/algebra/difference/empty_left/optimize_spec.rb +18 -0
  430. data/spec/unit/veritas/optimizer/algebra/difference/empty_right/optimize_spec.rb +18 -0
  431. data/spec/unit/veritas/optimizer/algebra/difference/equal_operands/optimize_spec.rb +20 -0
  432. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimizable_spec.rb +28 -0
  433. data/spec/unit/veritas/optimizer/algebra/extension/unoptimized_operand/optimize_spec.rb +24 -0
  434. data/spec/unit/veritas/optimizer/algebra/intersection/empty_left/optimize_spec.rb +18 -0
  435. data/spec/unit/veritas/optimizer/algebra/intersection/empty_right/optimize_spec.rb +18 -0
  436. data/spec/unit/veritas/optimizer/algebra/intersection/equal_operands/optimize_spec.rb +18 -0
  437. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimizable_spec.rb +28 -0
  438. data/spec/unit/veritas/optimizer/algebra/join/equal_headers/optimize_spec.rb +22 -0
  439. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimizable_spec.rb +26 -0
  440. data/spec/unit/veritas/optimizer/algebra/product/table_dee_left/optimize_spec.rb +17 -0
  441. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimizable_spec.rb +26 -0
  442. data/spec/unit/veritas/optimizer/algebra/product/table_dee_right/optimize_spec.rb +17 -0
  443. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimizable_spec.rb +26 -0
  444. data/spec/unit/veritas/optimizer/algebra/projection/empty_operand/optimize_spec.rb +17 -0
  445. data/spec/unit/veritas/optimizer/algebra/projection/header_spec.rb +17 -0
  446. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimizable_spec.rb +27 -0
  447. data/spec/unit/veritas/optimizer/algebra/projection/projection_operand/optimize_spec.rb +17 -0
  448. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimizable_spec.rb +28 -0
  449. data/spec/unit/veritas/optimizer/algebra/projection/set_operand/optimize_spec.rb +39 -0
  450. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimizable_spec.rb +27 -0
  451. data/spec/unit/veritas/optimizer/algebra/projection/unchanged_header/optimize_spec.rb +17 -0
  452. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimizable_spec.rb +27 -0
  453. data/spec/unit/veritas/optimizer/algebra/projection/unoptimized_operand/optimize_spec.rb +17 -0
  454. data/spec/unit/veritas/optimizer/algebra/rename/aliases_spec.rb +27 -0
  455. data/spec/unit/veritas/optimizer/algebra/rename/class_methods/union_aliases_spec.rb +25 -0
  456. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimizable_spec.rb +26 -0
  457. data/spec/unit/veritas/optimizer/algebra/rename/empty_operand/optimize_spec.rb +19 -0
  458. data/spec/unit/veritas/optimizer/algebra/rename/header_spec.rb +18 -0
  459. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimizable_spec.rb +27 -0
  460. data/spec/unit/veritas/optimizer/algebra/rename/limit_operand/optimize_spec.rb +18 -0
  461. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimizable_spec.rb +27 -0
  462. data/spec/unit/veritas/optimizer/algebra/rename/offset_operand/optimize_spec.rb +18 -0
  463. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimizable_spec.rb +27 -0
  464. data/spec/unit/veritas/optimizer/algebra/rename/order_operand/optimize_spec.rb +36 -0
  465. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimizable_spec.rb +27 -0
  466. data/spec/unit/veritas/optimizer/algebra/rename/projection_operand/optimize_spec.rb +18 -0
  467. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_any_aliases/optimizable_spec.rb +36 -0
  468. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_any_aliases/optimize_spec.rb +18 -0
  469. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimizable_spec.rb +36 -0
  470. data/spec/unit/veritas/optimizer/algebra/rename/rename_operand_and_empty_aliases/optimize_spec.rb +18 -0
  471. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimizable_spec.rb +28 -0
  472. data/spec/unit/veritas/optimizer/algebra/rename/restriction_operand/optimize_spec.rb +19 -0
  473. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimizable_spec.rb +26 -0
  474. data/spec/unit/veritas/optimizer/algebra/rename/reverse_operand/optimize_spec.rb +37 -0
  475. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimizable_spec.rb +28 -0
  476. data/spec/unit/veritas/optimizer/algebra/rename/set_operand/optimize_spec.rb +23 -0
  477. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimizable_spec.rb +43 -0
  478. data/spec/unit/veritas/optimizer/algebra/rename/unoptimized_operand/optimize_spec.rb +20 -0
  479. data/spec/unit/veritas/optimizer/algebra/restriction/class_methods/optimize_predicate_spec.rb +27 -0
  480. data/spec/unit/veritas/optimizer/algebra/restriction/false_predicate/optimizable_spec.rb +27 -0
  481. data/spec/unit/veritas/optimizer/algebra/restriction/false_predicate/optimize_spec.rb +20 -0
  482. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimizable_spec.rb +27 -0
  483. data/spec/unit/veritas/optimizer/algebra/restriction/order_operand/optimize_spec.rb +31 -0
  484. data/spec/unit/veritas/optimizer/algebra/restriction/predicate_spec.rb +17 -0
  485. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimizable_spec.rb +29 -0
  486. data/spec/unit/veritas/optimizer/algebra/restriction/restriction_operand/optimize_spec.rb +24 -0
  487. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimizable_spec.rb +27 -0
  488. data/spec/unit/veritas/optimizer/algebra/restriction/reverse_operand/optimize_spec.rb +31 -0
  489. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimizable_spec.rb +29 -0
  490. data/spec/unit/veritas/optimizer/algebra/restriction/set_operand/optimize_spec.rb +24 -0
  491. data/spec/unit/veritas/optimizer/algebra/restriction/true_predicate/optimizable_spec.rb +26 -0
  492. data/spec/unit/veritas/optimizer/algebra/restriction/true_predicate/optimize_spec.rb +18 -0
  493. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimizable_spec.rb +43 -0
  494. data/spec/unit/veritas/optimizer/algebra/restriction/unoptimized_operand/optimize_spec.rb +21 -0
  495. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimizable_spec.rb +28 -0
  496. data/spec/unit/veritas/optimizer/algebra/summarization/unoptimized_operand/optimize_spec.rb +24 -0
  497. data/spec/unit/veritas/optimizer/algebra/union/empty_left/optimize_spec.rb +18 -0
  498. data/spec/unit/veritas/optimizer/algebra/union/empty_right/optimize_spec.rb +18 -0
  499. data/spec/unit/veritas/optimizer/algebra/union/equal_operands/optimize_spec.rb +18 -0
  500. data/spec/unit/veritas/optimizer/class_methods/chain_spec.rb +55 -0
  501. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimizable_spec.rb +28 -0
  502. data/spec/unit/veritas/optimizer/logic/connective/binary/equal_operands/optimize_spec.rb +18 -0
  503. data/spec/unit/veritas/optimizer/logic/connective/binary/left_spec.rb +15 -0
  504. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimizable_spec.rb +27 -0
  505. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_left_operand/optimize_spec.rb +18 -0
  506. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimizable_spec.rb +27 -0
  507. data/spec/unit/veritas/optimizer/logic/connective/binary/redundant_right_operand/optimize_spec.rb +18 -0
  508. data/spec/unit/veritas/optimizer/logic/connective/binary/right_spec.rb +15 -0
  509. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimizable_spec.rb +35 -0
  510. data/spec/unit/veritas/optimizer/logic/connective/binary/unoptimized_operand/optimize_spec.rb +18 -0
  511. data/spec/unit/veritas/optimizer/logic/connective/conjunction/always_false/optimizable_spec.rb +42 -0
  512. data/spec/unit/veritas/optimizer/logic/connective/conjunction/always_false/optimize_spec.rb +18 -0
  513. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimizable_spec.rb +28 -0
  514. data/spec/unit/veritas/optimizer/logic/connective/conjunction/optimizable_to_exclusion/optimize_spec.rb +30 -0
  515. data/spec/unit/veritas/optimizer/logic/connective/conjunction/true_left_operand/optimizable_spec.rb +28 -0
  516. data/spec/unit/veritas/optimizer/logic/connective/conjunction/true_left_operand/optimize_spec.rb +18 -0
  517. data/spec/unit/veritas/optimizer/logic/connective/conjunction/true_right_operand/optimizable_spec.rb +28 -0
  518. data/spec/unit/veritas/optimizer/logic/connective/conjunction/true_right_operand/optimize_spec.rb +18 -0
  519. data/spec/unit/veritas/optimizer/logic/connective/disjunction/always_true/optimizable_spec.rb +42 -0
  520. data/spec/unit/veritas/optimizer/logic/connective/disjunction/always_true/optimize_spec.rb +18 -0
  521. data/spec/unit/veritas/optimizer/logic/connective/disjunction/false_left_operand/optimizable_spec.rb +28 -0
  522. data/spec/unit/veritas/optimizer/logic/connective/disjunction/false_left_operand/optimize_spec.rb +18 -0
  523. data/spec/unit/veritas/optimizer/logic/connective/disjunction/false_right_operand/optimizable_spec.rb +28 -0
  524. data/spec/unit/veritas/optimizer/logic/connective/disjunction/false_right_operand/optimize_spec.rb +18 -0
  525. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimizable_spec.rb +28 -0
  526. data/spec/unit/veritas/optimizer/logic/connective/disjunction/optimizable_to_inclusion/optimize_spec.rb +30 -0
  527. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimizable_spec.rb +27 -0
  528. data/spec/unit/veritas/optimizer/logic/connective/negation/invertible_operand/optimize_spec.rb +17 -0
  529. data/spec/unit/veritas/optimizer/logic/connective/negation/operand_spec.rb +13 -0
  530. data/spec/unit/veritas/optimizer/logic/predicate/always_false/optimize_spec.rb +16 -0
  531. data/spec/unit/veritas/optimizer/logic/predicate/always_true/optimize_spec.rb +16 -0
  532. data/spec/unit/veritas/optimizer/logic/predicate/class_methods/optimize_operand_spec.rb +20 -0
  533. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_comparable/optimizable_spec.rb +58 -0
  534. data/spec/unit/veritas/optimizer/logic/predicate/comparable/never_equivalent/optimizable_spec.rb +58 -0
  535. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimizable_spec.rb +42 -0
  536. data/spec/unit/veritas/optimizer/logic/predicate/comparable/normalizable_operands/optimize_spec.rb +16 -0
  537. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimizable_spec.rb +30 -0
  538. data/spec/unit/veritas/optimizer/logic/predicate/constant_operands/optimize_spec.rb +11 -0
  539. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/empty_right_operand/optimizable_spec.rb +76 -0
  540. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/one_right_operand/optimizable_spec.rb +76 -0
  541. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimizable_spec.rb +50 -0
  542. data/spec/unit/veritas/optimizer/logic/predicate/enumerable/unoptimized_operand/optimize_spec.rb +38 -0
  543. data/spec/unit/veritas/optimizer/logic/predicate/equality/always_true/optimizable_spec.rb +28 -0
  544. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/empty_right_operand/optimize_spec.rb +44 -0
  545. data/spec/unit/veritas/optimizer/logic/predicate/exclusion/one_right_operand/optimize_spec.rb +44 -0
  546. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/always_false/optimizable_spec.rb +42 -0
  547. data/spec/unit/veritas/optimizer/logic/predicate/greater_than/always_true/optimizable_spec.rb +27 -0
  548. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/always_false/optimizable_spec.rb +42 -0
  549. data/spec/unit/veritas/optimizer/logic/predicate/greater_than_or_equal_to/always_true/optimizable_spec.rb +42 -0
  550. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/empty_right_operand/optimize_spec.rb +44 -0
  551. data/spec/unit/veritas/optimizer/logic/predicate/inclusion/one_right_operand/optimize_spec.rb +44 -0
  552. data/spec/unit/veritas/optimizer/logic/predicate/inequality/always_false/optimizable_spec.rb +28 -0
  553. data/spec/unit/veritas/optimizer/logic/predicate/left_spec.rb +13 -0
  554. data/spec/unit/veritas/optimizer/logic/predicate/less_than/always_false/optimizable_spec.rb +42 -0
  555. data/spec/unit/veritas/optimizer/logic/predicate/less_than/always_true/optimizable_spec.rb +27 -0
  556. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/always_false/optimizable_spec.rb +42 -0
  557. data/spec/unit/veritas/optimizer/logic/predicate/less_than_or_equal_to/always_true/optimizable_spec.rb +42 -0
  558. data/spec/unit/veritas/optimizer/logic/predicate/right_spec.rb +13 -0
  559. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/attribute_spec.rb +19 -0
  560. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/constant_spec.rb +19 -0
  561. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/max_spec.rb +19 -0
  562. data/spec/unit/veritas/optimizer/logic/predicate/util/class_methods/min_spec.rb +19 -0
  563. data/spec/unit/veritas/optimizer/operation_spec.rb +11 -0
  564. data/spec/unit/veritas/optimizer/optimizable_spec.rb +15 -0
  565. data/spec/unit/veritas/optimizer/optimize_spec.rb +15 -0
  566. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimizable_spec.rb +21 -0
  567. data/spec/unit/veritas/optimizer/relation/materialized/empty_operand/optimize_spec.rb +14 -0
  568. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_left/optimizable_spec.rb +30 -0
  569. data/spec/unit/veritas/optimizer/relation/operation/binary/empty_right/optimizable_spec.rb +30 -0
  570. data/spec/unit/veritas/optimizer/relation/operation/binary/equal_operands/optimizable_spec.rb +34 -0
  571. data/spec/unit/veritas/optimizer/relation/operation/binary/left_spec.rb +18 -0
  572. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimizable_spec.rb +36 -0
  573. data/spec/unit/veritas/optimizer/relation/operation/binary/materialized_operand/optimize_spec.rb +17 -0
  574. data/spec/unit/veritas/optimizer/relation/operation/binary/right_spec.rb +18 -0
  575. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimizable_spec.rb +39 -0
  576. data/spec/unit/veritas/optimizer/relation/operation/binary/unoptimized_operand/optimize_spec.rb +15 -0
  577. data/spec/unit/veritas/optimizer/relation/operation/combine/optimize_spec.rb +15 -0
  578. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimizable_spec.rb +32 -0
  579. data/spec/unit/veritas/optimizer/relation/operation/limit/equal_limit_operand/optimize_spec.rb +18 -0
  580. data/spec/unit/veritas/optimizer/relation/operation/limit/inequal_limit_operand/optimizable_spec.rb +32 -0
  581. data/spec/unit/veritas/optimizer/relation/operation/limit/inequal_limit_operand/optimize_spec.rb +27 -0
  582. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimizable_spec.rb +27 -0
  583. data/spec/unit/veritas/optimizer/relation/operation/limit/unoptimized_operand/optimize_spec.rb +19 -0
  584. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimizable_spec.rb +26 -0
  585. data/spec/unit/veritas/optimizer/relation/operation/limit/zero_limit/optimize_spec.rb +19 -0
  586. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimizable_spec.rb +26 -0
  587. data/spec/unit/veritas/optimizer/relation/operation/offset/offset_operand/optimize_spec.rb +18 -0
  588. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimizable_spec.rb +27 -0
  589. data/spec/unit/veritas/optimizer/relation/operation/offset/unoptimized_operand/optimize_spec.rb +19 -0
  590. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimizable_spec.rb +26 -0
  591. data/spec/unit/veritas/optimizer/relation/operation/offset/zero_offset/optimize_spec.rb +16 -0
  592. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimizable_spec.rb +32 -0
  593. data/spec/unit/veritas/optimizer/relation/operation/order/one_limit_operand/optimize_spec.rb +18 -0
  594. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimizable_spec.rb +26 -0
  595. data/spec/unit/veritas/optimizer/relation/operation/order/order_operand/optimize_spec.rb +19 -0
  596. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimizable_spec.rb +27 -0
  597. data/spec/unit/veritas/optimizer/relation/operation/order/unoptimized_operand/optimize_spec.rb +20 -0
  598. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimizable_spec.rb +26 -0
  599. data/spec/unit/veritas/optimizer/relation/operation/reverse/order_operand/optimize_spec.rb +17 -0
  600. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimizable_spec.rb +26 -0
  601. data/spec/unit/veritas/optimizer/relation/operation/reverse/reverse_operand/optimize_spec.rb +17 -0
  602. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimizable_spec.rb +26 -0
  603. data/spec/unit/veritas/optimizer/relation/operation/reverse/unoptimized_operand/optimize_spec.rb +20 -0
  604. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimizable_spec.rb +21 -0
  605. data/spec/unit/veritas/optimizer/relation/operation/unary/empty_operand/optimize_spec.rb +16 -0
  606. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimizable_spec.rb +21 -0
  607. data/spec/unit/veritas/optimizer/relation/operation/unary/materialized_operand/optimize_spec.rb +15 -0
  608. data/spec/unit/veritas/optimizer/relation/operation/unary/operand_spec.rb +13 -0
  609. data/spec/unit/veritas/relation/class_methods/new_spec.rb +36 -0
  610. data/spec/unit/veritas/relation/directions_spec.rb +13 -0
  611. data/spec/unit/veritas/relation/each_spec.rb +26 -0
  612. data/spec/unit/veritas/relation/element_reference_spec.rb +12 -0
  613. data/spec/unit/veritas/relation/empty/each_spec.rb +14 -0
  614. data/spec/unit/veritas/relation/empty/empty_spec.rb +9 -0
  615. data/spec/unit/veritas/relation/empty/header_spec.rb +11 -0
  616. data/spec/unit/veritas/relation/empty_spec.rb +20 -0
  617. data/spec/unit/veritas/relation/eql_spec.rb +49 -0
  618. data/spec/unit/veritas/relation/equal_value_spec.rb +96 -0
  619. data/spec/unit/veritas/relation/hash_spec.rb +13 -0
  620. data/spec/unit/veritas/relation/header/class_methods/coerce_spec.rb +23 -0
  621. data/spec/unit/veritas/relation/header/difference_spec.rb +16 -0
  622. data/spec/unit/veritas/relation/header/each_spec.rb +25 -0
  623. data/spec/unit/veritas/relation/header/element_reference_spec.rb +19 -0
  624. data/spec/unit/veritas/relation/header/empty_spec.rb +17 -0
  625. data/spec/unit/veritas/relation/header/eql_spec.rb +89 -0
  626. data/spec/unit/veritas/relation/header/equal_value_spec.rb +81 -0
  627. data/spec/unit/veritas/relation/header/hash_spec.rb +13 -0
  628. data/spec/unit/veritas/relation/header/index_spec.rb +20 -0
  629. data/spec/unit/veritas/relation/header/inspect_spec.rb +12 -0
  630. data/spec/unit/veritas/relation/header/intersect_spec.rb +14 -0
  631. data/spec/unit/veritas/relation/header/project_spec.rb +11 -0
  632. data/spec/unit/veritas/relation/header/rename_spec.rb +14 -0
  633. data/spec/unit/veritas/relation/header/to_ary_spec.rb +14 -0
  634. data/spec/unit/veritas/relation/header/union_spec.rb +16 -0
  635. data/spec/unit/veritas/relation/header_spec.rb +14 -0
  636. data/spec/unit/veritas/relation/materialize_spec.rb +18 -0
  637. data/spec/unit/veritas/relation/materialized/class_methods/new_spec.rb +34 -0
  638. data/spec/unit/veritas/relation/materialized/empty_spec.rb +30 -0
  639. data/spec/unit/veritas/relation/materialized/materialize_spec.rb +9 -0
  640. data/spec/unit/veritas/relation/materialized/size_spec.rb +11 -0
  641. data/spec/unit/veritas/relation/operation/binary/class_methods/new_spec.rb +37 -0
  642. data/spec/unit/veritas/relation/operation/binary/directions_spec.rb +16 -0
  643. data/spec/unit/veritas/relation/operation/binary/fixtures/classes.rb +12 -0
  644. data/spec/unit/veritas/relation/operation/binary/header_spec.rb +16 -0
  645. data/spec/unit/veritas/relation/operation/combine/class_methods/combine_tuples_spec.rb +17 -0
  646. data/spec/unit/veritas/relation/operation/combine/fixtures/classes.rb +12 -0
  647. data/spec/unit/veritas/relation/operation/combine/header_spec.rb +18 -0
  648. data/spec/unit/veritas/relation/operation/limit/class_methods/new_spec.rb +28 -0
  649. data/spec/unit/veritas/relation/operation/limit/each_spec.rb +17 -0
  650. data/spec/unit/veritas/relation/operation/limit/eql_spec.rb +50 -0
  651. data/spec/unit/veritas/relation/operation/limit/methods/first_spec.rb +36 -0
  652. data/spec/unit/veritas/relation/operation/limit/methods/last_spec.rb +36 -0
  653. data/spec/unit/veritas/relation/operation/limit/methods/take_spec.rb +14 -0
  654. data/spec/unit/veritas/relation/operation/limit/to_i_spec.rb +12 -0
  655. data/spec/unit/veritas/relation/operation/offset/class_methods/new_spec.rb +28 -0
  656. data/spec/unit/veritas/relation/operation/offset/each_spec.rb +17 -0
  657. data/spec/unit/veritas/relation/operation/offset/eql_spec.rb +51 -0
  658. data/spec/unit/veritas/relation/operation/offset/methods/drop_spec.rb +14 -0
  659. data/spec/unit/veritas/relation/operation/offset/to_i_spec.rb +12 -0
  660. data/spec/unit/veritas/relation/operation/order/ascending/class_methods/call_spec.rb +26 -0
  661. data/spec/unit/veritas/relation/operation/order/ascending/class_methods/reverse_spec.rb +7 -0
  662. data/spec/unit/veritas/relation/operation/order/ascending/reverse_spec.rb +12 -0
  663. data/spec/unit/veritas/relation/operation/order/class_methods/new_spec.rb +21 -0
  664. data/spec/unit/veritas/relation/operation/order/descending/class_methods/call_spec.rb +26 -0
  665. data/spec/unit/veritas/relation/operation/order/descending/class_methods/reverse_spec.rb +7 -0
  666. data/spec/unit/veritas/relation/operation/order/descending/reverse_spec.rb +12 -0
  667. data/spec/unit/veritas/relation/operation/order/direction/attribute_spec.rb +11 -0
  668. data/spec/unit/veritas/relation/operation/order/direction/call_spec.rb +22 -0
  669. data/spec/unit/veritas/relation/operation/order/direction/class_methods/coerce_spec.rb +20 -0
  670. data/spec/unit/veritas/relation/operation/order/direction/eql_spec.rb +52 -0
  671. data/spec/unit/veritas/relation/operation/order/direction/hash_spec.rb +15 -0
  672. data/spec/unit/veritas/relation/operation/order/direction/rename_spec.rb +28 -0
  673. data/spec/unit/veritas/relation/operation/order/direction/reverse_spec.rb +27 -0
  674. data/spec/unit/veritas/relation/operation/order/direction_set/attributes_spec.rb +12 -0
  675. data/spec/unit/veritas/relation/operation/order/direction_set/class_methods/coerce_spec.rb +26 -0
  676. data/spec/unit/veritas/relation/operation/order/direction_set/each_spec.rb +27 -0
  677. data/spec/unit/veritas/relation/operation/order/direction_set/empty_spec.rb +18 -0
  678. data/spec/unit/veritas/relation/operation/order/direction_set/eql_spec.rb +49 -0
  679. data/spec/unit/veritas/relation/operation/order/direction_set/equal_value_spec.rb +49 -0
  680. data/spec/unit/veritas/relation/operation/order/direction_set/hash_spec.rb +14 -0
  681. data/spec/unit/veritas/relation/operation/order/direction_set/project_spec.rb +14 -0
  682. data/spec/unit/veritas/relation/operation/order/direction_set/rename_spec.rb +16 -0
  683. data/spec/unit/veritas/relation/operation/order/direction_set/reverse_spec.rb +19 -0
  684. data/spec/unit/veritas/relation/operation/order/direction_set/sort_tuples_spec.rb +62 -0
  685. data/spec/unit/veritas/relation/operation/order/direction_set/to_ary_spec.rb +12 -0
  686. data/spec/unit/veritas/relation/operation/order/direction_set/union_spec.rb +16 -0
  687. data/spec/unit/veritas/relation/operation/order/directions_spec.rb +15 -0
  688. data/spec/unit/veritas/relation/operation/order/each_spec.rb +16 -0
  689. data/spec/unit/veritas/relation/operation/order/eql_spec.rb +50 -0
  690. data/spec/unit/veritas/relation/operation/order/header_spec.rb +15 -0
  691. data/spec/unit/veritas/relation/operation/order/methods/order_spec.rb +44 -0
  692. data/spec/unit/veritas/relation/operation/reverse/class_methods/new_spec.rb +23 -0
  693. data/spec/unit/veritas/relation/operation/reverse/each_spec.rb +17 -0
  694. data/spec/unit/veritas/relation/operation/reverse/methods/reverse_spec.rb +14 -0
  695. data/spec/unit/veritas/relation/operation/set/class_methods/new_spec.rb +27 -0
  696. data/spec/unit/veritas/relation/operation/set/fixtures/classes.rb +12 -0
  697. data/spec/unit/veritas/relation/operation/set/header_spec.rb +15 -0
  698. data/spec/unit/veritas/relation/operation/unary/directions_spec.rb +15 -0
  699. data/spec/unit/veritas/relation/operation/unary/fixtures/classes.rb +15 -0
  700. data/spec/unit/veritas/relation/operation/unary/header_spec.rb +15 -0
  701. data/spec/unit/veritas/tuple/class_methods/coerce_spec.rb +19 -0
  702. data/spec/unit/veritas/tuple/element_reference_spec.rb +20 -0
  703. data/spec/unit/veritas/tuple/eql_spec.rb +88 -0
  704. data/spec/unit/veritas/tuple/equal_value_spec.rb +81 -0
  705. data/spec/unit/veritas/tuple/extend_spec.rb +16 -0
  706. data/spec/unit/veritas/tuple/hash_spec.rb +14 -0
  707. data/spec/unit/veritas/tuple/header_spec.rb +12 -0
  708. data/spec/unit/veritas/tuple/inspect_spec.rb +12 -0
  709. data/spec/unit/veritas/tuple/join_spec.rb +16 -0
  710. data/spec/unit/veritas/tuple/project_spec.rb +15 -0
  711. data/spec/unit/veritas/tuple/to_ary_spec.rb +12 -0
  712. data/tasks/ci.rake +2 -0
  713. data/tasks/clean.rake +6 -0
  714. data/tasks/quality/flay.rake +41 -0
  715. data/tasks/quality/flog.rake +43 -0
  716. data/tasks/quality/heckle.rake +239 -0
  717. data/tasks/quality/metric_fu.rake +26 -0
  718. data/tasks/quality/reek.rake +9 -0
  719. data/tasks/quality/roodi.rake +15 -0
  720. data/tasks/quality/yardstick.rake +23 -0
  721. data/tasks/spec.rake +41 -0
  722. data/tasks/yard.rake +9 -0
  723. data/veritas.gemspec +1350 -0
  724. metadata +1420 -0
@@ -0,0 +1,299 @@
1
+ module Veritas
2
+
3
+ # Allows objects to be made immutable
4
+ module Immutable
5
+
6
+ # Hook called when module is included
7
+ #
8
+ # @param [Module] descendant
9
+ # the module or class including Immutable
10
+ #
11
+ # @return [self]
12
+ #
13
+ # @api private
14
+ def self.included(descendant)
15
+ descendant.extend ModuleMethods if descendant.kind_of?(Module)
16
+ descendant.extend ClassMethods if descendant.kind_of?(Class)
17
+ self
18
+ end
19
+
20
+ # A noop when there are no memoized methods
21
+ #
22
+ # @example
23
+ # object.memoize(:hash, 12345) # => self
24
+ #
25
+ # @param [#to_s] name
26
+ # @param [Object] value
27
+ #
28
+ # @return [self]
29
+ #
30
+ # @api public
31
+ def memoize(name, value)
32
+ self
33
+ end
34
+
35
+ # A noop #dup for immutable objects
36
+ #
37
+ # @example
38
+ # object.dup # => self
39
+ #
40
+ # @return [self]
41
+ #
42
+ # @api public
43
+ def dup
44
+ self
45
+ end
46
+
47
+ # Attempt to freeze an object
48
+ #
49
+ # @example using a value object
50
+ # Immutable.freeze_object(12345) # => noop
51
+ #
52
+ # @example using a normal object
53
+ # Immutable.freeze_object({}) # => duplicate & freeze object
54
+ #
55
+ # @param [Object] object
56
+ # the object to freeze
57
+ #
58
+ # @return [Object]
59
+ # if supported, the frozen object, otherwise the object directly
60
+ #
61
+ # @api public
62
+ def self.freeze_object(object)
63
+ case object
64
+ when Numeric, TrueClass, FalseClass, NilClass
65
+ object
66
+ else
67
+ freeze_value(object)
68
+ end
69
+ end
70
+
71
+ # Returns a frozen value
72
+ #
73
+ # @param [Object] value
74
+ # a value to freeze
75
+ #
76
+ # @return [Object]
77
+ # if frozen, the value directly, otherwise a frozen copy of the value
78
+ #
79
+ # @api private
80
+ def self.freeze_value(value)
81
+ value.frozen? ? value : value.dup.freeze
82
+ end
83
+
84
+ private_class_method :freeze_value
85
+
86
+ # Methods mixed in to immutable modules
87
+ module ModuleMethods
88
+
89
+ # Hook called when module is included
90
+ #
91
+ # @param [Module] mod
92
+ # the module including ModuleMethods
93
+ #
94
+ # @return [self]
95
+ #
96
+ # @api private
97
+ def included(mod)
98
+ Immutable.included(mod)
99
+ self
100
+ end
101
+
102
+ # Memoize a list of methods
103
+ #
104
+ # @example
105
+ # memoize :hash
106
+ #
107
+ # @param [Array<#to_s>] *methods
108
+ # a list of methods to memoize
109
+ #
110
+ # @return [self]
111
+ #
112
+ # @api public
113
+ def memoize(*methods)
114
+ include_memoize_methods
115
+ methods.each { |method| memoize_method(method) }
116
+ self
117
+ end
118
+
119
+ private
120
+
121
+ # Mixin MemoizeMethods if it's not already
122
+ #
123
+ # @return [undefined]
124
+ #
125
+ # @api private
126
+ def include_memoize_methods
127
+ include MemoizeMethods unless include?(MemoizeMethods)
128
+ end
129
+
130
+ # Memoize the named method
131
+ #
132
+ # @param [#to_s] method
133
+ # a method to memoize
134
+ #
135
+ # @return [undefined]
136
+ #
137
+ # @api private
138
+ def memoize_method(method)
139
+ alias_name = "__memoized_#{method}"
140
+ create_alias_for(method, alias_name)
141
+ create_memoize_method_for(method, alias_name)
142
+ end
143
+
144
+ # Create an alias to a method
145
+ #
146
+ # @param [String, Symbol] original_method
147
+ # the name of the original method
148
+ # @param [String, Symbol] alias_name
149
+ # the name of the new alias to create
150
+ #
151
+ # @return [undefined]
152
+ #
153
+ # @api private
154
+ def create_alias_for(original_method, alias_name)
155
+ alias_method alias_name, original_method
156
+ private alias_name
157
+ end
158
+
159
+ # Create a memoized method that delegates to the original method
160
+ #
161
+ # @param [String, Symbol] new_method
162
+ # the name of the new method
163
+ # @param [String, Symbol] alias_name
164
+ # the name of the alias to the original method
165
+ #
166
+ # @return [undefined]
167
+ #
168
+ # @api private
169
+ def create_memoize_method_for(new_method, alias_name)
170
+ visibility = method_visibility(new_method)
171
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
172
+ def #{new_method}(*args) # def name(*args)
173
+ @__memory['@#{new_method}'] ||= #{alias_name}(*args) # @__memory['@name'] ||= __memoized_name(*args)
174
+ end # end
175
+ RUBY
176
+ send(visibility, new_method)
177
+ end
178
+
179
+ # Return the method visibility of a method
180
+ #
181
+ # @param [String, Symbol] method
182
+ # the name of the method
183
+ #
184
+ # @return [String]
185
+ #
186
+ # @api private
187
+ def method_visibility(method)
188
+ if private_method_defined?(method) then 'private'
189
+ elsif protected_method_defined?(method) then 'protected'
190
+ else 'public'
191
+ end
192
+ end
193
+
194
+ end # module ModuleMethods
195
+
196
+ # Methods mixed in to immutable classes
197
+ module ClassMethods
198
+
199
+ # Instantiate a new frozen object
200
+ #
201
+ # @example
202
+ # object = ImmutableClass.new # object is frozen
203
+ #
204
+ # @return [Object]
205
+ #
206
+ # @api public
207
+ def new(*)
208
+ super.freeze
209
+ end
210
+
211
+ end # module ClassMethods
212
+
213
+ # Methods mixed in to memoizable immutable instances
214
+ module MemoizeMethods
215
+
216
+ # Freeze the object
217
+ #
218
+ # @example
219
+ # object.freeze # object is now frozen
220
+ #
221
+ # @return [Object]
222
+ #
223
+ # @api public
224
+ def freeze
225
+ @__memory = Memory.new unless frozen?
226
+ super
227
+ end
228
+
229
+ # Get the memoized value for a method
230
+ #
231
+ # @example
232
+ # hash = object.memoized(:hash)
233
+ #
234
+ # @param [#to_s] name
235
+ # the method name
236
+ #
237
+ # @return [Object]
238
+ #
239
+ # @api public
240
+ def memoized(name)
241
+ @__memory["@#{name}"]
242
+ end
243
+
244
+ # Sets a memoized value for a method
245
+ #
246
+ # @example
247
+ # object.memoize(:hash, 12345)
248
+ #
249
+ # @param [#to_s] name
250
+ # the method name
251
+ # @param [Object] value
252
+ # the value to memoize
253
+ #
254
+ # @return [self]
255
+ #
256
+ # @api public
257
+ def memoize(name, value)
258
+ @__memory["@#{name}"] = value
259
+ self
260
+ end
261
+
262
+ end # module MemoizeMethods
263
+
264
+ # Tracks the values for memoized methods
265
+ class Memory
266
+
267
+ # Get a frozen value from memory
268
+ #
269
+ # @example
270
+ # value = memory[ivar]
271
+ #
272
+ # @param [#to_s] ivar
273
+ # the name of the ivar to get the value for
274
+ #
275
+ # @return [Object]
276
+ #
277
+ # @api public
278
+ alias [] instance_variable_get
279
+
280
+ # Set a frozen value in memory
281
+ #
282
+ # @example
283
+ # memory[ivar] = value
284
+ #
285
+ # @param [#to_s] ivar
286
+ # the name of the ivar to set
287
+ # @param [Object] value
288
+ # the value to set
289
+ #
290
+ # @return [undefined]
291
+ #
292
+ # @api public
293
+ def []=(ivar, value)
294
+ instance_variable_set(ivar, Immutable.freeze_object(value))
295
+ end
296
+
297
+ end # class Memory
298
+ end # module Immutable
299
+ end # module Veritas
@@ -0,0 +1,73 @@
1
+ module Veritas
2
+ module Operation
3
+ module Binary
4
+ include Immutable
5
+
6
+ # The left operand for the operation
7
+ #
8
+ # @example
9
+ # left = binary.left
10
+ #
11
+ # @return [Object]
12
+ #
13
+ # @api public
14
+ attr_reader :left
15
+
16
+ # The right operand for the operation
17
+ #
18
+ # @example
19
+ # right = binary.right
20
+ #
21
+ # @return [Object]
22
+ #
23
+ # @api public
24
+ attr_reader :right
25
+
26
+ # Initialize Binary Operation
27
+ #
28
+ # @param [Object] left
29
+ # the left operand for the operation
30
+ # @param [Object] right
31
+ # the right operand for the operation
32
+ #
33
+ # @return [undefined]
34
+ #
35
+ # @api private
36
+ def initialize(left, right)
37
+ @left = left
38
+ @right = right
39
+ end
40
+
41
+ # Compare the operation with the other operation for equality
42
+ #
43
+ # @example
44
+ # binary.eql?(other) # => true or false
45
+ #
46
+ # @param [Object] other
47
+ #
48
+ # @return [Boolean]
49
+ #
50
+ # @api public
51
+ def eql?(other)
52
+ instance_of?(other.class) &&
53
+ left.eql?(other.left) &&
54
+ right.eql?(other.right)
55
+ end
56
+
57
+ # Return the hash of the left and right operands
58
+ #
59
+ # @example
60
+ # numeric_hash = binary.hash
61
+ #
62
+ # @return [Integer]
63
+ #
64
+ # @api public
65
+ def hash
66
+ left.hash ^ right.hash
67
+ end
68
+
69
+ memoize :hash
70
+
71
+ end # module Binary
72
+ end # module Operation
73
+ end # module Veritas
@@ -0,0 +1,59 @@
1
+ module Veritas
2
+ module Operation
3
+ module Unary
4
+ include Immutable
5
+
6
+ # The operand to the operation
7
+ #
8
+ # @example
9
+ # operand = unary.operand
10
+ #
11
+ # @return [Object]
12
+ #
13
+ # @api public
14
+ attr_reader :operand
15
+
16
+ # Initialize Unary Operation
17
+ #
18
+ # @param [Object] operand
19
+ # the operand for the operation
20
+ #
21
+ # @return [undefined]
22
+ #
23
+ # @api private
24
+ def initialize(operand)
25
+ @operand = operand
26
+ end
27
+
28
+ # Compare the operation with the other operation for equality
29
+ #
30
+ # @example
31
+ # unary.eql?(other) # => true or false
32
+ #
33
+ # @param [Object] other
34
+ #
35
+ # @return [Boolean]
36
+ #
37
+ # @api public
38
+ def eql?(other)
39
+ instance_of?(other.class) &&
40
+ operand.eql?(other.operand)
41
+ end
42
+
43
+ # Return the hash of the operand
44
+ #
45
+ # @example
46
+ # numeric_hash = unary.hash
47
+ #
48
+ # @return [Integer]
49
+ #
50
+ # @api public
51
+ def hash
52
+ operand.hash
53
+ end
54
+
55
+ memoize :hash
56
+
57
+ end # module Unary
58
+ end # module Operation
59
+ end # module Veritas
@@ -0,0 +1,51 @@
1
+ module Veritas
2
+
3
+ # Allow operations to be optimizable
4
+ module Optimizable
5
+ include Immutable
6
+
7
+ # Hook called when module is included
8
+ #
9
+ # @param [Module] descendant
10
+ # the module or class including Optimizable
11
+ #
12
+ # @return [self]
13
+ #
14
+ # @api private
15
+ def self.included(descendant)
16
+ descendant.extend ClassMethods
17
+ self
18
+ end
19
+
20
+ # Optimize the operation
21
+ #
22
+ # @example
23
+ # optimized = operation.optimize
24
+ #
25
+ # @param [Optimizer] optimizer
26
+ # optional optimizer
27
+ #
28
+ # @return [Optimizable]
29
+ # the optimized operation
30
+ #
31
+ # @api public
32
+ def optimize(optimizer = self.class.optimizer)
33
+ return self if optimizer.nil?
34
+ optimized = optimizer.call(self)
35
+ optimized.memoize(:optimize, optimized)
36
+ end
37
+
38
+ memoize :optimize
39
+
40
+ module ClassMethods
41
+
42
+ # The Optimizer for the operation
43
+ #
44
+ # @return [Optimizable]
45
+ #
46
+ # @api private
47
+ attr_accessor :optimizer
48
+
49
+ end # module ClassMethods
50
+ end # module Optimizable
51
+ end # module Veritas
@@ -0,0 +1,181 @@
1
+ module Veritas
2
+
3
+ # A set of objects representing a unique fact in a relation
4
+ class Tuple
5
+ include Immutable
6
+
7
+ # The tuple header
8
+ #
9
+ # @return [Header]
10
+ #
11
+ # @api private
12
+ attr_reader :header
13
+
14
+ # Initialize a Tuple
15
+ #
16
+ # @param [Header] header
17
+ # the tuple header
18
+ # @param [#to_ary] data
19
+ # the tuple data
20
+ #
21
+ # @return [undefined]
22
+ #
23
+ # @api private
24
+ def initialize(header, data)
25
+ @header, @data = header, data.to_ary
26
+ end
27
+
28
+ # Lookup a value in the tuple given an attribute
29
+ #
30
+ # @example
31
+ # value = tuple[attribute]
32
+ #
33
+ # @param [Attribute] attribute
34
+ #
35
+ # @return [Object]
36
+ #
37
+ # @api public
38
+ def [](attribute)
39
+ index = header.index(attribute)
40
+ to_ary.at(index) if index
41
+ end
42
+
43
+ # Return a tuple with only the specified attributes
44
+ #
45
+ # @example
46
+ # new_tuple = tuple.project(header)
47
+ #
48
+ # @param [Header] header
49
+ # the attributes to include in the tuple
50
+ #
51
+ # @return [Tuple]
52
+ #
53
+ # @api public
54
+ def project(header)
55
+ self.class.new(header, header.map { |attribute| self[attribute] })
56
+ end
57
+
58
+ # Append values to the tuple and return a new tuple
59
+ #
60
+ # @example
61
+ # new_tuple = tuple.join(header, [ 1, 2, 3 ])
62
+ #
63
+ # @param [Header] header
64
+ # the attributes to include in the tuple
65
+ # @param [Array] values
66
+ # the values to append
67
+ #
68
+ # @return [Tuple]
69
+ #
70
+ # @api public
71
+ def join(header, values)
72
+ self.class.new(header, to_ary + values)
73
+ end
74
+
75
+ # Extend a tuple with function results
76
+ #
77
+ # @example
78
+ # new_tuple = tuple.extend(header, [ func1, func2 ])
79
+ #
80
+ # @param [Header] header
81
+ # the attributes to include in the tuple
82
+ # @param [Array<#call>] extensions
83
+ # the functions to extend the tuple with
84
+ #
85
+ # @return [Tuple]
86
+ #
87
+ # @api public
88
+ def extend(header, extensions)
89
+ join(header, extensions.map { |extension| extension.call(self) })
90
+ end
91
+
92
+ # Convert the Tuple into an Array
93
+ #
94
+ # @example
95
+ # array = tuple.to_ary
96
+ #
97
+ # @return [Array]
98
+ #
99
+ # @api public
100
+ def to_ary
101
+ @data
102
+ end
103
+
104
+ # Compare the tuple with other tuple for equivalency
105
+ #
106
+ # @example
107
+ # tuple == other # => true or false
108
+ #
109
+ # @param [Tuple] other
110
+ # the other tuple to compare with
111
+ #
112
+ # @return [Boolean]
113
+ #
114
+ # @api public
115
+ def ==(other)
116
+ header = self.header
117
+ other = self.class.coerce(header, other)
118
+ header == other.header &&
119
+ to_ary == other.project(header).to_ary
120
+ end
121
+
122
+ # Compare the tuple with other tuple for equality
123
+ #
124
+ # @example
125
+ # tuple == other # => true or false
126
+ #
127
+ # @param [Tuple] other
128
+ # the other tuple to compare with
129
+ #
130
+ # @return [Boolean]
131
+ #
132
+ # @api public
133
+ def eql?(other)
134
+ header = self.header
135
+ instance_of?(other.class) &&
136
+ header.eql?(other.header) &&
137
+ to_ary.eql?(other.project(header).to_ary)
138
+ end
139
+
140
+ # Return the hash of the tuple
141
+ #
142
+ # @example
143
+ # numeric_hash = tuple.hash
144
+ #
145
+ # @return [Integer]
146
+ #
147
+ # @api public
148
+ def hash
149
+ header.hash ^ to_ary.hash
150
+ end
151
+
152
+ # Return a string representing the tuple data
153
+ #
154
+ # @example
155
+ # tuple.inspect # => "[1, 2, 3]"
156
+ #
157
+ # @return [String]
158
+ #
159
+ # @api public
160
+ def inspect
161
+ to_ary.inspect
162
+ end
163
+
164
+ # Coerce an Array-like object into a Tuple
165
+ #
166
+ # @param [Header] header
167
+ # the tuple header
168
+ # @param [Tuple, #to_ary]
169
+ # the tuple or tuple data
170
+ #
171
+ # @return [Tuple]
172
+ #
173
+ # @api private
174
+ def self.coerce(header, object)
175
+ object.kind_of?(Tuple) ? object : new(header, object)
176
+ end
177
+
178
+ memoize :hash
179
+
180
+ end # class Tuple
181
+ end # module Veritas
@@ -0,0 +1,3 @@
1
+ module Veritas
2
+ VERSION = '0.0.1'
3
+ end # module Veritas
data/lib/veritas.rb ADDED
@@ -0,0 +1,54 @@
1
+ require 'bigdecimal'
2
+ require 'date'
3
+ require 'set'
4
+ require 'singleton'
5
+
6
+ require 'veritas/core_ext/date'
7
+ require 'veritas/core_ext/range'
8
+ require 'veritas/core_ext/time'
9
+
10
+ require 'veritas/support/abstract_class'
11
+ require 'veritas/support/aliasable'
12
+ require 'veritas/support/immutable'
13
+ require 'veritas/support/optimizable'
14
+
15
+ require 'veritas/support/operation/binary'
16
+ require 'veritas/support/operation/unary'
17
+
18
+ require 'veritas/support/evaluator'
19
+
20
+ require 'veritas/logic'
21
+ require 'veritas/relation'
22
+ require 'veritas/algebra'
23
+
24
+ require 'veritas/optimizer'
25
+ require 'veritas/attribute'
26
+ require 'veritas/tuple'
27
+ require 'veritas/version'
28
+
29
+ module Veritas
30
+
31
+ # Raised when the headers are invalid for Join and Product
32
+ class InvalidHeaderError < ArgumentError; end
33
+
34
+ # Raised when the limit is not a positive integer
35
+ class InvalidLimitError < ArgumentError; end
36
+
37
+ # Raised when the offset is not a positive integer
38
+ class InvalidOffsetError < ArgumentError; end
39
+
40
+ # Raised when the order does not include every attribute in the header
41
+ class InvalidDirectionsError < ArgumentError; end
42
+
43
+ # Raised when a method requiring ordering is called on an unordered relation
44
+ class OrderedRelationRequiredError < StandardError; end
45
+
46
+ # Raised when a binary operation mixes ordered and unordered relations
47
+ class RelationMismatchError < StandardError; end
48
+
49
+ # Raised when an attribute is added to a relation that already exists
50
+ class DuplicateHeaderName < StandardError; end
51
+
52
+ TABLE_DUM = Relation.new([], [ ]).optimize
53
+ TABLE_DEE = Relation.new([], [ [] ]).optimize
54
+ end