axiom-sql-generator 0.1.0 → 0.2.0

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/.ruby-gemset +1 -0
  4. data/.travis.yml +17 -23
  5. data/CONTRIBUTING.md +1 -2
  6. data/Gemfile +10 -3
  7. data/Gemfile.devtools +39 -27
  8. data/README.md +5 -33
  9. data/axiom-sql-generator.gemspec +3 -5
  10. data/config/devtools.yml +2 -0
  11. data/config/flay.yml +1 -1
  12. data/config/reek.yml +1 -1
  13. data/config/rubocop.yml +59 -0
  14. data/lib/axiom/sql/generator/core_ext/date_time.rb +5 -6
  15. data/lib/axiom/sql/generator/direction.rb +4 -4
  16. data/lib/axiom/sql/generator/function/predicate.rb +1 -1
  17. data/lib/axiom/sql/generator/relation.rb +12 -11
  18. data/lib/axiom/sql/generator/relation/binary.rb +1 -1
  19. data/lib/axiom/sql/generator/relation/insertion.rb +1 -1
  20. data/lib/axiom/sql/generator/relation/unary.rb +20 -20
  21. data/lib/axiom/sql/generator/version.rb +1 -1
  22. data/lib/axiom/sql/generator/visitor.rb +3 -3
  23. data/spec/spec_helper.rb +11 -10
  24. data/spec/support/config_alias.rb +2 -0
  25. data/spec/unit/axiom/sql/generator/direction/{visit_axiom_relation_operation_order_ascending_spec.rb → visit_axiom_relation_operation_sorted_ascending_spec.rb} +2 -2
  26. data/spec/unit/axiom/sql/generator/direction/{visit_axiom_relation_operation_order_descending_spec.rb → visit_axiom_relation_operation_sorted_descending_spec.rb} +2 -2
  27. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_exclusion_spec.rb +1 -1
  28. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_inclusion_spec.rb +1 -1
  29. data/spec/unit/axiom/sql/generator/function/predicate/visit_axiom_function_predicate_inequality_spec.rb +3 -3
  30. data/spec/unit/axiom/sql/generator/literal/visit_enumerable_spec.rb +1 -1
  31. data/spec/unit/axiom/sql/generator/relation/binary/base/to_subquery_spec.rb +7 -7
  32. data/spec/unit/axiom/sql/generator/relation/binary/base/visit_axiom_relation_base_spec.rb +8 -8
  33. data/spec/unit/axiom/sql/generator/relation/binary/to_s_spec.rb +7 -7
  34. data/spec/unit/axiom/sql/generator/relation/binary/to_subquery_spec.rb +7 -7
  35. data/spec/unit/axiom/sql/generator/relation/binary/visit_axiom_algebra_join_spec.rb +20 -20
  36. data/spec/unit/axiom/sql/generator/relation/binary/visit_axiom_algebra_product_spec.rb +26 -26
  37. data/spec/unit/axiom/sql/generator/relation/class_methods/visit_spec.rb +10 -10
  38. data/spec/unit/axiom/sql/generator/relation/insertion/to_subquery_spec.rb +2 -2
  39. data/spec/unit/axiom/sql/generator/relation/insertion/visit_axiom_relation_operation_insertion_spec.rb +23 -23
  40. data/spec/unit/axiom/sql/generator/relation/materialized/visit_axiom_relation_materialized_spec.rb +3 -3
  41. data/spec/unit/axiom/sql/generator/relation/materialized/visited_spec.rb +2 -2
  42. data/spec/unit/axiom/sql/generator/relation/set/class_methods/normalize_operand_headers_spec.rb +5 -5
  43. data/spec/unit/axiom/sql/generator/relation/set/to_s_spec.rb +7 -7
  44. data/spec/unit/axiom/sql/generator/relation/set/to_subquery_spec.rb +7 -7
  45. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_difference_spec.rb +19 -19
  46. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_intersection_spec.rb +19 -19
  47. data/spec/unit/axiom/sql/generator/relation/set/visit_axiom_algebra_union_spec.rb +19 -19
  48. data/spec/unit/axiom/sql/generator/relation/to_s_spec.rb +9 -9
  49. data/spec/unit/axiom/sql/generator/relation/to_sql_spec.rb +8 -8
  50. data/spec/unit/axiom/sql/generator/relation/to_subquery_spec.rb +9 -9
  51. data/spec/unit/axiom/sql/generator/relation/unary/to_s_spec.rb +9 -9
  52. data/spec/unit/axiom/sql/generator/relation/unary/to_subquery_spec.rb +11 -11
  53. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_extension_spec.rb +17 -17
  54. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_projection_spec.rb +23 -23
  55. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_rename_spec.rb +19 -19
  56. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_restriction_spec.rb +22 -22
  57. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_algebra_summarization_spec.rb +48 -48
  58. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_base_spec.rb +8 -8
  59. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_limit_spec.rb +24 -24
  60. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_offset_spec.rb +24 -24
  61. data/spec/unit/axiom/sql/generator/relation/unary/visit_axiom_relation_operation_reverse_spec.rb +26 -26
  62. data/spec/unit/axiom/sql/generator/relation/unary/{visit_axiom_relation_operation_order_spec.rb → visit_axiom_relation_operation_sorted_spec.rb} +28 -28
  63. data/spec/unit/axiom/sql/generator/relation/visit_spec.rb +3 -3
  64. data/spec/unit/axiom/sql/generator/relation/visited_spec.rb +7 -7
  65. data/spec/unit/axiom/sql/generator/visitor/visit_spec.rb +2 -2
  66. metadata +22 -41
  67. data/.rvmrc +0 -1
