rom-sql 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/lib/rom/sql/association.rb +1 -1
  4. data/lib/rom/sql/association/many_to_one.rb +1 -1
  5. data/lib/rom/sql/association/name.rb +1 -1
  6. data/lib/rom/sql/association/one_to_many.rb +1 -1
  7. data/lib/rom/sql/attribute.rb +23 -9
  8. data/lib/rom/sql/dsl.rb +13 -0
  9. data/lib/rom/sql/extensions/postgres/commands.rb +4 -4
  10. data/lib/rom/sql/extensions/postgres/types.rb +262 -110
  11. data/lib/rom/sql/function.rb +2 -2
  12. data/lib/rom/sql/projection_dsl.rb +1 -12
  13. data/lib/rom/sql/relation.rb +1 -1
  14. data/lib/rom/sql/relation/reading.rb +8 -4
  15. data/lib/rom/sql/restriction_dsl.rb +7 -1
  16. data/lib/rom/sql/types.rb +2 -0
  17. data/lib/rom/sql/version.rb +1 -1
  18. data/spec/extensions/postgres/attribute_spec.rb +78 -0
  19. data/spec/integration/association/many_to_many/custom_fks_spec.rb +8 -3
  20. data/spec/integration/association/many_to_many/from_view_spec.rb +9 -3
  21. data/spec/integration/association/many_to_many_spec.rb +8 -2
  22. data/spec/integration/association/many_to_one/custom_fks_spec.rb +8 -4
  23. data/spec/integration/association/many_to_one/from_view_spec.rb +10 -4
  24. data/spec/integration/association/many_to_one/self_ref_spec.rb +4 -2
  25. data/spec/integration/association/many_to_one_spec.rb +8 -4
  26. data/spec/integration/association/one_to_many/custom_fks_spec.rb +5 -2
  27. data/spec/integration/association/one_to_many/from_view_spec.rb +5 -2
  28. data/spec/integration/association/one_to_many/self_ref_spec.rb +4 -2
  29. data/spec/integration/association/one_to_many_spec.rb +1 -1
  30. data/spec/integration/commands/upsert_spec.rb +2 -2
  31. data/spec/integration/plugins/auto_wrap_spec.rb +1 -1
  32. data/spec/integration/sequel_api_spec.rb +3 -2
  33. data/spec/unit/function_spec.rb +1 -1
  34. data/spec/unit/order_dsl_spec.rb +4 -4
  35. data/spec/unit/projection_dsl_spec.rb +8 -0
  36. data/spec/unit/relation/dataset_spec.rb +3 -3
  37. data/spec/unit/relation/project_spec.rb +1 -1
  38. data/spec/unit/relation/qualified_columns_spec.rb +3 -2
  39. data/spec/unit/relation/where_spec.rb +20 -0
  40. data/spec/unit/restriction_dsl_spec.rb +2 -2
  41. metadata +2 -2
@@ -7,7 +7,7 @@ RSpec.describe 'Plugins / :auto_wrap' do
7
7
  it 'returns joined tuples' do
8
8
  task_with_user = tasks
9
9
  .for_wrap({ id: :user_id }, name)
10
- .where(tasks__id: 2)
10
+ .where { id.qualified.is(2) }
11
11
  .one
12
12
 
