sequel 5.6.0 → 5.7.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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +30 -5099
  3. data/Rakefile +1 -1
  4. data/doc/opening_databases.rdoc +0 -2
  5. data/doc/postgresql.rdoc +31 -0
  6. data/doc/querying.rdoc +2 -2
  7. data/doc/release_notes/5.7.0.txt +108 -0
  8. data/doc/testing.rdoc +1 -0
  9. data/lib/sequel/adapters/jdbc/derby.rb +1 -1
  10. data/lib/sequel/adapters/jdbc/oracle.rb +11 -0
  11. data/lib/sequel/adapters/postgres.rb +1 -0
  12. data/lib/sequel/adapters/shared/postgres.rb +117 -13
  13. data/lib/sequel/connection_pool/sharded_threaded.rb +7 -6
  14. data/lib/sequel/connection_pool/threaded.rb +6 -6
  15. data/lib/sequel/core.rb +20 -0
  16. data/lib/sequel/database/logging.rb +3 -2
  17. data/lib/sequel/database/schema_generator.rb +1 -2
  18. data/lib/sequel/dataset/actions.rb +15 -5
  19. data/lib/sequel/extensions/connection_expiration.rb +3 -3
  20. data/lib/sequel/extensions/connection_validator.rb +3 -3
  21. data/lib/sequel/extensions/integer64.rb +30 -0
  22. data/lib/sequel/extensions/migration.rb +2 -3
  23. data/lib/sequel/plugins/pg_array_associations.rb +5 -3
  24. data/lib/sequel/plugins/validate_associated.rb +18 -0
  25. data/lib/sequel/version.rb +1 -1
  26. data/spec/adapters/mssql_spec.rb +6 -6
  27. data/spec/adapters/mysql_spec.rb +1 -1
  28. data/spec/adapters/oracle_spec.rb +15 -1
  29. data/spec/adapters/postgres_spec.rb +78 -1
  30. data/spec/adapters/spec_helper.rb +3 -1
  31. data/spec/bin_spec.rb +1 -0
  32. data/spec/core/dataset_spec.rb +10 -0
  33. data/spec/extensions/integer64_spec.rb +22 -0
  34. data/spec/extensions/pg_array_associations_spec.rb +14 -2
  35. data/spec/extensions/spec_helper.rb +1 -0
  36. data/spec/integration/associations_test.rb +4 -4
  37. data/spec/integration/dataset_test.rb +2 -0
  38. data/spec/integration/spec_helper.rb +5 -11
  39. data/spec/model/spec_helper.rb +1 -0
  40. metadata +35 -165
  41. data/doc/release_notes/1.0.txt +0 -38
  42. data/doc/release_notes/1.1.txt +0 -143
  43. data/doc/release_notes/1.3.txt +0 -101
  44. data/doc/release_notes/1.4.0.txt +0 -53
  45. data/doc/release_notes/1.5.0.txt +0 -155
  46. data/doc/release_notes/2.0.0.txt +0 -298
  47. data/doc/release_notes/2.1.0.txt +0 -271
  48. data/doc/release_notes/2.10.0.txt +0 -328
  49. data/doc/release_notes/2.11.0.txt +0 -215
  50. data/doc/release_notes/2.12.0.txt +0 -534
  51. data/doc/release_notes/2.2.0.txt +0 -253
  52. data/doc/release_notes/2.3.0.txt +0 -88
  53. data/doc/release_notes/2.4.0.txt +0 -106
  54. data/doc/release_notes/2.5.0.txt +0 -137
  55. data/doc/release_notes/2.6.0.txt +0 -157
  56. data/doc/release_notes/2.7.0.txt +0 -166
  57. data/doc/release_notes/2.8.0.txt +0 -171
  58. data/doc/release_notes/2.9.0.txt +0 -97
  59. data/doc/release_notes/3.0.0.txt +0 -221
  60. data/doc/release_notes/3.1.0.txt +0 -406
  61. data/doc/release_notes/3.10.0.txt +0 -286
  62. data/doc/release_notes/3.11.0.txt +0 -254
  63. data/doc/release_notes/3.12.0.txt +0 -304
  64. data/doc/release_notes/3.13.0.txt +0 -210
  65. data/doc/release_notes/3.14.0.txt +0 -118
  66. data/doc/release_notes/3.15.0.txt +0 -78
  67. data/doc/release_notes/3.16.0.txt +0 -45
  68. data/doc/release_notes/3.17.0.txt +0 -58
  69. data/doc/release_notes/3.18.0.txt +0 -120
  70. data/doc/release_notes/3.19.0.txt +0 -67
  71. data/doc/release_notes/3.2.0.txt +0 -268
  72. data/doc/release_notes/3.20.0.txt +0 -41
  73. data/doc/release_notes/3.21.0.txt +0 -87
  74. data/doc/release_notes/3.22.0.txt +0 -39
  75. data/doc/release_notes/3.23.0.txt +0 -172
  76. data/doc/release_notes/3.24.0.txt +0 -420
  77. data/doc/release_notes/3.25.0.txt +0 -88
  78. data/doc/release_notes/3.26.0.txt +0 -88
  79. data/doc/release_notes/3.27.0.txt +0 -82
  80. data/doc/release_notes/3.28.0.txt +0 -304
  81. data/doc/release_notes/3.29.0.txt +0 -459
  82. data/doc/release_notes/3.3.0.txt +0 -192
  83. data/doc/release_notes/3.30.0.txt +0 -135
  84. data/doc/release_notes/3.31.0.txt +0 -146
  85. data/doc/release_notes/3.32.0.txt +0 -202
  86. data/doc/release_notes/3.33.0.txt +0 -157
  87. data/doc/release_notes/3.34.0.txt +0 -671
  88. data/doc/release_notes/3.35.0.txt +0 -144
  89. data/doc/release_notes/3.36.0.txt +0 -245
  90. data/doc/release_notes/3.37.0.txt +0 -338
  91. data/doc/release_notes/3.38.0.txt +0 -234
  92. data/doc/release_notes/3.39.0.txt +0 -237
  93. data/doc/release_notes/3.4.0.txt +0 -325
  94. data/doc/release_notes/3.40.0.txt +0 -73
  95. data/doc/release_notes/3.41.0.txt +0 -155
  96. data/doc/release_notes/3.42.0.txt +0 -74
  97. data/doc/release_notes/3.43.0.txt +0 -105
  98. data/doc/release_notes/3.44.0.txt +0 -152
  99. data/doc/release_notes/3.45.0.txt +0 -179
  100. data/doc/release_notes/3.46.0.txt +0 -122
  101. data/doc/release_notes/3.47.0.txt +0 -270
  102. data/doc/release_notes/3.48.0.txt +0 -477
  103. data/doc/release_notes/3.5.0.txt +0 -510
  104. data/doc/release_notes/3.6.0.txt +0 -366
  105. data/doc/release_notes/3.7.0.txt +0 -179
  106. data/doc/release_notes/3.8.0.txt +0 -151
  107. data/doc/release_notes/3.9.0.txt +0 -233
