arel 1.0.1 → 2.0.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.
- data/MIT-LICENSE.txt +20 -0
- data/Manifest.txt +105 -0
- data/README.markdown +12 -32
- data/Rakefile +17 -0
- data/arel.gemspec +39 -0
- data/lib/arel.rb +30 -9
- data/lib/arel/attributes.rb +20 -0
- data/lib/arel/attributes/attribute.rb +190 -0
- data/lib/arel/compatibility/wheres.rb +33 -0
- data/lib/arel/crud.rb +37 -0
- data/lib/arel/delete_manager.rb +22 -0
- data/lib/arel/deprecated.rb +4 -0
- data/lib/arel/expression.rb +4 -0
- data/lib/arel/expressions.rb +23 -0
- data/lib/arel/insert_manager.rb +34 -0
- data/lib/arel/nodes.rb +44 -0
- data/lib/arel/nodes/and.rb +6 -0
- data/lib/arel/nodes/assignment.rb +6 -0
- data/lib/arel/nodes/avg.rb +6 -0
- data/lib/arel/nodes/between.rb +6 -0
- data/lib/arel/nodes/binary.rb +12 -0
- data/lib/arel/nodes/count.rb +13 -0
- data/lib/arel/nodes/delete_statement.rb +17 -0
- data/lib/arel/nodes/does_not_match.rb +6 -0
- data/lib/arel/nodes/equality.rb +9 -0
- data/lib/arel/nodes/exists.rb +11 -0
- data/lib/arel/nodes/function.rb +18 -0
- data/lib/arel/nodes/greater_than.rb +6 -0
- data/lib/arel/nodes/greater_than_or_equal.rb +6 -0
- data/lib/arel/nodes/group.rb +11 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/having.rb +11 -0
- data/lib/arel/nodes/in.rb +6 -0
- data/lib/arel/nodes/inner_join.rb +6 -0
- data/lib/arel/nodes/insert_statement.rb +19 -0
- data/lib/arel/nodes/join.rb +13 -0
- data/lib/arel/nodes/less_than.rb +6 -0
- data/lib/arel/nodes/less_than_or_equal.rb +6 -0
- data/lib/arel/nodes/lock.rb +6 -0
- data/lib/arel/nodes/matches.rb +6 -0
- data/lib/arel/nodes/max.rb +6 -0
- data/lib/arel/nodes/min.rb +6 -0
- data/lib/arel/nodes/node.rb +30 -0
- data/lib/arel/nodes/not_equal.rb +6 -0
- data/lib/arel/nodes/not_in.rb +6 -0
- data/lib/arel/nodes/offset.rb +11 -0
- data/lib/arel/nodes/on.rb +11 -0
- data/lib/arel/nodes/or.rb +6 -0
- data/lib/arel/nodes/ordering.rb +19 -0
- data/lib/arel/nodes/outer_join.rb +6 -0
- data/lib/arel/nodes/select_core.rb +25 -0
- data/lib/arel/nodes/select_statement.rb +22 -0
- data/lib/arel/nodes/sql_literal.rb +7 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/sum.rb +6 -0
- data/lib/arel/nodes/table_alias.rb +21 -0
- data/lib/arel/nodes/unqualified_column.rb +19 -0
- data/lib/arel/nodes/update_statement.rb +21 -0
- data/lib/arel/nodes/values.rb +12 -0
- data/lib/arel/relation.rb +6 -0
- data/lib/arel/select_manager.rb +203 -0
- data/lib/arel/sql/engine.rb +10 -0
- data/lib/arel/sql_literal.rb +1 -10
- data/lib/arel/table.rb +126 -0
- data/lib/arel/tree_manager.rb +26 -0
- data/lib/arel/update_manager.rb +48 -0
- data/lib/arel/visitors.rb +30 -0
- data/lib/arel/visitors/dot.rb +233 -0
- data/lib/arel/visitors/join_sql.rb +38 -0
- data/lib/arel/visitors/mysql.rb +16 -0
- data/lib/arel/visitors/oracle.rb +69 -0
- data/lib/arel/visitors/order_clauses.rb +9 -0
- data/lib/arel/visitors/postgresql.rb +54 -0
- data/lib/arel/visitors/to_sql.rb +301 -0
- data/lib/arel/visitors/where_sql.rb +9 -0
- data/spec/activerecord_compat_spec.rb +18 -0
- data/spec/attributes/attribute_spec.rb +648 -0
- data/spec/attributes_spec.rb +33 -6
- data/spec/crud_spec.rb +69 -0
- data/spec/delete_manager_spec.rb +53 -0
- data/spec/insert_manager_spec.rb +141 -0
- data/spec/nodes/count_spec.rb +18 -0
- data/spec/nodes/delete_statement_spec.rb +15 -0
- data/spec/nodes/equality_spec.rb +72 -0
- data/spec/nodes/insert_statement_spec.rb +18 -0
- data/spec/nodes/or_spec.rb +20 -0
- data/spec/nodes/select_core_spec.rb +21 -0
- data/spec/nodes/select_statement_spec.rb +14 -0
- data/spec/nodes/sql_literal_spec.rb +26 -0
- data/spec/nodes/sum_spec.rb +12 -0
- data/spec/nodes/update_statement_spec.rb +18 -0
- data/spec/select_manager_spec.rb +581 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +6 -21
- data/spec/support/fake_record.rb +89 -0
- data/spec/support/shared/tree_manager_shared.rb +9 -0
- data/spec/table_spec.rb +176 -0
- data/spec/update_manager_spec.rb +89 -0
- data/spec/visitors/join_sql_spec.rb +35 -0
- data/spec/visitors/oracle_spec.rb +111 -0
- data/spec/visitors/to_sql_spec.rb +134 -0
- metadata +160 -260
- data/lib/arel/algebra.rb +0 -10
- data/lib/arel/algebra/attributes.rb +0 -7
- data/lib/arel/algebra/attributes/attribute.rb +0 -304
- data/lib/arel/algebra/attributes/boolean.rb +0 -21
- data/lib/arel/algebra/attributes/decimal.rb +0 -9
- data/lib/arel/algebra/attributes/float.rb +0 -9
- data/lib/arel/algebra/attributes/integer.rb +0 -10
- data/lib/arel/algebra/attributes/string.rb +0 -10
- data/lib/arel/algebra/attributes/time.rb +0 -6
- data/lib/arel/algebra/core_extensions.rb +0 -3
- data/lib/arel/algebra/core_extensions/hash.rb +0 -7
- data/lib/arel/algebra/core_extensions/object.rb +0 -13
- data/lib/arel/algebra/core_extensions/symbol.rb +0 -9
- data/lib/arel/algebra/expression.rb +0 -56
- data/lib/arel/algebra/header.rb +0 -66
- data/lib/arel/algebra/ordering.rb +0 -31
- data/lib/arel/algebra/predicates.rb +0 -306
- data/lib/arel/algebra/relations.rb +0 -16
- data/lib/arel/algebra/relations/operations/from.rb +0 -14
- data/lib/arel/algebra/relations/operations/group.rb +0 -14
- data/lib/arel/algebra/relations/operations/having.rb +0 -14
- data/lib/arel/algebra/relations/operations/join.rb +0 -103
- data/lib/arel/algebra/relations/operations/lock.rb +0 -10
- data/lib/arel/algebra/relations/operations/order.rb +0 -23
- data/lib/arel/algebra/relations/operations/project.rb +0 -20
- data/lib/arel/algebra/relations/operations/skip.rb +0 -14
- data/lib/arel/algebra/relations/operations/take.rb +0 -18
- data/lib/arel/algebra/relations/operations/where.rb +0 -24
- data/lib/arel/algebra/relations/relation.rb +0 -205
- data/lib/arel/algebra/relations/row.rb +0 -29
- data/lib/arel/algebra/relations/utilities/compound.rb +0 -55
- data/lib/arel/algebra/relations/utilities/externalization.rb +0 -26
- data/lib/arel/algebra/relations/utilities/nil.rb +0 -7
- data/lib/arel/algebra/relations/writes.rb +0 -47
- data/lib/arel/algebra/value.rb +0 -53
- data/lib/arel/engines.rb +0 -2
- data/lib/arel/engines/memory.rb +0 -2
- data/lib/arel/engines/memory/engine.rb +0 -10
- data/lib/arel/engines/memory/relations.rb +0 -2
- data/lib/arel/engines/memory/relations/array.rb +0 -37
- data/lib/arel/engines/memory/relations/operations.rb +0 -9
- data/lib/arel/engines/sql.rb +0 -6
- data/lib/arel/engines/sql/attributes.rb +0 -45
- data/lib/arel/engines/sql/christener.rb +0 -20
- data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +0 -48
- data/lib/arel/engines/sql/compilers/mysql_compiler.rb +0 -11
- data/lib/arel/engines/sql/compilers/oracle_compiler.rb +0 -106
- data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +0 -50
- data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +0 -9
- data/lib/arel/engines/sql/core_extensions.rb +0 -4
- data/lib/arel/engines/sql/core_extensions/array.rb +0 -24
- data/lib/arel/engines/sql/core_extensions/nil_class.rb +0 -15
- data/lib/arel/engines/sql/core_extensions/object.rb +0 -19
- data/lib/arel/engines/sql/core_extensions/range.rb +0 -19
- data/lib/arel/engines/sql/engine.rb +0 -47
- data/lib/arel/engines/sql/formatters.rb +0 -138
- data/lib/arel/engines/sql/relations.rb +0 -3
- data/lib/arel/engines/sql/relations/compiler.rb +0 -153
- data/lib/arel/engines/sql/relations/table.rb +0 -100
- data/lib/arel/engines/sql/relations/utilities/nil.rb +0 -6
- data/lib/arel/recursion/base_case.rb +0 -13
- data/lib/arel/session.rb +0 -35
- data/lib/arel/version.rb +0 -3
- data/spec/algebra/unit/predicates/binary_spec.rb +0 -35
- data/spec/algebra/unit/predicates/equality_spec.rb +0 -29
- data/spec/algebra/unit/predicates/in_spec.rb +0 -12
- data/spec/algebra/unit/predicates/inequality_spec.rb +0 -32
- data/spec/algebra/unit/predicates/predicate_spec.rb +0 -22
- data/spec/algebra/unit/primitives/attribute_spec.rb +0 -175
- data/spec/algebra/unit/primitives/expression_spec.rb +0 -39
- data/spec/algebra/unit/primitives/value_spec.rb +0 -15
- data/spec/algebra/unit/relations/alias_spec.rb +0 -16
- data/spec/algebra/unit/relations/delete_spec.rb +0 -9
- data/spec/algebra/unit/relations/group_spec.rb +0 -10
- data/spec/algebra/unit/relations/insert_spec.rb +0 -9
- data/spec/algebra/unit/relations/join_spec.rb +0 -18
- data/spec/algebra/unit/relations/order_spec.rb +0 -21
- data/spec/algebra/unit/relations/project_spec.rb +0 -34
- data/spec/algebra/unit/relations/relation_spec.rb +0 -241
- data/spec/algebra/unit/relations/skip_spec.rb +0 -10
- data/spec/algebra/unit/relations/table_spec.rb +0 -38
- data/spec/algebra/unit/relations/take_spec.rb +0 -10
- data/spec/algebra/unit/relations/update_spec.rb +0 -9
- data/spec/algebra/unit/relations/where_spec.rb +0 -19
- data/spec/algebra/unit/session/session_spec.rb +0 -84
- data/spec/attributes/boolean_spec.rb +0 -57
- data/spec/attributes/float_spec.rb +0 -119
- data/spec/attributes/header_spec.rb +0 -42
- data/spec/attributes/integer_spec.rb +0 -119
- data/spec/attributes/string_spec.rb +0 -43
- data/spec/attributes/time_spec.rb +0 -24
- data/spec/engines/memory/integration/joins/cross_engine_spec.rb +0 -61
- data/spec/engines/memory/unit/relations/array_spec.rb +0 -33
- data/spec/engines/memory/unit/relations/insert_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/join_spec.rb +0 -32
- data/spec/engines/memory/unit/relations/order_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/project_spec.rb +0 -27
- data/spec/engines/memory/unit/relations/skip_spec.rb +0 -31
- data/spec/engines/memory/unit/relations/take_spec.rb +0 -28
- data/spec/engines/memory/unit/relations/where_spec.rb +0 -43
- data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +0 -258
- data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +0 -221
- data/spec/engines/sql/integration/joins/with_compounds_spec.rb +0 -137
- data/spec/engines/sql/unit/engine_spec.rb +0 -65
- data/spec/engines/sql/unit/predicates/binary_spec.rb +0 -140
- data/spec/engines/sql/unit/predicates/equality_spec.rb +0 -75
- data/spec/engines/sql/unit/predicates/in_spec.rb +0 -179
- data/spec/engines/sql/unit/predicates/noteq_spec.rb +0 -75
- data/spec/engines/sql/unit/predicates/predicates_spec.rb +0 -79
- data/spec/engines/sql/unit/primitives/attribute_spec.rb +0 -36
- data/spec/engines/sql/unit/primitives/expression_spec.rb +0 -28
- data/spec/engines/sql/unit/primitives/literal_spec.rb +0 -43
- data/spec/engines/sql/unit/primitives/value_spec.rb +0 -29
- data/spec/engines/sql/unit/relations/alias_spec.rb +0 -53
- data/spec/engines/sql/unit/relations/delete_spec.rb +0 -83
- data/spec/engines/sql/unit/relations/from_spec.rb +0 -64
- data/spec/engines/sql/unit/relations/group_spec.rb +0 -72
- data/spec/engines/sql/unit/relations/having_spec.rb +0 -78
- data/spec/engines/sql/unit/relations/insert_spec.rb +0 -143
- data/spec/engines/sql/unit/relations/join_spec.rb +0 -180
- data/spec/engines/sql/unit/relations/lock_spec.rb +0 -86
- data/spec/engines/sql/unit/relations/order_spec.rb +0 -161
- data/spec/engines/sql/unit/relations/project_spec.rb +0 -143
- data/spec/engines/sql/unit/relations/skip_spec.rb +0 -41
- data/spec/engines/sql/unit/relations/table_spec.rb +0 -122
- data/spec/engines/sql/unit/relations/take_spec.rb +0 -75
- data/spec/engines/sql/unit/relations/update_spec.rb +0 -203
- data/spec/engines/sql/unit/relations/where_spec.rb +0 -72
- data/spec/relations/join_spec.rb +0 -42
- data/spec/relations/relation_spec.rb +0 -31
- data/spec/shared/relation_spec.rb +0 -255
- data/spec/sql/christener_spec.rb +0 -70
- data/spec/support/connections/mysql_connection.rb +0 -14
- data/spec/support/connections/oracle_connection.rb +0 -17
- data/spec/support/connections/postgresql_connection.rb +0 -13
- data/spec/support/connections/sqlite3_connection.rb +0 -24
- data/spec/support/guards.rb +0 -28
- data/spec/support/matchers/disambiguate_attributes.rb +0 -28
- data/spec/support/matchers/hash_the_same_as.rb +0 -26
- data/spec/support/matchers/have_rows.rb +0 -18
- data/spec/support/model.rb +0 -67
- data/spec/support/schemas/mysql_schema.rb +0 -26
- data/spec/support/schemas/oracle_schema.rb +0 -20
- data/spec/support/schemas/postgresql_schema.rb +0 -26
- data/spec/support/schemas/sqlite3_schema.rb +0 -26
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
CHANGED
@@ -1,33 +1,18 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'spec'
|
3
|
-
require 'pp'
|
4
3
|
require 'fileutils'
|
5
4
|
require 'arel'
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
Dir["spec/{support,shared}/*.rb"].each do |file|
|
12
|
-
require file
|
13
|
-
end
|
6
|
+
require 'support/matchers/be_like'
|
7
|
+
require 'support/check'
|
8
|
+
require 'support/fake_record'
|
9
|
+
require 'support/shared/tree_manager_shared'
|
14
10
|
|
15
11
|
Spec::Runner.configure do |config|
|
16
12
|
config.include Matchers
|
17
|
-
config.include AdapterGuards
|
18
13
|
config.include Check
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
FileUtils.mkdir_p(tmp)
|
24
|
-
ActiveRecord::Base.logger = Logger.new("#{tmp}/debug.log")
|
25
|
-
ActiveRecord::Base.establish_connection("unit")
|
26
|
-
|
27
|
-
require "support/schemas/#{ENV['ADAPTER']}_schema.rb"
|
28
|
-
|
29
|
-
config.before do
|
30
|
-
Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
|
31
|
-
end
|
15
|
+
config.before do
|
16
|
+
Arel::Table.engine = Arel::Sql::Engine.new(FakeRecord::Base.new)
|
32
17
|
end
|
33
18
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module FakeRecord
|
2
|
+
class Column < Struct.new(:name, :type)
|
3
|
+
end
|
4
|
+
|
5
|
+
class Connection
|
6
|
+
attr_reader :tables
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@tables = %w{ users photos developers }
|
10
|
+
@columns = {
|
11
|
+
'users' => [
|
12
|
+
Column.new('id', :integer),
|
13
|
+
Column.new('name', :string)
|
14
|
+
]
|
15
|
+
}
|
16
|
+
@primary_keys = {
|
17
|
+
'users' => 'id'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def primary_key name
|
22
|
+
@primary_keys[name.to_s]
|
23
|
+
end
|
24
|
+
|
25
|
+
def table_exists? name
|
26
|
+
@tables.include? name.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def columns name, message = nil
|
30
|
+
@columns[name.to_s]
|
31
|
+
end
|
32
|
+
|
33
|
+
def quote_table_name name
|
34
|
+
"\"#{name.to_s}\""
|
35
|
+
end
|
36
|
+
|
37
|
+
def quote_column_name name
|
38
|
+
"\"#{name.to_s}\""
|
39
|
+
end
|
40
|
+
|
41
|
+
def quote thing, column = nil
|
42
|
+
if column && column.type == :integer
|
43
|
+
return 'NULL' if thing.nil?
|
44
|
+
return thing.to_i
|
45
|
+
end
|
46
|
+
|
47
|
+
case thing
|
48
|
+
when true
|
49
|
+
"'t'"
|
50
|
+
when false
|
51
|
+
"'f'"
|
52
|
+
when nil
|
53
|
+
'NULL'
|
54
|
+
when Numeric
|
55
|
+
thing
|
56
|
+
else
|
57
|
+
"'#{thing}'"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class ConnectionPool
|
63
|
+
class Spec < Struct.new(:config)
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_reader :spec, :connection
|
67
|
+
|
68
|
+
def initialize
|
69
|
+
@spec = Spec.new(:adapter => 'sqlite3')
|
70
|
+
@connection = Connection.new
|
71
|
+
end
|
72
|
+
|
73
|
+
def with_connection
|
74
|
+
yield connection
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class Base
|
79
|
+
attr_accessor :connection_pool
|
80
|
+
|
81
|
+
def initialize
|
82
|
+
@connection_pool = ConnectionPool.new
|
83
|
+
end
|
84
|
+
|
85
|
+
def connection
|
86
|
+
connection_pool.connection
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
shared_examples_for "TreeManager" do
|
2
|
+
describe "clone" do
|
3
|
+
it "clones the insert statement" do
|
4
|
+
subject.instance_variable_get("@head").should_receive(:clone).and_return(:foo) # TODO: ick.
|
5
|
+
dolly = subject.clone
|
6
|
+
dolly.instance_variable_get("@head").should == :foo
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
data/spec/table_spec.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
describe Table do
|
5
|
+
before do
|
6
|
+
@relation = Table.new(:users)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'primary_key' do
|
10
|
+
it 'should return an attribute' do
|
11
|
+
check @relation.primary_key.name.should == :id
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'select_manager' do
|
16
|
+
it 'should return an empty select manager' do
|
17
|
+
sm = @relation.select_manager
|
18
|
+
sm.to_sql.should be_like 'SELECT'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'having' do
|
23
|
+
it 'adds a having clause' do
|
24
|
+
mgr = @relation.having @relation[:id].eq(10)
|
25
|
+
mgr.to_sql.should be_like %{
|
26
|
+
SELECT FROM "users" HAVING "users"."id" = 10
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'backwards compat' do
|
32
|
+
describe 'joins' do
|
33
|
+
it 'returns nil' do
|
34
|
+
check @relation.joins(nil).should == nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'join' do
|
39
|
+
it 'noops on nil' do
|
40
|
+
mgr = @relation.join nil
|
41
|
+
|
42
|
+
mgr.to_sql.should be_like %{ SELECT FROM "users" }
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'takes a second argument for join type' do
|
46
|
+
right = @relation.alias
|
47
|
+
predicate = @relation[:id].eq(right[:id])
|
48
|
+
mgr = @relation.join(right, Nodes::OuterJoin).on(predicate)
|
49
|
+
|
50
|
+
mgr.to_sql.should be_like %{
|
51
|
+
SELECT FROM "users"
|
52
|
+
LEFT OUTER JOIN "users" "users_2"
|
53
|
+
ON "users"."id" = "users_2"."id"
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'group' do
|
60
|
+
it 'should create a group' do
|
61
|
+
manager = @relation.group @relation[:id]
|
62
|
+
manager.to_sql.should be_like %{
|
63
|
+
SELECT FROM "users" GROUP BY "users"."id"
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'alias' do
|
69
|
+
it 'should create a node that proxies to a table' do
|
70
|
+
check @relation.aliases.should == []
|
71
|
+
|
72
|
+
node = @relation.alias
|
73
|
+
check @relation.aliases.should == [node]
|
74
|
+
check node.name.should == 'users_2'
|
75
|
+
check node[:id].relation.should == node
|
76
|
+
check node[:id].relation.should != node
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'new' do
|
81
|
+
it 'takes :columns' do
|
82
|
+
columns = Table.engine.connection.columns("users")
|
83
|
+
@relation = Table.new(:users, :columns => columns)
|
84
|
+
check @relation.columns.first.name.should == :id
|
85
|
+
check @relation.engine.should == Table.engine
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should accept an engine' do
|
89
|
+
rel = Table.new :users, 'foo'
|
90
|
+
check rel.engine.should == 'foo'
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should accept a hash' do
|
94
|
+
rel = Table.new :users, :engine => 'foo'
|
95
|
+
check rel.engine.should == 'foo'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'ignores as if it equals name' do
|
99
|
+
rel = Table.new :users, :as => 'users'
|
100
|
+
rel.table_alias.should be_nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe 'order' do
|
105
|
+
it "should take an order" do
|
106
|
+
manager = @relation.order "foo"
|
107
|
+
manager.to_sql.should be_like %{ SELECT FROM "users" ORDER BY foo }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'take' do
|
112
|
+
it "should add a limit" do
|
113
|
+
manager = @relation.take 1
|
114
|
+
manager.project SqlLiteral.new '*'
|
115
|
+
manager.to_sql.should be_like %{ SELECT * FROM "users" LIMIT 1 }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe 'project' do
|
120
|
+
it 'can project' do
|
121
|
+
manager = @relation.project SqlLiteral.new '*'
|
122
|
+
manager.to_sql.should be_like %{ SELECT * FROM "users" }
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'takes multiple parameters' do
|
126
|
+
manager = @relation.project SqlLiteral.new('*'), SqlLiteral.new('*')
|
127
|
+
manager.to_sql.should be_like %{ SELECT *, * FROM "users" }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe 'where' do
|
132
|
+
it "returns a tree manager" do
|
133
|
+
manager = @relation.where @relation[:id].eq 1
|
134
|
+
manager.project @relation[:id]
|
135
|
+
manager.should be_kind_of TreeManager
|
136
|
+
manager.to_sql.should be_like %{
|
137
|
+
SELECT "users"."id"
|
138
|
+
FROM "users"
|
139
|
+
WHERE "users"."id" = 1
|
140
|
+
}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'columns' do
|
145
|
+
it 'returns a list of columns' do
|
146
|
+
columns = @relation.columns
|
147
|
+
check columns.length.should == 2
|
148
|
+
columns.map { |x| x.name.to_s }.sort.should == %w{ name id }.sort
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should have a name" do
|
153
|
+
@relation.name.should == :users
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should have an engine" do
|
157
|
+
@relation.engine.should == Table.engine
|
158
|
+
end
|
159
|
+
|
160
|
+
describe '[]' do
|
161
|
+
describe 'when given a', Symbol do
|
162
|
+
it "manufactures an attribute if the symbol names an attribute within the relation" do
|
163
|
+
column = @relation[:id]
|
164
|
+
check column.name.should == :id
|
165
|
+
column.should be_kind_of Attributes::Integer
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe 'when table does not exist' do
|
170
|
+
it 'returns nil' do
|
171
|
+
@relation[:foooo].should be_nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
describe 'update manager' do
|
5
|
+
describe 'new' do
|
6
|
+
it 'takes an engine' do
|
7
|
+
Arel::UpdateManager.new Table.engine
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'set' do
|
12
|
+
it "updates with null" do
|
13
|
+
table = Table.new(:users)
|
14
|
+
um = Arel::UpdateManager.new Table.engine
|
15
|
+
um.table table
|
16
|
+
um.set [[table[:name], nil]]
|
17
|
+
um.to_sql.should be_like %{ UPDATE "users" SET "name" = NULL }
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'takes a string' do
|
21
|
+
table = Table.new(:users)
|
22
|
+
um = Arel::UpdateManager.new Table.engine
|
23
|
+
um.table table
|
24
|
+
um.set Nodes::SqlLiteral.new "foo = bar"
|
25
|
+
um.to_sql.should be_like %{ UPDATE "users" SET foo = bar }
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'takes a list of lists' do
|
29
|
+
table = Table.new(:users)
|
30
|
+
um = Arel::UpdateManager.new Table.engine
|
31
|
+
um.table table
|
32
|
+
um.set [[table[:id], 1], [table[:name], 'hello']]
|
33
|
+
um.to_sql.should be_like %{
|
34
|
+
UPDATE "users" SET "id" = 1, "name" = 'hello'
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'chains' do
|
39
|
+
table = Table.new(:users)
|
40
|
+
um = Arel::UpdateManager.new Table.engine
|
41
|
+
um.set([[table[:id], 1], [table[:name], 'hello']]).should == um
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'table' do
|
46
|
+
it 'generates an update statement' do
|
47
|
+
um = Arel::UpdateManager.new Table.engine
|
48
|
+
um.table Table.new(:users)
|
49
|
+
um.to_sql.should be_like %{ UPDATE "users" }
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'chains' do
|
53
|
+
um = Arel::UpdateManager.new Table.engine
|
54
|
+
um.table(Table.new(:users)).should == um
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'where' do
|
59
|
+
it 'generates a where clause' do
|
60
|
+
table = Table.new :users
|
61
|
+
um = Arel::UpdateManager.new Table.engine
|
62
|
+
um.table table
|
63
|
+
um.where table[:id].eq(1)
|
64
|
+
um.to_sql.should be_like %{
|
65
|
+
UPDATE "users" WHERE "users"."id" = 1
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'chains' do
|
70
|
+
table = Table.new :users
|
71
|
+
um = Arel::UpdateManager.new Table.engine
|
72
|
+
um.table table
|
73
|
+
um.where(table[:id].eq(1)).should == um
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "TreeManager" do
|
78
|
+
subject do
|
79
|
+
table = Table.new :users
|
80
|
+
Arel::UpdateManager.new(Table.engine).tap do |manager|
|
81
|
+
manager.table table
|
82
|
+
manager.where table[:id].eq(1)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it_should_behave_like "TreeManager"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Arel
|
4
|
+
module Visitors
|
5
|
+
describe 'the join_sql visitor' do
|
6
|
+
before do
|
7
|
+
@visitor = JoinSql.new Table.engine
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'inner join' do
|
11
|
+
it 'should visit left if left is a join' do
|
12
|
+
t = Table.new :users
|
13
|
+
join = Nodes::InnerJoin.new t, t, Nodes::On.new(t[:id])
|
14
|
+
j2 = Nodes::InnerJoin.new join, t, Nodes::On.new(t[:id])
|
15
|
+
@visitor.accept(j2).should be_like %{
|
16
|
+
INNER JOIN "users" ON "users"."id"
|
17
|
+
INNER JOIN "users" ON "users"."id"
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'outer join' do
|
23
|
+
it 'should visit left if left is a join' do
|
24
|
+
t = Table.new :users
|
25
|
+
join = Nodes::OuterJoin.new t, t, Nodes::On.new(t[:id])
|
26
|
+
j2 = Nodes::OuterJoin.new join, t, Nodes::On.new(t[:id])
|
27
|
+
@visitor.accept(j2).should be_like %{
|
28
|
+
LEFT OUTER JOIN "users" ON "users"."id"
|
29
|
+
LEFT OUTER JOIN "users" ON "users"."id"
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|