rom-sql 0.5.2 → 0.5.3
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/CHANGELOG.md +16 -0
- data/README.md +1 -104
- data/lib/rom/sql/commands/create.rb +13 -1
- data/lib/rom/sql/commands_ext/postgres.rb +4 -0
- data/lib/rom/sql/relation.rb +14 -0
- data/lib/rom/sql/relation/associations.rb +2 -2
- data/lib/rom/sql/relation/class_methods.rb +1 -3
- data/lib/rom/sql/version.rb +1 -1
- data/spec/integration/commands/create_spec.rb +10 -0
- data/spec/unit/many_to_one_spec.rb +14 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3b5357a86ca00174aa17cce24a077a1eb843238
|
4
|
+
data.tar.gz: 4e7165c1dc95b56b1823def507746fefc0c0c74e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe54d5beae0bf5cb3b249ff8a6c17b445b351ebcf61651b02903dda3205d4d1696162be311b82ff68a08b6d9496f735529e7d0807f200a88f3b5445b11787314
|
7
|
+
data.tar.gz: 5458d5da39115d940d9c01989723bbee280ad6f50710c3324e78936c41b91d1c2b2a642e1a5ed58d2bf04320c9b6b1fb1beff26f5795f2806082f0f635dc241b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## v0.5.3 2015-07-23
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* `Relation#multi_insert` (draxxxeus)
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
|
9
|
+
* Command that receives many tuples will use `multi_insert` now (draxxxeus)
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
* Relation name and join key fixes for `many_to_one` macro (jamesmoriarty)
|
14
|
+
|
15
|
+
[Compare v0.5.2...v0.5.3](https://github.com/rom-rb/rom-sql/compare/v0.5.2...v0.5.3)
|
16
|
+
|
1
17
|
## v0.5.2 2015-06-22
|
2
18
|
|
3
19
|
### Added
|
data/README.md
CHANGED
@@ -35,110 +35,7 @@ Or install it yourself as:
|
|
35
35
|
|
36
36
|
$ gem install rom-sql
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
ROM uses [Sequel](http://sequel.jeremyevans.net) under the hood and exposes its
|
41
|
-
[Dataset API](http://sequel.jeremyevans.net/rdoc/files/doc/dataset_basics_rdoc.html)
|
42
|
-
in relation objects. For schema migrations you can use its
|
43
|
-
[Migration API](http://sequel.jeremyevans.net/rdoc/files/doc/migration_rdoc.html)
|
44
|
-
which is available via repositories.
|
45
|
-
|
46
|
-
``` ruby
|
47
|
-
require "rom-sql"
|
48
|
-
require "sqlite3"
|
49
|
-
|
50
|
-
setup = ROM.setup(:sql, "sqlite::memory")
|
51
|
-
|
52
|
-
setup.default.connection.create_table(:users) do
|
53
|
-
primary_key :id
|
54
|
-
String :name
|
55
|
-
Boolean :admin
|
56
|
-
end
|
57
|
-
|
58
|
-
setup.default.connection.create_table(:tasks) do
|
59
|
-
primary_key :id
|
60
|
-
Integer :user_id
|
61
|
-
String :title
|
62
|
-
end
|
63
|
-
```
|
64
|
-
|
65
|
-
## Relations
|
66
|
-
|
67
|
-
``` ruby
|
68
|
-
|
69
|
-
class Users < ROM::Relation[:sql]
|
70
|
-
def by_name(name)
|
71
|
-
where(name: name)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
class Tasks < ROM::Relation[:sql]
|
76
|
-
end
|
77
|
-
|
78
|
-
rom = ROM.finalize.env
|
79
|
-
|
80
|
-
users = rom.relations.users
|
81
|
-
tasks = rom.relations.tasks
|
82
|
-
|
83
|
-
users.insert(id: 1, name: "Piotr")
|
84
|
-
tasks.insert(user_id: 1, title: "Be happy")
|
85
|
-
|
86
|
-
puts rom.relation(:users).by_name("Piotr").to_a.inspect
|
87
|
-
# => [{:id=>1, :name=>"Piotr", :user_id=>1}]
|
88
|
-
```
|
89
|
-
|
90
|
-
## Mapping joins to aggregates
|
91
|
-
|
92
|
-
ROM doesn't have a relationship concept like in ActiveRecord or Sequel. Instead
|
93
|
-
it provides a convenient interface for building joined relations that can be
|
94
|
-
mapped to [aggregate objects](http://martinfowler.com/bliki/Aggregate.html).
|
95
|
-
|
96
|
-
There's no lazy-loading, eager-loading or any other magic happening behind the
|
97
|
-
scenes. You're in full control of how data are fetched from the database and it's
|
98
|
-
an explicit operation.
|
99
|
-
|
100
|
-
Sequel's association DSL is available in relation definitions which enables
|
101
|
-
`association_join` interface inside relations. To map joined results to
|
102
|
-
aggregate objects `wrap` and `group` mapping transformation can be used
|
103
|
-
|
104
|
-
``` ruby
|
105
|
-
ROM.setup(:sql, "sqlite::memory")
|
106
|
-
|
107
|
-
class Users < ROM::Relation[:sql]
|
108
|
-
one_to_many :tasks, key: :user_id
|
109
|
-
|
110
|
-
def by_name(name)
|
111
|
-
where(name: name)
|
112
|
-
end
|
113
|
-
|
114
|
-
def with_tasks
|
115
|
-
association_join(:tasks, select: [:title])
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
class UserMapper < ROM::Mapper
|
120
|
-
relation :users
|
121
|
-
register_as :model
|
122
|
-
|
123
|
-
model name: 'User'
|
124
|
-
|
125
|
-
group tasks: [:title]
|
126
|
-
end
|
127
|
-
|
128
|
-
rom = ROM.finalize.env
|
129
|
-
|
130
|
-
users = rom.relations.users
|
131
|
-
tasks = rom.relations.tasks
|
132
|
-
|
133
|
-
users.insert(id: 1, name: "Piotr")
|
134
|
-
tasks.insert(user_id: 1, title: "Be happy")
|
135
|
-
|
136
|
-
rom.relation(:users).with_tasks.by_name("Piotr").to_a
|
137
|
-
# => [{:id=>1, :name=>"Piotr", :admin=>nil, :title=>"Be happy"}]
|
138
|
-
|
139
|
-
rom.relation(:users).as(:model).with_tasks.by_name("Piotr").to_a
|
140
|
-
# => [#<User:0x007fb31542a098 @id=1, @name="Piotr", @tasks=[{:title=>"Be happy"}]>]
|
141
|
-
```
|
38
|
+
Check out [SQL guide](http://rom-rb.org/guides/adapters/sql/) for usage examples.
|
142
39
|
|
143
40
|
## ROADMAP
|
144
41
|
|
@@ -26,7 +26,11 @@ module ROM
|
|
26
26
|
attributes.to_h
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
if insert_tuples.length > 1
|
30
|
+
multi_insert(insert_tuples)
|
31
|
+
else
|
32
|
+
insert(insert_tuples)
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
private
|
@@ -39,6 +43,14 @@ module ROM
|
|
39
43
|
relation.where(relation.primary_key => pks)
|
40
44
|
end
|
41
45
|
|
46
|
+
# Executes multi_insert statement and returns inserted tuples
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
def multi_insert(tuples)
|
50
|
+
pks = relation.multi_insert(tuples, return: :primary_key)
|
51
|
+
relation.where(relation.primary_key => pks).to_a
|
52
|
+
end
|
53
|
+
|
42
54
|
# Yields tuples for insertion or return an enumerator
|
43
55
|
#
|
44
56
|
# @api private
|
data/lib/rom/sql/relation.rb
CHANGED
@@ -348,6 +348,20 @@ module ROM
|
|
348
348
|
dataset.insert(*args, &block)
|
349
349
|
end
|
350
350
|
|
351
|
+
# Multi insert tuples into relation
|
352
|
+
#
|
353
|
+
# @example
|
354
|
+
# users.multi_insert([{name: 'Jane'}, {name: 'Jack'}])
|
355
|
+
#
|
356
|
+
# @param [Array] tuples
|
357
|
+
#
|
358
|
+
# @return [Relation]
|
359
|
+
#
|
360
|
+
# @api public
|
361
|
+
def multi_insert(*args, &block)
|
362
|
+
dataset.multi_insert(*args, &block)
|
363
|
+
end
|
364
|
+
|
351
365
|
# Update tuples in the relation
|
352
366
|
#
|
353
367
|
# @example
|
@@ -97,12 +97,12 @@ module ROM
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def graph_join_other(name, assoc, type, join_type, options)
|
100
|
-
key
|
100
|
+
key = assoc[:key]
|
101
101
|
on_conditions = assoc[:on] || {}
|
102
102
|
|
103
103
|
join_keys =
|
104
104
|
if type == :many_to_one
|
105
|
-
{ primary_key => key }
|
105
|
+
{ assoc[:class].primary_key => key }
|
106
106
|
else
|
107
107
|
{ key => primary_key }
|
108
108
|
end.merge(on_conditions)
|
@@ -88,9 +88,7 @@ module ROM
|
|
88
88
|
#
|
89
89
|
# @api public
|
90
90
|
def many_to_one(name, options = {})
|
91
|
-
|
92
|
-
new_options = options.merge(relation: relation_name)
|
93
|
-
associations << [__method__, name, new_options]
|
91
|
+
associations << [__method__, name, { relation: name }.merge(options)]
|
94
92
|
end
|
95
93
|
|
96
94
|
# Finalize the relation by setting up its associations (if any)
|
data/lib/rom/sql/version.rb
CHANGED
@@ -51,6 +51,16 @@ describe 'Commands / Create' do
|
|
51
51
|
expect(result.value).to eq(id: 1, name: 'Jane')
|
52
52
|
end
|
53
53
|
|
54
|
+
it 'creates multiple records if nothing was raised' do
|
55
|
+
result = users.create.transaction {
|
56
|
+
users.create_many.call([{name: 'Jane'}, {name: 'Jack'}])
|
57
|
+
}
|
58
|
+
|
59
|
+
expect(result.value).to match_array([
|
60
|
+
{ id: 1, name: 'Jane' }, { id: 2, name: 'Jack' }
|
61
|
+
])
|
62
|
+
end
|
63
|
+
|
54
64
|
it 'allows for nested transactions' do
|
55
65
|
result = users.create.transaction {
|
56
66
|
users.create.transaction {
|
@@ -43,4 +43,18 @@ describe 'Defining many-to-one association' do
|
|
43
43
|
[{ id: 1, title: 'Finish ROM', user: { name: 'Piotr' } }]
|
44
44
|
)
|
45
45
|
end
|
46
|
+
|
47
|
+
it "joins on specified key" do
|
48
|
+
setup.relation(:task_tags) do
|
49
|
+
many_to_one :tags, key: :tag_id
|
50
|
+
|
51
|
+
def with_tags
|
52
|
+
association_left_join(:tags)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
expect(rom.relation(:task_tags).with_tags.to_a).to eq(
|
57
|
+
[{ tag_id: 1, task_id: 1, id: 1, name: "important" }]
|
58
|
+
)
|
59
|
+
end
|
46
60
|
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: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|