@@ -99,7 +99,7 @@ module Axiom
99
99
  #
100
100
  # @api private
101
101
  def set_name
102
- @name = [ @left.name, @right.name ].uniq.join(UNDERSCORE).freeze
102
+ @name = [@left.name, @right.name].uniq.join(UNDERSCORE).freeze
103
103
  end
104
104
 
105
105
  # Generates an SQL statement for base relation binary operands
@@ -9,7 +9,7 @@ module Axiom
9
9
  class Insertion < Set
10
10
  extend Aliasable
11
11
 
12
- inheritable_alias(:to_subquery => :to_s)
12
+ inheritable_alias(to_subquery: :to_s)
13
13
 
14
14
  # Visit an Insertion
15
15
  #
@@ -17,21 +17,21 @@ module Axiom
17
17
  Function::String,
18
18
  Function::Numeric
19
19
 
20
- inheritable_alias(:visit_axiom_relation_operation_reverse => :visit_axiom_relation_operation_order)
20
+ inheritable_alias(visit_axiom_relation_operation_reverse: :visit_axiom_relation_operation_sorted)
21
21
 
22
22
  DISTINCT = 'DISTINCT '.freeze
23
23
  NO_ROWS = ' HAVING FALSE'.freeze
24
24
  ANY_ROWS = ' HAVING COUNT (*) > 0'
25
25
  COLLAPSIBLE = {
26
- Algebra::Summarization => Set[ ].freeze,
27
- Algebra::Projection => Set[ Algebra::Projection, Algebra::Restriction, ].freeze,
28
- Algebra::Extension => Set[ Algebra::Projection, Algebra::Restriction, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset, Axiom::Relation::Operation::Limit ].freeze,
29
- Algebra::Rename => Set[ Algebra::Projection, Algebra::Restriction, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset, Axiom::Relation::Operation::Limit ].freeze,
30
- Algebra::Restriction => Set[ Algebra::Projection, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, ].freeze,
31
- Axiom::Relation::Operation::Order => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, ].freeze,
32
- Axiom::Relation::Operation::Reverse => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, ].freeze,
33
- Axiom::Relation::Operation::Offset => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, ].freeze,
34
- Axiom::Relation::Operation::Limit => Set[ Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Order, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset, ].freeze,
26
+ Algebra::Summarization => Set[].freeze,
27
+ Algebra::Projection => Set[Algebra::Projection, Algebra::Restriction].freeze,
28
+ Algebra::Extension => Set[Algebra::Projection, Algebra::Restriction, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset, Axiom::Relation::Operation::Limit].freeze,
29
+ Algebra::Rename => Set[Algebra::Projection, Algebra::Restriction, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset, Axiom::Relation::Operation::Limit].freeze,
30
+ Algebra::Restriction => Set[Algebra::Projection, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse].freeze,
31
+ Axiom::Relation::Operation::Sorted => Set[Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse].freeze,
32
+ Axiom::Relation::Operation::Reverse => Set[Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse].freeze,
33
+ Axiom::Relation::Operation::Offset => Set[Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse].freeze,
34
+ Axiom::Relation::Operation::Limit => Set[Algebra::Projection, Algebra::Extension, Algebra::Rename, Algebra::Restriction, Algebra::Summarization, Axiom::Relation::Operation::Sorted, Axiom::Relation::Operation::Reverse, Axiom::Relation::Operation::Offset].freeze,
35
35
  }.freeze
36
36
 
37
37
  # Initialize a Unary relation SQL generator
@@ -52,7 +52,7 @@ module Axiom
52
52
  #
53
53
  # @api private
54
54
  def visit_axiom_relation_base(base_relation)
55
- @name = base_relation.name
55
+ @name = base_relation.name.to_s.freeze
56
56
  @from = visit_identifier(@name)
57
57
  @header = base_relation.header
58
58
  @columns = columns_for(base_relation)
@@ -141,19 +141,19 @@ module Axiom
141
141
  self
142
142
  end
143
143
 
144
- # Visit an Order
144
+ # Visit a Sorted
145
145
  #
146
- # @param [Relation::Operation::Order] order
146
+ # @param [Relation::Operation::Sorted] sorted
147
147
  #
148
148
  # @return [self]
149
149
  #
150
150
  # @api private
151
- def visit_axiom_relation_operation_order(order)
152
- @from = subquery_for(order)
153
- @order = " ORDER BY #{order_for(order.directions)}"
154
- @header = order.header
155
- @columns ||= columns_for(order)
156
- scope_query(order)
151
+ def visit_axiom_relation_operation_sorted(sorted)
152
+ @from = subquery_for(sorted)
153
+ @order = " ORDER BY #{order_for(sorted.directions)}"
154
+ @header = sorted.header
155
+ @columns ||= columns_for(sorted)
156
+ scope_query(sorted)
157
157
  self
158
158
  end
159
159
 
@@ -199,7 +199,7 @@ module Axiom
199
199
  #
200
200
  # @api private
201
201
  def generate_sql(columns)
202
- [ "SELECT #{columns} FROM #{@from}", @where, @group, @having, @order, @limit, @offset ].join
202
+ ["SELECT #{columns} FROM #{@from}", @where, @group, @having, @order, @limit, @offset].join
203
203
  end
204
204
 
205
205
  # Return the columns to use in a query
@@ -5,7 +5,7 @@ module Axiom
5
5
  module Generator
6
6
 
7
7
  # Gem version
8
- VERSION = '0.1.0'.freeze
8
+ VERSION = '0.2.0'.freeze
9
9
 
10
10
  end # module Generator
11
11
  end # module SQL
@@ -26,7 +26,7 @@ module Axiom
26
26
  #
27
27
  # @api private
28
28
  def self.handler_for(visitable_class)
29
- handlers[visitable_class] or raise UnknownObject, "No handler for #{visitable_class} in #{self}"
29
+ handlers[visitable_class] or fail UnknownObject, "No handler for #{visitable_class} in #{self}"
30
30
  end
31
31
 
32
32
  # Return the handler cache that maps modules to method names
@@ -84,7 +84,7 @@ module Axiom
84
84
  #
85
85
  # @api public
86
86
  def visit(_visitable)
87
- raise NotImplementedError, "#{self.class}#visit must be implemented"
87
+ fail NotImplementedError, "#{self.class}#visit must be implemented"
88
88
  end
89
89
 
90
90
  # Test if a visitable object has been visited
@@ -96,7 +96,7 @@ module Axiom
96
96
  #
97
97
  # @api public
98
98
  def visited?
99
- raise NotImplementedError, "#{self.class}#visited? must be implemented"
99
+ fail NotImplementedError, "#{self.class}#visited? must be implemented"
100
100
  end
101
101
 
102
102
  private
@@ -1,7 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'devtools/spec_helper'
4
-
5
3
  if ENV['COVERAGE'] == 'true'
6
4
  require 'simplecov'
7
5
  require 'coveralls'
@@ -12,22 +10,25 @@ if ENV['COVERAGE'] == 'true'
12
10
  ]
13
11
 
14
12
  SimpleCov.start do
15
- command_name 'spec:unit'
16
- add_filter 'config'
17
- add_filter 'core_ext'
18
- add_filter 'spec'
13
+ command_name 'spec:unit'
14
+
15
+ add_filter 'config'
16
+ add_filter 'spec'
17
+ add_filter 'vendor'
18
+
19
19
  minimum_coverage 100
20
20
  end
21
21
  end
22
22
 
23
+ require 'devtools/spec_helper'
23
24
  require 'axiom-sql-generator'
24
25
 
25
26
  include Axiom
26
27
 
27
- # require spec support files and shared behavior
28
- Dir[File.expand_path('../{support,shared}/**/*.rb', __FILE__)].each do |file|
29
- require file
30
- end
28
+ Types.finalize
31
29
 
32
30
  RSpec.configure do |config|
31
+ config.expect_with :rspec do |expect_with|
32
+ expect_with.syntax = :expect
33
+ end
33
34
  end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rbconfig'
2
4
 
3
5
  ::Config = RbConfig unless defined?(::Config)
@@ -2,8 +2,8 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Direction, '#visit_axiom_relation_operation_order_ascending' do
6
- subject { object.visit_axiom_relation_operation_order_ascending(direction) }
5
+ describe SQL::Generator::Direction, '#visit_axiom_relation_operation_sorted_ascending' do
6
+ subject { object.visit_axiom_relation_operation_sorted_ascending(direction) }
7
7
 
8
8
  let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Direction } }
9
9
  let(:direction) { Attribute::Integer.new(:id).asc }
@@ -2,8 +2,8 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Direction, '#visit_axiom_relation_operation_order_descending' do
6
- subject { object.visit_axiom_relation_operation_order_descending(direction) }
5
+ describe SQL::Generator::Direction, '#visit_axiom_relation_operation_sorted_descending' do
6
+ subject { object.visit_axiom_relation_operation_sorted_descending(direction) }
7
7
 
8
8
  let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Direction } }
9
9
  let(:direction) { Attribute::Integer.new(:id).desc }
@@ -30,7 +30,7 @@ describe SQL::Generator::Function::Predicate, '#visit_axiom_function_predicate_e
30
30
  end
31
31
 
32
32
  context 'when right operand is an Array' do
33
- let(:exclusion) { attribute.exclude([ 1, 2 ]) }
33
+ let(:exclusion) { attribute.exclude([1, 2]) }
34
34
 
35
35
  it_should_behave_like 'a generated SQL expression'
36
36
 
@@ -30,7 +30,7 @@ describe SQL::Generator::Function::Predicate, '#visit_axiom_function_predicate_i
30
30
  end
31
31
 
32
32
  context 'when right operand is an Array' do
33
- let(:inclusion) { attribute.include([ 1, 2 ]) }
33
+ let(:inclusion) { attribute.include([1, 2]) }
34
34
 
