veritas-sql-generator 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/.gemtest +0 -0
  2. data/.rvmrc +1 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +20 -10
  5. data/Guardfile +22 -0
  6. data/README.rdoc +2 -0
  7. data/Rakefile +4 -2
  8. data/TODO +16 -2
  9. data/config/flay.yml +2 -2
  10. data/config/flog.yml +1 -1
  11. data/config/roodi.yml +5 -5
  12. data/config/site.reek +21 -19
  13. data/lib/veritas/sql/generator.rb +25 -2
  14. data/lib/veritas/sql/generator/core_ext/date.rb +20 -0
  15. data/lib/veritas/sql/generator/core_ext/date_time.rb +45 -0
  16. data/lib/veritas/sql/generator/direction.rb +3 -1
  17. data/lib/veritas/sql/generator/function.rb +54 -0
  18. data/lib/veritas/sql/generator/function/aggregate.rb +134 -0
  19. data/lib/veritas/sql/generator/function/connective.rb +53 -0
  20. data/lib/veritas/sql/generator/function/numeric.rb +135 -0
  21. data/lib/veritas/sql/generator/function/predicate.rb +266 -0
  22. data/lib/veritas/sql/generator/function/proposition.rb +38 -0
  23. data/lib/veritas/sql/generator/function/string.rb +29 -0
  24. data/lib/veritas/sql/generator/identifier.rb +2 -1
  25. data/lib/veritas/sql/generator/literal.rb +15 -18
  26. data/lib/veritas/sql/generator/relation.rb +144 -17
  27. data/lib/veritas/sql/generator/relation/binary.rb +16 -64
  28. data/lib/veritas/sql/generator/relation/set.rb +30 -22
  29. data/lib/veritas/sql/generator/relation/unary.rb +131 -78
  30. data/lib/veritas/sql/generator/version.rb +1 -1
  31. data/spec/unit/date/iso8601_spec.rb +23 -0
  32. data/spec/unit/date_time/iso_8601_spec.rb +115 -0
  33. data/spec/unit/veritas/sql/generator/class_methods/parenthesize_spec.rb +18 -0
  34. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_count_spec.rb +16 -0
  35. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_maximum_spec.rb +16 -0
  36. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_mean_spec.rb +16 -0
  37. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_minimum_spec.rb +16 -0
  38. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_standard_deviation_spec.rb +16 -0
  39. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_sum_spec.rb +16 -0
  40. data/spec/unit/veritas/sql/generator/function/aggregate/visit_veritas_aggregate_variance_spec.rb +16 -0
  41. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_conjunction_spec.rb +20 -0
  42. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_disjunction_spec.rb +20 -0
  43. data/spec/unit/veritas/sql/generator/function/connective/visit_veritas_function_connective_negation_spec.rb +20 -0
  44. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_absolute_spec.rb +15 -0
  45. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_addition_spec.rb +15 -0
  46. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_division_spec.rb +15 -0
  47. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_exponentiation_spec.rb +15 -0
  48. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_modulo_spec.rb +15 -0
  49. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_multiplication_spec.rb +15 -0
  50. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_square_root_spec.rb +15 -0
  51. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_subtraction_spec.rb +15 -0
  52. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_minus_spec.rb +15 -0
  53. data/spec/unit/veritas/sql/generator/function/numeric/visit_veritas_function_numeric_unary_plus_spec.rb +15 -0
  54. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_equality_spec.rb → function/predicate/visit_veritas_function_predicate_equality_spec.rb} +5 -5
  55. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_exclusion_spec.rb → function/predicate/visit_veritas_function_predicate_exclusion_spec.rb} +10 -6
  56. data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_greater_than_or_equal_to_spec.rb +15 -0
  57. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_greater_than_spec.rb → function/predicate/visit_veritas_function_predicate_greater_than_spec.rb} +5 -5
  58. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_inclusion_spec.rb → function/predicate/visit_veritas_function_predicate_inclusion_spec.rb} +10 -6
  59. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_inequality_spec.rb → function/predicate/visit_veritas_function_predicate_inequality_spec.rb} +8 -8
  60. data/spec/unit/veritas/sql/generator/function/predicate/visit_veritas_function_predicate_less_than_or_equal_to_spec.rb +15 -0
  61. data/spec/unit/veritas/sql/generator/{logic/visit_veritas_logic_predicate_less_than_spec.rb → function/predicate/visit_veritas_function_predicate_less_than_spec.rb} +5 -5
  62. data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_contradiction_spec.rb +15 -0
  63. data/spec/unit/veritas/sql/generator/function/proposition/visit_veritas_function_proposition_tautology_spec.rb +15 -0
  64. data/spec/unit/veritas/sql/generator/function/string/visit_veritas_function_string_length_spec.rb +15 -0
  65. data/spec/unit/veritas/sql/generator/literal/class_methods/dup_frozen_spec.rb +2 -2
  66. data/spec/unit/veritas/sql/generator/relation/binary/base/to_subquery_spec.rb +1 -1
  67. data/spec/unit/veritas/sql/generator/relation/binary/base/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +3 -3
  68. data/spec/unit/veritas/sql/generator/relation/binary/to_s_spec.rb +2 -2
  69. data/spec/unit/veritas/sql/generator/relation/binary/to_subquery_spec.rb +2 -2
  70. data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_join_spec.rb +74 -33
  71. data/spec/unit/veritas/sql/generator/relation/binary/visit_veritas_algebra_product_spec.rb +63 -19
  72. data/spec/unit/veritas/sql/generator/relation/class_methods/visit_spec.rb +1 -1
  73. data/spec/unit/veritas/sql/generator/relation/set/class_methods/normalize_operand_headers_spec.rb +35 -0
  74. data/spec/unit/veritas/sql/generator/relation/set/to_s_spec.rb +1 -1
  75. data/spec/unit/veritas/sql/generator/relation/set/to_subquery_spec.rb +4 -4
  76. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_difference_spec.rb +83 -30
  77. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_intersection_spec.rb +80 -30
  78. data/spec/unit/veritas/sql/generator/relation/set/visit_veritas_algebra_union_spec.rb +80 -30
  79. data/spec/unit/veritas/sql/generator/relation/to_s_spec.rb +50 -0
  80. data/spec/unit/veritas/sql/generator/relation/to_subquery_spec.rb +49 -0
  81. data/spec/unit/veritas/sql/generator/relation/unary/to_s_spec.rb +1 -1
  82. data/spec/unit/veritas/sql/generator/relation/unary/to_subquery_spec.rb +6 -6
  83. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_extension_spec.rb +165 -0
  84. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_projection_spec.rb +84 -29
  85. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_rename_spec.rb +69 -27
  86. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_restriction_spec.rb +64 -22
  87. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_algebra_summarization_spec.rb +652 -0
  88. data/spec/unit/veritas/sql/generator/relation/unary/{visit_veritas_base_relation_spec.rb → visit_veritas_relation_base_spec.rb} +4 -4
  89. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_limit_spec.rb +60 -20
  90. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_offset_spec.rb +60 -20
  91. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_order_spec.rb +63 -23
  92. data/spec/unit/veritas/sql/generator/relation/unary/visit_veritas_relation_operation_reverse_spec.rb +60 -20
  93. data/spec/unit/veritas/sql/generator/relation/visited_spec.rb +1 -1
  94. data/tasks/metrics/ci.rake +7 -0
  95. data/tasks/{quality → metrics}/flay.rake +0 -0
  96. data/tasks/{quality → metrics}/flog.rake +0 -0
  97. data/tasks/{quality → metrics}/heckle.rake +1 -0
  98. data/tasks/{quality → metrics}/metric_fu.rake +3 -0
  99. data/tasks/{quality → metrics}/reek.rake +0 -0
  100. data/tasks/{quality → metrics}/roodi.rake +0 -0
  101. data/tasks/{quality → metrics}/yardstick.rake +0 -0
  102. data/tasks/spec.rake +1 -0
  103. data/veritas-sql-generator.gemspec +82 -114
  104. metadata +137 -125
  105. data/lib/veritas/base_relation.rb +0 -36
  106. data/lib/veritas/sql/generator/logic.rb +0 -349
  107. data/spec/unit/veritas/base_relation/name_spec.rb +0 -45
  108. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_conjunction_spec.rb +0 -16
  109. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_disjunction_spec.rb +0 -16
  110. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_connective_negation_spec.rb +0 -16
  111. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_greater_than_or_equal_to_spec.rb +0 -15
  112. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_predicate_less_than_or_equal_to_spec.rb +0 -15
  113. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_contradiction_spec.rb +0 -15
  114. data/spec/unit/veritas/sql/generator/logic/visit_veritas_logic_proposition_tautology_spec.rb +0 -15
  115. data/spec/unit/veritas/sql/generator/relation/binary/class_methods/subquery_spec.rb +0 -42
  116. data/spec/unit/veritas/sql/generator/relation/class_methods/subquery_spec.rb +0 -33
  117. data/tasks/quality/ci.rake +0 -2
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Numeric, '#visit_veritas_function_numeric_unary_minus' do
6
+ subject { object.visit_veritas_function_numeric_unary_minus(unary_minus) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Numeric } }
9
+ let(:unary_minus) { Attribute::Integer.new(:number).unary_minus }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('- ("number")') }
15
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Numeric, '#visit_veritas_function_numeric_unary_plus' do
6
+ subject { object.visit_veritas_function_numeric_unary_plus(unary_plus) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Numeric } }
9
+ let(:unary_plus) { Attribute::Integer.new(:number).unary_plus }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('+ ("number")') }
15
+ end
@@ -2,12 +2,12 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_equality' do
6
- subject { object.visit_veritas_logic_predicate_equality(equality) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_equality' do
6
+ subject { object.visit_veritas_function_predicate_equality(equality) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:attribute) { Attribute::Integer.new(:id) }
10
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:attribute) { Attribute::Integer.new(:id) }
10
+ let(:object) { described_class.new }
11
11
 
12
12
  context 'when the right operand is not nil' do
13
13
  let(:equality) { attribute.eq(1) }
@@ -2,12 +2,16 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_exclusion' do
6
- subject { object.visit_veritas_logic_predicate_exclusion(exclusion) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_exclusion' do
6
+ subject { object.visit_veritas_function_predicate_exclusion(exclusion) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:attribute) { Attribute::Integer.new(:id) }
10
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:attribute) { Attribute::Integer.new(:id) }
10
+ let(:object) { described_class.new }
11
+
12
+ before do
13
+ described_class.class_eval { include SQL::Generator::Function::Connective }
14
+ end
11
15
 
12
16
  context 'when right operand is an inclusive Range' do
13
17
  let(:exclusion) { attribute.exclude(1..10) }
@@ -38,6 +42,6 @@ describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_exclusion' do
38
42
 
39
43
  it_should_behave_like 'a generated SQL expression'
40
44
 
41
- its(:to_s) { should eql('1 = 1') }
45
+ its(:to_s) { should eql('TRUE') }
42
46
  end
43
47
  end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_greater_than_or_equal_to' do
6
+ subject { object.visit_veritas_function_predicate_greater_than_or_equal_to(greater_than_or_equal_to) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:greater_than_or_equal_to) { Attribute::Integer.new(:id).gte(1) }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('"id" >= 1') }
15
+ end
@@ -2,12 +2,12 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_greater_than' do
6
- subject { object.visit_veritas_logic_predicate_greater_than(greater_than) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_greater_than' do
6
+ subject { object.visit_veritas_function_predicate_greater_than(greater_than) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:greater_than) { Attribute::Integer.new(:id).gt(1) }
10
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:greater_than) { Attribute::Integer.new(:id).gt(1) }
10
+ let(:object) { described_class.new }
11
11
 
12
12
  it_should_behave_like 'a generated SQL expression'
13
13
 
@@ -2,12 +2,16 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_inclusion' do
6
- subject { object.visit_veritas_logic_predicate_inclusion(inclusion) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_inclusion' do
6
+ subject { object.visit_veritas_function_predicate_inclusion(inclusion) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:attribute) { Attribute::Integer.new(:id) }
10
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:attribute) { Attribute::Integer.new(:id) }
10
+ let(:object) { described_class.new }
11
+
12
+ before do
13
+ described_class.class_eval { include SQL::Generator::Function::Connective }
14
+ end
11
15
 
12
16
  context 'when right operand is an inclusive Range' do
13
17
  let(:inclusion) { attribute.include(1..10) }
@@ -38,6 +42,6 @@ describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_inclusion' do
38
42
 
39
43
  it_should_behave_like 'a generated SQL expression'
40
44
 
41
- its(:to_s) { should eql('1 = 0') }
45
+ its(:to_s) { should eql('FALSE') }
42
46
  end
43
47
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_inequality' do
6
- subject { object.visit_veritas_logic_predicate_inequality(inequality) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_inequality' do
6
+ subject { object.visit_veritas_function_predicate_inequality(inequality) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:object) { described_class.new }
10
10
 
11
11
  context 'and the left attribute is optional' do
12
12
  let(:attribute) { Attribute::Integer.new(:age, :required => false) }
@@ -18,8 +18,8 @@ describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_inequality' do
18
18
  end
19
19
 
20
20
  context 'and the right attribute is optional' do
21
- let(:attribute) { Attribute::Integer.new(:age, :required => false) }
22
- let(:inequality) { Logic::Predicate::Inequality.new(1, attribute) }
21
+ let(:attribute) { Attribute::Integer.new(:age, :required => false) }
22
+ let(:inequality) { Function::Predicate::Inequality.new(1, attribute) }
23
23
 
24
24
  it_should_behave_like 'a generated SQL expression'
25
25
 
@@ -27,8 +27,8 @@ describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_inequality' do
27
27
  end
28
28
 
29
29
  context 'and the left is a value' do
30
- let(:attribute) { Attribute::Integer.new(:id) }
31
- let(:inequality) { Logic::Predicate::Inequality.new(1, attribute) }
30
+ let(:attribute) { Attribute::Integer.new(:id) }
31
+ let(:inequality) { Function::Predicate::Inequality.new(1, attribute) }
32
32
 
33
33
  it_should_behave_like 'a generated SQL expression'
34
34
 
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_less_than_or_equal_to' do
6
+ subject { object.visit_veritas_function_predicate_less_than_or_equal_to(less_than_or_equal_to) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:less_than_or_equal_to) { Attribute::Integer.new(:id).lte(1) }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('"id" <= 1') }
15
+ end
@@ -2,12 +2,12 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Logic, '#visit_veritas_logic_predicate_less_than' do
6
- subject { object.visit_veritas_logic_predicate_less_than(less_than) }
5
+ describe SQL::Generator::Function::Predicate, '#visit_veritas_function_predicate_less_than' do
6
+ subject { object.visit_veritas_function_predicate_less_than(less_than) }
7
7
 
