axiom 0.1.0 → 0.1.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 (531) hide show
  1. data/.gitignore +1 -1
  2. data/.rspec +1 -0
  3. data/.ruby-gemset +1 -0
  4. data/.travis.yml +11 -20
  5. data/Gemfile +5 -2
  6. data/Gemfile.devtools +26 -28
  7. data/Guardfile +18 -9
  8. data/README.md +20 -39
  9. data/axiom.gemspec +17 -18
  10. data/benchmarks/memory.rb +14 -14
  11. data/benchmarks/speed.rb +14 -14
  12. data/config/devtools.yml +2 -0
  13. data/config/flay.yml +1 -1
  14. data/config/flog.yml +1 -1
  15. data/config/reek.yml +3 -3
  16. data/config/rubocop.yml +62 -0
  17. data/lib/axiom.rb +17 -20
  18. data/lib/axiom/aggregate.rb +2 -5
  19. data/lib/axiom/aggregate/count.rb +4 -4
  20. data/lib/axiom/aggregate/maximum.rb +3 -3
  21. data/lib/axiom/aggregate/mean.rb +9 -9
  22. data/lib/axiom/aggregate/minimum.rb +3 -3
  23. data/lib/axiom/aggregate/standard_deviation.rb +5 -4
  24. data/lib/axiom/aggregate/sum.rb +4 -4
  25. data/lib/axiom/aggregate/variance.rb +15 -12
  26. data/lib/axiom/algebra/extension.rb +2 -2
  27. data/lib/axiom/algebra/projection.rb +3 -3
  28. data/lib/axiom/algebra/rename/aliases.rb +6 -6
  29. data/lib/axiom/algebra/restriction.rb +1 -1
  30. data/lib/axiom/algebra/summarization.rb +5 -7
  31. data/lib/axiom/algebra/summarization/summaries.rb +2 -2
  32. data/lib/axiom/algebra/union.rb +1 -1
  33. data/lib/axiom/attribute.rb +24 -33
  34. data/lib/axiom/attribute/boolean.rb +10 -20
  35. data/lib/axiom/attribute/class.rb +5 -5
  36. data/lib/axiom/attribute/date.rb +5 -19
  37. data/lib/axiom/attribute/date_time.rb +5 -19
  38. data/lib/axiom/attribute/decimal.rb +5 -5
  39. data/lib/axiom/attribute/float.rb +5 -7
  40. data/lib/axiom/attribute/integer.rb +5 -5
  41. data/lib/axiom/attribute/numeric.rb +15 -39
  42. data/lib/axiom/attribute/object.rb +5 -5
  43. data/lib/axiom/attribute/string.rb +16 -63
  44. data/lib/axiom/attribute/time.rb +5 -19
  45. data/lib/axiom/function.rb +14 -2
  46. data/lib/axiom/function/binary.rb +17 -0
  47. data/lib/axiom/function/connective.rb +6 -3
  48. data/lib/axiom/function/connective/conjunction.rb +2 -2
  49. data/lib/axiom/function/connective/disjunction.rb +2 -2
  50. data/lib/axiom/function/numeric.rb +13 -0
  51. data/lib/axiom/function/numeric/absolute.rb +1 -1
  52. data/lib/axiom/function/numeric/division.rb +18 -2
  53. data/lib/axiom/function/numeric/exponentiation.rb +1 -1
  54. data/lib/axiom/function/numeric/modulo.rb +1 -1
  55. data/lib/axiom/function/numeric/square_root.rb +19 -3
  56. data/lib/axiom/function/predicate.rb +6 -3
  57. data/lib/axiom/function/predicate/exclusion.rb +2 -2
  58. data/lib/axiom/function/predicate/inclusion.rb +2 -2
  59. data/lib/axiom/function/proposition.rb +12 -9
  60. data/lib/axiom/function/string/length.rb +6 -3
  61. data/lib/axiom/function/unary.rb +12 -0
  62. data/lib/axiom/relation.rb +31 -50
  63. data/lib/axiom/relation/base.rb +3 -3
  64. data/lib/axiom/relation/empty.rb +3 -32
  65. data/lib/axiom/relation/header.rb +31 -15
  66. data/lib/axiom/relation/keys.rb +4 -4
  67. data/lib/axiom/relation/materialized.rb +2 -1
  68. data/lib/axiom/relation/operation/limit.rb +51 -0
  69. data/lib/axiom/relation/operation/order.rb +21 -28
  70. data/lib/axiom/relation/operation/order/direction_set.rb +1 -1
  71. data/lib/axiom/relation/proxy.rb +2 -2
  72. data/lib/axiom/relation/variable.rb +117 -0
  73. data/lib/axiom/support/equalizer.rb +9 -2
  74. data/lib/axiom/support/evaluator.rb +4 -1
  75. data/lib/axiom/tuple.rb +2 -2
  76. data/lib/axiom/version.rb +1 -1
  77. data/spec/integration/axiom/algebra/join_spec.rb +2 -2
  78. data/spec/integration/axiom/algebra/product_spec.rb +2 -2
  79. data/spec/integration/axiom/algebra/projection_spec.rb +6 -6
  80. data/spec/integration/axiom/algebra/summarization_spec.rb +9 -9
  81. data/spec/integration/axiom/relation/efficient_enumerable_spec.rb +18 -18
  82. data/spec/integration/axiom/relation/mutable_enumerator_spec.rb +51 -0
  83. data/spec/integration/axiom/relation/variable/thread_safe_spec.rb +45 -0
  84. data/spec/integration/axiom/relation/writable_relations_spec.rb +14 -14
  85. data/spec/shared/invertible_method_behaviour.rb +1 -1
  86. data/spec/spec_helper.rb +23 -15
  87. data/spec/support/config_alias.rb +2 -0
  88. data/spec/unit/axiom/aggregate/call_spec.rb +5 -5
  89. data/spec/unit/axiom/aggregate/class_methods/finalize_spec.rb +3 -3
  90. data/spec/unit/axiom/aggregate/count/class_methods/call_spec.rb +3 -3
  91. data/spec/unit/axiom/aggregate/count/class_methods/type_spec.rb +11 -0
  92. data/spec/unit/axiom/aggregate/count/methods/count_spec.rb +1 -1
  93. data/spec/unit/axiom/aggregate/default_spec.rb +2 -2
  94. data/spec/unit/axiom/aggregate/finalize_spec.rb +3 -3
  95. data/spec/unit/axiom/aggregate/maximum/class_methods/call_spec.rb +3 -3
  96. data/spec/unit/axiom/aggregate/maximum/methods/maximum_spec.rb +2 -2
  97. data/spec/unit/axiom/aggregate/maximum/type_spec.rb +4 -4
  98. data/spec/unit/axiom/aggregate/mean/class_methods/call_spec.rb +6 -6
  99. data/spec/unit/axiom/aggregate/mean/class_methods/default_spec.rb +1 -1
  100. data/spec/unit/axiom/aggregate/mean/class_methods/finalize_spec.rb +4 -4
  101. data/spec/unit/axiom/aggregate/mean/class_methods/type_spec.rb +11 -0
  102. data/spec/unit/axiom/aggregate/mean/methods/mean_spec.rb +2 -2
  103. data/spec/unit/axiom/aggregate/minimum/class_methods/call_spec.rb +3 -3
  104. data/spec/unit/axiom/aggregate/minimum/methods/minimum_spec.rb +2 -2
  105. data/spec/unit/axiom/aggregate/minimum/type_spec.rb +4 -4
  106. data/spec/unit/axiom/aggregate/standard_deviation/class_methods/finalize_spec.rb +4 -4
  107. data/spec/unit/axiom/aggregate/standard_deviation/class_methods/type_spec.rb +11 -0
  108. data/spec/unit/axiom/aggregate/standard_deviation/methods/standard_deviation_spec.rb +2 -2
  109. data/spec/unit/axiom/aggregate/sum/class_methods/call_spec.rb +3 -3
  110. data/spec/unit/axiom/aggregate/sum/default_spec.rb +3 -3
  111. data/spec/unit/axiom/aggregate/sum/methods/sum_spec.rb +1 -1
  112. data/spec/unit/axiom/aggregate/sum/type_spec.rb +4 -4
  113. data/spec/unit/axiom/aggregate/variance/class_methods/call_spec.rb +9 -9
  114. data/spec/unit/axiom/aggregate/variance/class_methods/default_spec.rb +1 -1
  115. data/spec/unit/axiom/aggregate/variance/class_methods/finalize_spec.rb +11 -3
  116. data/spec/unit/axiom/aggregate/variance/class_methods/type_spec.rb +11 -0
  117. data/spec/unit/axiom/aggregate/variance/methods/variance_spec.rb +2 -2
  118. data/spec/unit/axiom/algebra/difference/delete_spec.rb +6 -6
  119. data/spec/unit/axiom/algebra/difference/each_spec.rb +6 -6
  120. data/spec/unit/axiom/algebra/difference/insert_spec.rb +5 -5
  121. data/spec/unit/axiom/algebra/difference/methods/difference_spec.rb +5 -5
  122. data/spec/unit/axiom/algebra/extension/class_methods/new_spec.rb +4 -4
  123. data/spec/unit/axiom/algebra/extension/delete_spec.rb +11 -11
  124. data/spec/unit/axiom/algebra/extension/each_spec.rb +7 -7
  125. data/spec/unit/axiom/algebra/extension/eql_spec.rb +5 -5
  126. data/spec/unit/axiom/algebra/extension/extensions_spec.rb +3 -3
  127. data/spec/unit/axiom/algebra/extension/hash_spec.rb +3 -3
  128. data/spec/unit/axiom/algebra/extension/header_spec.rb +4 -4
  129. data/spec/unit/axiom/algebra/extension/insert_spec.rb +11 -11
  130. data/spec/unit/axiom/algebra/extension/methods/extend_spec.rb +6 -6
  131. data/spec/unit/axiom/algebra/extension/operand_spec.rb +4 -4
  132. data/spec/unit/axiom/algebra/intersection/delete_spec.rb +6 -6
  133. data/spec/unit/axiom/algebra/intersection/each_spec.rb +6 -6
  134. data/spec/unit/axiom/algebra/intersection/insert_spec.rb +5 -5
  135. data/spec/unit/axiom/algebra/intersection/methods/intersect_spec.rb +5 -5
  136. data/spec/unit/axiom/algebra/join/class_methods/new_spec.rb +5 -5
  137. data/spec/unit/axiom/algebra/join/delete_spec.rb +8 -8
  138. data/spec/unit/axiom/algebra/join/each_spec.rb +15 -15
  139. data/spec/unit/axiom/algebra/join/insert_spec.rb +8 -8
  140. data/spec/unit/axiom/algebra/join/join_header_spec.rb +4 -4
  141. data/spec/unit/axiom/algebra/join/methods/join_spec.rb +6 -6
  142. data/spec/unit/axiom/algebra/product/class_methods/new_spec.rb +6 -6
  143. data/spec/unit/axiom/algebra/product/delete_spec.rb +4 -4
  144. data/spec/unit/axiom/algebra/product/each_spec.rb +8 -8
  145. data/spec/unit/axiom/algebra/product/insert_spec.rb +4 -4
  146. data/spec/unit/axiom/algebra/product/methods/product_spec.rb +4 -4
  147. data/spec/unit/axiom/algebra/projection/delete_spec.rb +11 -11
  148. data/spec/unit/axiom/algebra/projection/each_spec.rb +7 -7
  149. data/spec/unit/axiom/algebra/projection/eql_spec.rb +5 -5
  150. data/spec/unit/axiom/algebra/projection/hash_spec.rb +4 -4
  151. data/spec/unit/axiom/algebra/projection/header_spec.rb +3 -3
  152. data/spec/unit/axiom/algebra/projection/insert_spec.rb +14 -14
  153. data/spec/unit/axiom/algebra/projection/methods/project_spec.rb +5 -5
  154. data/spec/unit/axiom/algebra/projection/methods/remove_spec.rb +5 -5
  155. data/spec/unit/axiom/algebra/rename/aliases/class_methods/coerce_spec.rb +2 -2
  156. data/spec/unit/axiom/algebra/rename/aliases/each_spec.rb +4 -4
  157. data/spec/unit/axiom/algebra/rename/aliases/element_reader_spec.rb +2 -2
  158. data/spec/unit/axiom/algebra/rename/aliases/to_hash_spec.rb +2 -2
  159. data/spec/unit/axiom/algebra/rename/aliases/union_spec.rb +1 -1
  160. data/spec/unit/axiom/algebra/rename/aliases_spec.rb +2 -2
  161. data/spec/unit/axiom/algebra/rename/delete_spec.rb +6 -6
  162. data/spec/unit/axiom/algebra/rename/directions_spec.rb +4 -4
  163. data/spec/unit/axiom/algebra/rename/each_spec.rb +6 -6
  164. data/spec/unit/axiom/algebra/rename/eql_spec.rb +5 -5
  165. data/spec/unit/axiom/algebra/rename/hash_spec.rb +3 -3
  166. data/spec/unit/axiom/algebra/rename/header_spec.rb +3 -3
  167. data/spec/unit/axiom/algebra/rename/insert_spec.rb +6 -6
  168. data/spec/unit/axiom/algebra/rename/methods/rename_spec.rb +4 -4
  169. data/spec/unit/axiom/algebra/restriction/delete_spec.rb +9 -9
  170. data/spec/unit/axiom/algebra/restriction/each_spec.rb +12 -12
  171. data/spec/unit/axiom/algebra/restriction/eql_spec.rb +4 -4
  172. data/spec/unit/axiom/algebra/restriction/hash_spec.rb +3 -3
  173. data/spec/unit/axiom/algebra/restriction/insert_spec.rb +9 -9
  174. data/spec/unit/axiom/algebra/restriction/methods/restrict_spec.rb +12 -15
  175. data/spec/unit/axiom/algebra/restriction/predicate_spec.rb +4 -4
  176. data/spec/unit/axiom/algebra/summarization/class_methods/new_spec.rb +6 -6
  177. data/spec/unit/axiom/algebra/summarization/delete_spec.rb +3 -3
  178. data/spec/unit/axiom/algebra/summarization/each_spec.rb +5 -5
  179. data/spec/unit/axiom/algebra/summarization/eql_spec.rb +3 -3
  180. data/spec/unit/axiom/algebra/summarization/hash_spec.rb +2 -2
  181. data/spec/unit/axiom/algebra/summarization/header_spec.rb +3 -3
  182. data/spec/unit/axiom/algebra/summarization/insert_spec.rb +3 -3
  183. data/spec/unit/axiom/algebra/summarization/methods/summarize_spec.rb +15 -15
  184. data/spec/unit/axiom/algebra/summarization/summaries/summarize_by_spec.rb +6 -6
  185. data/spec/unit/axiom/algebra/summarization/summaries/to_hash_spec.rb +2 -2
  186. data/spec/unit/axiom/algebra/summarization/summarize_per_spec.rb +3 -3
  187. data/spec/unit/axiom/algebra/summarization/summarizers_spec.rb +3 -3
  188. data/spec/unit/axiom/algebra/summarization/summary/call_spec.rb +4 -4
  189. data/spec/unit/axiom/algebra/summarization/summary/summarize_by_spec.rb +9 -6
  190. data/spec/unit/axiom/algebra/union/delete_spec.rb +6 -6
  191. data/spec/unit/axiom/algebra/union/each_spec.rb +9 -9
  192. data/spec/unit/axiom/algebra/union/insert_spec.rb +5 -5
  193. data/spec/unit/axiom/algebra/union/methods/union_spec.rb +5 -5
  194. data/spec/unit/axiom/aliasable/inheritable_alias_spec.rb +6 -6
  195. data/spec/unit/axiom/attribute/{date/class_methods/primitive_spec.rb → boolean/class_methods/type_spec.rb} +3 -3
  196. data/spec/unit/axiom/attribute/boolean/{valid_value_predicate_spec.rb → include_predicate_spec.rb} +2 -2
  197. data/spec/unit/axiom/attribute/call_spec.rb +8 -4
  198. data/spec/unit/axiom/attribute/{time/class_methods/primitive_spec.rb → class/class_methods/type_spec.rb} +3 -3
  199. data/spec/unit/axiom/attribute/class_methods/coerce_spec.rb +6 -6
  200. data/spec/unit/axiom/attribute/class_methods/infer_type_spec.rb +15 -15
  201. data/spec/unit/axiom/attribute/class_methods/name_from_spec.rb +4 -4
  202. data/spec/unit/axiom/attribute/class_methods/new_spec.rb +1 -1
  203. data/spec/unit/axiom/attribute/{float/class_methods/primitive_spec.rb → date/class_methods/type_spec.rb} +3 -3
  204. data/spec/unit/axiom/attribute/{class/class_methods/primitive_spec.rb → date_time/class_methods/type_spec.rb} +3 -3
  205. data/spec/unit/axiom/attribute/decimal/class_methods/type_spec.rb +13 -0
  206. data/spec/unit/axiom/attribute/eql_spec.rb +5 -1
  207. data/spec/unit/axiom/attribute/equality_operator_spec.rb +5 -1
  208. data/spec/unit/axiom/attribute/float/class_methods/type_spec.rb +13 -0
  209. data/spec/unit/axiom/attribute/hash_spec.rb +6 -2
  210. data/spec/unit/axiom/attribute/{valid_value_predicate_spec.rb → include_predicate_spec.rb} +4 -8
  211. data/spec/unit/axiom/attribute/integer/class_methods/type_spec.rb +13 -0
  212. data/spec/unit/axiom/attribute/name_spec.rb +5 -1
  213. data/spec/unit/axiom/attribute/numeric/class_methods/type_spec.rb +13 -0
  214. data/spec/unit/axiom/attribute/numeric/eql_spec.rb +2 -2
  215. data/spec/unit/axiom/attribute/numeric/equality_operator_spec.rb +2 -2
  216. data/spec/unit/axiom/attribute/numeric/hash_spec.rb +6 -6
  217. data/spec/unit/axiom/attribute/numeric/{valid_value_predicate_spec.rb → include_predicate_spec.rb} +3 -3
  218. data/spec/unit/axiom/attribute/object/class_methods/type_spec.rb +13 -0
  219. data/spec/unit/axiom/attribute/optional_predicate_spec.rb +31 -0
  220. data/spec/unit/axiom/attribute/rename_spec.rb +9 -5
  221. data/spec/unit/axiom/attribute/required_predicate_spec.rb +8 -4
  222. data/spec/unit/axiom/attribute/string/class_methods/type_spec.rb +13 -0
  223. data/spec/unit/axiom/attribute/string/eql_spec.rb +5 -5
  224. data/spec/unit/axiom/attribute/string/equality_operator_spec.rb +5 -5
  225. data/spec/unit/axiom/attribute/string/hash_spec.rb +9 -9
  226. data/spec/unit/axiom/attribute/string/{valid_value_predicate_spec.rb → include_predicate_spec.rb} +3 -3
  227. data/spec/unit/axiom/attribute/time/class_methods/type_spec.rb +13 -0
  228. data/spec/unit/axiom/attribute/type_spec.rb +4 -4
  229. data/spec/unit/axiom/equalizer/class_method/new_spec.rb +11 -11
  230. data/spec/unit/axiom/equalizer/methods/eql_spec.rb +1 -1
  231. data/spec/unit/axiom/evaluator/context/add_spec.rb +5 -5
  232. data/spec/unit/axiom/evaluator/context/element_reader_spec.rb +5 -5
  233. data/spec/unit/axiom/evaluator/context/functions_spec.rb +1 -1
  234. data/spec/unit/axiom/evaluator/context/method_missing_spec.rb +5 -5
  235. data/spec/unit/axiom/evaluator/context/respond_to_predicate_spec.rb +3 -3
  236. data/spec/unit/axiom/evaluator/context/send_spec.rb +9 -9
  237. data/spec/unit/axiom/evaluator/context/yield_spec.rb +3 -3
  238. data/spec/unit/axiom/function/binary/call_spec.rb +4 -4
  239. data/spec/unit/axiom/function/binary/equality_operator_spec.rb +6 -6
  240. data/spec/unit/axiom/function/binary/invertible/class_methods/included_spec.rb +5 -5
  241. data/spec/unit/axiom/function/binary/invertible/inverse_spec.rb +5 -5
  242. data/spec/unit/axiom/function/binary/rename_spec.rb +9 -9
  243. data/spec/unit/axiom/function/binary/type_spec.rb +53 -0
  244. data/spec/unit/axiom/function/class_methods/extract_value_spec.rb +5 -5
  245. data/spec/unit/axiom/function/class_methods/rename_attributes_spec.rb +3 -3
  246. data/spec/unit/axiom/function/class_methods/type_spec.rb +12 -0
  247. data/spec/unit/axiom/function/comparable/class_methods/included_spec.rb +5 -5
  248. data/spec/unit/axiom/function/connective/class_methods/type_spec.rb +11 -0
  249. data/spec/unit/axiom/function/connective/conjunction/methods/and_spec.rb +5 -5
  250. data/spec/unit/axiom/function/connective/disjunction/methods/or_spec.rb +5 -5
  251. data/spec/unit/axiom/function/connective/negation/class_methods/operation_spec.rb +1 -1
  252. data/spec/unit/axiom/function/connective/negation/inverse_spec.rb +1 -1
  253. data/spec/unit/axiom/function/connective/negation/methods/not_spec.rb +6 -6
  254. data/spec/unit/axiom/function/numeric/absolute/class_methods/operation_spec.rb +1 -1
  255. data/spec/unit/axiom/function/numeric/absolute/methods/absolute_spec.rb +2 -2
  256. data/spec/unit/axiom/function/numeric/addition/class_methods/inverse_spec.rb +1 -1
  257. data/spec/unit/axiom/function/numeric/addition/methods/add_spec.rb +4 -4
  258. data/spec/unit/axiom/function/numeric/class_methods/type_spec.rb +11 -0
  259. data/spec/unit/axiom/function/numeric/division/class_methods/inverse_spec.rb +1 -1
  260. data/spec/unit/axiom/function/numeric/division/class_methods/type_spec.rb +11 -0
  261. data/spec/unit/axiom/function/numeric/division/methods/divide_spec.rb +4 -4
  262. data/spec/unit/axiom/function/numeric/division/type_spec.rb +1 -1
  263. data/spec/unit/axiom/function/numeric/exponentiation/inverse_spec.rb +1 -1
  264. data/spec/unit/axiom/function/numeric/exponentiation/methods/exponent_spec.rb +4 -4
  265. data/spec/unit/axiom/function/numeric/modulo/methods/modulo_spec.rb +4 -4
  266. data/spec/unit/axiom/function/numeric/multiplication/class_methods/inverse_spec.rb +1 -1
  267. data/spec/unit/axiom/function/numeric/multiplication/methods/multiply_spec.rb +4 -4
  268. data/spec/unit/axiom/function/numeric/square_root/class_methods/type_spec.rb +11 -0
  269. data/spec/unit/axiom/function/numeric/square_root/methods/square_root_spec.rb +2 -2
  270. data/spec/unit/axiom/function/numeric/square_root/type_spec.rb +1 -1
  271. data/spec/unit/axiom/function/numeric/subtraction/class_methods/inverse_spec.rb +1 -1
  272. data/spec/unit/axiom/function/numeric/subtraction/methods/subtract_spec.rb +4 -4
  273. data/spec/unit/axiom/function/numeric/unary_minus/class_methods/inverse_spec.rb +1 -1
  274. data/spec/unit/axiom/function/numeric/unary_minus/class_methods/operation_spec.rb +1 -1
  275. data/spec/unit/axiom/function/numeric/unary_minus/methods/unary_minus_spec.rb +2 -2
  276. data/spec/unit/axiom/function/numeric/unary_plus/class_methods/inverse_spec.rb +1 -1
  277. data/spec/unit/axiom/function/numeric/unary_plus/class_methods/operation_spec.rb +1 -1
  278. data/spec/unit/axiom/function/numeric/unary_plus/methods/unary_plus_spec.rb +2 -2
  279. data/spec/unit/axiom/function/predicate/call_spec.rb +5 -5
  280. data/spec/unit/axiom/function/predicate/class_methods/type_spec.rb +11 -0
  281. data/spec/unit/axiom/function/predicate/enumerable/call_spec.rb +11 -11
  282. data/spec/unit/axiom/function/predicate/enumerable/class_methods/compare_method_spec.rb +1 -1
  283. data/spec/unit/axiom/function/predicate/equality/class_methods/inverse_spec.rb +1 -1
  284. data/spec/unit/axiom/function/predicate/equality/class_methods/reverse_spec.rb +1 -1
  285. data/spec/unit/axiom/function/predicate/equality/inverse_spec.rb +1 -1
  286. data/spec/unit/axiom/function/predicate/exclusion/class_methods/call_spec.rb +4 -4
  287. data/spec/unit/axiom/function/predicate/exclusion/class_methods/inverse_spec.rb +1 -1
  288. data/spec/unit/axiom/function/predicate/exclusion/inverse_spec.rb +3 -3
  289. data/spec/unit/axiom/function/predicate/exclusion/methods/exclude_spec.rb +1 -1
  290. data/spec/unit/axiom/function/predicate/greater_than/class_methods/inverse_spec.rb +1 -1
  291. data/spec/unit/axiom/function/predicate/greater_than/class_methods/reverse_spec.rb +1 -1
  292. data/spec/unit/axiom/function/predicate/greater_than/inverse_spec.rb +1 -1
  293. data/spec/unit/axiom/function/predicate/greater_than_or_equal_to/class_methods/inverse_spec.rb +1 -1
  294. data/spec/unit/axiom/function/predicate/greater_than_or_equal_to/class_methods/reverse_spec.rb +1 -1
  295. data/spec/unit/axiom/function/predicate/greater_than_or_equal_to/inverse_spec.rb +1 -1
  296. data/spec/unit/axiom/function/predicate/inclusion/class_methods/call_spec.rb +4 -4
  297. data/spec/unit/axiom/function/predicate/inclusion/class_methods/inverse_spec.rb +1 -1
  298. data/spec/unit/axiom/function/predicate/inclusion/inverse_spec.rb +3 -3
  299. data/spec/unit/axiom/function/predicate/inclusion/methods/include_spec.rb +1 -1
  300. data/spec/unit/axiom/function/predicate/inequality/class_methods/inverse_spec.rb +1 -1
  301. data/spec/unit/axiom/function/predicate/inequality/class_methods/reverse_spec.rb +1 -1
  302. data/spec/unit/axiom/function/predicate/inequality/inverse_spec.rb +1 -1
  303. data/spec/unit/axiom/function/predicate/less_than/class_methods/inverse_spec.rb +1 -1
  304. data/spec/unit/axiom/function/predicate/less_than/class_methods/reverse_spec.rb +1 -1
  305. data/spec/unit/axiom/function/predicate/less_than/inverse_spec.rb +1 -1
  306. data/spec/unit/axiom/function/predicate/less_than_or_equal_to/class_methods/inverse_spec.rb +1 -1
  307. data/spec/unit/axiom/function/predicate/less_than_or_equal_to/class_methods/reverse_spec.rb +1 -1
  308. data/spec/unit/axiom/function/predicate/less_than_or_equal_to/inverse_spec.rb +1 -1
  309. data/spec/unit/axiom/function/predicate/match/class_methods/inverse_spec.rb +1 -1
  310. data/spec/unit/axiom/function/predicate/match/inverse_spec.rb +2 -2
  311. data/spec/unit/axiom/function/predicate/no_match/class_methods/inverse_spec.rb +1 -1
  312. data/spec/unit/axiom/function/predicate/no_match/inverse_spec.rb +2 -2
  313. data/spec/unit/axiom/function/proposition/call_spec.rb +2 -2
  314. data/spec/unit/axiom/function/proposition/class_methods/new_spec.rb +4 -4
  315. data/spec/unit/axiom/function/proposition/class_methods/type_spec.rb +11 -0
  316. data/spec/unit/axiom/function/proposition/contradiction/and_spec.rb +2 -2
  317. data/spec/unit/axiom/function/proposition/contradiction/class_methods/inverse_spec.rb +1 -1
  318. data/spec/unit/axiom/function/proposition/contradiction/inverse_spec.rb +1 -1
  319. data/spec/unit/axiom/function/proposition/contradiction/or_spec.rb +2 -2
  320. data/spec/unit/axiom/function/proposition/inverse_spec.rb +6 -6
  321. data/spec/unit/axiom/function/proposition/rename_spec.rb +1 -1
  322. data/spec/unit/axiom/function/proposition/tautology/and_spec.rb +2 -2
  323. data/spec/unit/axiom/function/proposition/tautology/class_methods/inverse_spec.rb +1 -1
  324. data/spec/unit/axiom/function/proposition/tautology/inverse_spec.rb +1 -1
  325. data/spec/unit/axiom/function/proposition/tautology/or_spec.rb +2 -2
  326. data/spec/unit/axiom/function/rename_spec.rb +1 -1
  327. data/spec/unit/axiom/function/string/length/class_methods/type_spec.rb +11 -0
  328. data/spec/unit/axiom/function/string/length/methods/length_spec.rb +1 -1
  329. data/spec/unit/axiom/function/type_spec.rb +8 -1
  330. data/spec/unit/axiom/function/unary/call_spec.rb +7 -7
  331. data/spec/unit/axiom/function/unary/callable/call_spec.rb +4 -4
  332. data/spec/unit/axiom/function/unary/callable/included_spec.rb +1 -1
  333. data/spec/unit/axiom/function/unary/equality_operator_spec.rb +5 -5
  334. data/spec/unit/axiom/function/unary/hash_spec.rb +5 -5
  335. data/spec/unit/axiom/function/unary/invertible/class_methods/included_spec.rb +5 -5
  336. data/spec/unit/axiom/function/unary/invertible/inverse_spec.rb +2 -2
  337. data/spec/unit/axiom/function/unary/rename_spec.rb +7 -7
  338. data/spec/unit/axiom/function/unary/type_spec.rb +26 -0
  339. data/spec/unit/axiom/operation/binary/eql_spec.rb +4 -4
  340. data/spec/unit/axiom/operation/binary/hash_spec.rb +2 -2
  341. data/spec/unit/axiom/operation/binary/left_spec.rb +2 -2
  342. data/spec/unit/axiom/operation/binary/right_spec.rb +2 -2
  343. data/spec/unit/axiom/operation/unary/eql_spec.rb +2 -2
  344. data/spec/unit/axiom/operation/unary/hash_spec.rb +1 -1
  345. data/spec/unit/axiom/operation/unary/operand_spec.rb +2 -2
  346. data/spec/unit/axiom/relation/base/class_methods/new_spec.rb +20 -8
  347. data/spec/unit/axiom/relation/base/eql_spec.rb +12 -12
  348. data/spec/unit/axiom/relation/base/hash_spec.rb +4 -4
  349. data/spec/unit/axiom/relation/base/name_spec.rb +5 -34
  350. data/spec/unit/axiom/relation/class_methods/coerce_spec.rb +11 -5
  351. data/spec/unit/axiom/relation/class_methods/new_spec.rb +15 -7
  352. data/spec/unit/axiom/relation/directions_spec.rb +2 -2
  353. data/spec/unit/axiom/relation/each_spec.rb +10 -10
  354. data/spec/unit/axiom/relation/element_reader_spec.rb +4 -4
  355. data/spec/unit/axiom/relation/empty/class_methods/new_spec.rb +6 -20
  356. data/spec/unit/axiom/relation/empty/each_spec.rb +7 -22
  357. data/spec/unit/axiom/relation/empty/empty_predicate_spec.rb +1 -1
  358. data/spec/unit/axiom/relation/empty/header_spec.rb +3 -3
  359. data/spec/unit/axiom/relation/empty/size_spec.rb +1 -1
  360. data/spec/unit/axiom/relation/empty_predicate_spec.rb +2 -2
  361. data/spec/unit/axiom/relation/eql_spec.rb +10 -10
  362. data/spec/unit/axiom/relation/equality_operator_spec.rb +24 -14
  363. data/spec/unit/axiom/relation/hash_spec.rb +3 -3
  364. data/spec/unit/axiom/relation/header/call_spec.rb +5 -5
  365. data/spec/unit/axiom/relation/header/class_methods/coerce_spec.rb +13 -13
  366. data/spec/unit/axiom/relation/header/class_methods/new_spec.rb +4 -4
  367. data/spec/unit/axiom/relation/header/context_spec.rb +27 -0
  368. data/spec/unit/axiom/relation/header/difference_spec.rb +19 -19
  369. data/spec/unit/axiom/relation/header/each_spec.rb +6 -6
  370. data/spec/unit/axiom/relation/header/empty_predicate_spec.rb +1 -1
  371. data/spec/unit/axiom/relation/header/eql_spec.rb +6 -6
  372. data/spec/unit/axiom/relation/header/equality_operator_spec.rb +8 -8
  373. data/spec/unit/axiom/relation/header/extend_spec.rb +9 -9
  374. data/spec/unit/axiom/relation/header/hash_spec.rb +3 -3
  375. data/spec/unit/axiom/relation/header/intersect_spec.rb +19 -19
  376. data/spec/unit/axiom/relation/header/keys_spec.rb +5 -5
  377. data/spec/unit/axiom/relation/header/project_spec.rb +11 -11
  378. data/spec/unit/axiom/relation/header/rename_spec.rb +6 -6
  379. data/spec/unit/axiom/relation/header/to_ary_spec.rb +3 -3
  380. data/spec/unit/axiom/relation/header/union_spec.rb +20 -20
  381. data/spec/unit/axiom/relation/header_spec.rb +2 -2
  382. data/spec/unit/axiom/relation/include_predicate_spec.rb +4 -4
  383. data/spec/unit/axiom/relation/keys/class_methods/coerce_spec.rb +4 -4
  384. data/spec/unit/axiom/relation/keys/class_methods/new_spec.rb +5 -5
  385. data/spec/unit/axiom/relation/keys/difference_spec.rb +7 -7
  386. data/spec/unit/axiom/relation/keys/each_spec.rb +6 -6
  387. data/spec/unit/axiom/relation/keys/empty_predicate_spec.rb +1 -1
  388. data/spec/unit/axiom/relation/keys/extend_spec.rb +7 -7
  389. data/spec/unit/axiom/relation/keys/intersect_spec.rb +6 -6
  390. data/spec/unit/axiom/relation/keys/project_spec.rb +8 -8
  391. data/spec/unit/axiom/relation/keys/rename_spec.rb +5 -5
  392. data/spec/unit/axiom/relation/keys/to_ary_spec.rb +3 -3
  393. data/spec/unit/axiom/relation/keys/union_spec.rb +8 -8
  394. data/spec/unit/axiom/relation/materialize_spec.rb +3 -3
  395. data/spec/unit/axiom/relation/materialized/class_methods/new_spec.rb +19 -7
  396. data/spec/unit/axiom/relation/materialized/directions_spec.rb +4 -4
  397. data/spec/unit/axiom/relation/materialized/empty_predicate_spec.rb +2 -2
  398. data/spec/unit/axiom/relation/materialized/materialize_spec.rb +2 -2
  399. data/spec/unit/axiom/relation/materialized/materialized_predicate_spec.rb +1 -1
  400. data/spec/unit/axiom/relation/materialized/size_spec.rb +1 -1
  401. data/spec/unit/axiom/relation/materialized_predicate_spec.rb +1 -1
  402. data/spec/unit/axiom/relation/operation/binary/class_methods/included_spec.rb +5 -5
  403. data/spec/unit/axiom/relation/operation/binary/class_methods/new_spec.rb +3 -3
  404. data/spec/unit/axiom/relation/operation/binary/header_spec.rb +5 -5
  405. data/spec/unit/axiom/relation/operation/combination/class_methods/combine_tuples_spec.rb +18 -11
  406. data/spec/unit/axiom/relation/operation/combination/header_spec.rb +5 -5
  407. data/spec/unit/axiom/relation/operation/deletion/initialize_spec.rb +2 -2
  408. data/spec/unit/axiom/relation/operation/deletion/methods/delete_spec.rb +5 -5
  409. data/spec/unit/axiom/relation/operation/insertion/initialize_spec.rb +2 -2
  410. data/spec/unit/axiom/relation/operation/insertion/methods/insert_spec.rb +5 -5
  411. data/spec/unit/axiom/relation/operation/limit/class_methods/new_spec.rb +2 -2
  412. data/spec/unit/axiom/relation/operation/limit/delete_spec.rb +4 -4
  413. data/spec/unit/axiom/relation/operation/limit/directions_spec.rb +4 -4
  414. data/spec/unit/axiom/relation/operation/limit/each_spec.rb +7 -7
  415. data/spec/unit/axiom/relation/operation/limit/eql_spec.rb +6 -6
  416. data/spec/unit/axiom/relation/operation/limit/hash_spec.rb +4 -4
  417. data/spec/unit/axiom/relation/operation/limit/insert_spec.rb +4 -4
  418. data/spec/unit/axiom/relation/operation/limit/limit_spec.rb +4 -4
  419. data/spec/unit/axiom/relation/operation/limit/methods/first_spec.rb +6 -6
  420. data/spec/unit/axiom/relation/operation/limit/methods/last_spec.rb +6 -6
  421. data/spec/unit/axiom/relation/operation/limit/methods/one_spec.rb +63 -0
  422. data/spec/unit/axiom/relation/operation/limit/methods/take_spec.rb +4 -4
  423. data/spec/unit/axiom/relation/operation/offset/class_methods/new_spec.rb +2 -2
  424. data/spec/unit/axiom/relation/operation/offset/delete_spec.rb +4 -4
  425. data/spec/unit/axiom/relation/operation/offset/directions_spec.rb +4 -4
  426. data/spec/unit/axiom/relation/operation/offset/each_spec.rb +7 -7
  427. data/spec/unit/axiom/relation/operation/offset/eql_spec.rb +6 -6
  428. data/spec/unit/axiom/relation/operation/offset/hash_spec.rb +4 -4
  429. data/spec/unit/axiom/relation/operation/offset/insert_spec.rb +4 -4
  430. data/spec/unit/axiom/relation/operation/offset/methods/drop_spec.rb +4 -4
  431. data/spec/unit/axiom/relation/operation/offset/offset_spec.rb +4 -4
  432. data/spec/unit/axiom/relation/operation/order/ascending/class_methods/reverse_spec.rb +1 -1
  433. data/spec/unit/axiom/relation/operation/order/ascending/reverse_spec.rb +1 -1
  434. data/spec/unit/axiom/relation/operation/order/class_methods/new_spec.rb +117 -15
  435. data/spec/unit/axiom/relation/operation/order/delete_spec.rb +11 -11
  436. data/spec/unit/axiom/relation/operation/order/descending/class_methods/reverse_spec.rb +1 -1
  437. data/spec/unit/axiom/relation/operation/order/descending/reverse_spec.rb +1 -1
  438. data/spec/unit/axiom/relation/operation/order/direction/attribute_spec.rb +1 -1
  439. data/spec/unit/axiom/relation/operation/order/direction/call_spec.rb +5 -5
  440. data/spec/unit/axiom/relation/operation/order/direction/class_methods/coerce_spec.rb +3 -3
  441. data/spec/unit/axiom/relation/operation/order/direction/eql_predicate_spec.rb +1 -1
  442. data/spec/unit/axiom/relation/operation/order/direction/name_spec.rb +1 -1
  443. data/spec/unit/axiom/relation/operation/order/direction/rename_spec.rb +6 -6
  444. data/spec/unit/axiom/relation/operation/order/direction/reverse_spec.rb +4 -4
  445. data/spec/unit/axiom/relation/operation/order/direction_set/attributes_spec.rb +3 -3
  446. data/spec/unit/axiom/relation/operation/order/direction_set/class_methods/coerce_spec.rb +11 -11
  447. data/spec/unit/axiom/relation/operation/order/direction_set/class_methods/new_spec.rb +2 -2
  448. data/spec/unit/axiom/relation/operation/order/direction_set/eql_spec.rb +2 -2
  449. data/spec/unit/axiom/relation/operation/order/direction_set/equality_operator_spec.rb +7 -7
  450. data/spec/unit/axiom/relation/operation/order/direction_set/hash_spec.rb +1 -1
  451. data/spec/unit/axiom/relation/operation/order/direction_set/project_spec.rb +5 -5
  452. data/spec/unit/axiom/relation/operation/order/direction_set/rename_spec.rb +6 -6
  453. data/spec/unit/axiom/relation/operation/order/direction_set/reverse_spec.rb +5 -5
  454. data/spec/unit/axiom/relation/operation/order/direction_set/sort_tuples_spec.rb +12 -12
  455. data/spec/unit/axiom/relation/operation/order/direction_set/to_ary_spec.rb +3 -3
  456. data/spec/unit/axiom/relation/operation/order/directions_spec.rb +4 -4
  457. data/spec/unit/axiom/relation/operation/order/each_spec.rb +7 -7
  458. data/spec/unit/axiom/relation/operation/order/eql_spec.rb +5 -5
  459. data/spec/unit/axiom/relation/operation/order/hash_spec.rb +1 -1
  460. data/spec/unit/axiom/relation/operation/order/header_spec.rb +4 -4
  461. data/spec/unit/axiom/relation/operation/order/insert_spec.rb +11 -11
  462. data/spec/unit/axiom/relation/operation/order/methods/sort_by_spec.rb +127 -20
  463. data/spec/unit/axiom/relation/operation/order/methods/sort_spec.rb +19 -0
  464. data/spec/unit/axiom/relation/operation/reverse/class_methods/new_spec.rb +2 -2
  465. data/spec/unit/axiom/relation/operation/reverse/directions_spec.rb +4 -4
  466. data/spec/unit/axiom/relation/operation/reverse/each_spec.rb +7 -7
  467. data/spec/unit/axiom/relation/operation/reverse/methods/reverse_spec.rb +3 -3
  468. data/spec/unit/axiom/relation/operation/set/class_methods/included_spec.rb +5 -5
  469. data/spec/unit/axiom/relation/operation/set/class_methods/new_spec.rb +6 -6
  470. data/spec/unit/axiom/relation/operation/set/header_spec.rb +5 -5
  471. data/spec/unit/axiom/relation/operation/unary/header_spec.rb +5 -5
  472. data/spec/unit/axiom/relation/proxy/each_spec.rb +8 -8
  473. data/spec/unit/axiom/relation/proxy/hash_spec.rb +4 -4
  474. data/spec/unit/axiom/relation/proxy/method_missing_spec.rb +4 -4
  475. data/spec/unit/axiom/relation/proxy/respond_to_predicate_spec.rb +4 -4
  476. data/spec/unit/axiom/relation/replace_spec.rb +6 -6
  477. data/spec/unit/axiom/relation/variable/class_methods/new_spec.rb +35 -0
  478. data/spec/unit/axiom/relation/variable/delete_spec.rb +18 -0
  479. data/spec/unit/axiom/relation/variable/insert_spec.rb +18 -0
  480. data/spec/unit/axiom/relation/variable/materialized/delete_spec.rb +18 -0
  481. data/spec/unit/axiom/relation/variable/materialized/insert_spec.rb +18 -0
  482. data/spec/unit/axiom/relation/variable/materialized/replace_spec.rb +18 -0
  483. data/spec/unit/axiom/relation/variable/replace_spec.rb +18 -0
  484. data/spec/unit/axiom/tuple/call_spec.rb +3 -4
  485. data/spec/unit/axiom/tuple/class_methods/coerce_spec.rb +6 -6
  486. data/spec/unit/axiom/tuple/data_spec.rb +2 -2
  487. data/spec/unit/axiom/tuple/eql_spec.rb +5 -5
  488. data/spec/unit/axiom/tuple/equality_operator_spec.rb +6 -6
  489. data/spec/unit/axiom/tuple/extend_spec.rb +12 -12
  490. data/spec/unit/axiom/tuple/hash_spec.rb +3 -3
  491. data/spec/unit/axiom/tuple/header_spec.rb +3 -3
  492. data/spec/unit/axiom/tuple/join_spec.rb +6 -6
  493. data/spec/unit/axiom/tuple/predicate_spec.rb +5 -5
  494. data/spec/unit/axiom/tuple/project_spec.rb +5 -5
  495. data/spec/unit/axiom/tuple/to_ary_spec.rb +3 -3
  496. data/spec/unit/axiom/visitable/accept_spec.rb +1 -1
  497. data/spec/unit/range/to_inclusive_spec.rb +1 -1
  498. data/spec/unit/time/pred_spec.rb +1 -1
  499. metadata +92 -614
  500. checksums.yaml +0 -7
  501. data/.rvmrc +0 -1
  502. data/lib/axiom/function/numeric/binary.rb +0 -26
  503. data/lib/axiom/function/numeric/unary.rb +0 -26
  504. data/spec/support/ice_nine_config.rb +0 -6
  505. data/spec/unit/axiom/aggregate/count/type_spec.rb +0 -12
  506. data/spec/unit/axiom/aggregate/mean/type_spec.rb +0 -12
  507. data/spec/unit/axiom/aggregate/standard_deviation/type_spec.rb +0 -12
  508. data/spec/unit/axiom/aggregate/type_spec.rb +0 -13
  509. data/spec/unit/axiom/aggregate/variance/type_spec.rb +0 -12
  510. data/spec/unit/axiom/attribute/boolean/class_methods/primitive_spec.rb +0 -13
  511. data/spec/unit/axiom/attribute/date/range_spec.rb +0 -11
  512. data/spec/unit/axiom/attribute/date_time/class_methods/primitive_spec.rb +0 -13
  513. data/spec/unit/axiom/attribute/date_time/range_spec.rb +0 -11
  514. data/spec/unit/axiom/attribute/decimal/class_methods/primitive_spec.rb +0 -13
  515. data/spec/unit/axiom/attribute/float/size_spec.rb +0 -21
  516. data/spec/unit/axiom/attribute/integer/class_methods/primitive_spec.rb +0 -13
  517. data/spec/unit/axiom/attribute/numeric/class_methods/primitive_spec.rb +0 -13
  518. data/spec/unit/axiom/attribute/numeric/size_spec.rb +0 -33
  519. data/spec/unit/axiom/attribute/object/class_methods/primitive_spec.rb +0 -13
  520. data/spec/unit/axiom/attribute/string/class_methods/primitive_spec.rb +0 -13
  521. data/spec/unit/axiom/attribute/string/max_length_spec.rb +0 -20
  522. data/spec/unit/axiom/attribute/string/min_length_spec.rb +0 -20
  523. data/spec/unit/axiom/attribute/time/range_spec.rb +0 -11
  524. data/spec/unit/axiom/attribute/valid_primitive_predicate_spec.rb +0 -30
  525. data/spec/unit/axiom/function/connective/type_spec.rb +0 -12
  526. data/spec/unit/axiom/function/numeric/binary/type_spec.rb +0 -33
  527. data/spec/unit/axiom/function/numeric/unary/type_spec.rb +0 -21
  528. data/spec/unit/axiom/function/predicate/type_spec.rb +0 -14
  529. data/spec/unit/axiom/function/proposition/type_spec.rb +0 -12
  530. data/spec/unit/axiom/function/string/length/type_spec.rb +0 -11
  531. data/spec/unit/axiom/relation/one_spec.rb +0 -36