35
35
  it_should_behave_like 'a generated SQL expression'
36
36
 
@@ -9,8 +9,8 @@ describe SQL::Generator::Function::Predicate, '#visit_axiom_function_predicate_i
9
9
  let(:object) { described_class.new }
10
10
 
11
11
  context 'and the left attribute is optional' do
12
- let(:attribute) { Attribute::Integer.new(:age, :required => false) }
13
- let(:inequality) { attribute.ne(1) }
12
+ let(:attribute) { Attribute::Integer.new(:age, required: false) }
13
+ let(:inequality) { attribute.ne(1) }
14
14
 
15
15
  it_should_behave_like 'a generated SQL expression'
16
16
 
@@ -18,7 +18,7 @@ describe SQL::Generator::Function::Predicate, '#visit_axiom_function_predicate_i
18
18
  end
19
19
 
20
20
  context 'and the right attribute is optional' do
21
- let(:attribute) { Attribute::Integer.new(:age, :required => false) }
21
+ let(:attribute) { Attribute::Integer.new(:age, required: false) }
22
22
  let(:inequality) { Function::Predicate::Inequality.new(1, attribute) }
23
23
 
24
24
  it_should_behave_like 'a generated SQL expression'
@@ -6,7 +6,7 @@ describe SQL::Generator::Literal, '#visit_enumerable' do
6
6
  subject { object.visit_enumerable(enumerable) }
7
7
 
8
8
  let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Literal } }
9
- let(:enumerable) { [ 1, 2 ].freeze }
9
+ let(:enumerable) { [1, 2].freeze }
10
10
  let(:object) { described_class.new }
11
11
 
12
12
  it_should_behave_like 'a generated SQL expression'
@@ -5,13 +5,13 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary::Base, '#to_subquery' do
6
6
  subject { object.to_subquery }
7
7
 
8
- let(:id) { Attribute::Integer.new(:id) }
9
- let(:name) { Attribute::String.new(:name) }
10
- let(:age) { Attribute::Integer.new(:age, :required => false) }
11
- let(:header) { [ id, name, age ] }
12
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { Relation::Base.new('users', header, body) }
14
- let(:object) { described_class.new }
8
+ let(:id) { Attribute::Integer.new(:id) }
9
+ let(:name) { Attribute::String.new(:name) }
10
+ let(:age) { Attribute::Integer.new(:age, required: false) }
11
+ let(:header) { [id, name, age] }
12
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
+ let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
17
17
  it_should_behave_like 'an idempotent method'
@@ -5,14 +5,14 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary::Base, '#visit_axiom_relation_base' do
6
6
  subject { object.visit_axiom_relation_base(base_relation) }
7
7
 
8
- let(:relation_name) { 'users' }
9
- let(:id) { Attribute::Integer.new(:id) }
10
- let(:name) { Attribute::String.new(:name) }
11
- let(:age) { Attribute::Integer.new(:age, :required => false) }
12
- let(:header) { [ id, name, age ] }
13
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
14
- let(:base_relation) { Relation::Base.new(relation_name, header, body) }
15
- let(:object) { described_class.new }
8
+ let(:relation_name) { 'users' }
9
+ let(:id) { Attribute::Integer.new(:id) }
10
+ let(:name) { Attribute::String.new(:name) }
11
+ let(:age) { Attribute::Integer.new(:age, required: false) }
12
+ let(:header) { [id, name, age] }
13
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
14
+ let(:base_relation) { Relation::Base.new(relation_name, header, body) }
15
+ let(:object) { described_class.new }
16
16
 
17
17
  it_should_behave_like 'a generated SQL SELECT query'
18
18
 
@@ -5,13 +5,13 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary, '#to_s' do
6
6
  subject { object.to_s }
7
7
 