8
- let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Logic } }
9
- let(:less_than) { Attribute::Integer.new(:id).lt(1) }
10
- let(:object) { described_class.new }
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Predicate } }
9
+ let(:less_than) { Attribute::Integer.new(:id).lt(1) }
10
+ let(:object) { described_class.new }
11
11
 
12
12
  it_should_behave_like 'a generated SQL expression'
13
13
 
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Proposition, '#visit_veritas_function_proposition_contradiction' do
6
+ subject { object.visit_veritas_function_proposition_contradiction(contradiction) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Proposition } }
9
+ let(:contradiction) { Function::Proposition::Contradiction.instance }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('FALSE') }
15
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::Proposition, '#visit_veritas_function_proposition_tautology' do
6
+ subject { object.visit_veritas_function_proposition_tautology(tautology) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::Proposition } }
9
+ let(:tautology) { Function::Proposition::Tautology.instance }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('TRUE') }
15
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SQL::Generator::Function::String, '#visit_veritas_function_string_length' do
6
+ subject { object.visit_veritas_function_string_length(length) }
7
+
8
+ let(:described_class) { Class.new(SQL::Generator::Visitor) { include SQL::Generator::Function::String } }
9
+ let(:length) { Attribute::String.new(:name).length }
10
+ let(:object) { described_class.new }
11
+
12
+ it_should_behave_like 'a generated SQL expression'
13
+
14
+ its(:to_s) { should eql('LENGTH ("name")') }
15
+ end
@@ -8,7 +8,7 @@ describe SQL::Generator::Literal, '.dup_frozen' do
8
8
  let(:object) { SQL::Generator::Literal }