@@ -24,6 +24,19 @@ module Axiom
24
24
  Math.sqrt(value)
25
25
  end
26
26
 
27
+ # Return the type returned from #call
28
+ #
29
+ # @example
30
+ # type = Axiom::Function::Numeric::SquareRoot.type
31
+ # # => Axiom::Types::Float
32
+ #
33
+ # @return [Class<Types::Float>]
34
+ #
35
+ # @api public
36
+ def self.type
37
+ Types::Float
38
+ end
39
+
27
40
  # Return the inverse function
28
41
  #
29
42
  # @example
@@ -38,17 +51,20 @@ module Axiom
38
51
 
39
52
  # Return the type returned from #call
40
53
  #
41
- # @return [Class<Attribute::Float>]
54
+ # @example
55
+ # type = square_root.type # => Axiom::Types::Float
56
+ #
57
+ # @return [Class<Types::Float>]
42
58
  #
43
59
  # @api public
44
60
  def type
45
- Attribute::Float
61
+ self.class.type
46
62
  end
47
63
 
48
64
  module Methods
49
65
  extend Aliasable
50
66
 
51
- inheritable_alias(:sqrt => :square_root)
67
+ inheritable_alias(sqrt: :square_root)
52
68
 
53
69
  # Return a square root function
54
70
  #
