arel 6.0.0.beta2 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +1 -1
- data/README.markdown +5 -5
- data/lib/arel.rb +1 -1
- data/lib/arel/collectors/sql_string.rb +7 -1
- data/lib/arel/expressions.rb +5 -4
- data/lib/arel/nodes.rb +1 -0
- data/lib/arel/nodes/bind_param.rb +6 -0
- data/lib/arel/nodes/sql_literal.rb +0 -3
- data/lib/arel/predications.rb +2 -2
- data/lib/arel/visitors/depth_first.rb +6 -0
- data/lib/arel/visitors/oracle.rb +4 -0
- data/lib/arel/visitors/postgresql.rb +4 -0
- data/lib/arel/visitors/reduce.rb +4 -4
- data/lib/arel/visitors/to_sql.rb +3 -2
- data/lib/arel/visitors/visitor.rb +15 -15
- metadata +26 -69
- data/.gitignore +0 -9
- data/.travis.yml +0 -18
- data/Gemfile +0 -5
- data/Rakefile +0 -15
- data/arel.gemspec +0 -24
- data/test/attributes/test_attribute.rb +0 -910
- data/test/collectors/test_bind_collector.rb +0 -70
- data/test/collectors/test_sql_string.rb +0 -38
- data/test/helper.rb +0 -22
- data/test/nodes/test_and.rb +0 -20
- data/test/nodes/test_as.rb +0 -34
- data/test/nodes/test_ascending.rb +0 -44
- data/test/nodes/test_bin.rb +0 -33
- data/test/nodes/test_binary.rb +0 -26
- data/test/nodes/test_count.rb +0 -33
- data/test/nodes/test_delete_statement.rb +0 -34
- data/test/nodes/test_descending.rb +0 -44
- data/test/nodes/test_distinct.rb +0 -20
- data/test/nodes/test_equality.rb +0 -84
- data/test/nodes/test_extract.rb +0 -41
- data/test/nodes/test_false.rb +0 -20
- data/test/nodes/test_grouping.rb +0 -25
- data/test/nodes/test_infix_operation.rb +0 -40
- data/test/nodes/test_insert_statement.rb +0 -42
- data/test/nodes/test_named_function.rb +0 -46
- data/test/nodes/test_node.rb +0 -39
- data/test/nodes/test_not.rb +0 -29
- data/test/nodes/test_or.rb +0 -34
- data/test/nodes/test_over.rb +0 -67
- data/test/nodes/test_select_core.rb +0 -69
- data/test/nodes/test_select_statement.rb +0 -49
- data/test/nodes/test_sql_literal.rb +0 -73
- data/test/nodes/test_sum.rb +0 -24
- data/test/nodes/test_table_alias.rb +0 -36
- data/test/nodes/test_true.rb +0 -21
- data/test/nodes/test_update_statement.rb +0 -58
- data/test/nodes/test_window.rb +0 -79
- data/test/support/fake_record.rb +0 -135
- data/test/test_attributes.rb +0 -66
- data/test/test_crud.rb +0 -63
- data/test/test_delete_manager.rb +0 -42
- data/test/test_factory_methods.rb +0 -44
- data/test/test_insert_manager.rb +0 -171
- data/test/test_select_manager.rb +0 -1181
- data/test/test_table.rb +0 -253
- data/test/test_update_manager.rb +0 -124
- data/test/visitors/test_bind_visitor.rb +0 -60
- data/test/visitors/test_depth_first.rb +0 -258
- data/test/visitors/test_dispatch_contamination.rb +0 -22
- data/test/visitors/test_dot.rb +0 -76
- data/test/visitors/test_ibm_db.rb +0 -33
- data/test/visitors/test_informix.rb +0 -58
- data/test/visitors/test_mssql.rb +0 -70
- data/test/visitors/test_mysql.rb +0 -60
- data/test/visitors/test_oracle.rb +0 -170
- data/test/visitors/test_postgres.rb +0 -122
- data/test/visitors/test_sqlite.rb +0 -23
- data/test/visitors/test_to_sql.rb +0 -598
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Arel::Nodes::SelectStatement do
|
4
|
-
describe "#clone" do
|
5
|
-
it "clones cores" do
|
6
|
-
statement = Arel::Nodes::SelectStatement.new %w[a b c]
|
7
|
-
|
8
|
-
dolly = statement.clone
|
9
|
-
dolly.cores.must_equal statement.cores
|
10
|
-
dolly.cores.wont_be_same_as statement.cores
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe 'equality' do
|
15
|
-
it 'is equal with equal ivars' do
|
16
|
-
statement1 = Arel::Nodes::SelectStatement.new %w[a b c]
|
17
|
-
statement1.offset = 1
|
18
|
-
statement1.limit = 2
|
19
|
-
statement1.lock = false
|
20
|
-
statement1.orders = %w[x y z]
|
21
|
-
statement1.with = 'zomg'
|
22
|
-
statement2 = Arel::Nodes::SelectStatement.new %w[a b c]
|
23
|
-
statement2.offset = 1
|
24
|
-
statement2.limit = 2
|
25
|
-
statement2.lock = false
|
26
|
-
statement2.orders = %w[x y z]
|
27
|
-
statement2.with = 'zomg'
|
28
|
-
array = [statement1, statement2]
|
29
|
-
assert_equal 1, array.uniq.size
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'is not equal with different ivars' do
|
33
|
-
statement1 = Arel::Nodes::SelectStatement.new %w[a b c]
|
34
|
-
statement1.offset = 1
|
35
|
-
statement1.limit = 2
|
36
|
-
statement1.lock = false
|
37
|
-
statement1.orders = %w[x y z]
|
38
|
-
statement1.with = 'zomg'
|
39
|
-
statement2 = Arel::Nodes::SelectStatement.new %w[a b c]
|
40
|
-
statement2.offset = 1
|
41
|
-
statement2.limit = 2
|
42
|
-
statement2.lock = false
|
43
|
-
statement2.orders = %w[x y z]
|
44
|
-
statement2.with = 'wth'
|
45
|
-
array = [statement1, statement2]
|
46
|
-
assert_equal 2, array.uniq.size
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
module Arel
|
5
|
-
module Nodes
|
6
|
-
describe 'sql literal' do
|
7
|
-
before do
|
8
|
-
@visitor = Visitors::ToSql.new Table.engine.connection
|
9
|
-
end
|
10
|
-
|
11
|
-
def compile node
|
12
|
-
@visitor.accept(node, Collectors::SQLString.new).value
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'sql' do
|
16
|
-
it 'makes a sql literal node' do
|
17
|
-
sql = Arel.sql 'foo'
|
18
|
-
sql.must_be_kind_of Arel::Nodes::SqlLiteral
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'count' do
|
23
|
-
it 'makes a count node' do
|
24
|
-
node = SqlLiteral.new('*').count
|
25
|
-
compile(node).must_be_like %{ COUNT(*) }
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'makes a distinct node' do
|
29
|
-
node = SqlLiteral.new('*').count true
|
30
|
-
compile(node).must_be_like %{ COUNT(DISTINCT *) }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe 'equality' do
|
35
|
-
it 'makes an equality node' do
|
36
|
-
node = SqlLiteral.new('foo').eq(1)
|
37
|
-
compile(node).must_be_like %{ foo = 1 }
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'is equal with equal contents' do
|
41
|
-
array = [SqlLiteral.new('foo'), SqlLiteral.new('foo')]
|
42
|
-
assert_equal 1, array.uniq.size
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'is not equal with different contents' do
|
46
|
-
array = [SqlLiteral.new('foo'), SqlLiteral.new('bar')]
|
47
|
-
assert_equal 2, array.uniq.size
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'grouped "or" equality' do
|
52
|
-
it 'makes a grouping node with an or node' do
|
53
|
-
node = SqlLiteral.new('foo').eq_any([1,2])
|
54
|
-
compile(node).must_be_like %{ (foo = 1 OR foo = 2) }
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe 'grouped "and" equality' do
|
59
|
-
it 'makes a grouping node with an or node' do
|
60
|
-
node = SqlLiteral.new('foo').eq_all([1,2])
|
61
|
-
compile(node).must_be_like %{ (foo = 1 AND foo = 2) }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'serialization' do
|
66
|
-
it 'serializes into YAML' do
|
67
|
-
yaml_literal = SqlLiteral.new('foo').to_yaml
|
68
|
-
assert_equal('foo', YAML.load(yaml_literal))
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/test/nodes/test_sum.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Arel::Nodes::Sum do
|
4
|
-
describe "as" do
|
5
|
-
it 'should alias the sum' do
|
6
|
-
table = Arel::Table.new :users
|
7
|
-
table[:id].sum.as('foo').to_sql.must_be_like %{
|
8
|
-
SUM("users"."id") AS foo
|
9
|
-
}
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe 'equality' do
|
14
|
-
it 'is equal with equal ivars' do
|
15
|
-
array = [Arel::Nodes::Sum.new('foo'), Arel::Nodes::Sum.new('foo')]
|
16
|
-
assert_equal 1, array.uniq.size
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'is not equal with different ivars' do
|
20
|
-
array = [Arel::Nodes::Sum.new('foo'), Arel::Nodes::Sum.new('foo!')]
|
21
|
-
assert_equal 2, array.uniq.size
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
module Arel
|
5
|
-
module Nodes
|
6
|
-
describe 'table alias' do
|
7
|
-
it 'has an #engine which delegates to the relation' do
|
8
|
-
engine = 'vroom'
|
9
|
-
relation = Table.new(:users, engine)
|
10
|
-
|
11
|
-
node = TableAlias.new relation, :foo
|
12
|
-
node.engine.must_equal engine
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'equality' do
|
16
|
-
it 'is equal with equal ivars' do
|
17
|
-
relation1 = Table.new(:users, 'vroom')
|
18
|
-
node1 = TableAlias.new relation1, :foo
|
19
|
-
relation2 = Table.new(:users, 'vroom')
|
20
|
-
node2 = TableAlias.new relation2, :foo
|
21
|
-
array = [node1, node2]
|
22
|
-
assert_equal 1, array.uniq.size
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'is not equal with different ivars' do
|
26
|
-
relation1 = Table.new(:users, 'vroom')
|
27
|
-
node1 = TableAlias.new relation1, :foo
|
28
|
-
relation2 = Table.new(:users, 'vroom')
|
29
|
-
node2 = TableAlias.new relation2, :bar
|
30
|
-
array = [node1, node2]
|
31
|
-
assert_equal 2, array.uniq.size
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/test/nodes/test_true.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
module Arel
|
4
|
-
module Nodes
|
5
|
-
describe 'True' do
|
6
|
-
describe 'equality' do
|
7
|
-
it 'is equal to other true nodes' do
|
8
|
-
array = [True.new, True.new]
|
9
|
-
assert_equal 1, array.uniq.size
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'is not equal with other nodes' do
|
13
|
-
array = [True.new, Node.new]
|
14
|
-
assert_equal 2, array.uniq.size
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Arel::Nodes::UpdateStatement do
|
4
|
-
describe "#clone" do
|
5
|
-
it "clones wheres and values" do
|
6
|
-
statement = Arel::Nodes::UpdateStatement.new
|
7
|
-
statement.wheres = %w[a b c]
|
8
|
-
statement.values = %w[x y z]
|
9
|
-
|
10
|
-
dolly = statement.clone
|
11
|
-
dolly.wheres.must_equal statement.wheres
|
12
|
-
dolly.wheres.wont_be_same_as statement.wheres
|
13
|
-
|
14
|
-
dolly.values.must_equal statement.values
|
15
|
-
dolly.values.wont_be_same_as statement.values
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe 'equality' do
|
20
|
-
it 'is equal with equal ivars' do
|
21
|
-
statement1 = Arel::Nodes::UpdateStatement.new
|
22
|
-
statement1.relation = 'zomg'
|
23
|
-
statement1.wheres = 2
|
24
|
-
statement1.values = false
|
25
|
-
statement1.orders = %w[x y z]
|
26
|
-
statement1.limit = 42
|
27
|
-
statement1.key = 'zomg'
|
28
|
-
statement2 = Arel::Nodes::UpdateStatement.new
|
29
|
-
statement2.relation = 'zomg'
|
30
|
-
statement2.wheres = 2
|
31
|
-
statement2.values = false
|
32
|
-
statement2.orders = %w[x y z]
|
33
|
-
statement2.limit = 42
|
34
|
-
statement2.key = 'zomg'
|
35
|
-
array = [statement1, statement2]
|
36
|
-
assert_equal 1, array.uniq.size
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'is not equal with different ivars' do
|
40
|
-
statement1 = Arel::Nodes::UpdateStatement.new
|
41
|
-
statement1.relation = 'zomg'
|
42
|
-
statement1.wheres = 2
|
43
|
-
statement1.values = false
|
44
|
-
statement1.orders = %w[x y z]
|
45
|
-
statement1.limit = 42
|
46
|
-
statement1.key = 'zomg'
|
47
|
-
statement2 = Arel::Nodes::UpdateStatement.new
|
48
|
-
statement2.relation = 'zomg'
|
49
|
-
statement2.wheres = 2
|
50
|
-
statement2.values = false
|
51
|
-
statement2.orders = %w[x y z]
|
52
|
-
statement2.limit = 42
|
53
|
-
statement2.key = 'wth'
|
54
|
-
array = [statement1, statement2]
|
55
|
-
assert_equal 2, array.uniq.size
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/test/nodes/test_window.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
module Arel
|
4
|
-
module Nodes
|
5
|
-
describe 'Window' do
|
6
|
-
describe 'equality' do
|
7
|
-
it 'is equal with equal ivars' do
|
8
|
-
window1 = Window.new
|
9
|
-
window1.orders = [1, 2]
|
10
|
-
window1.partitions = [1]
|
11
|
-
window1.frame 3
|
12
|
-
window2 = Window.new
|
13
|
-
window2.orders = [1, 2]
|
14
|
-
window2.partitions = [1]
|
15
|
-
window2.frame 3
|
16
|
-
array = [window1, window2]
|
17
|
-
assert_equal 1, array.uniq.size
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'is not equal with different ivars' do
|
21
|
-
window1 = Window.new
|
22
|
-
window1.orders = [1, 2]
|
23
|
-
window1.partitions = [1]
|
24
|
-
window1.frame 3
|
25
|
-
window2 = Window.new
|
26
|
-
window2.orders = [1, 2]
|
27
|
-
window1.partitions = [1]
|
28
|
-
window2.frame 4
|
29
|
-
array = [window1, window2]
|
30
|
-
assert_equal 2, array.uniq.size
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe 'NamedWindow' do
|
36
|
-
describe 'equality' do
|
37
|
-
it 'is equal with equal ivars' do
|
38
|
-
window1 = NamedWindow.new 'foo'
|
39
|
-
window1.orders = [1, 2]
|
40
|
-
window1.partitions = [1]
|
41
|
-
window1.frame 3
|
42
|
-
window2 = NamedWindow.new 'foo'
|
43
|
-
window2.orders = [1, 2]
|
44
|
-
window2.partitions = [1]
|
45
|
-
window2.frame 3
|
46
|
-
array = [window1, window2]
|
47
|
-
assert_equal 1, array.uniq.size
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'is not equal with different ivars' do
|
51
|
-
window1 = NamedWindow.new 'foo'
|
52
|
-
window1.orders = [1, 2]
|
53
|
-
window1.partitions = [1]
|
54
|
-
window1.frame 3
|
55
|
-
window2 = NamedWindow.new 'bar'
|
56
|
-
window2.orders = [1, 2]
|
57
|
-
window2.partitions = [1]
|
58
|
-
window2.frame 3
|
59
|
-
array = [window1, window2]
|
60
|
-
assert_equal 2, array.uniq.size
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'CurrentRow' do
|
66
|
-
describe 'equality' do
|
67
|
-
it 'is equal to other current row nodes' do
|
68
|
-
array = [CurrentRow.new, CurrentRow.new]
|
69
|
-
assert_equal 1, array.uniq.size
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'is not equal with other nodes' do
|
73
|
-
array = [CurrentRow.new, Node.new]
|
74
|
-
assert_equal 2, array.uniq.size
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
data/test/support/fake_record.rb
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
module FakeRecord
|
2
|
-
class Column < Struct.new(:name, :type)
|
3
|
-
end
|
4
|
-
|
5
|
-
class Connection
|
6
|
-
attr_reader :tables
|
7
|
-
attr_accessor :visitor
|
8
|
-
|
9
|
-
def initialize(visitor = nil)
|
10
|
-
@tables = %w{ users photos developers products}
|
11
|
-
@columns = {
|
12
|
-
'users' => [
|
13
|
-
Column.new('id', :integer),
|
14
|
-
Column.new('name', :string),
|
15
|
-
Column.new('bool', :boolean),
|
16
|
-
Column.new('created_at', :date)
|
17
|
-
],
|
18
|
-
'products' => [
|
19
|
-
Column.new('id', :integer),
|
20
|
-
Column.new('price', :decimal)
|
21
|
-
]
|
22
|
-
}
|
23
|
-
@columns_hash = {
|
24
|
-
'users' => Hash[@columns['users'].map { |x| [x.name, x] }],
|
25
|
-
'products' => Hash[@columns['products'].map { |x| [x.name, x] }]
|
26
|
-
}
|
27
|
-
@primary_keys = {
|
28
|
-
'users' => 'id',
|
29
|
-
'products' => 'id'
|
30
|
-
}
|
31
|
-
@visitor = visitor
|
32
|
-
end
|
33
|
-
|
34
|
-
def columns_hash table_name
|
35
|
-
@columns_hash[table_name]
|
36
|
-
end
|
37
|
-
|
38
|
-
def primary_key name
|
39
|
-
@primary_keys[name.to_s]
|
40
|
-
end
|
41
|
-
|
42
|
-
def table_exists? name
|
43
|
-
@tables.include? name.to_s
|
44
|
-
end
|
45
|
-
|
46
|
-
def columns name, message = nil
|
47
|
-
@columns[name.to_s]
|
48
|
-
end
|
49
|
-
|
50
|
-
def quote_table_name name
|
51
|
-
"\"#{name.to_s}\""
|
52
|
-
end
|
53
|
-
|
54
|
-
def quote_column_name name
|
55
|
-
"\"#{name.to_s}\""
|
56
|
-
end
|
57
|
-
|
58
|
-
def schema_cache
|
59
|
-
self
|
60
|
-
end
|
61
|
-
|
62
|
-
def quote thing, column = nil
|
63
|
-
if column && !thing.nil?
|
64
|
-
case column.type
|
65
|
-
when :integer
|
66
|
-
thing = thing.to_i
|
67
|
-
when :string
|
68
|
-
thing = thing.to_s
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
case thing
|
73
|
-
when DateTime
|
74
|
-
"'#{thing.strftime("%Y-%m-%d %H:%M:%S")}'"
|
75
|
-
when Date
|
76
|
-
"'#{thing.strftime("%Y-%m-%d")}'"
|
77
|
-
when true
|
78
|
-
"'t'"
|
79
|
-
when false
|
80
|
-
"'f'"
|
81
|
-
when nil
|
82
|
-
'NULL'
|
83
|
-
when Numeric
|
84
|
-
thing
|
85
|
-
else
|
86
|
-
"'#{thing.to_s.gsub("'", "\\\\'")}'"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
class ConnectionPool
|
92
|
-
class Spec < Struct.new(:config)
|
93
|
-
end
|
94
|
-
|
95
|
-
attr_reader :spec, :connection
|
96
|
-
|
97
|
-
def initialize
|
98
|
-
@spec = Spec.new(:adapter => 'america')
|
99
|
-
@connection = Connection.new
|
100
|
-
@connection.visitor = Arel::Visitors::ToSql.new(connection)
|
101
|
-
end
|
102
|
-
|
103
|
-
def with_connection
|
104
|
-
yield connection
|
105
|
-
end
|
106
|
-
|
107
|
-
def table_exists? name
|
108
|
-
connection.tables.include? name.to_s
|
109
|
-
end
|
110
|
-
|
111
|
-
def columns_hash
|
112
|
-
connection.columns_hash
|
113
|
-
end
|
114
|
-
|
115
|
-
def schema_cache
|
116
|
-
connection
|
117
|
-
end
|
118
|
-
|
119
|
-
def quote thing, column = nil
|
120
|
-
connection.quote thing, column
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
class Base
|
125
|
-
attr_accessor :connection_pool
|
126
|
-
|
127
|
-
def initialize
|
128
|
-
@connection_pool = ConnectionPool.new
|
129
|
-
end
|
130
|
-
|
131
|
-
def connection
|
132
|
-
connection_pool.connection
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|