9
9
 
10
10
  context 'with a frozen object' do
11
- let(:object_arg) { Date.today.freeze }
11
+ let(:object_arg) { Time.now.freeze }
12
12
 
13
13
  it { should_not equal(object_arg) }
14
14
 
@@ -16,7 +16,7 @@ describe SQL::Generator::Literal, '.dup_frozen' do
16
16
  end
17
17
 
18
18
  context 'with a non-frozen object' do
19
- let(:object_arg) { Date.today }
19
+ let(:object_arg) { Time.now }
20
20
 
21
21
  it { should equal(object_arg) }
22
22
  end
@@ -10,7 +10,7 @@ describe SQL::Generator::Relation::Binary::Base, '#to_subquery' do
10
10
  let(:age) { Attribute::Integer.new(:age, :required => false) }
11
11
  let(:header) { [ id, name, age ] }
12
12
  let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { BaseRelation.new('users', header, body) }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
14
  let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
@@ -2,8 +2,8 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SQL::Generator::Relation::Binary::Base, '#visit_veritas_base_relation' do
6
- subject { object.visit_veritas_base_relation(base_relation) }
5
+ describe SQL::Generator::Relation::Binary::Base, '#visit_veritas_relation_base' do
6
+ subject { object.visit_veritas_relation_base(base_relation) }
7
7
 
8
8
  let(:relation_name) { 'users' }
9
9
  let(:id) { Attribute::Integer.new(:id) }
@@ -11,7 +11,7 @@ describe SQL::Generator::Relation::Binary::Base, '#visit_veritas_base_relation'
11
11
  let(:age) { Attribute::Integer.new(:age, :required => false) }
12
12
  let(:header) { [ id, name, age ] }
13
13
  let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
14
- let(:base_relation) { BaseRelation.new(relation_name, header, body) }
14
+ let(:base_relation) { Relation::Base.new(relation_name, header, body) }
15
15
  let(:object) { described_class.new }
16
16
 
17
17
  it_should_behave_like 'a generated SQL SELECT query'
@@ -10,7 +10,7 @@ describe SQL::Generator::Relation::Binary, '#to_s' do
10
10
  let(:age) { Attribute::Integer.new(:age, :required => false) }
11
11
  let(:header) { [ id, name, age ] }
12
12
  let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { BaseRelation.new('users', header, body) }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
14
  let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
@@ -30,6 +30,6 @@ describe SQL::Generator::Relation::Binary, '#to_s' do
30
30
 
31
31
  it_should_behave_like 'a generated SQL expression'
32
32
 
33
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" NATURAL JOIN "users"') }
33
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" AS "left" NATURAL JOIN "users" AS "right"') }
34
34
  end
35
35
  end
@@ -10,7 +10,7 @@ describe SQL::Generator::Relation::Binary, '#to_subquery' do
10
10
  let(:age) { Attribute::Integer.new(:age, :required => false) }
11
11
  let(:header) { [ id, name, age ] }
12
12
  let(:body) { [ [ 1, 'Dan Kubb', 35 ] ].each }
13
- let(:base_relation) { BaseRelation.new('users', header, body) }
13
+ let(:base_relation) { Relation::Base.new('users', header, body) }
14
14
  let(:object) { described_class.new }
15
15
 
16
16
  context 'when no object visited' do
@@ -30,6 +30,6 @@ describe SQL::Generator::Relation::Binary, '#to_subquery' do
30
30
 
31
31
  it_should_behave_like 'a generated SQL expression'
32
32
 
33
- its(:to_s) { should eql('SELECT * FROM "users" NATURAL JOIN "users"') }
33
+ its(:to_s) { should eql('(SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right")') }
34
34
  end
35
35
  end
@@ -5,25 +5,26 @@ require 'spec_helper'
5
5
  describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