@@ -14,11 +14,14 @@ module Axiom
14
14
 
15
15
  # Return the type returned from #call
16
16
  #
17
- # @return [Class<Attribute::Boolean>]
17
+ # @example
18
+ # type = Axiom::Function::Predicate.type # => Axiom::Types::Boolean
19
+ #
20
+ # @return [Class<Types::Boolean>]
18
21
  #
19
22
  # @api public
20
- def type
21
- Attribute::Boolean
23
+ def self.type
24
+ Types::Boolean
22
25
  end
23
26
 
24
27
  end # class Predicate
@@ -11,7 +11,7 @@ module Axiom
11
11
  # Test an enumerable to see if a value is excluded
12
12
  #
13
13
  # @example
14
- # Exclusion.call(1, [ 1, 2, 3 ]) # => false
14
+ # Exclusion.call(1, [1, 2, 3]) # => false
15
15
  #
16
16
  # @param [Object] left
17
17
  # the object to test for in the Enumerable
@@ -42,7 +42,7 @@ module Axiom
42
42
  # Compare the left to see if it is excluded from the right
43
43
  #
44
44
  # @example
45
- # exclusion = attribute.exclude([ 1, 2, 3 ])
45
+ # exclusion = attribute.exclude([1, 2, 3])
46
46
  #
47
47
  # @param [Function] other
48
48
  #
@@ -11,7 +11,7 @@ module Axiom
11
11
  # Test an enumerable to see if a value is included
12
12
  #
13
13
  # @example
14
- # Inclusion.call(1, [ 1, 2, 3 ]) # => true
14
+ # Inclusion.call(1, [1, 2, 3]) # => true
15
15
  #
16
16
  # @param [Object] left
17
17
  # the object to test for in the Enumerable
@@ -42,7 +42,7 @@ module Axiom
42
42
  # Compare the left to see if it is included in the right
43
43
  #
44
44
  # @example
45
- # inclusion = attribute.include([ 1, 2, 3 ])
45
+ # inclusion = attribute.include([1, 2, 3])
46
46
  #
47
47
  # @param [Function] other
48
48
  #
@@ -12,6 +12,18 @@ module Axiom
12
12
  Function::Connective::Negation::Methods
13
13
  include Equalizer.new
14
14
 
15
+ # Return the type returned from #call
16
+ #
17
+ # @example
18
+ # type = Axiom::Function::Proposition.type # => Axiom::Types::Boolean
19
+ #
20
+ # @return [Class<Types::Boolean>]
21
+ #
22
+ # @api public
23
+ def self.type
24
+ Types::Boolean
25
+ end
26
+
15
27
  # Instantiate a new Proposition