8
- let(:id) { Attribute::Integer.new(:id) }
9
- let(:name) { Attribute::String.new(:name) }
10
- let(:age) { Attribute::Integer.new(:age, :required => false) }
11
- let(:header) { [ id, name, age ] }
12
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { Relation::Base.new('users', header, body) }
14
- let(:object) { described_class.new }
8
+ let(:id) { Attribute::Integer.new(:id) }
9
+ let(:name) { Attribute::String.new(:name) }
10
+ let(:age) { Attribute::Integer.new(:age, required: false) }
11
+ let(:header) { [id, name, age] }
12
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
+ let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
17
17
  it_should_behave_like 'an idempotent method'
@@ -5,13 +5,13 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary, '#to_subquery' do
6
6
  subject { object.to_subquery }
7
7
 
8
- let(:id) { Attribute::Integer.new(:id) }
9
- let(:name) { Attribute::String.new(:name) }
10
- let(:age) { Attribute::Integer.new(:age, :required => false) }
11
- let(:header) { [ id, name, age ] }
12
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { Relation::Base.new('users', header, body) }
14
- let(:object) { described_class.new }
8
+ let(:id) { Attribute::Integer.new(:id) }
9
+ let(:name) { Attribute::String.new(:name) }
10
+ let(:age) { Attribute::Integer.new(:age, required: false) }
11
+ let(:header) { [id, name, age] }
12
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
+ let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
17
17
  it_should_behave_like 'an idempotent method'
@@ -5,18 +5,18 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
6
6
  subject { object.visit_axiom_algebra_join(join) }
7
7
 
8
- let(:relation_name) { 'users' }
9
- let(:id) { Attribute::Integer.new(:id) }
10
- let(:name) { Attribute::String.new(:name) }
11
- let(:age) { Attribute::Integer.new(:age, :required => false) }
12
- let(:header) { [ id, name, age ] }
13
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
14
- let(:base_relation) { Relation::Base.new(relation_name, header, body) }
15
- let(:other_relation) { Relation::Base.new('other', header, body) }
16
- let(:left) { operand }
17
- let(:right) { operand }
18
- let(:join) { left.join(right) }
19
- let(:object) { described_class.new }
8
+ let(:relation_name) { 'users' }
9
+ let(:id) { Attribute::Integer.new(:id) }
10
+ let(:name) { Attribute::String.new(:name) }
11
+ let(:age) { Attribute::Integer.new(:age, required: false) }
12
+ let(:header) { [id, name, age] }
13
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
14
+ let(:base_relation) { Relation::Base.new(relation_name, header, body) }
15
+ let(:other_relation) { Relation::Base.new('other', header, body) }
16
+ let(:left) { operand }
17
+ let(:right) { operand }
18
+ let(:join) { left.join(right) }
19
+ let(:object) { described_class.new }
20
20
 
21
21
  context 'when the operands are base relations' do
22
22
  let(:operand) { base_relation }
@@ -28,7 +28,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
28
28
  end
29
29
 
30
30
  context 'when the operands are projections' do
31
- let(:operand) { base_relation.project([ :id, :name ]) }
31
+ let(:operand) { base_relation.project([:id, :name]) }
32
32
 
33
33
  it_should_behave_like 'a generated SQL SELECT query'
34
34
 
@@ -46,7 +46,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
46
46
  end
47
47
 
48
48
  context 'when the operands are rename' do
49
- let(:operand) { base_relation.rename(:id => :user_id) }
49
+ let(:operand) { base_relation.rename(id: :user_id) }
50
50
 
51
51
  it_should_behave_like 'a generated SQL SELECT query'
52
52
 
@@ -85,7 +85,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
85
85
  end
86
86
 
87
87
  context 'summarize by a subset of the operand header' do
88
- let(:operand) { base_relation.summarize([ :id, :name ]) { |r| r.add(:count, r.age.count) } }
88
+ let(:operand) { base_relation.summarize([:id, :name]) { |r| r.add(:count, r.age.count) } }
89
89
 
90
90
  it_should_behave_like 'a generated SQL SELECT query'
91
91
 
@@ -94,8 +94,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
94
94
  end
95
95
  end
96
96
 
97
- context 'when the operands are ordered' do
98
- let(:operand) { base_relation.sort_by { |r| [ r.id, r.name, r.age ] } }
97
+ context 'when the operands are sorted' do
98
+ let(:operand) { base_relation.sort_by { |r| [r.id, r.name, r.age] } }
99
99
 
100
100
  it_should_behave_like 'a generated SQL SELECT query'
101
101
 
@@ -104,7 +104,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
104
104
  end
105
105
 
106
106
  context 'when the operands are reversed' do
107
- let(:operand) { base_relation.sort_by { |r| [ r.id, r.name, r.age ] }.reverse }
107
+ let(:operand) { base_relation.sort_by { |r| [r.id, r.name, r.age] }.reverse }
108
108
 
109
109
  it_should_behave_like 'a generated SQL SELECT query'
110
110
 
@@ -113,7 +113,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
113
113
  end
114
114
 
115
115
  context 'when the operands are limited' do
116
- let(:operand) { base_relation.sort_by { |r| [ r.id, r.name, r.age ] }.take(1) }
116
+ let(:operand) { base_relation.sort_by { |r| [r.id, r.name, r.age] }.take(1) }
117
117
 
118
118
  it_should_behave_like 'a generated SQL SELECT query'
119
119
 
@@ -122,7 +122,7 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_join' do
122
122
  end
123
123
 
124
124
  context 'when the operands are offsets' do
125
- let(:operand) { base_relation.sort_by { |r| [ r.id, r.name, r.age ] }.drop(1) }
125
+ let(:operand) { base_relation.sort_by { |r| [r.id, r.name, r.age] }.drop(1) }
126
126
 
127
127
  it_should_behave_like 'a generated SQL SELECT query'
128
128
 
@@ -5,17 +5,17 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
6
6
  subject { object.visit_axiom_algebra_product(product) }
7
7
 
8
- let(:relation_name) { 'users_other' }
9
- let(:id) { Attribute::Integer.new(:id) }
10
- let(:name) { Attribute::String.new(:name) }
11
- let(:age) { Attribute::Integer.new(:age, :required => false) }
12
- let(:header) { [ id, name, age ] }
13
- let(:other_header) { [ id.rename(:other_id), name.rename(:other_name), age.rename(:other_age) ] }
14
- let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
15
- let(:users) { Relation::Base.new('users', header, body) }
16
- let(:other) { Relation::Base.new('other', other_header, body) }
17
- let(:product) { left.product(right) }
18
- let(:object) { described_class.new }
8
+ let(:relation_name) { 'users_other' }
9
+ let(:id) { Attribute::Integer.new(:id) }
10
+ let(:name) { Attribute::String.new(:name) }
11
+ let(:age) { Attribute::Integer.new(:age, required: false) }
12
+ let(:header) { [id, name, age] }
13
+ let(:other_header) { [id.rename(:other_id), name.rename(:other_name), age.rename(:other_age)] }
14
+ let(:body) { [[1, 'Dan Kubb', 35]].each }
15
+ let(:users) { Relation::Base.new('users', header, body) }
16
+ let(:other) { Relation::Base.new('other', other_header, body) }
17
+ let(:product) { left.product(right) }
18
+ let(:object) { described_class.new }
19
19
 
20
20
  context 'when the operands are base relations' do
21
21
  let(:left) { users }
@@ -28,8 +28,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
28
28
  end
29
29
 
30
30
  context 'when the operands are a projection' do
31
- let(:left) { users.project([ :id, :name ]) }
32
- let(:right) { other.project([ :other_id, :other_name ]) }
31
+ let(:left) { users.project([:id, :name]) }
32
+ let(:right) { other.project([:other_id, :other_name]) }
33
33
 
34
34
  it_should_behave_like 'a generated SQL SELECT query'
35
35
 