@@ -1,268 +0,0 @@
1
- New Features
2
- ------------
3
-
4
- * Common table expressions (CTEs) are now supported. CTEs use the
5
- SQL WITH clause, and specify inline views that queries can use.
6
- They also support a recursive mode, where the CTE can recursively
7
- query its own output, allowing you do do things like load all
8
- branches for a given node in a plain tree structure.
9
-
10
- The standard with takes an alias and a dataset:
11
-
12
- DB[:vw].with(:vw, DB[:table].filter{col < 1})
13
- # WITH vw AS (SELECT * FROM table WHERE col < 1)
14
- # SELECT * FROM vw
15
-
16
- The recursive with takes an alias, a nonrecursive dataset, and a
17
- recursive dataset:
18
-
19
- DB[:vw].with_recursive(:vw,
20
- DB[:tree].filter(:id=>1),
21
- DB[:tree].join(:vw, :id=>:parent_id).
22
- select(:vw__id, :vw__parent_id))
23
- # WITH RECURSIVE vw AS (SELECT * FROM tree
24
- # WHERE (id = 1)
25
- # UNION ALL
26
- # SELECT vw.id, vw.parent_id
27
- # FROM tree
28
- # INNER JOIN vw ON (vw.id = tree.parent_id))
29
- # SELECT * FROM vw
30
-
31
- CTEs are supported by Microsoft SQL Server 2005+, DB2 7+,
32
- Firebird 2.1+, Oracle 9+, and PostgreSQL 8.4+.
33
-
34
- * SQL window functions are now supported, and a DSL has been added to
35
- ease their creation. Window functions act similarly to aggregate
36
- functions but operate on sliding ranges of rows.
37
-
38
- In virtual row blocks (blocks passed to filter, select, order, etc.)
39
- you can now provide a block to method calls to change the default
40
- behavior to create functions that weren't possible previously. The
41
- blocks aren't called, but their presence serves as a flag.
42
-
43
- What function is created depends on the arguments to the method:
44
-
45
- * If there are no arguments, an SQL::Function is created with the
46
- name of method used, and no arguments. Previously, it was not
47
- possible to create functions without arguments using the virtual
48
- row block DSL. Example:
49
-
50
- DB.dataset.select{version{}} # SELECT version()
51
-
52
- * If the first argument is :*, an SQL::Function is created with a
53
- single wildcard argument (*). This is mostly useful for count:
54
-
55
- DB[:t].select{count(:*){}} # SELECT count(*) FROM t
56
-
57
- * If the first argument is :distinct, an SQL::Function is created
58
- with the keyword DISTINCT prefacing all remaining arguments. This
59
- is useful for aggregate functions such as count:
60
-
61
- DB[:t].select{count(:distinct, col1){}}
62
- # SELECT count(DISTINCT col1) FROM t
63
-
64
- * If the first argument is :over, the second argument, if provided,
65
- should be a hash of options to pass to SQL::Window. The options
66
- hash can also contain :*=>true to use a wildcard argument as the
67
- function argument, or :args=>... to specify an array of arguments
68
- to use as the function arguments.
69
-
70
- DB[:t].select{rank(:over){}} # SELECT rank() OVER ()
71
- DB[:t].select{count(:over, :*=>true){}} # SELECT count(*) OVER ()
72
- DB[:t].select{sum(:over, :args=>col1,
73
- :partition=>col2, :order=>col3){}}
74
- # SELECT sum(col1) OVER (PARTITION BY col2 ORDER BY col3)
75
-
76
- PostgreSQL also supports named windows. Named windows can be
77
- specified by Dataset#window, and window functions can reference
78
- them using the :window option.
79
-
80
- * Schema information for columns now includes a :ruby_default entry
81
- which contains a ruby object that represents the default given by
82
- the database (which is stored in :default). Not all :default
83
- entries can be parsed into a :ruby_default, but if the
84
- schema_dumper extension previously supported it, it should work.
85
-
86
- * Methods to create compound datasets (union, intersect, except), now
87
- take an options hash instead of a true/false flag. The previous
88
- API is still supported, but switching to specifying the ALL setting
89
- using :all=>true is recommended.
90
-
91
- Additionally, you can now set :from_self=>false to not wrap the
92
- returned dataset in a "SELECT * FROM (...)".
93
-
94
- * Dataset#ungraphed was added that removes the graphing information
95
- from the dataset. This allows you to use Dataset#graph for the
96
- automatic aliasing, or #eager_graph for the automatic aliasing and
97
- joining, and then remove the graphing information so that the
98
- resulting objects will not be split into subhashes or associations.
99
-
100
- * There were some introspection methods added to Dataset to describe
101
- which capabilities that dataset does or does not support:
102
-
103
- supports_cte?
104
- supports_distinct_on?
105
- supports_intersect_except?
106
- supports_intersect_except_all?
107
- supports_window_functions?
108
-
109
- In addition to being available for the user to use, these are also
110
- used internally, so attempting to use a CTE on a dataset that
111
- doesn't support it will raise an Error.
112
-
113
- * Dataset#qualify was added, which is like qualify_to with a default
114
- of first_source.
115
-
116
- Additionally, qualify now affects PlaceholderLiteralStrings. It
117
- doesn't scan the string (as Sequel never attempts to parse SQL),
118
- but if you provide the column as a symbol placeholder argument, it
119
- will qualify it.
120
-
121
- * You can now specify the table and column Sequel::Migrator will use
122
- to record the current schema version. The new Migrator.run method
123
- must be used to use these new options.
124
-
125
- * The JDBC adapter now accepts :user and :password options, instead
126
- of requiring them to be specified in the connection string and
127
- handled by the JDBC driver. This should allow connections to
128
- Oracle using the Thin JDBC driver.
129
-
130
- * You can now specify the max_connections, pool_timeout, and
131
- single_threaded settings directly in the connection string:
132
-
133
- postgres:///database?single_threaded=t
134
- postgres:///database?max_connections=10&pool_timeout=20
135
-
136
- * Dataset#on_duplicate_key_update now affects Dataset#insert when
137
- using MySQL.
138
-
139
- * You can now specify the :opclass option when creating PostgreSQL
140
- indexes. Currently, this only supports a single operator class
141
- for all columns. If you need different operator classes per
142
- column, please post on sequel-talk.
143
-
144
- * Model#autoincrementing_primary_key was added and can be used if
145
- the autoincrementing key isn't the same as the primary key. The
146
- only likely use for this is on MySQL MyISAM tables with composite
147
- primary keys where only one of the composite parts is
148
- autoincrementing.
149
-
150
- * You can now use database column values as search patterns and
151
- specify the text to search as a String or Regexp:
152
-
153
- String.send(:include, Sequel::SQL::StringMethods)
154
- Regexp.send(:include, Sequel::SQL::StringMethods)
155
-
156
- 'a'.like(:x) # ('a' LIKE x)
157
- /a/.like(:x) # ('a' ~ x)
158
- /a/i.like(:x) # ('a' ~* x)
159
- /a/.like(:x, 'b') # (('a' ~ x) OR ('a' ~ 'b'))
160
-
161
- * The Dataset#dataset_alias private method was added. It can be
162
- overridden if you have tables named t0, t1, etc and want to make
163
- sure the default dataset aliases that Sequel uses do not clash
164
- with existing table names.
165
-
166
- * Sequel now raises an Error if you call Sequel.connect with
167
- something that is not a Hash or String.
168
-
169
- * bin/sequel now accepts a -N option to not test the database
170
- connection.
171
-
172
- * An opening_databases.rdoc file was added to the documentation
173
- directory, which should be a good introduction for new users about
174
- how to set up your Database connection.
175
-
176
- Other Improvements
177
- ------------------
178
-
179
- * MySQL native adapter SELECT is much faster than before, up to 75%
180
- faster.
181
-
182
- * JDBC SELECT is about 10% faster than before. It's still much
183
- slower than the native adapters, due to conversion issues.
184
-
185
- * bin/sequel now works with a YAML file on ruby 1.9.
186
-
187
- * MySQL foreign key table constraints have been fixed.
188
-
189
- * Database#indexes now works on PostgreSQL if the schema used is a
190
- Symbol. It also works on PostgreSQL versions all the way back to
191
- 7.4.
192
-
193
- * Graphing of datasets with dataset sources has been fixed.
194
-
195
- * Changing a columns name, type, or NULL status on MySQL now
196
- supports a much wider selection of column defaults.
197
-
198
- * The stored procedure code is now thread-safe. Sequel is
199
- thread-safe in general, but due to a bug the previous stored
200
- procedure code was not thread-safe.
201
-
202
- * The ODBC adapter now drops statements automatically instead of
203
- requiring the user to do so manually, making it more similar
204
- to other adapters.
205
-
206
- * The single_table_inheritance plugin no longer overwrites the STI
207
- field if the field already has a value. This allows you to use
208
- create in the generic class to insert a value that will be
209
- returned as a subclass:
210
-
211
- Person.create(:kind => "Manager")
212
-
213
- * When altering colums on MySQL, :unsigned, :elements, :size and other
214
- options given are no longer ignored.
215
-
216
- * The PostgreSQL shared adapter's explain and analyze methods have
217
- been fixed, they had been broken in 3.0.
218
-
219
- * Parsing of the server's version is more robust on PostgreSQL.
220
- It should now work correctly for 8.4 and 8.4rc1 type versions.
221
-
222
- Backwards Compatibility
223
- -----------------------
224
-
225
- * Dataset#table_exists? has been removed, since it never worked
226
- perfectly. Use Database#table_exists? instead.
227
-
228
- * Model.grep now calls Dataset#grep instead of Enumerable#grep.
229
- If you are using Model.grep, you need to modify your application.
230
-
231
- * The MSSQL shared adapter previously used the :with option for
232
- storing the NOLOCK setting of the query. That option has been
233
- renamed to :table_options, since :with is now used for CTEs.
234
- This should not have an effect unless you where using the option
235
- manually.
236
-
237
- * Previously, providing a block to a method calls in virtual row
238
- blocks did not change behavior, where now it causes a different
239
- code path to be used. In both cases, the block is not evaluated,
240
- but that may change in a future version.
241
-
242
- * Dataset#to_table_reference protected method was removed, as it was
243
- no longer used.
244
-
245
- * The pool_timeout setting is now converted to an Integer, so if you
246
- used to pass in a Float, it no longer works the same way.
247
-
248
- * Most files in adapters/utils have been removed, in favor of
249
- integrating the code directly into Database and Dataset. If you
250
- were previously checking for the UnsupportedIntersectExcept or
251
- related modules, use the Dataset introspection methods instead
252
- (e.g. supports_intersect_except?).
253
-
254
- * If you were using the ODBC adapter and manually dropping returned
255
- statements, you should note that now statements are dropped
256
- automatically, and the execute method doesn't return a statement
257
- object.
258
-
259
- * The MySQL adapter on_duplicate_key_update_sql is now a private
260
- method.
261
-
262
- * If you were modifying the :from dataset option directly, note that
263
- Sequel now expects this option to be preprocessed. See the new
264
- implementation of Dataset#from for an idea of the changes
265
- required.
266
-
267
- * Dataset#simple_select_all? now returns false instead of true for a
268
- dataset that selects from another dataset.
@@ -1,41 +0,0 @@
1
- = New Features
2
-
3
- * The swift adapter now supports an SQLite subadapter. Use the
4
- :db_type => 'sqlite' option when connecting. You can use an
5
- in memory database with the following connection string:
6
-
7
- swift:///?database=:memory:&db_type=sqlite
8
-
9
- * Arbitrary JDBC properties can now be set in the JDBC adapter
10
- using the :jdbc_properties option when connecting. The value
11
- of this option should be a hash where keys and values are JDBC
12
- property keys and values.
13
-
14
- * Basic Microsoft Access support was added to the ado adapter.
15
- The creation of autoincrementing primary key integers now works,
16
- and identifiers are now quoted with [].
17
-
18
- * The Database#indexes method now supports a :partial option when
19
- connecting to MySQL, which makes it include partial indexes (which
20
- are usually excluded).
21
-
22
- = Other Improvements
23
-
24
- * The class_table_inheritance plugin now handles subclass
25
- associations better. Previously, the implicit eager loading code
26
- had issues when you called an association method that only existed
27
- in the subclass.
28
-
29
- * The error message used when a validates_max_length validation is
30
- applied to a nil column value has been improved. You can override
31
- the message yourself using the :nil_message option.
32
-
33
- * The read_timeout and connect_timeout options now work correctly in
34
- the mysql adapter.
35
-
36
- * Another MySQL disconnect error message is now recognized.
37
-
38
- = Backwards Compatibility
39
-
40
- * The swift adapter was upgraded to support swift 0.8.1. Older
41
- versions of swift are no longer supported.
@@ -1,87 +0,0 @@
1
- = New Features
2
-
3
- * A tinytds adapter was added, enabling Sequel users on a C-based
4
- ruby running on *nix easy access to Microsoft SQL Server.
5
- Previously, the best way to connect to Microsoft SQL Server from
6
- a C-based ruby on *nix was to use the ODBC adapter with unixodbc
7
- and freetds. However, setting that up is nontrivial, while
8
- setting up tinytds is very easy.
9
-
10
- Note that the tinytds adapter currently requires the git master
11
- branch of tiny_tds, but tiny_tds 0.4.0 should include the related
12
- changes.
13
-
14
- * An association_autoreloading plugin has been added to Sequel,
15
- which removes stale many_to_one associations from the cache when
16
- the associated foreign key setter is used to change the value of
17
- the foreign key.
18
-
19
- * bin/sequel now operates more like a standard *nix utility.
20
- If given a file on the command line after the connection
21
- string, it will assume that file has ruby code and load it.
22
- If stdin is not a tty, it will read from stdin and execute it
23
- as ruby code.
24
-
25
- For recent Linux users, this means you can have a shebang line
26
- such as:
27
-
28
- #!/usr/bin/sequel postgres://user:pass@host/db
29
-
30
- to create a self contained script.
31
-
32
- * bin/sequel now supports -r and -I options similar to ruby's
33
- -r and -I options.
34
-
35
- * MySQL datasets now have a calc_found_rows method that uses
36
- SQL_CALC_FOUND_ROWS, which provides a fast way to limit the
37
- number of results returned by a dataset while having an easy
38
- way to determine how many rows would have been returned if no
39
- limit was applied.
40
-
41
- = Other Improvements
42
-
43
- * The Sequel::Model.plugin method can now be overridden just like
44
- any other method. Previously, it was the only method that
45
- was defined directly on the class. This allows the creation
46
- of plugins that can modify the plugin system itself.
47
-
48
- * Symbol splitting (:table__column___alias) now works correctly
49
- for identifiers that include characters that aren't in [\w ].
50
- Among other things, this means that identifiers with accented
51
- characters or even kanji characters can be used with symbol
52
- splitting.
53
-
54
- * If cover? is defined, it is now used in preference to include?
55
- for the validates_includes/validates_inclusion_of validations.
56
- ruby 1.9 defines include? differently for some ranges and can
57
- be very slow, while cover? is similar to the 1.8 behavior of
58
- just checking the beginning and end of the range.
59
-
60
- * The bin/sequel -L option now takes effect even if the -m,
61
- -C, -d, or -D options are used.
62
-
63
- * The schema_dumper extension now recognizes the "bigint unsigned"
64
- type.
65
-
66
- * On Microsoft SQL Server, if joining to a subselect that uses a
67
- common table expression, that common table expression is
68
- promoted to the main dataset. This allows most queries to work
69
- correctly, but is vulnerable to issues if both the current
70
- dataset and the joined dataset use common table expressions with
71
- the same name. Unfortunately, unlike PostgreSQL, Microsoft SQL
72
- Server does not allow common table expressions to occur in
73
- subselects.
74
-
75
- * The NULL/NOT NULL, DEFAULT, and UNIQUE column options now
76
- use the proper order on H2 and Oracle, so they can now be
77
- used in conjunction with each other.
78
-
79
- * Row locks are now enabled on Oracle.
80
-
81
- * The join_table method on MySQL no longer ignores the block it was
82
- given.
83
-
84
- * The informix adapter now supports ruby-informix version >= 0.7.3,
85
- while still being backwards compatible with older versions.
86
-
87
- * The specs now run under both RSpec 2 and RSpec 1.
@@ -1,39 +0,0 @@
1
- = New Features
2
-
3
- * Support COLLATE in column definitions. At least MySQL and Microsoft
4
- SQL Server support them, and PostgreSQL 9.1 should as well.
5
-
6
- * When connecting to Microsoft SQL Server, you can use the
7
- mssql_unicode_strings accessor to turn of the default usage
8
- of unicode strings (N'') and use regular strings (''). This
9
- can improve performance, but changes the behavior. It's
10
- set to true by default for backwards compatibility. You can
11
- change it at both the dataset and database level:
12
-
13
- DB.mssql_unicode_strings = false # default for datasets
14
- dataset.mssql_unicode_strings = false # just this dataset
15
-
16
- * In the oracle adapter, if Sequel.application_timezone is :utc, set
17
- the timezone for the connection to use the 00:00 timezone.
18
-
19
- = Other Improvements
20
-
21
- * In the single_table_inheritance plugin, correctly handle a
22
- multi-level class hierarchy so that loading instances from a
23
- middle level of the hierarchy can return instances of subclasses.
24
-
25
- * Don't use a schema when creating a temporary table, even if
26
- default_schema is set.
27
-
28
- * Fix the migrator when a default_schema is used.
29
-
30
- * In the ado adapter, assume a connection to SQL Server if the
31
- :conn_string is given and doesn't indicate Access/Jet.
32
-
33
- * Fix fetching rows in the tinytds adapter when the
34
- identifier_output_method is nil.
35
-
36
- * The tinytds adapter now checks for disconnect errors, but it might
37
- not be reliable until the next release of tiny_tds.
38
-
39
- * The odbc adapter now handles ODBC::Time instances correctly.
@@ -1,172 +0,0 @@
1
- = New Features
2
-
3
- * Sequel now allows dynamic customization for eager loading.
4
- Previously, the parameters for eager loading were fixed at
5
- association creation time. Now, they can be modified at query
6
- time. To dynamically modify an eager load, you use a hash with
7
- the proc as the value. For example, if you have this code:
8
-
9
- Artist.eager(:albums)
10
-
11
- And you only want to eagerly load albums where the id is greater
12
- than or equal to some number provided by the user, you do:
13
-
14
- min = params[:min].to_i
15
- Artist.eager(:albums=>proc{|ds| ds.where{id > min}})
16
-
17
- This also works when eager loading via eager_graph:
18
-
19
- Artist.eager_graph(:albums=>proc{|ds| ds.where{id > min}})
20
-
21
- For eager_graph, the dataset is the dataset to graph into the
22
- current dataset, and filtering it will result in an SQL query
23
- that joins to a subquery.
24
-
25
- You can also use dynamic customization while cascading to also
26
- eagerly load dependent associations, by making the hash value
27
- a single entry hash with a proc key and the value being the
28
- dependent associations to eagerly load. For example, if you want
29
- to eagerly load tracks for those albums:
30
-
31
- Artist.eager(:albums=>{proc{|ds| ds.where{id > min}}=>:tracks})
32
-
33
- * Sequel also now allows dynamic customization for regular
34
- association loading. Previously, this was possible by using the
35
- association's dataset:
36
-
37
- albums = artist.albums_dataset.filter{id > min}
38
-
39
- However, then there was no handling of caching, callbacks, or
40
- reciprocals. For example:
41
-
42
- albums.each{|album| album.artist}
43
-
44
- Would issue one query per album to get the artist, because the
45
- reciprocal association was not set. Now you can provide a
46
- block to the association method:
47
-
48
- albums = artist.albums{|ds| ds.filter{id > min}}
49
-
50
- This block is called with the dataset used to retrieve the
51
- associated objects, and should return a modified version of that
52
- dataset.
53
-
54
- Note that ruby 1.8.6 doesn't allow blocks to take block arguments,
55
- so you have to pass the block as a separate proc argument to the
56
- association method if you are still using 1.8.6.
57
-
58
- * Sequel now supports filtering by associations. This wasn't
59
- previously supported as filtering is a dataset level feature and
60
- associations are a model level feature, and datasets do not depend
61
- on models. Now, model datasets have the ability to filter by
62
- associations. For example, to get all albums for a given artist,
63
- you could do:
64
-
65
- artist = Artist[1]
66
- Album.filter(:artist=>artist)
67
-
68
- Since the above can also be accomplished with:
69
-
70
- artist.albums
71
-
72
- this may not seem like a big improvement, but it allows you to
73
- filter on multiple associations simultaneously:
74
-
75
- Album.filter(:artist=>artist, :publisher=>publisher)
76
-
77
- For simple many_to_one associations, the above is just a simpler
78
- way to do:
79
-
80
- Album.filter(:artist_id=>artist.id, :publisher_id=>publisher.id)
81
-
82
- Sequel supports this for all association types, including
83
- many_to_many and many_through_many, where a subquery is used, and
84
- it also works when composite key associations are used:
85
-
86
- Album.filter(:artist=>artist, :tags=>tag)
87
-
88
- This will give you the albums for that artist that are also tagged
89
- with that tag. To provide multiple values for the same
90
- association, mostly useful for many_to_many associations, you can
91
- either use separate filter calls or specify the conditions as an
92
- array:
93
-
94
- Album.filter(:tags=>tag1).filter(:tags=>tag2)
95
- Album.filter([[:tags, tag1], [:tags, tag2]])
96
-
97
- * A columns_introspection extension has been added that makes
98
- datasets attempt to guess their columns in some cases instead of
99
- issuing a database query. This can improve performance in cases
100
- where the columns are needed implicitly, such as graphing. After
101
- loading the extension, you can enable the support for specific
102
- datasets by extending them with Sequel::ColumnIntrospection. To
103
- enable introspection for all datasets, use:
104
-
105
- Sequel::Dataset.introspect_all_columns
106
-
107
- * A serialization_modification_detection plugin has been added.
108
- Previously, Sequel could not detect modifications made to
109
- serialized objects. It could detect modification if you assigned
110
- a new value:
111
-
112
- model.hash_column = model.hash_column.merge(:foo=>:bar)
113
-
114
- but not if you just modified the object directly:
115
-
116
- model.hash_columns[:foo] = :bar
117
-
118
- With this plugin, such modifications can be detected, at a
119
- potentially significant performance cost.
120
-
121
- = Other Improvements
122
-
123
- * When using a migration directory containing both older integer
124
- migrations and newer timestamp migrations, where some integer
125
- migrations have not been applied, make sure to apply the remaining
126
- integer migrations before the timestamp migrations. Previously,
127
- they could be applied out of order due to a lexicographic sort
128
- being used instead of a numeric sort.
129
-
130
- * If a model does not select all columns from its table, the
131
- insert_select optimization is no longer used. Previously,
132
- creating a new model object for such a model could result in the
133
- object containing columns that the model does not select.
134
-
135
- * You can now use :select=>[] as an option for many_to_many
136
- associations to select all columns from both the associated
137
- table and the join table. Previously, this raised an error and
138
- required you do :select=>'*'.lit as a workaround. The default
139
- remains to select all columns in the associated table and none
140
- from the join table.
141
-
142
- * The xml_serializer plugin now handles namespaced models by
143
- using __ instead of / as the namespace separator. Previously, /
144
- was used and caused problems as it is not valid XML.
145
-
146
- * The :eager_grapher association option can now accept a proc that
147
- takes a single hash of options instead of a fixed 3 arguments.
148
- This is the recommended way going forward of writing custom
149
- :eager_graphers, and all of the internal ones have been converted.
150
- The previous way of using 3 arguments is still supported.
151
-
152
- * A bug in the identity_map plugin for many_to_one associations
153
- without full association reflection information has been fixed.
154
-
155
- * Sequel is now using GitHub Issues for issue tracking. Old issues
156
- have been migrated from Google Code.
157
-
158
- = Backwards Compatibility
159
-
160
- * The filter by associations support breaks backward compatibilty for
161
- users who previously added an sql_literal instance method to
162
- Sequel::Model. Usually, that was done to for reasons similar to
163
- but inferior than the filter by association support. The following
164
- code can be used as a temporary workaround until you can modify
165
- your program to use the new filter by associations support:
166
-
167
- Sequel::Model::Associations::DatasetMethods.
168
- send(:remove_method, :complex_expression_sql)
169
-
170
- * The private Sequel::Model#_load_associated_objects method now takes
171
- an additional, optional options hash. Plugins that override that
172
- method need to be modified.