16
28
  #
17
29
  # @example using a true value
@@ -83,15 +95,6 @@ module Axiom
83
95
  self.class.inverse.instance
84
96
  end
85
97
 
86
- # Return the type returned from #call
87
- #
88
- # @return [Class<Attribute::Boolean>]
89
- #
90
- # @api public
91
- def type
92
- Attribute::Boolean
93
- end
94
-
95
98
  end # class Proposition
96
99
  end # module Algebra
97
100
  end # module Axiom
@@ -24,11 +24,14 @@ module Axiom
24
24
 
25
25
  # Return the type returned from #call
26
26
  #
27
- # @return [Class<Attribute::Integer>]
27
+ # @example
28
+ # type = Axiom::Function::String.type # => Axiom::Types::Integer
29
+ #
30
+ # @return [Class<Types::Integer>]
28
31
  #
29
32
  # @api public
30
- def type
31
- Attribute::Integer
33
+ def self.type
34
+ Types::Integer
32
35
  end
33
36
 
34
37
  module Methods
@@ -86,6 +86,18 @@ module Axiom
86
86
  end
87
87
  end
88
88
 
89
+ # Return the type returned from #call
90
+ #
91
+ # @example
92
+ # type = unary.type # => Axiom::Types::Numeric
93
+ #
94
+ # @return [Class<Types::Numeric>]
95
+ #
96
+ # @api public
97
+ def type
98
+ Attribute.infer_type(operand)
99
+ end
100
+
89
101
  # Mixin for invertable unary functions