@@ -48,8 +48,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
48
48
  end
49
49
 
50
50
  context 'when the operand is a rename' do
51
- let(:left) { users.rename(:id => :user_id) }
52
- let(:right) { other.rename(:other_id => :other_user_id) }
51
+ let(:left) { users.rename(id: :user_id) }
52
+ let(:right) { other.rename(other_id: :other_user_id) }
53
53
 
54
54
  it_should_behave_like 'a generated SQL SELECT query'
55
55
 
@@ -91,8 +91,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
91
91
  end
92
92
 
93
93
  context 'summarize by a subset of the operand header' do
94
- let(:left) { users.summarize([ :id, :name ]) { |r| r.add(:count, r.age.count) } }
95
- let(:right) { other.summarize([ :other_id, :other_name ]) { |r| r.add(:other_count, r.other_age.count) } }
94
+ let(:left) { users.summarize([:id, :name]) { |r| r.add(:count, r.age.count) } }
95
+ let(:right) { other.summarize([:other_id, :other_name]) { |r| r.add(:other_count, r.other_age.count) } }
96
96
 
97
97
  it_should_behave_like 'a generated SQL SELECT query'
98
98
 
@@ -101,9 +101,9 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
101
101
  end
102
102
  end
103
103
 
104
- context 'when the operand is ordered' do
105
- let(:left) { users.sort_by { |r| [ r.id, r.name, r.age ] } }
106
- let(:right) { other.sort_by { |r| [ r.other_id, r.other_name, r.other_age ] } }
104
+ context 'when the operand is sorted' do
105
+ let(:left) { users.sort_by { |r| [r.id, r.name, r.age] } }
106
+ let(:right) { other.sort_by { |r| [r.other_id, r.other_name, r.other_age] } }
107
107
 
108
108
  it_should_behave_like 'a generated SQL SELECT query'
109
109
 
@@ -112,8 +112,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
112
112
  end
113
113
 
114
114
  context 'when the operand is reversed' do
115
- let(:left) { users.sort_by { |r| [ r.id, r.name, r.age ] }.reverse }
116
- let(:right) { other.sort_by { |r| [ r.other_id, r.other_name, r.other_age ] }.reverse }
115
+ let(:left) { users.sort_by { |r| [r.id, r.name, r.age] }.reverse }
116
+ let(:right) { other.sort_by { |r| [r.other_id, r.other_name, r.other_age] }.reverse }
117
117
 
118
118
  it_should_behave_like 'a generated SQL SELECT query'
119
119
 
@@ -122,8 +122,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
122
122
  end
123
123
 
124
124
  context 'when the operand is limited' do
125
- let(:left) { users.sort_by { |r| [ r.id, r.name, r.age ] }.take(1) }
126
- let(:right) { other.sort_by { |r| [ r.other_id, r.other_name, r.other_age ] }.take(1) }
125
+ let(:left) { users.sort_by { |r| [r.id, r.name, r.age] }.take(1) }
126
+ let(:right) { other.sort_by { |r| [r.other_id, r.other_name, r.other_age] }.take(1) }
127
127
 
128
128
  it_should_behave_like 'a generated SQL SELECT query'
129
129
 
@@ -132,8 +132,8 @@ describe SQL::Generator::Relation::Binary, '#visit_axiom_algebra_product' do
132
132
  end
133
133
 
134
134
  context 'when the operand is an offset' do
135
- let(:left) { users.sort_by { |r| [ r.id, r.name, r.age ] }.drop(1) }
136
- let(:right) { other.sort_by { |r| [ r.other_id, r.other_name, r.other_age ] }.drop(1) }
135
+ let(:left) { users.sort_by { |r| [r.id, r.name, r.age] }.drop(1) }
136
+ let(:right) { other.sort_by { |r| [r.other_id, r.other_name, r.other_age] }.drop(1) }
137
137
 
138
138
  it_should_behave_like 'a generated SQL SELECT query'
139
139