13
13
  expect(task_with_user).to eql(
@@ -13,7 +13,8 @@ RSpec.describe 'Using legacy sequel api', :sqlite do
13
13
 
14
14
  describe '#select' do
15
15
  it 'selects columns' do
16
- expect(users.select(:users__id, :users__name).first).to eql(id: 1, name: 'Jane')
16
+ expect(users.select(Sequel.qualify(:users, :id), Sequel.qualify(:users, :name)).first).
17
+ to eql(id: 1, name: 'Jane')
17
18
  end
18
19
 
19
20
  it 'supports legacy blocks' do
@@ -29,7 +30,7 @@ RSpec.describe 'Using legacy sequel api', :sqlite do
29
30
 
30
31
  describe '#order' do
31
32
  it 'orders relation' do
32
- expect(users.order(:users__name).first).to eql(id: 1, name: 'Jane')
33
+ expect(users.order(Sequel.qualify(:users, :name)).first).to eql(id: 1, name: 'Jane')
33
34
  end
34
35
  end
35
36
  end
@@ -24,7 +24,7 @@ RSpec.describe ROM::SQL::Function, :postgres do
24
24
 
25
25
  describe '#is' do
26
26
  it 'returns an sql boolean expression' do
27
- expect((func.count(:id).is(1)).sql_literal(ds)).to eql(%((COUNT("id") = 1)))
27
+ expect(ds.literal(func.count(:id).is(1))).to eql(%((COUNT("id") = 1)))
28
28
  end
29
29
  end
30
30
 
@@ -17,7 +17,7 @@ RSpec.describe ROM::SQL::OrderDSL, :postgres, helpers: true do
17
17
 
18
18
  describe '#call' do
19
19
  it 'returns an array with ordered expressions' do
20
- expect(dsl.call { id }.first.sql_literal(conn[:users])).to eql('"id"')
20
+ expect(ds.literal(dsl.call { id }.first)).to eql('"id"')
21
21
  end
22
22
  end
23
23
 
@@ -28,15 +28,15 @@ RSpec.describe ROM::SQL::OrderDSL, :postgres, helpers: true do
28
28
  end
29
29
 
30
30
  it 'delegates to sequel virtual row' do
31
- expect(dsl.call { nullif(id.qualified, `''`).desc }.first.sql_literal(conn[:users])).
31
+ expect(ds.literal(dsl.call { nullif(id.qualified, Sequel.lit("''")).desc }.first)).
32
32
  to eql(%(NULLIF("users"."id", '') DESC))
33
33
  end
34
34
 
35
35
  it 'allows to set nulls first/last' do
36
- expect(dsl.call { id.desc(nulls: :first) }.first.sql_literal(conn[:users])).
36
+ expect(ds.literal(dsl.call { id.desc(nulls: :first) }.first)).
37
37
  to eql(%("id" DESC NULLS FIRST))
38
38
 
39
- expect(dsl.call { id.desc(nulls: :last) }.first.sql_literal(conn[:users])).
39
+ expect(ds.literal(dsl.call { id.desc(nulls: :last) }.first)).
40
40
  to eql(%("id" DESC NULLS LAST))
41
41
  end
42
42
  end
@@ -71,6 +71,14 @@ RSpec.describe ROM::SQL::ProjectionDSL, :postgres, helpers: true do
71
71
 
72
72
  expect(literals).to eql([%('event' AS "type")])
73
73
  end
74
+
75
+ it 'supports functions without return value' do
76
+ literals = dsl
77
+ .call { void::pg_advisory_lock(1).as(:lock) }
78
+ .map { |attr| attr.sql_literal(ds) }
79
+
80
+ expect(literals).to eql([%(PG_ADVISORY_LOCK(1) AS "lock")])
81
+ end
74
82
  end
75
83
 
76
84
  describe '#method_missing' do
@@ -17,7 +17,7 @@ RSpec.describe ROM::Relation, '#dataset' do
17
17
  end
18
18
 
19
19
  it 'uses schema to infer default dataset' do
20
- expect(relation.dataset.sql).to eql(dataset.select(:id, :name).order(:users__id).sql)
20
+ expect(relation.dataset.sql).to eql(dataset.select(:id, :name).order(Sequel.qualify(:users, :id)).sql)
21
21
  end
22
22
  end
23
23
 
@@ -31,7 +31,7 @@ RSpec.describe ROM::Relation, '#dataset' do
31
31
  end
32
32
 
33
33
  it 'uses schema to infer default dataset' do
34
- expect(relation.dataset.sql).to eql(dataset.select(:id).order(:users__id).sql)
34
+ expect(relation.dataset.sql).to eql(dataset.select(:id).order(Sequel.qualify(:users, :id)).sql)
35
35
  end
36
36
  end
37
37
 
@@ -41,7 +41,7 @@ RSpec.describe ROM::Relation, '#dataset' do
41
41
  end
42
42
 
43
43
  it 'selects all qualified columns and sorts by pk' do
44
- expect(relation.dataset.sql).to eql(dataset.select(*relation.columns).order(:users__id).sql)
44
+ expect(relation.dataset.sql).to eql(dataset.select(*relation.columns).order(Sequel.qualify(:users, :id)).sql)
45
45
  end
46
46
  end
47
47
  end
@@ -17,7 +17,7 @@ RSpec.describe ROM::Relation, '#project' do
17
17
  it 'projects the dataset using new column names' do
18
18
  projected = relation.sorted.project(:name)
19
19
 
20
- expect(projected.schema.map(&:to_sym)).to match_array([:name])
20
+ expect(projected.schema.map(&:to_sql_name)).to match_array(Sequel[:name])
21
21
  expect(projected.first).to eql(name: 'Jane')
22
22
  end
23
23
  end
@@ -17,13 +17,14 @@ RSpec.describe ROM::Relation, '#qualified_columns' do
17
17
  it 'returns qualified column names' do
18
18
  columns = relation.sorted.prefix(:user).qualified_columns
19
19
 
20
- expect(columns).to eql([:users__id___user_id, :users__name___user_name])
20
+ expect(columns).to eql([Sequel.qualify(:users, :id).as(:user_id),
21
+ Sequel.qualify(:users, :name).as(:user_name)])
21
22
  end
22
23
 
23
24
  it 'returns projected qualified column names' do
24
25
  columns = relation.sorted.project(:id).prefix(:user).qualified_columns
25
26
 
26
- expect(columns).to eql([:users__id___user_id])
27
+ expect(columns).to eql([Sequel.qualify(:users, :id).as(:user_id)])
27
28
  end
28
29
  end
29
30
  end
@@ -49,6 +49,26 @@ RSpec.describe ROM::Relation, '#where' do
49
49
  expect(relation.where(relation[:id].in(2, 3)).to_a).
50
50
  to eql([{ id: 2, title: "Jane's task" }])
51
51
  end
52
+
53
+ context 'using underscored symbols for qualifying' do
54
+ before { Sequel.split_symbols = true }
55
+ after { Sequel.split_symbols = false }
56
+
57
+ it 'queries with a qualified name' do
58
+ expect(relation.where(tasks__id: 1).to_a).
59
+ to eql([{ id: 1, title: "Joe's task" }])
60
+ end
61
+ end
62
+
63
+ it 'restricts with a function' do
64
+ expect(relation.where { string::lower(title).is("joe's task") }.to_a).
65
+ to eql([{ id: 1, title: "Joe's task" }])
66
+ end
67
+
68
+ it 'restricts with a function using LIKE' do
69
+ expect(relation.where { string::lower(title).like("joe%") }.to_a).
70
+ to eql([{ id: 1, title: "Joe's task" }])
71
+ end
52
72
  end
53
73
 
54
74
  context 'with :read types' do
@@ -17,7 +17,7 @@ RSpec.describe ROM::SQL::RestrictionDSL, :sqlite, helpers: true do
17
17
 
18
18
  describe '#call' do
19
19
  it 'evaluates the block and returns an SQL expression' do
20
- expect(dsl.call { count(id) >= 3 }.sql_literal(conn[:users])).to eql('(count(`id`) >= 3)')
20
+ expect(conn[:users].literal(dsl.call { count(id) >= 3 })).to eql('(count(`id`) >= 3)')
21
21
  end
22
22
  end
23
23
 
@@ -28,7 +28,7 @@ RSpec.describe ROM::SQL::RestrictionDSL, :sqlite, helpers: true do
28
28
  end
29
29
 
30
30
  it 'delegates to sequel virtual row' do
31
- expect(dsl.count(dsl.id).sql_literal(conn[:users])).to eql('count(`id`)')
31
+ expect(conn[:users].literal(dsl.count(dsl.id))).to eql('count(`id`)')
32
32
  end
33
33
  end
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-05 00:00:00.000000000 Z
11
+ date: 2017-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel