rom-sql 3.6.4 → 4.0.0.alpha1
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 +11 -48
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/lib/rom/plugins/relation/sql/auto_restrictions.rb +11 -10
- data/lib/rom/plugins/relation/sql/default_views.rb +75 -0
- data/lib/rom/plugins/relation/sql/instrumentation.rb +8 -13
- data/lib/rom/plugins/relation/sql/postgres/explain.rb +4 -4
- data/lib/rom/plugins/relation/sql/postgres/full_text_search.rb +18 -16
- data/lib/rom/plugins/relation/sql/postgres/streaming.rb +12 -9
- data/lib/rom/sql/associations/many_to_many.rb +7 -7
- data/lib/rom/sql/associations/many_to_one.rb +3 -3
- data/lib/rom/sql/associations/one_to_many.rb +3 -3
- data/lib/rom/sql/associations/one_to_one.rb +1 -1
- data/lib/rom/sql/associations/one_to_one_through.rb +1 -1
- data/lib/rom/sql/associations/self_ref.rb +1 -1
- data/lib/rom/sql/associations.rb +5 -5
- data/lib/rom/sql/attribute.rb +9 -9
- data/lib/rom/sql/attribute_aliasing.rb +2 -3
- data/lib/rom/sql/commands/create.rb +5 -4
- data/lib/rom/sql/commands/delete.rb +2 -2
- data/lib/rom/sql/commands/update.rb +5 -4
- data/lib/rom/sql/commands.rb +4 -4
- data/lib/rom/sql/dsl.rb +3 -3
- data/lib/rom/sql/errors.rb +3 -3
- data/lib/rom/sql/extensions/active_support_notifications.rb +4 -4
- data/lib/rom/sql/extensions/mysql/type_builder.rb +5 -5
- data/lib/rom/sql/extensions/mysql.rb +1 -1
- data/lib/rom/sql/extensions/postgres/commands.rb +13 -31
- data/lib/rom/sql/extensions/postgres/type_builder.rb +28 -31
- data/lib/rom/sql/extensions/postgres/type_serializer.rb +24 -25
- data/lib/rom/sql/extensions/postgres/types/array.rb +4 -4
- data/lib/rom/sql/extensions/postgres/types/array_types.rb +1 -1
- data/lib/rom/sql/extensions/postgres/types/geometric.rb +27 -27
- data/lib/rom/sql/extensions/postgres/types/json.rb +9 -9
- data/lib/rom/sql/extensions/postgres/types/ltree.rb +61 -34
- data/lib/rom/sql/extensions/postgres/types/network.rb +4 -17
- data/lib/rom/sql/extensions/postgres/types/range.rb +25 -25
- data/lib/rom/sql/extensions/postgres/types.rb +14 -14
- data/lib/rom/sql/extensions/postgres.rb +6 -6
- data/lib/rom/sql/extensions/rails_log_subscriber.rb +6 -21
- data/lib/rom/sql/extensions/sqlite/types.rb +1 -1
- data/lib/rom/sql/extensions/sqlite.rb +2 -2
- data/lib/rom/sql/extensions.rb +6 -6
- data/lib/rom/sql/foreign_key.rb +3 -1
- data/lib/rom/sql/function.rb +18 -22
- data/lib/rom/sql/gateway.rb +44 -17
- data/lib/rom/sql/group_dsl.rb +1 -1
- data/lib/rom/sql/index.rb +2 -0
- data/lib/rom/sql/join_dsl.rb +1 -1
- data/lib/rom/sql/mapper_compiler.rb +2 -2
- data/lib/rom/sql/migration/migrator.rb +11 -11
- data/lib/rom/sql/migration/runner.rb +3 -3
- data/lib/rom/sql/migration/schema_diff.rb +7 -8
- data/lib/rom/sql/migration/writer.rb +12 -12
- data/lib/rom/sql/migration.rb +4 -8
- data/lib/rom/sql/order_dsl.rb +1 -1
- data/lib/rom/sql/plugin/associates.rb +49 -11
- data/lib/rom/sql/plugin/pagination.rb +5 -3
- data/lib/rom/sql/plugin/schema_indexes.rb +35 -0
- data/lib/rom/sql/plugins.rb +9 -6
- data/lib/rom/sql/projection_dsl.rb +4 -4
- data/lib/rom/sql/rake_task.rb +2 -2
- data/lib/rom/sql/relation/reading.rb +34 -27
- data/lib/rom/sql/relation/writing.rb +11 -10
- data/lib/rom/sql/relation.rb +57 -89
- data/lib/rom/sql/restriction_dsl.rb +2 -2
- data/lib/rom/sql/schema/attributes_inferrer.rb +3 -3
- data/lib/rom/sql/schema/dsl.rb +4 -2
- data/lib/rom/sql/schema/index_dsl.rb +3 -5
- data/lib/rom/sql/schema/inferrer.rb +25 -23
- data/lib/rom/sql/schema/type_builder.rb +2 -2
- data/lib/rom/sql/schema.rb +9 -21
- data/lib/rom/sql/spec/support.rb +5 -5
- data/lib/rom/sql/tasks/migration_tasks.rake +13 -21
- data/lib/rom/sql/transaction.rb +4 -2
- data/lib/rom/sql/type_extensions.rb +3 -1
- data/lib/rom/sql/type_serializer.rb +10 -10
- data/lib/rom/sql/types.rb +4 -4
- data/lib/rom/sql/version.rb +1 -1
- data/lib/rom/sql/wrap.rb +1 -1
- data/lib/rom/sql.rb +13 -12
- data/lib/rom/types/values.rb +2 -2
- data/lib/rom-sql.rb +1 -1
- metadata +13 -17
data/lib/rom/sql/gateway.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "logger"
|
4
|
+
require "sequel/core"
|
5
5
|
|
6
|
-
require
|
6
|
+
require "dry/core/constants"
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
8
|
+
require "rom/setup"
|
9
|
+
require "rom/types"
|
10
|
+
require "rom/gateway"
|
11
|
+
require "rom/sql/migration"
|
12
|
+
require "rom/sql/commands"
|
13
|
+
require "rom/sql/transaction"
|
14
|
+
require "rom/support/notifications"
|
13
15
|
|
14
16
|
module ROM
|
15
17
|
module SQL
|
@@ -17,6 +19,8 @@ module ROM
|
|
17
19
|
#
|
18
20
|
# @api public
|
19
21
|
class Gateway < ROM::Gateway
|
22
|
+
extend Notifications
|
23
|
+
|
20
24
|
include Dry::Core::Constants
|
21
25
|
include Migration
|
22
26
|
|
@@ -81,13 +85,18 @@ module ROM
|
|
81
85
|
def initialize(uri, options = EMPTY_HASH)
|
82
86
|
@connection = connect(uri, options)
|
83
87
|
load_extensions(Array(options[:extensions]))
|
84
|
-
|
88
|
+
notifications.trigger("sql.gateway.connected", connection: @connection)
|
85
89
|
|
86
90
|
@options = options
|
87
91
|
|
88
92
|
super
|
89
93
|
end
|
90
94
|
|
95
|
+
# @api private
|
96
|
+
def notifications
|
97
|
+
@notifications ||= Notifications.event_bus(:sql)
|
98
|
+
end
|
99
|
+
|
91
100
|
# Disconnect from the gateway's database
|
92
101
|
#
|
93
102
|
# @api public
|
@@ -152,15 +161,15 @@ module ROM
|
|
152
161
|
# Create a table using the configured connection
|
153
162
|
#
|
154
163
|
# @api public
|
155
|
-
def create_table(
|
156
|
-
connection.create_table(
|
164
|
+
def create_table(...)
|
165
|
+
connection.create_table(...)
|
157
166
|
end
|
158
167
|
|
159
168
|
# Drops a table
|
160
169
|
#
|
161
170
|
# @api public
|
162
|
-
def drop_table(
|
163
|
-
connection.drop_table(
|
171
|
+
def drop_table(...)
|
172
|
+
connection.drop_table(...)
|
164
173
|
end
|
165
174
|
|
166
175
|
# Returns a list of datasets inferred from table names
|
@@ -205,6 +214,26 @@ module ROM
|
|
205
214
|
connection.run(statement)
|
206
215
|
end
|
207
216
|
|
217
|
+
# Build an SQL-specific command
|
218
|
+
#
|
219
|
+
# @return [Command]
|
220
|
+
#
|
221
|
+
# @api public
|
222
|
+
def command(klass, relation:, **opts)
|
223
|
+
return super unless relation.dataset.db.database_type == :postgres
|
224
|
+
|
225
|
+
ext =
|
226
|
+
if klass < Commands::Create
|
227
|
+
Postgres::Commands::Create
|
228
|
+
elsif klass < Commands::Update
|
229
|
+
Postgres::Commands::Update
|
230
|
+
end
|
231
|
+
|
232
|
+
klass.include(ext) if ext
|
233
|
+
|
234
|
+
super
|
235
|
+
end
|
236
|
+
|
208
237
|
private
|
209
238
|
|
210
239
|
# Connect to database or reuse established connection instance
|
@@ -236,18 +265,16 @@ module ROM
|
|
236
265
|
|
237
266
|
# this will be default in Sequel 5.0.0 and since we don't rely
|
238
267
|
# on dataset mutation it is safe to enable it already
|
239
|
-
connection.extension(:freeze_datasets) unless RUBY_ENGINE ==
|
268
|
+
connection.extension(:freeze_datasets) unless RUBY_ENGINE == "rbx"
|
240
269
|
|
241
270
|
# for ROM::SQL::Relation#nullify
|
242
271
|
connection.extension(:null_dataset)
|
243
272
|
end
|
244
273
|
|
245
274
|
# @api private
|
246
|
-
def transaction_runner(
|
275
|
+
def transaction_runner(**)
|
247
276
|
ROM::SQL::Transaction.new(connection)
|
248
277
|
end
|
249
278
|
end
|
250
279
|
end
|
251
|
-
|
252
|
-
Configuration.register_event("configuration.gateway.connected")
|
253
280
|
end
|
data/lib/rom/sql/group_dsl.rb
CHANGED
data/lib/rom/sql/index.rb
CHANGED
data/lib/rom/sql/join_dsl.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/mapper_compiler"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
@@ -9,7 +9,7 @@ module ROM
|
|
9
9
|
name, _, meta_options = node
|
10
10
|
|
11
11
|
if meta_options[:wrapped]
|
12
|
-
[extract_wrapped_name(node), from: meta_options[:alias]]
|
12
|
+
[extract_wrapped_name(node), {from: meta_options[:alias]}]
|
13
13
|
else
|
14
14
|
[name]
|
15
15
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "pathname"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "rom/types"
|
6
|
+
require "rom/initializer"
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
8
|
+
require "rom/sql/migration/runner"
|
9
|
+
require "rom/sql/migration/inline_runner"
|
10
|
+
require "rom/sql/migration/writer"
|
11
11
|
|
12
12
|
module ROM
|
13
13
|
module SQL
|
@@ -16,8 +16,8 @@ module ROM
|
|
16
16
|
class Migrator
|
17
17
|
extend Initializer
|
18
18
|
|
19
|
-
DEFAULT_PATH =
|
20
|
-
VERSION_FORMAT =
|
19
|
+
DEFAULT_PATH = "db/migrate"
|
20
|
+
VERSION_FORMAT = "%Y%m%d%H%M%S"
|
21
21
|
DEFAULT_INFERRER = Schema::Inferrer.new.suppress_errors.freeze
|
22
22
|
|
23
23
|
param :connection
|
@@ -43,8 +43,8 @@ module ROM
|
|
43
43
|
|
44
44
|
# @api private
|
45
45
|
def create_file(name, version = generate_version, **options)
|
46
|
-
sequence = options[:sequence] ?
|
47
|
-
filename = "#{
|
46
|
+
sequence = options[:sequence] ? "%03d" % options[:sequence] : nil
|
47
|
+
filename = "#{version}#{sequence}_#{name}.rb"
|
48
48
|
content = options[:content] || migration_file_content
|
49
49
|
path = options[:path] || self.path
|
50
50
|
dirname = Pathname(path)
|
@@ -63,7 +63,7 @@ module ROM
|
|
63
63
|
|
64
64
|
# @api private
|
65
65
|
def migration_file_content
|
66
|
-
File.read(Pathname(__FILE__).dirname.join(
|
66
|
+
File.read(Pathname(__FILE__).dirname.join("template.rb").realpath)
|
67
67
|
end
|
68
68
|
|
69
69
|
# @api private
|
@@ -54,6 +54,7 @@ module ROM
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
# rubocop:disable Metrics/AbcSize
|
57
58
|
def alter_table(diff)
|
58
59
|
return if diff.meta?
|
59
60
|
|
@@ -68,9 +69,7 @@ module ROM
|
|
68
69
|
when SchemaDiff::AttributeChanged
|
69
70
|
if attribute.type_changed?
|
70
71
|
from, to = attribute.current.unwrap, attribute.target.unwrap
|
71
|
-
raise UnsupportedConversion.
|
72
|
-
"Don't know how to convert #{from.inspect} to #{to.inspect}"
|
73
|
-
)
|
72
|
+
raise UnsupportedConversion, "Don't know how to convert #{from.inspect} to #{to.inspect}"
|
74
73
|
end
|
75
74
|
|
76
75
|
if attribute.nullability_changed?
|
@@ -94,6 +93,7 @@ module ROM
|
|
94
93
|
end
|
95
94
|
end
|
96
95
|
end
|
96
|
+
# rubocop:enable Metrics/AbcSize
|
97
97
|
|
98
98
|
def alter_foreign_keys(diff, foreign_key_changes)
|
99
99
|
return if foreign_key_changes.empty?
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/sql/type_serializer"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
@@ -46,7 +46,6 @@ module ROM
|
|
46
46
|
end
|
47
47
|
|
48
48
|
class TableAltered < TableDiff
|
49
|
-
|
50
49
|
option :attribute_changes, default: -> { EMPTY_ARRAY }
|
51
50
|
|
52
51
|
option :index_changes, default: -> { EMPTY_ARRAY }
|
@@ -135,10 +134,10 @@ module ROM
|
|
135
134
|
class IndexAdded < IndexDiff
|
136
135
|
def options
|
137
136
|
options = {}
|
138
|
-
options[:name] = index.name
|
137
|
+
options[:name] = index.name unless index.name.nil?
|
139
138
|
options[:unique] = true if index.unique?
|
140
|
-
options[:type] = index.type
|
141
|
-
options[:where] = index.predicate
|
139
|
+
options[:type] = index.type unless index.type.nil?
|
140
|
+
options[:where] = index.predicate unless index.predicate.nil?
|
142
141
|
options
|
143
142
|
end
|
144
143
|
end
|
@@ -146,7 +145,7 @@ module ROM
|
|
146
145
|
class IndexRemoved < IndexDiff
|
147
146
|
def options
|
148
147
|
options = {}
|
149
|
-
options[:name] = index.name
|
148
|
+
options[:name] = index.name unless index.name.nil?
|
150
149
|
options
|
151
150
|
end
|
152
151
|
end
|
@@ -210,8 +209,8 @@ module ROM
|
|
210
209
|
}.map { |name, target_attr|
|
211
210
|
[name, [target_attr, current[name]]]
|
212
211
|
}.to_h
|
213
|
-
added_attributes = target.
|
214
|
-
removed_attributes = current.
|
212
|
+
added_attributes = target.reject { |name, _| current.key?(name) }
|
213
|
+
removed_attributes = current.reject { |name, _| target.key?(name) }
|
215
214
|
|
216
215
|
map_attributes(removed_attributes, AttributeRemoved) +
|
217
216
|
map_attributes(added_attributes, AttributeAdded) +
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/sql/migration/recorder"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
7
7
|
module Migration
|
8
8
|
# @api private
|
9
9
|
class Writer
|
10
|
-
MIGRATION_BEGIN = "ROM::SQL.migration do\n change do"
|
11
|
-
MIGRATION_END = "\n end\nend\n"
|
10
|
+
MIGRATION_BEGIN = "ROM::SQL.migration do\n change do"
|
11
|
+
MIGRATION_END = "\n end\nend\n"
|
12
12
|
|
13
13
|
attr_reader :yield_migration
|
14
14
|
|
@@ -33,14 +33,14 @@ module ROM
|
|
33
33
|
def write(operations, buffer, indent)
|
34
34
|
operations.each do |operation|
|
35
35
|
op, args, nested = operation
|
36
|
-
buffer << indent << op.to_s <<
|
36
|
+
buffer << indent << op.to_s << " "
|
37
37
|
write_arguments(buffer, args)
|
38
38
|
|
39
|
-
if
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
39
|
+
next if nested.empty?
|
40
|
+
|
41
|
+
buffer << " do"
|
42
|
+
write(nested, buffer, indent + " ")
|
43
|
+
buffer << indent << "end"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -51,9 +51,9 @@ module ROM
|
|
51
51
|
options = EMPTY_HASH
|
52
52
|
end
|
53
53
|
|
54
|
-
buffer << args.map(&:inspect).join(
|
54
|
+
buffer << args.map(&:inspect).join(", ")
|
55
55
|
options.each do |key, value|
|
56
|
-
buffer <<
|
56
|
+
buffer << ", " << key.to_s << ": " << value.inspect
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -61,7 +61,7 @@ module ROM
|
|
61
61
|
create_or_alter, args = op
|
62
62
|
table_name = args[0]
|
63
63
|
|
64
|
-
"#{create_or_alter.to_s.sub(
|
64
|
+
"#{create_or_alter.to_s.sub("_table", "")}_#{table_name}"
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
data/lib/rom/sql/migration.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rom/sql/migration/migrator"
|
4
|
+
require "rom/sql/migration/schema_diff"
|
5
5
|
|
6
6
|
module ROM
|
7
7
|
module SQL
|
@@ -141,12 +141,8 @@ module ROM
|
|
141
141
|
end
|
142
142
|
|
143
143
|
# @api public
|
144
|
-
def auto_migrate!(
|
145
|
-
|
146
|
-
klass.schema_proc.call.finalize_attributes!(gateway: self)
|
147
|
-
end
|
148
|
-
|
149
|
-
migrator.auto_migrate!(self, schemas, options)
|
144
|
+
def auto_migrate!(setup, options = EMPTY_HASH)
|
145
|
+
migrator.auto_migrate!(self, setup.registry.relations.map(&:schema), options)
|
150
146
|
end
|
151
147
|
|
152
148
|
private
|
data/lib/rom/sql/order_dsl.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rom/sql/associations"
|
4
4
|
|
5
5
|
module ROM
|
6
6
|
module SQL
|
@@ -16,7 +16,7 @@ module ROM
|
|
16
16
|
def initialize(name, relation, opts)
|
17
17
|
@name = name
|
18
18
|
@assoc = relation.associations[name]
|
19
|
-
@opts = {
|
19
|
+
@opts = {assoc: assoc, keys: assoc.join_keys}
|
20
20
|
@opts.update(parent: opts[:parent]) if opts[:parent]
|
21
21
|
end
|
22
22
|
|
@@ -25,7 +25,7 @@ module ROM
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def to_hash
|
28
|
-
{
|
28
|
+
{associate: opts}
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -35,11 +35,10 @@ module ROM
|
|
35
35
|
extend ClassMethods
|
36
36
|
include InstanceMethods
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
associations Hash.new
|
38
|
+
setting :associations, default: {}, reader: true
|
41
39
|
|
42
40
|
option :associations, default: -> { self.class.associations }
|
41
|
+
|
43
42
|
option :configured_associations, default: -> { EMPTY_ARRAY }
|
44
43
|
end
|
45
44
|
super
|
@@ -47,6 +46,39 @@ module ROM
|
|
47
46
|
|
48
47
|
# @api public
|
49
48
|
module ClassMethods
|
49
|
+
# @api private
|
50
|
+
def create_class(relation:, rel_meta: {}, parent_relation: nil, **, &block)
|
51
|
+
klass = super
|
52
|
+
|
53
|
+
if relation && rel_meta[:combine_type]
|
54
|
+
setup_associates(klass, relation, parent_relation)
|
55
|
+
end
|
56
|
+
|
57
|
+
klass
|
58
|
+
end
|
59
|
+
|
60
|
+
# Sets up `associates` plugin for a given command class and relation
|
61
|
+
#
|
62
|
+
# @param [Class] klass The command class
|
63
|
+
# @param [Relation] relation The relation for the command
|
64
|
+
#
|
65
|
+
# @api private
|
66
|
+
def setup_associates(klass, relation, parent_relation)
|
67
|
+
assoc_name =
|
68
|
+
if relation.associations.key?(parent_relation)
|
69
|
+
parent_relation
|
70
|
+
else
|
71
|
+
singular_name = relation.inflector.singularize(parent_relation).to_sym
|
72
|
+
singular_name if relation.associations.key?(singular_name)
|
73
|
+
end
|
74
|
+
|
75
|
+
if assoc_name
|
76
|
+
klass.associates(assoc_name)
|
77
|
+
else
|
78
|
+
klass.associates(parent_relation)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
50
82
|
# @see ROM::Command::ClassInterface.build
|
51
83
|
#
|
52
84
|
# @api public
|
@@ -57,16 +89,17 @@ module ROM
|
|
57
89
|
|
58
90
|
associate_options = command.associations.map { |(name, opts)|
|
59
91
|
next if configured_assocs.include?(name)
|
92
|
+
|
60
93
|
AssociateOptions.new(name, relation, opts)
|
61
94
|
}.compact
|
62
95
|
|
63
96
|
before_hooks = associate_options.reject(&:after?).map(&:to_hash)
|
64
97
|
after_hooks = associate_options.select(&:after?).map(&:to_hash)
|
65
98
|
|
66
|
-
command
|
67
|
-
with(configured_associations: configured_assocs + associate_options.map(&:name))
|
68
|
-
before(*before_hooks)
|
69
|
-
after(*after_hooks)
|
99
|
+
command
|
100
|
+
.with(configured_associations: configured_assocs + associate_options.map(&:name))
|
101
|
+
.before(*before_hooks)
|
102
|
+
.after(*after_hooks)
|
70
103
|
end
|
71
104
|
|
72
105
|
# Set command to associate tuples with a parent tuple using provided keys
|
@@ -96,7 +129,9 @@ module ROM
|
|
96
129
|
"#{name} association is already defined for #{self.class}"
|
97
130
|
end
|
98
131
|
|
99
|
-
associations
|
132
|
+
associations[name] = options
|
133
|
+
|
134
|
+
self
|
100
135
|
end
|
101
136
|
end
|
102
137
|
|
@@ -109,6 +144,8 @@ module ROM
|
|
109
144
|
# @return [Array<Hash>]
|
110
145
|
#
|
111
146
|
# @api public
|
147
|
+
#
|
148
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
112
149
|
def associate(tuples, curried_parent = nil, assoc:, keys:, parent: curried_parent)
|
113
150
|
result_type = result
|
114
151
|
|
@@ -137,6 +174,7 @@ module ROM
|
|
137
174
|
|
138
175
|
result_type == :one ? output_tuples[0] : output_tuples
|
139
176
|
end
|
177
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
140
178
|
|
141
179
|
# Return a new command with the provided association
|
142
180
|
#
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/core/equalizer"
|
4
|
+
|
5
|
+
require "rom/initializer"
|
4
6
|
|
5
7
|
module ROM
|
6
8
|
module SQL
|
@@ -53,7 +55,7 @@ module ROM
|
|
53
55
|
# @api public
|
54
56
|
def prev_page
|
55
57
|
num = current_page - 1
|
56
|
-
num if num
|
58
|
+
num if num.positive?
|
57
59
|
end
|
58
60
|
|
59
61
|
# Return total number of tuples
|
@@ -100,7 +102,7 @@ module ROM
|
|
100
102
|
per_page = per_page.to_i
|
101
103
|
|
102
104
|
self.class.new(
|
103
|
-
dataset.offset((current_page-1)*per_page).limit(per_page),
|
105
|
+
dataset.offset((current_page - 1) * per_page).limit(per_page),
|
104
106
|
current_page: current_page, per_page: per_page
|
105
107
|
)
|
106
108
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/effects"
|
4
|
+
require "rom/sql/schema/index_dsl"
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module SQL
|
8
|
+
module Plugin
|
9
|
+
module SchemaIndexes
|
10
|
+
# @api public
|
11
|
+
module DSL
|
12
|
+
# Define indexes within a block
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
def indexes(&block)
|
16
|
+
index_dsl.instance_eval(&block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
def configure
|
21
|
+
super
|
22
|
+
config.options.update(indexes: index_dsl.(config.id, attributes.values))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# @api private
|
28
|
+
def index_dsl
|
29
|
+
@index_dsl ||= Schema::IndexDSL.new(attr_class: config.attr_class)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/rom/sql/plugins.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rom/plugins/relation/sql/instrumentation"
|
4
|
+
require "rom/plugins/relation/sql/default_views"
|
5
|
+
require "rom/plugins/relation/sql/auto_restrictions"
|
5
6
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "rom/sql/plugin/associates"
|
8
|
+
require "rom/sql/plugin/nullify"
|
9
|
+
require "rom/sql/plugin/pagination"
|
10
|
+
require "rom/sql/plugin/schema_indexes"
|
9
11
|
|
10
12
|
ROM.plugins do
|
11
|
-
adapter
|
13
|
+
adapter(:sql) do
|
12
14
|
register :nullify, ROM::SQL::Plugin::Nullify, type: :relation
|
13
15
|
register :pagination, ROM::SQL::Plugin::Pagination, type: :relation
|
14
16
|
register :associates, ROM::SQL::Plugin::Associates, type: :command
|
17
|
+
register :indexes, ROM::SQL::Plugin::SchemaIndexes, type: :schema
|
15
18
|
end
|
16
19
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rom/sql/dsl"
|
4
|
+
require "rom/sql/function"
|
5
5
|
|
6
6
|
module ROM
|
7
7
|
module SQL
|
@@ -37,7 +37,7 @@ module ROM
|
|
37
37
|
#
|
38
38
|
# @api public
|
39
39
|
def function(name, *attrs)
|
40
|
-
::ROM::SQL::Function.new(::ROM::Types::Any
|
40
|
+
::ROM::SQL::Function.new(::ROM::Types::Any, schema: schema).public_send(name, *attrs)
|
41
41
|
end
|
42
42
|
alias_method :f, :function
|
43
43
|
|
@@ -57,7 +57,7 @@ module ROM
|
|
57
57
|
|
58
58
|
if type
|
59
59
|
if args.empty?
|
60
|
-
::ROM::SQL::Function.new(type
|
60
|
+
::ROM::SQL::Function.new(type, schema: schema)
|
61
61
|
else
|
62
62
|
::ROM::SQL::Attribute[type].value(args[0])
|
63
63
|
end
|
data/lib/rom/sql/rake_task.rb
CHANGED