6
6
  subject { object.visit_veritas_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) { BaseRelation.new(relation_name, header, body) }
15
- let(:left) { operand }
16
- let(:right) { operand }
17
- let(:join) { left.join(right) }
18
- 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 }
19
20
 
20
21
  context 'when the operands are base relations' do
21
22
  let(:operand) { base_relation }
22
23
 
23
24
  it_should_behave_like 'a generated SQL SELECT query'
24
25
 
25
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" NATURAL JOIN "users"') }
26
- its(:to_subquery) { should eql('SELECT * FROM "users" NATURAL JOIN "users"') }
26
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" AS "left" NATURAL JOIN "users" AS "right"') }
27
+ its(:to_subquery) { should eql('(SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right")') }
27
28
  end
28
29
 
29
30
  context 'when the operands are projections' do
@@ -32,7 +33,16 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
32
33
  it_should_behave_like 'a generated SQL SELECT query'
33
34
 
34
35
  its(:to_s) { should eql('SELECT "id", "name" FROM (SELECT DISTINCT "id", "name" FROM "users") AS "left" NATURAL JOIN (SELECT DISTINCT "id", "name" FROM "users") AS "right"') }
35
- its(:to_subquery) { should eql('SELECT * FROM (SELECT DISTINCT "id", "name" FROM "users") AS "left" NATURAL JOIN (SELECT DISTINCT "id", "name" FROM "users") AS "right"') }
36
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT DISTINCT "id", "name" FROM "users") AS "left" NATURAL JOIN (SELECT DISTINCT "id", "name" FROM "users") AS "right")') }
37
+ end
38
+
39
+ context 'when the operand is an extension' do
40
+ let(:operand) { base_relation.extend { |r| r.add(:one, 1) } }
41
+
42
+ it_should_behave_like 'a generated SQL SELECT query'
43
+
44
+ its(:to_s) { should eql('SELECT "id", "name", "age", "one" FROM (SELECT *, 1 AS "one" FROM "users") AS "left" NATURAL JOIN (SELECT *, 1 AS "one" FROM "users") AS "right"') }
45
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT *, 1 AS "one" FROM "users") AS "left" NATURAL JOIN (SELECT *, 1 AS "one" FROM "users") AS "right")') }
36
46
  end
37
47
 
38
48
  context 'when the operands are rename' do
@@ -41,7 +51,7 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
41
51
  it_should_behave_like 'a generated SQL SELECT query'
42
52
 
43
53
  its(:to_s) { should eql('SELECT "user_id", "name", "age" FROM (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "left" NATURAL JOIN (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "right"') }
44
- its(:to_subquery) { should eql('SELECT * FROM (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "left" NATURAL JOIN (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "right"') }
54
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "left" NATURAL JOIN (SELECT "id" AS "user_id", "name", "age" FROM "users") AS "right")') }
45
55
  end
46
56
 
47
57
  context 'when the operands are restrictions' do
@@ -50,7 +60,38 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
50
60
  it_should_behave_like 'a generated SQL SELECT query'
51
61
 
52
62
  its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" WHERE "id" = 1) AS "left" NATURAL JOIN (SELECT * FROM "users" WHERE "id" = 1) AS "right"') }
53
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" WHERE "id" = 1) AS "left" NATURAL JOIN (SELECT * FROM "users" WHERE "id" = 1) AS "right"') }
63
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" WHERE "id" = 1) AS "left" NATURAL JOIN (SELECT * FROM "users" WHERE "id" = 1) AS "right")') }
64
+ end
65
+
66
+ context 'when the operand is a summarization' do
67
+ context 'summarize per table dee' do
68
+ let(:summarize_per) { TABLE_DEE }
69
+ let(:operand) { base_relation.summarize(summarize_per) { |r| r.add(:count, r[:id].count) } }
70
+
71
+ it_should_behave_like 'a generated SQL SELECT query'
72
+
73
+ its(:to_s) { should eql('SELECT "count" FROM (SELECT COUNT ("id") AS "count" FROM "users") AS "left" NATURAL JOIN (SELECT COUNT ("id") AS "count" FROM "users") AS "right"') }
74
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT COUNT ("id") AS "count" FROM "users") AS "left" NATURAL JOIN (SELECT COUNT ("id") AS "count" FROM "users") AS "right")') }
75
+ end
76
+
77
+ context 'summarize per table dum' do
78
+ let(:summarize_per) { TABLE_DUM }
79
+ let(:operand) { base_relation.summarize(summarize_per) { |r| r.add(:count, r[:id].count) } }
80
+
81
+ it_should_behave_like 'a generated SQL SELECT query'
82
+
83
+ its(:to_s) { should eql('SELECT "count" FROM (SELECT COUNT ("id") AS "count" FROM "users" HAVING FALSE) AS "left" NATURAL JOIN (SELECT COUNT ("id") AS "count" FROM "users" HAVING FALSE) AS "right"') }
84
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT COUNT ("id") AS "count" FROM "users" HAVING FALSE) AS "left" NATURAL JOIN (SELECT COUNT ("id") AS "count" FROM "users" HAVING FALSE) AS "right")') }
85
+ end
86
+
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) } }
89
+
90
+ it_should_behave_like 'a generated SQL SELECT query'
91
+
92
+ its(:to_s) { should eql('SELECT "id", "name", "count" FROM (SELECT "id", "name", COUNT ("age") AS "count" FROM "users" GROUP BY "id", "name" HAVING COUNT (*) > 0) AS "left" NATURAL JOIN (SELECT "id", "name", COUNT ("age") AS "count" FROM "users" GROUP BY "id", "name" HAVING COUNT (*) > 0) AS "right"') }
93
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT "id", "name", COUNT ("age") AS "count" FROM "users" GROUP BY "id", "name" HAVING COUNT (*) > 0) AS "left" NATURAL JOIN (SELECT "id", "name", COUNT ("age") AS "count" FROM "users" GROUP BY "id", "name" HAVING COUNT (*) > 0) AS "right")') }
94
+ end
54
95
  end
55
96
 
56
97
  context 'when the operands are ordered' do
@@ -59,7 +100,7 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
59
100
  it_should_behave_like 'a generated SQL SELECT query'
60
101
 
61
102
  its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "right"') }
62
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "right"') }
103
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age") AS "right")') }
63
104
  end
64
105
 
65
106
  context 'when the operands are reversed' do
@@ -68,7 +109,7 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
68
109
  it_should_behave_like 'a generated SQL SELECT query'
69
110
 
70
111
  its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "right"') }
71
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "right"') }
112
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id" DESC, "name" DESC, "age" DESC) AS "right")') }
72
113
  end
73
114
 
74
115
  context 'when the operands are limited' do
@@ -77,7 +118,7 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
77
118
  it_should_behave_like 'a generated SQL SELECT query'
78
119
 
79
120
  its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "right"') }
80
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "right"') }
121
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" LIMIT 1) AS "right")') }
81
122
  end
82
123
 
83
124
  context 'when the operands are offsets' do
@@ -86,7 +127,7 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
86
127
  it_should_behave_like 'a generated SQL SELECT query'
87
128
 
88
129
  its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "right"') }
89
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "right"') }
130
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "left" NATURAL JOIN (SELECT * FROM "users" ORDER BY "id", "name", "age" OFFSET 1) AS "right")') }
90
131
  end
91
132
 
92
133
  context 'when the operands are differences' do
@@ -94,8 +135,8 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
94
135
 
95
136
  it_should_behave_like 'a generated SQL SELECT query'
96
137
 
97
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT * FROM "users") EXCEPT (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") EXCEPT (SELECT * FROM "users")) AS "right"') }
98
- its(:to_subquery) { should eql('SELECT * FROM ((SELECT * FROM "users") EXCEPT (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") EXCEPT (SELECT * FROM "users")) AS "right"') }
138
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT "id", "name", "age" FROM "users") EXCEPT (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") EXCEPT (SELECT "id", "name", "age" FROM "users")) AS "right"') }
139
+ its(:to_subquery) { should eql('(SELECT * FROM ((SELECT "id", "name", "age" FROM "users") EXCEPT (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") EXCEPT (SELECT "id", "name", "age" FROM "users")) AS "right")') }
99
140
  end
100
141
 
101
142
  context 'when the operands are intersections' do
@@ -103,8 +144,8 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
103
144
 
104
145
  it_should_behave_like 'a generated SQL SELECT query'
105
146
 
106
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT * FROM "users") INTERSECT (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") INTERSECT (SELECT * FROM "users")) AS "right"') }
107
- its(:to_subquery) { should eql('SELECT * FROM ((SELECT * FROM "users") INTERSECT (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") INTERSECT (SELECT * FROM "users")) AS "right"') }
147
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT "id", "name", "age" FROM "users") INTERSECT (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") INTERSECT (SELECT "id", "name", "age" FROM "users")) AS "right"') }
148
+ its(:to_subquery) { should eql('(SELECT * FROM ((SELECT "id", "name", "age" FROM "users") INTERSECT (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") INTERSECT (SELECT "id", "name", "age" FROM "users")) AS "right")') }
108
149
  end
109
150
 
110
151
  context 'when the operands are unions' do
@@ -112,8 +153,8 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
112
153
 
113
154
  it_should_behave_like 'a generated SQL SELECT query'
114
155
 
115
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT * FROM "users") UNION (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") UNION (SELECT * FROM "users")) AS "right"') }
116
- its(:to_subquery) { should eql('SELECT * FROM ((SELECT * FROM "users") UNION (SELECT * FROM "users")) AS "left" NATURAL JOIN ((SELECT * FROM "users") UNION (SELECT * FROM "users")) AS "right"') }
156
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM ((SELECT "id", "name", "age" FROM "users") UNION (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") UNION (SELECT "id", "name", "age" FROM "users")) AS "right"') }
157
+ its(:to_subquery) { should eql('(SELECT * FROM ((SELECT "id", "name", "age" FROM "users") UNION (SELECT "id", "name", "age" FROM "users")) AS "left" NATURAL JOIN ((SELECT "id", "name", "age" FROM "users") UNION (SELECT "id", "name", "age" FROM "users")) AS "right")') }
117
158
  end
118
159
 
119
160
  context 'when the operands are joins' do
@@ -121,18 +162,18 @@ describe SQL::Generator::Relation::Binary, '#visit_veritas_algebra_join' do
121
162
 
122
163
  it_should_behave_like 'a generated SQL SELECT query'
123
164
 
124
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" NATURAL JOIN "users") AS "left" NATURAL JOIN (SELECT * FROM "users" NATURAL JOIN "users") AS "right"') }
125
- its(:to_subquery) { should eql('SELECT * FROM (SELECT * FROM "users" NATURAL JOIN "users") AS "left" NATURAL JOIN (SELECT * FROM "users" NATURAL JOIN "users") AS "right"') }
165
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM (SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right") AS "left" NATURAL JOIN (SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right") AS "right"') }
166
+ its(:to_subquery) { should eql('(SELECT * FROM (SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right") AS "left" NATURAL JOIN (SELECT * FROM "users" AS "left" NATURAL JOIN "users" AS "right") AS "right")') }
126
167
  end
127
168
 
128
169
  context 'when the operands have different base relations' do
129
- let(:relation_name) { 'users_others' }
130
- let(:left) { BaseRelation.new('users', header, body) }
131
- let(:right) { BaseRelation.new('others', header, body) }
170
+ let(:relation_name) { 'users_others' }
171
+ let(:left) { Relation::Base.new('users', header, body) }
172
+ let(:right) { Relation::Base.new('others', header, body) }
132
173
 
133
174
  it_should_behave_like 'a generated SQL SELECT query'
134
175
 
135
- its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" NATURAL JOIN "others"') }
136
- its(:to_subquery) { should eql('SELECT * FROM "users" NATURAL JOIN "others"') }
176
+ its(:to_s) { should eql('SELECT "id", "name", "age" FROM "users" AS "left" NATURAL JOIN "others" AS "right"') }
177
+ its(:to_subquery) { should eql('(SELECT * FROM "users" AS "left" NATURAL JOIN "others" AS "right")') }
137
178
  end
138
179
  end