90
102
  module Invertible
91
103
 
@@ -4,7 +4,7 @@ module Axiom
4
4
 
5
5
  # Abstract base class for Relation operations
6
6
  class Relation
7
- include Enumerable, Visitable
7
+ include Enumerable, Visitable, Adamantium::Flat
8
8
  include Equalizer.new(:header, :to_set)
9
9
 
10
10
  # The relation header
@@ -34,16 +34,16 @@ module Axiom
34
34
  # Instantiate a new Relation
35
35
  #
36
36
  # @example of a materialized Array based relation
37
- # array = [ [ 1 ], [ 2 ], [ 3 ] ]
38
- # relation = Relation.new([ [ :id, Integer ] ], array)
37
+ # array = [[1], [2], [3]]
38
+ # relation = Relation.new([[:id, Integer]], array)
39
39
  #
40
40
  # @example of a materialized Set based relation
41
- # set = Set[ [ 1 ], [ 2 ], [ 3 ] ]
42
- # relation = Relation.new([ [ :id, Integer ] ], set)
41
+ # set = Set[[1], [2], [3]]
42
+ # relation = Relation.new([[:id, Integer]], set)
43
43
  #
44
44
  # @example of a non-materialized Enumerator based relation
45
- # enumerator = [ [ 1 ], [ 2 ], [ 3 ] ].each
46
- # relation = Relation.new([ [ :id, Integer ] ], enumerator)
45
+ # enumerator = [[1], [2], [3]].each
46
+ # relation = Relation.new([[:id, Integer]], enumerator)
47
47
  #
48
48
  # @param [Array(Header, Enumerable)] args
49
49
  #
@@ -51,14 +51,28 @@ module Axiom
51
51
  #
52
52
  # @api public
53
53
  def self.new(*args)
54
- last = args.last
55
- if superclass.equal?(Object) && last.respond_to?(:size) && last.size.kind_of?(Integer)
54
+ if equal?(Relation) && materialized?(args[1])
56
55
  Materialized.new(*args)
57
56
  else
58
57
  super
59
58
  end
60
59
  end
61
60
 
61
+ # Test if the tuples are materialized
62
+ #
63
+ # When tuples are nil, it means there are no tuples so it is the equivalent
64
+ # of specifying [] for the tuples.
65
+ #
66
+ # @param [Enumerable, nil] tuples
67
+ #
68
+ # @return [Boolean]
69
+ #
70
+ # @api private
71
+ def self.materialized?(tuples)
72
+ tuples.nil? || tuples.respond_to?(:size) && tuples.size.kind_of?(Integer)
73
+ end
74
+ private_class_method :materialized?
75
+
62
76
  # Initialize a Relation
63
77
  #
64
78
  # @param [Header, #to_ary] header
@@ -71,7 +85,7 @@ module Axiom
71
85
  # @api private
72
86
  def initialize(header, tuples)
73
87
  @header = Header.coerce(header)
74
- @tuples = freeze_object(tuples)
88
+ @tuples = tuples
75
89
  end
76
90
 
77
91
  # Lookup an Attribute in the header given an attribute name
@@ -105,7 +119,7 @@ module Axiom
105
119
  # @api public
106
120
  def each
107
121
  return to_enum unless block_given?
108
- seen = Hash.new
122
+ seen = {}
109
123
  tuples.each do |tuple|
110
124
  tuple = Tuple.coerce(header, tuple)
111
125
  yield seen[tuple] = tuple unless seen.key?(tuple)
@@ -113,25 +127,6 @@ module Axiom
113
127
  self
114
128
  end
115
129
 
116
- # Return a tuple if the relation contains exactly one tuple
117
- #
118
- # @example
119
- # tuple = relation.one
120
- #
121
- # @return [Tuple]
122
- #
123
- # @raise [NoTuplesError]
124
- # raised if no tuples are returned
125
- # @raise [ManyTuplesError]
126
- # raised if more than one tuple is returned
127
- #
128
- # @api public
129
- def one
130
- tuples = to_a
131
- assert_exactly_one_tuple(tuples.size)
132
- tuples.first
133
- end
134
-
135
130
  # Return a relation that represents a replacement of a relation
136
131
  #
137
132
  # Delete the tuples from the relation that are not in the other relation,
