sequel 5.50.0 → 5.51.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/CHANGELOG +14 -0
- data/README.rdoc +5 -4
- data/doc/release_notes/5.51.0.txt +47 -0
- data/lib/sequel/adapters/shared/mysql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +33 -1
- data/lib/sequel/dataset/query.rb +42 -1
- data/lib/sequel/dataset/sql.rb +9 -5
- data/lib/sequel/model/associations.rb +2 -0
- data/lib/sequel/plugins/lazy_attributes.rb +1 -0
- data/lib/sequel/plugins/tactical_eager_loading.rb +8 -2
- data/lib/sequel/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebee8a266be02f6ba3c1d5d340b606336dbb0fb74beb4b4333eb3c930cd59b5c
|
4
|
+
data.tar.gz: f657a1aaedf3e0ef8f644097ee94760dfb04381730dd0c6f0a53c57e3f2bc742
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a0aac448e73636a0c20e5e4d87d65ac648a56bb4267034c5b92fdf2cf297aeeaff408dc4e79c6fe05bdd113e22824a5d7bc7a5b236b44346cda6ed427a377c1
|
7
|
+
data.tar.gz: d99a2b488a0735ba9012e4dfcaae30bec76fce1e7d3c34a14be9395241432a3d00ec5fa7a22df371810adf734e0c39230d212934f10a7d39c5839e58231d6625
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
=== 5.51.0 (2021-12-01)
|
2
|
+
|
3
|
+
* Make eager loading via tactical_eager_loading no longer modify objects who already have a cached value for the association (jeremyevans)
|
4
|
+
|
5
|
+
* Make association cloning handle cases where clone association sets different :class option than cloned association (jeremyevans)
|
6
|
+
|
7
|
+
* Make column schema entries on MySQL include an :extra entry for the Extra column in DESCRIBE output (bschmeck) (#1791)
|
8
|
+
|
9
|
+
* Update mock PostgreSQL adapter to default to PostgreSQL 14 instead of PostgreSQL 9.5 (jeremyevans)
|
10
|
+
|
11
|
+
* Support Dataset#with_recursive :search and :cycle options on PostgreSQL 14+ for result ordering and cycle detection (jeremyevans)
|
12
|
+
|
13
|
+
* Avoid method redefined verbose mode warnings in lazy_attributes plugin (jeremyevans)
|
14
|
+
|
1
15
|
=== 5.50.0 (2021-11-01)
|
2
16
|
|
3
17
|
* Make Migrator :allow_missing_migration_files also allow down migrations where the current database version is greater than the last migration file version (francisconeves97) (#1789)
|
data/README.rdoc
CHANGED
@@ -17,11 +17,12 @@ toolkit for Ruby.
|
|
17
17
|
|
18
18
|
== Resources
|
19
19
|
|
20
|
-
Website ::
|
21
|
-
RDoc Documentation ::
|
20
|
+
Website :: https://sequel.jeremyevans.net
|
21
|
+
RDoc Documentation :: https://sequel.jeremyevans.net/rdoc
|
22
22
|
Source Code :: https://github.com/jeremyevans/sequel
|
23
|
-
Bug tracking (GitHub Issues) ::
|
24
|
-
Discussion Forum (
|
23
|
+
Bug tracking (GitHub Issues) :: https://github.com/jeremyevans/sequel/issues
|
24
|
+
Discussion Forum (GitHub Discussions) :: https://github.com/jeremyevans/sequel/discussions
|
25
|
+
Alternate Discussion Forum (sequel-talk Google Group) :: http://groups.google.com/group/sequel-talk
|
25
26
|
|
26
27
|
If you have questions about how to use Sequel, please ask on the
|
27
28
|
sequel-talk Google Group. Only use the the bug tracker to report
|
@@ -0,0 +1,47 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* On PostgreSQL 14+, Dataset#with_recursive now supports :search and
|
4
|
+
:cycle options for result ordering and cycle detection. These use
|
5
|
+
the SEARCH and CYCLE clauses added in PostgreSQL 14:
|
6
|
+
|
7
|
+
DB[:t].with_recursive(:t,
|
8
|
+
DB[:i1].where(parent_id: nil),
|
9
|
+
DB[:i1].join(:t, id: :parent_id).select_all(:i1),
|
10
|
+
search: {by: :id, type: :breadth},
|
11
|
+
cycle: {columns: :id, cycle_value: 1, noncycle_value: 2})
|
12
|
+
|
13
|
+
# WITH RECURSIVE t AS (
|
14
|
+
# SELECT * FROM i1 WHERE (parent_id IS NULL)
|
15
|
+
# UNION ALL
|
16
|
+
# (SELECT i1.* FROM i1 INNER JOIN t ON (t.id = i1.parent_id))
|
17
|
+
# )
|
18
|
+
# SEARCH BREADTH FIRST BY id SET ordercol
|
19
|
+
# CYCLE id SET is_cycle TO 1 DEFAULT 2 USING path
|
20
|
+
|
21
|
+
* On MySQL, column schema hashes now contain an :extra entry, which
|
22
|
+
contains the Extra string returned in MySQL's DESCRIBE results
|
23
|
+
for the column.
|
24
|
+
|
25
|
+
= Other Improvements
|
26
|
+
|
27
|
+
* When eager loading via the tactical_eager_loading plugin, objects
|
28
|
+
that already have an association loaded will not have it reloaded
|
29
|
+
unless the :eager_reload option is given.
|
30
|
+
|
31
|
+
* When cloning an association and using a different :class option
|
32
|
+
than the cloned association, the :class option given when cloning
|
33
|
+
will now take precedence over the :class option for the cloned
|
34
|
+
association.
|
35
|
+
|
36
|
+
* When using the mock postgres adapter, the adapter defaults to
|
37
|
+
supporting PostgreSQL 14 (previously, it defaulted to supporting
|
38
|
+
PostgreSQL 9.5).
|
39
|
+
|
40
|
+
* Sequel now avoids a method redefined warning in the lazy attributes
|
41
|
+
plugin in verbose warnings mode.
|
42
|
+
|
43
|
+
= Other
|
44
|
+
|
45
|
+
* Sequel's primary discussion forum is now GitHub Discussions. The
|
46
|
+
sequel-talk Google Group is still available for users who would
|
47
|
+
prefer to use that instead.
|
@@ -87,7 +87,7 @@ module Sequel
|
|
87
87
|
|
88
88
|
def self.mock_adapter_setup(db)
|
89
89
|
db.instance_exec do
|
90
|
-
@server_version =
|
90
|
+
@server_version = 140000
|
91
91
|
initialize_postgres_adapter
|
92
92
|
extend(MockAdapterDatabaseMethods)
|
93
93
|
end
|
@@ -2162,6 +2162,38 @@ module Sequel
|
|
2162
2162
|
opts[:with].any?{|w| w[:recursive]} ? "WITH RECURSIVE " : super
|
2163
2163
|
end
|
2164
2164
|
|
2165
|
+
# Support PostgreSQL 14+ CTE SEARCH/CYCLE clauses
|
2166
|
+
def select_with_sql_cte(sql, cte)
|
2167
|
+
super
|
2168
|
+
|
2169
|
+
if search_opts = cte[:search]
|
2170
|
+
sql << if search_opts[:type] == :breadth
|
2171
|
+
" SEARCH BREADTH FIRST BY "
|
2172
|
+
else
|
2173
|
+
" SEARCH DEPTH FIRST BY "
|
2174
|
+
end
|
2175
|
+
|
2176
|
+
identifier_list_append(sql, Array(search_opts[:by]))
|
2177
|
+
sql << " SET "
|
2178
|
+
identifier_append(sql, search_opts[:set] || :ordercol)
|
2179
|
+
end
|
2180
|
+
|
2181
|
+
if cycle_opts = cte[:cycle]
|
2182
|
+
sql << " CYCLE "
|
2183
|
+
identifier_list_append(sql, Array(cycle_opts[:columns]))
|
2184
|
+
sql << " SET "
|
2185
|
+
identifier_append(sql, cycle_opts[:cycle_column] || :is_cycle)
|
2186
|
+
if cycle_opts.has_key?(:cycle_value)
|
2187
|
+
sql << " TO "
|
2188
|
+
literal_append(sql, cycle_opts[:cycle_value])
|
2189
|
+
sql << " DEFAULT "
|
2190
|
+
literal_append(sql, cycle_opts.fetch(:noncycle_value, false))
|
2191
|
+
end
|
2192
|
+
sql << " USING "
|
2193
|
+
identifier_append(sql, cycle_opts[:path_column] || :path)
|
2194
|
+
end
|
2195
|
+
end
|
2196
|
+
|
2165
2197
|
# The version of the database server
|
2166
2198
|
def server_version
|
2167
2199
|
db.server_version(@opts[:server])
|
data/lib/sequel/dataset/query.rb
CHANGED
@@ -1060,6 +1060,7 @@ module Sequel
|
|
1060
1060
|
|
1061
1061
|
# Add a common table expression (CTE) with the given name and a dataset that defines the CTE.
|
1062
1062
|
# A common table expression acts as an inline view for the query.
|
1063
|
+
#
|
1063
1064
|
# Options:
|
1064
1065
|
# :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
|
1065
1066
|
# :recursive :: Specify that this is a recursive CTE
|
@@ -1080,10 +1081,35 @@ module Sequel
|
|
1080
1081
|
|
1081
1082
|
# Add a recursive common table expression (CTE) with the given name, a dataset that
|
1082
1083
|
# defines the nonrecursive part of the CTE, and a dataset that defines the recursive part
|
1083
|
-
# of the CTE.
|
1084
|
+
# of the CTE.
|
1085
|
+
#
|
1086
|
+
# Options:
|
1084
1087
|
# :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
|
1085
1088
|
# :union_all :: Set to false to use UNION instead of UNION ALL combining the nonrecursive and recursive parts.
|
1086
1089
|
#
|
1090
|
+
# PostgreSQL 14+ Options:
|
1091
|
+
# :cycle :: Stop recursive searching when a cycle is detected. Includes two columns in the
|
1092
|
+
# result of the CTE, a cycle column indicating whether a cycle was detected for
|
1093
|
+
# the current row, and a path column for the path traversed to get to the current
|
1094
|
+
# row. If given, must be a hash with the following keys:
|
1095
|
+
# :columns :: (required) The column or array of columns to use to detect a cycle.
|
1096
|
+
# If the value of these columns match columns already traversed, then
|
1097
|
+
# a cycle is detected, and recursive searching will not traverse beyond
|
1098
|
+
# the cycle (the CTE will include the row where the cycle was detected).
|
1099
|
+
# :cycle_column :: The name of the cycle column in the output, defaults to :is_cycle.
|
1100
|
+
# :cycle_value :: The value of the cycle column in the output if the current row was
|
1101
|
+
# detected as a cycle, defaults to true.
|
1102
|
+
# :noncycle_value :: The value of the cycle column in the output if the current row
|
1103
|
+
# was not detected as a cycle, defaults to false. Only respected
|
1104
|
+
# if :cycle_value is given.
|
1105
|
+
# :path_column :: The name of the path column in the output, defaults to :path.
|
1106
|
+
# :search :: Include an order column in the result of the CTE that allows for breadth or
|
1107
|
+
# depth first searching. If given, must be a hash with the following keys:
|
1108
|
+
# :by :: (required) The column or array of columns to search by.
|
1109
|
+
# :order_column :: The name of the order column in the output, defaults to :ordercol.
|
1110
|
+
# :type :: Set to :breadth to use breadth-first searching (depth-first searching
|
1111
|
+
# is the default).
|
1112
|
+
#
|
1087
1113
|
# DB[:t].with_recursive(:t,
|
1088
1114
|
# DB[:i1].select(:id, :parent_id).where(parent_id: nil),
|
1089
1115
|
# DB[:i1].join(:t, id: :parent_id).select(Sequel[:i1][:id], Sequel[:i1][:parent_id]),
|
@@ -1094,6 +1120,21 @@ module Sequel
|
|
1094
1120
|
# # UNION ALL
|
1095
1121
|
# # SELECT i1.id, i1.parent_id FROM i1 INNER JOIN t ON (t.id = i1.parent_id)
|
1096
1122
|
# # ) SELECT * FROM t
|
1123
|
+
#
|
1124
|
+
# DB[:t].with_recursive(:t,
|
1125
|
+
# DB[:i1].where(parent_id: nil),
|
1126
|
+
# DB[:i1].join(:t, id: :parent_id).select_all(:i1),
|
1127
|
+
# search: {by: :id, type: :breadth},
|
1128
|
+
# cycle: {columns: :id, cycle_value: 1, noncycle_value: 2})
|
1129
|
+
#
|
1130
|
+
# # WITH RECURSIVE t AS (
|
1131
|
+
# # SELECT * FROM i1 WHERE (parent_id IS NULL)
|
1132
|
+
# # UNION ALL
|
1133
|
+
# # (SELECT i1.* FROM i1 INNER JOIN t ON (t.id = i1.parent_id))
|
1134
|
+
# # )
|
1135
|
+
# # SEARCH BREADTH FIRST BY id SET ordercol
|
1136
|
+
# # CYCLE id SET is_cycle TO 1 DEFAULT 2 USING path
|
1137
|
+
# # SELECT * FROM t
|
1097
1138
|
def with_recursive(name, nonrecursive, recursive, opts=OPTS)
|
1098
1139
|
raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
|
1099
1140
|
if hoist_cte?(nonrecursive)
|
data/lib/sequel/dataset/sql.rb
CHANGED
@@ -1543,15 +1543,14 @@ module Sequel
|
|
1543
1543
|
|
1544
1544
|
def select_with_sql(sql)
|
1545
1545
|
return unless supports_cte?
|
1546
|
-
|
1547
|
-
return if !
|
1546
|
+
ctes = opts[:with]
|
1547
|
+
return if !ctes || ctes.empty?
|
1548
1548
|
sql << select_with_sql_base
|
1549
1549
|
c = false
|
1550
1550
|
comma = ', '
|
1551
|
-
|
1551
|
+
ctes.each do |cte|
|
1552
1552
|
sql << comma if c
|
1553
|
-
|
1554
|
-
literal_dataset_append(sql, w[:dataset])
|
1553
|
+
select_with_sql_cte(sql, cte)
|
1555
1554
|
c ||= true
|
1556
1555
|
end
|
1557
1556
|
sql << ' '
|
@@ -1564,6 +1563,11 @@ module Sequel
|
|
1564
1563
|
"WITH "
|
1565
1564
|
end
|
1566
1565
|
|
1566
|
+
def select_with_sql_cte(sql, cte)
|
1567
|
+
select_with_sql_prefix(sql, cte)
|
1568
|
+
literal_dataset_append(sql, cte[:dataset])
|
1569
|
+
end
|
1570
|
+
|
1567
1571
|
def select_with_sql_prefix(sql, w)
|
1568
1572
|
quote_identifier_append(sql, w[:name])
|
1569
1573
|
if args = w[:args]
|
@@ -1836,7 +1836,9 @@ module Sequel
|
|
1836
1836
|
|
1837
1837
|
if opts[:clone]
|
1838
1838
|
cloned_assoc = association_reflection(opts[:clone])
|
1839
|
+
remove_class_name = orig_opts[:class] && !orig_opts[:class_name]
|
1839
1840
|
orig_opts = cloned_assoc[:orig_opts].merge(orig_opts)
|
1841
|
+
orig_opts.delete(:class_name) if remove_class_name
|
1840
1842
|
end
|
1841
1843
|
|
1842
1844
|
opts = Hash[default_association_options]
|
@@ -143,9 +143,15 @@ module Sequel
|
|
143
143
|
def load_associated_objects(opts, dynamic_opts=OPTS, &block)
|
144
144
|
dynamic_opts = load_association_objects_options(dynamic_opts, &block)
|
145
145
|
name = opts[:name]
|
146
|
-
|
146
|
+
eager_reload = dynamic_opts[:eager_reload]
|
147
|
+
if (!associations.include?(name) || eager_reload) && opts[:allow_eager] != false && retrieved_by && !frozen? && !dynamic_opts[:callback] && !dynamic_opts[:reload]
|
147
148
|
begin
|
148
|
-
|
149
|
+
objects = if eager_reload
|
150
|
+
retrieved_with.reject(&:frozen?)
|
151
|
+
else
|
152
|
+
retrieved_with.reject{|x| x.frozen? || x.associations.include?(name)}
|
153
|
+
end
|
154
|
+
retrieved_by.send(:eager_load, objects, name=>dynamic_opts[:eager] || OPTS)
|
149
155
|
rescue Sequel::UndefinedAssociation
|
150
156
|
# This can happen if class table inheritance is used and the association
|
151
157
|
# is only defined in a subclass. This particular instance can use the
|
data/lib/sequel/version.rb
CHANGED
@@ -6,7 +6,7 @@ module Sequel
|
|
6
6
|
|
7
7
|
# The minor version of Sequel. Bumped for every non-patch level
|
8
8
|
# release, generally around once a month.
|
9
|
-
MINOR =
|
9
|
+
MINOR = 51
|
10
10
|
|
11
11
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
12
12
|
# releases that fix regressions from previous versions.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.51.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -195,6 +195,7 @@ extra_rdoc_files:
|
|
195
195
|
- doc/release_notes/5.49.0.txt
|
196
196
|
- doc/release_notes/5.5.0.txt
|
197
197
|
- doc/release_notes/5.50.0.txt
|
198
|
+
- doc/release_notes/5.51.0.txt
|
198
199
|
- doc/release_notes/5.6.0.txt
|
199
200
|
- doc/release_notes/5.7.0.txt
|
200
201
|
- doc/release_notes/5.8.0.txt
|
@@ -273,6 +274,7 @@ files:
|
|
273
274
|
- doc/release_notes/5.49.0.txt
|
274
275
|
- doc/release_notes/5.5.0.txt
|
275
276
|
- doc/release_notes/5.50.0.txt
|
277
|
+
- doc/release_notes/5.51.0.txt
|
276
278
|
- doc/release_notes/5.6.0.txt
|
277
279
|
- doc/release_notes/5.7.0.txt
|
278
280
|
- doc/release_notes/5.8.0.txt
|
@@ -562,7 +564,7 @@ metadata:
|
|
562
564
|
bug_tracker_uri: https://github.com/jeremyevans/sequel/issues
|
563
565
|
changelog_uri: http://sequel.jeremyevans.net/rdoc/files/CHANGELOG.html
|
564
566
|
documentation_uri: http://sequel.jeremyevans.net/documentation.html
|
565
|
-
mailing_list_uri: https://
|
567
|
+
mailing_list_uri: https://github.com/jeremyevans/sequel/discussions
|
566
568
|
source_code_uri: https://github.com/jeremyevans/sequel
|
567
569
|
post_install_message:
|
568
570
|
rdoc_options:
|
@@ -586,7 +588,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
586
588
|
- !ruby/object:Gem::Version
|
587
589
|
version: '0'
|
588
590
|
requirements: []
|
589
|
-
rubygems_version: 3.2.
|
591
|
+
rubygems_version: 3.2.32
|
590
592
|
signing_key:
|
591
593
|
specification_version: 4
|
592
594
|
summary: The Database Toolkit for Ruby
|