arel 6.0.0.beta2 → 6.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.
- 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
|