@@ -201,7 +196,8 @@ module Axiom
201
196
  # @api public
202
197
  def ==(other)
203
198
  other = coerce(other)
204
- header == other.header &&
199
+ other.kind_of?(Relation) &&
200
+ header == other.header &&
205
201
  to_set == other.to_set
206
202
  end
207
203
 
@@ -242,25 +238,10 @@ module Axiom
242
238
  #
243
239
  # @api private
244
240
  def self.coerce(header, object)
245
- object.kind_of?(Relation) ? object : Relation.new(header, object)
246
- end
247
-
248
- # Assert exactly one tuple is returned
249
- #
250
- # @return [undefined]
251
- #
252
- # @raise [NoTuplesError]
253
- # raised if no tuples are returned
254
- # @raise [ManyTuplesError]
255
- # raised if more than one tuple is returned
256
- #
257
- # @api private
258
- def assert_exactly_one_tuple(size)
259
- if size.zero?
260
- raise NoTuplesError, 'one tuple expected, but was an empty set'
261
- elsif size > 1
262
- raise ManyTuplesError,
263
- "one tuple expected, but set contained #{size} tuples"
241
+ if object.kind_of?(Relation) || ! object.kind_of?(Enumerable)
242
+ object
243
+ else
244
+ Relation.new(header, object)
264
245
  end
265
246
  end
266
247
 
@@ -12,14 +12,14 @@ module Axiom
12
12
  # @example
13
13
  # name = base.name
14
14
  #
15
- # @return [#to_s]
15
+ # @return [Symbol]
16
16
  #
17
17
  # @api public
18
18
  attr_reader :name
19
19
 
20
20
  # Initialize a base relation
21
21
  #
22
- # @param [#to_s] name
22
+ # @param [#to_sym] name
23
23
  # the relation name
24
24
  # @param [Header, #to_ary] header
25
25
  # the relation header
@@ -31,7 +31,7 @@ module Axiom
31
31
  # @api private
32
32
  def initialize(name, header, tuples = Empty::ZERO_TUPLE)
33
33
  super(header, tuples)
34
- @name = freeze_object(name.to_s)
34
+ @name = name.to_sym
35
35
  end
36
36
 
37
37
  end # class Base
@@ -5,46 +5,17 @@ module Axiom
5
5
 
6
6
  # An empty relation
7
7
  class Empty < Materialized
8
- ZERO_TUPLE = EMPTY_ARRAY
9
8
 
10
9
  # Initialize an empty Relation
11
10
  #
12
- # @param [Header] _header
11
+ # @param [Header] header
13
12
  # the header for the empty relation
14
- # @param [#each] _tuples
15
- # optional original tuples
16
13
  #
17
14
  # @return [undefined]
18
15
  #
19
16
  # @api public
20
- def initialize(_header, _tuples = ZERO_TUPLE)
21
- super
22
- end
23
-
24
- # Noop #each method
25
- #
26
- # @example
27
- # empty = Empty.new(header)
28
- # empty.each { ... }
29
- #
30
- # @return [self]
31
- #
32
- # @api public
33
- def each
34
- return to_enum unless block_given?
35
- self
36
- end
37
-
38
- # Return the number of tuples
39
- #
40
- # @example
41
- # empty.size # => 0
42
- #
43
- # @return [0]
44
- #
45
- # @api public
46
- def size
47
- 0
17
+ def initialize(header)
18
+ super(header, ZERO_TUPLE)
48
19
  end
49
20
 
50
21
  end # class Empty
@@ -43,7 +43,7 @@ module Axiom
43
43
  # Find the attribute with the block if possible, then fallback
44
44
  # to the default coercion method.
45
45
  block = lambda do |attribute|
46
- block_given? and yield(attribute) or coerce_attribute(attribute)
46
+ coerce_attribute(block_given? && yield(attribute) || attribute)
47
47
  end
48
48
  new(Array(object).map(&block), options)
49
49
  end
@@ -114,7 +114,7 @@ module Axiom
114
114
  # Initialize a Header
115
115
  #
116
116
  # @example
117
- # header = Header.new(attributes, :keys => [ [ :id ] ])
117
+ # header = Header.new(attributes, keys: [[:id]])
118
118
  #
119
119
  # @param [Array] attributes
120
120
  #
@@ -125,9 +125,8 @@ module Axiom
125
125
  # @api public
126
126
  def initialize(attributes, options)
127
127
  @attributes = freeze_object(attributes)
128
- @options = freeze_object(options)
129
128
  @attribute_for = Hash[@attributes.map(&:name).zip(@attributes)]
130
- @keys = coerce_keys
129
+ @keys = coerce_keys(options.fetch(:keys, EMPTY_ARRAY))
131
130
  end
132
131
 
133
132
  # Iterate over each attribute in the header
@@ -163,8 +162,10 @@ module Axiom
163
162
  # @api public
164
163
  def call(name)
165
164
  @attribute_for.fetch(Attribute.name_from(name)) do |attribute_name|
166
- raise UnknownAttributeError,
165
+ raise(
166
+ UnknownAttributeError,
167
167
  "the attribute #{attribute_name} is unknown"
168
+ )
168
169
  end
169
170
  end
170
171
 
@@ -183,7 +184,7 @@ module Axiom
183
184
  #
184
185
  # @api public
185
186
  def project(attributes)
186
- coerce(attributes, :keys => keys.project(attributes))
187
+ coerce(attributes, keys: keys.project(attributes))
187
188
  end
188
189
 
189
190
  # Return a header with the new attributes added
@@ -201,7 +202,7 @@ module Axiom
201
202
  #
202
203
  # @api public
203
204
  def extend(attributes)
204
- new(to_ary + coerce(attributes), :keys => keys)
205
+ new(to_ary + coerce(attributes), keys: keys)
205
206
  end
206
207
 
207
208
  # Return a header with the attributes renamed
@@ -221,7 +222,7 @@ module Axiom
221
222
  def rename(aliases)
222
223
  new(
223
224
  map { |attribute| aliases[attribute] },
224
- :keys => keys.rename(aliases)
225
+ keys: keys.rename(aliases)
225
226
  )
226
227
  end
227
228
 
@@ -241,7 +242,7 @@ module Axiom
241
242
  def intersect(other)
242
243
  other = coerce(other)
243
244
  attributes = to_ary & other
244
- new(attributes, :keys => (keys | other.keys).project(attributes))
245
+ new(attributes, keys: (keys | other.keys).project(attributes))
245
246
  end
246
247
 
247
248
  # Return the union of the header with another header
@@ -259,7 +260,7 @@ module Axiom
259
260
  # @api public
260
261
  def union(other)
261
262
  other = coerce(other)
262
- new(to_ary | other, :keys => keys & other.keys)
263
+ new(to_ary | other, keys: keys & other.keys)
263
264
  end
264
265
 
265
266
  # Return the difference of the header with another header
@@ -277,7 +278,22 @@ module Axiom
277
278
  # @api public
278
279
  def difference(other)
279
280
  other = coerce(other)
280
- new(to_ary - other, :keys => keys - other.keys)
281
+ new(to_ary - other, keys: keys - other.keys)
282
+ end
283
+
284
+ # Evaluate a block within the context of the header
285
+ #
286
+ # @yield [context]
287
+ #
288
+ # @yieldparam [Evaluator::Context] context
289
+ #
290
+ # @yieldreturn [Evaluator::Context]
291
+ #
292
+ # @return [Header]
293
+ #
294
+ # @api private
295
+ def context(&block)
296
+ Evaluator::Context.new(self, &block)
281
297
  end
282
298
 
283
299
  # Convert the Header into an Array
@@ -319,13 +335,13 @@ module Axiom
319
335
 
320
336
  # Coerce the keys into an Array of Headers
321
337
  #
338
+ # @return [Array]
339
+ #
322
340
  # @return [Array<Header>]
323
341
  #
324
342
  # @api private
325
- def coerce_keys
326
- Keys.coerce(@options.fetch(:keys, EMPTY_ARRAY)) do |attributes|
327
- coerce(attributes)
328
- end
343
+ def coerce_keys(keys)
344
+ Keys.coerce(keys) { |attributes| coerce(attributes) }
329
345
  end
330
346
 
331
347
  # Coerce the object into a Header