sequel 4.41.0 → 4.42.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +98 -0
  3. data/README.rdoc +23 -10
  4. data/doc/active_record.rdoc +4 -4
  5. data/doc/advanced_associations.rdoc +2 -2
  6. data/doc/association_basics.rdoc +5 -2
  7. data/doc/cheat_sheet.rdoc +3 -3
  8. data/doc/core_extensions.rdoc +2 -2
  9. data/doc/dataset_basics.rdoc +4 -4
  10. data/doc/dataset_filtering.rdoc +1 -1
  11. data/doc/migration.rdoc +19 -1
  12. data/doc/prepared_statements.rdoc +2 -2
  13. data/doc/release_notes/4.42.0.txt +221 -0
  14. data/doc/testing.rdoc +3 -1
  15. data/lib/sequel/adapters/ado/access.rb +0 -1
  16. data/lib/sequel/adapters/ado/mssql.rb +0 -1
  17. data/lib/sequel/adapters/do/mysql.rb +0 -1
  18. data/lib/sequel/adapters/do/postgres.rb +0 -1
  19. data/lib/sequel/adapters/do/sqlite3.rb +0 -1
  20. data/lib/sequel/adapters/ibmdb.rb +21 -25
  21. data/lib/sequel/adapters/jdbc.rb +8 -16
  22. data/lib/sequel/adapters/jdbc/as400.rb +0 -1
  23. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
  24. data/lib/sequel/adapters/jdbc/db2.rb +0 -1
  25. data/lib/sequel/adapters/jdbc/derby.rb +0 -1
  26. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
  27. data/lib/sequel/adapters/jdbc/h2.rb +0 -1
  28. data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
  29. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
  30. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
  31. data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
  32. data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
  34. data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
  36. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
  37. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
  38. data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
  39. data/lib/sequel/adapters/mock.rb +54 -12
  40. data/lib/sequel/adapters/mysql.rb +1 -1
  41. data/lib/sequel/adapters/mysql2.rb +11 -17
  42. data/lib/sequel/adapters/odbc/mssql.rb +0 -1
  43. data/lib/sequel/adapters/oracle.rb +8 -20
  44. data/lib/sequel/adapters/postgres.rb +11 -29
  45. data/lib/sequel/adapters/shared/access.rb +5 -12
  46. data/lib/sequel/adapters/shared/cubrid.rb +4 -13
  47. data/lib/sequel/adapters/shared/db2.rb +4 -2
  48. data/lib/sequel/adapters/shared/firebird.rb +2 -4
  49. data/lib/sequel/adapters/shared/informix.rb +4 -2
  50. data/lib/sequel/adapters/shared/mssql.rb +3 -5
  51. data/lib/sequel/adapters/shared/mysql.rb +4 -14
  52. data/lib/sequel/adapters/shared/oracle.rb +1 -3
  53. data/lib/sequel/adapters/shared/postgres.rb +16 -38
  54. data/lib/sequel/adapters/shared/progress.rb +0 -2
  55. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
  56. data/lib/sequel/adapters/shared/sqlite.rb +20 -16
  57. data/lib/sequel/adapters/sqlite.rb +8 -20
  58. data/lib/sequel/adapters/swift/mysql.rb +0 -1
  59. data/lib/sequel/adapters/swift/postgres.rb +0 -1
  60. data/lib/sequel/adapters/swift/sqlite.rb +0 -1
  61. data/lib/sequel/adapters/tinytds.rb +4 -12
  62. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  63. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
  64. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
  65. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  66. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
  67. data/lib/sequel/ast_transformer.rb +2 -2
  68. data/lib/sequel/database/dataset.rb +1 -1
  69. data/lib/sequel/database/dataset_defaults.rb +0 -66
  70. data/lib/sequel/database/features.rb +6 -0
  71. data/lib/sequel/database/misc.rb +31 -17
  72. data/lib/sequel/database/query.rb +7 -4
  73. data/lib/sequel/database/schema_methods.rb +1 -1
  74. data/lib/sequel/dataset.rb +8 -8
  75. data/lib/sequel/dataset/actions.rb +140 -46
  76. data/lib/sequel/dataset/features.rb +1 -5
  77. data/lib/sequel/dataset/graph.rb +7 -8
  78. data/lib/sequel/dataset/misc.rb +127 -56
  79. data/lib/sequel/dataset/mutation.rb +9 -20
  80. data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
  81. data/lib/sequel/dataset/prepared_statements.rb +102 -46
  82. data/lib/sequel/dataset/query.rb +155 -72
  83. data/lib/sequel/dataset/sql.rb +26 -9
  84. data/lib/sequel/extensions/columns_introspection.rb +3 -1
  85. data/lib/sequel/extensions/core_extensions.rb +5 -5
  86. data/lib/sequel/extensions/core_refinements.rb +5 -5
  87. data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
  88. data/lib/sequel/extensions/freeze_datasets.rb +69 -0
  89. data/lib/sequel/extensions/identifier_mangling.rb +196 -0
  90. data/lib/sequel/extensions/looser_typecasting.rb +11 -7
  91. data/lib/sequel/extensions/migration.rb +1 -1
  92. data/lib/sequel/extensions/null_dataset.rb +5 -2
  93. data/lib/sequel/extensions/pagination.rb +42 -23
  94. data/lib/sequel/extensions/pg_enum.rb +3 -3
  95. data/lib/sequel/extensions/query.rb +3 -3
  96. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
  97. data/lib/sequel/model/associations.rb +25 -8
  98. data/lib/sequel/model/base.rb +88 -29
  99. data/lib/sequel/model/dataset_module.rb +37 -0
  100. data/lib/sequel/plugins/association_pks.rb +4 -4
  101. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  102. data/lib/sequel/plugins/constraint_validations.rb +1 -2
  103. data/lib/sequel/plugins/csv_serializer.rb +2 -2
  104. data/lib/sequel/plugins/dataset_associations.rb +8 -8
  105. data/lib/sequel/plugins/eager_each.rb +2 -2
  106. data/lib/sequel/plugins/instance_filters.rb +1 -1
  107. data/lib/sequel/plugins/json_serializer.rb +2 -2
  108. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  109. data/lib/sequel/plugins/list.rb +4 -4
  110. data/lib/sequel/plugins/prepared_statements.rb +2 -4
  111. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
  112. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  113. data/lib/sequel/plugins/rcte_tree.rb +13 -13
  114. data/lib/sequel/plugins/sharding.rb +1 -1
  115. data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
  116. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  117. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  118. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  119. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  120. data/lib/sequel/sql.rb +69 -36
  121. data/lib/sequel/version.rb +1 -1
  122. data/spec/adapters/db2_spec.rb +10 -0
  123. data/spec/adapters/firebird_spec.rb +1 -1
  124. data/spec/adapters/mssql_spec.rb +4 -5
  125. data/spec/adapters/mysql_spec.rb +9 -9
  126. data/spec/adapters/postgres_spec.rb +67 -68
  127. data/spec/adapters/spec_helper.rb +6 -1
  128. data/spec/adapters/sqlite_spec.rb +29 -15
  129. data/spec/core/connection_pool_spec.rb +14 -14
  130. data/spec/core/database_spec.rb +38 -180
  131. data/spec/core/dataset_mutation_spec.rb +253 -0
  132. data/spec/core/dataset_spec.rb +394 -537
  133. data/spec/core/expression_filters_spec.rb +34 -32
  134. data/spec/core/mock_adapter_spec.rb +27 -35
  135. data/spec/core/placeholder_literalizer_spec.rb +2 -4
  136. data/spec/core/schema_generator_spec.rb +4 -4
  137. data/spec/core/schema_spec.rb +1 -2
  138. data/spec/core_extensions_spec.rb +22 -29
  139. data/spec/extensions/active_model_spec.rb +6 -6
  140. data/spec/extensions/association_dependencies_spec.rb +2 -2
  141. data/spec/extensions/blacklist_security_spec.rb +3 -3
  142. data/spec/extensions/boolean_readers_spec.rb +12 -12
  143. data/spec/extensions/caching_spec.rb +13 -10
  144. data/spec/extensions/class_table_inheritance_spec.rb +38 -43
  145. data/spec/extensions/column_conflicts_spec.rb +1 -3
  146. data/spec/extensions/columns_introspection_spec.rb +2 -3
  147. data/spec/extensions/composition_spec.rb +5 -3
  148. data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
  149. data/spec/extensions/constraint_validations_spec.rb +14 -8
  150. data/spec/extensions/core_refinements_spec.rb +22 -29
  151. data/spec/extensions/csv_serializer_spec.rb +7 -6
  152. data/spec/extensions/date_arithmetic_spec.rb +15 -15
  153. data/spec/extensions/defaults_setter_spec.rb +2 -2
  154. data/spec/extensions/delay_add_association_spec.rb +1 -1
  155. data/spec/extensions/dirty_spec.rb +19 -10
  156. data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
  157. data/spec/extensions/eager_each_spec.rb +12 -16
  158. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  159. data/spec/extensions/eval_inspect_spec.rb +4 -3
  160. data/spec/extensions/force_encoding_spec.rb +12 -12
  161. data/spec/extensions/freeze_datasets_spec.rb +31 -0
  162. data/spec/extensions/graph_each_spec.rb +6 -18
  163. data/spec/extensions/hook_class_methods_spec.rb +7 -7
  164. data/spec/extensions/identifier_mangling_spec.rb +307 -0
  165. data/spec/extensions/instance_filters_spec.rb +5 -6
  166. data/spec/extensions/instance_hooks_spec.rb +12 -12
  167. data/spec/extensions/json_serializer_spec.rb +12 -15
  168. data/spec/extensions/lazy_attributes_spec.rb +4 -4
  169. data/spec/extensions/list_spec.rb +19 -21
  170. data/spec/extensions/many_through_many_spec.rb +108 -163
  171. data/spec/extensions/meta_def_spec.rb +7 -2
  172. data/spec/extensions/migration_spec.rb +10 -12
  173. data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
  174. data/spec/extensions/named_timezones_spec.rb +4 -3
  175. data/spec/extensions/nested_attributes_spec.rb +2 -2
  176. data/spec/extensions/null_dataset_spec.rb +17 -12
  177. data/spec/extensions/optimistic_locking_spec.rb +4 -5
  178. data/spec/extensions/pagination_spec.rb +8 -10
  179. data/spec/extensions/pg_array_associations_spec.rb +28 -27
  180. data/spec/extensions/pg_array_ops_spec.rb +2 -1
  181. data/spec/extensions/pg_array_spec.rb +6 -2
  182. data/spec/extensions/pg_enum_spec.rb +5 -3
  183. data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
  184. data/spec/extensions/pg_hstore_spec.rb +7 -6
  185. data/spec/extensions/pg_inet_ops_spec.rb +2 -1
  186. data/spec/extensions/pg_inet_spec.rb +2 -1
  187. data/spec/extensions/pg_interval_spec.rb +2 -1
  188. data/spec/extensions/pg_json_ops_spec.rb +2 -1
  189. data/spec/extensions/pg_json_spec.rb +6 -3
  190. data/spec/extensions/pg_loose_count_spec.rb +1 -0
  191. data/spec/extensions/pg_range_ops_spec.rb +3 -1
  192. data/spec/extensions/pg_range_spec.rb +9 -5
  193. data/spec/extensions/pg_row_ops_spec.rb +2 -1
  194. data/spec/extensions/pg_row_plugin_spec.rb +4 -6
  195. data/spec/extensions/pg_row_spec.rb +5 -3
  196. data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
  197. data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
  198. data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
  199. data/spec/extensions/prepared_statements_spec.rb +12 -11
  200. data/spec/extensions/pretty_table_spec.rb +1 -1
  201. data/spec/extensions/query_spec.rb +8 -5
  202. data/spec/extensions/rcte_tree_spec.rb +39 -39
  203. data/spec/extensions/round_timestamps_spec.rb +2 -2
  204. data/spec/extensions/schema_dumper_spec.rb +3 -2
  205. data/spec/extensions/schema_spec.rb +2 -2
  206. data/spec/extensions/scissors_spec.rb +1 -2
  207. data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
  208. data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
  209. data/spec/extensions/serialization_spec.rb +15 -13
  210. data/spec/extensions/set_overrides_spec.rb +14 -8
  211. data/spec/extensions/sharding_spec.rb +9 -18
  212. data/spec/extensions/shared_caching_spec.rb +3 -4
  213. data/spec/extensions/single_table_inheritance_spec.rb +11 -11
  214. data/spec/extensions/skip_create_refresh_spec.rb +2 -1
  215. data/spec/extensions/spec_helper.rb +1 -1
  216. data/spec/extensions/split_values_spec.rb +2 -2
  217. data/spec/extensions/sql_comments_spec.rb +6 -0
  218. data/spec/extensions/static_cache_spec.rb +7 -9
  219. data/spec/extensions/string_agg_spec.rb +30 -29
  220. data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
  221. data/spec/extensions/thread_local_timezones_spec.rb +2 -2
  222. data/spec/extensions/timestamps_spec.rb +28 -3
  223. data/spec/extensions/to_dot_spec.rb +1 -2
  224. data/spec/extensions/tree_spec.rb +33 -29
  225. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  226. data/spec/extensions/unlimited_update_spec.rb +1 -0
  227. data/spec/extensions/update_primary_key_spec.rb +11 -7
  228. data/spec/extensions/update_refresh_spec.rb +1 -1
  229. data/spec/extensions/uuid_spec.rb +0 -1
  230. data/spec/extensions/validate_associated_spec.rb +1 -1
  231. data/spec/extensions/validation_class_methods_spec.rb +10 -10
  232. data/spec/extensions/validation_helpers_spec.rb +10 -10
  233. data/spec/extensions/xml_serializer_spec.rb +7 -3
  234. data/spec/integration/associations_test.rb +31 -31
  235. data/spec/integration/dataset_test.rb +17 -19
  236. data/spec/integration/eager_loader_test.rb +24 -24
  237. data/spec/integration/model_test.rb +6 -6
  238. data/spec/integration/plugin_test.rb +43 -43
  239. data/spec/integration/prepared_statement_test.rb +6 -6
  240. data/spec/integration/schema_test.rb +63 -52
  241. data/spec/integration/spec_helper.rb +6 -1
  242. data/spec/integration/transaction_test.rb +13 -13
  243. data/spec/model/association_reflection_spec.rb +17 -17
  244. data/spec/model/associations_spec.rb +101 -96
  245. data/spec/model/base_spec.rb +175 -49
  246. data/spec/model/class_dataset_methods_spec.rb +5 -9
  247. data/spec/model/dataset_methods_spec.rb +5 -5
  248. data/spec/model/eager_loading_spec.rb +209 -235
  249. data/spec/model/hooks_spec.rb +15 -15
  250. data/spec/model/model_spec.rb +28 -21
  251. data/spec/model/plugins_spec.rb +4 -5
  252. data/spec/model/record_spec.rb +59 -57
  253. data/spec/model/spec_helper.rb +1 -1
  254. data/spec/model/validations_spec.rb +6 -6
  255. data/spec/spec_config.rb +1 -1
  256. metadata +10 -2
@@ -71,11 +71,11 @@ module Sequel
71
71
  lambda do
72
72
  h = {}
73
73
  lk.zip(lpk).each{|k, pk| h[k] = get_column_value(pk)}
74
- _join_table_dataset(opts).filter(h).select_map(rk)
74
+ _join_table_dataset(opts).where(h).select_map(rk)
75
75
  end
76
76
  else
77
77
  lambda do
78
- _join_table_dataset(opts).filter(lk=>get_column_value(lpk)).select_map(rk)
78
+ _join_table_dataset(opts).where(lk=>get_column_value(lpk)).select_map(rk)
79
79
  end
80
80
  end
81
81
 
@@ -91,7 +91,7 @@ module Sequel
91
91
  lpkv = get_column_value(lpk)
92
92
  cond = {lk=>lpkv}
93
93
  end
94
- ds = _join_table_dataset(opts).filter(cond)
94
+ ds = _join_table_dataset(opts).where(cond)
95
95
  ds.exclude(rk=>pks).delete
96
96
  pks -= ds.select_map(rk)
97
97
  lpkv = Array(lpkv)
@@ -139,7 +139,7 @@ module Sequel
139
139
 
140
140
  checked_transaction do
141
141
  ds = send(opts.dataset_method)
142
- ds.unfiltered.filter(pkh).update(h)
142
+ ds.unfiltered.where(pkh).update(h)
143
143
  ds.exclude(pkh).update(nh)
144
144
  end
145
145
  end
@@ -280,7 +280,7 @@ module Sequel
280
280
  @sti_dataset = ds.join(table, pk=>pk).select_append(*sel_app)
281
281
  set_dataset(@sti_dataset)
282
282
  set_columns(self.columns)
283
- dataset.row_proc = lambda{|r| subclass.sti_load(r)}
283
+ @dataset = @dataset.with_row_proc(lambda{|r| subclass.sti_load(r)})
284
284
  (columns - [pk]).each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>table)}
285
285
 
286
286
  @cti_models += [self]
@@ -323,7 +323,7 @@ module Sequel
323
323
  private
324
324
 
325
325
  def cti_this(model)
326
- use_server(model.cti_instance_dataset.filter(model.primary_key_hash(pk)))
326
+ use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
327
327
  end
328
328
 
329
329
  # Set the sti_key column based on the sti_key_map.
@@ -117,8 +117,7 @@ module Sequel
117
117
  end
118
118
 
119
119
  if @dataset
120
- ds = @dataset.clone
121
- ds.quote_identifiers = false
120
+ ds = @dataset.with_quote_identifiers(false)
122
121
  table_name = ds.literal(ds.first_source_table)
123
122
  reflections = {}
124
123
  @constraint_validations = (Sequel.synchronize{hash[table_name]} || []).map{|r| constraint_validation_array(r, reflections)}
@@ -31,7 +31,7 @@ module Sequel
31
31
  # all objects in the dataset:
32
32
  #
33
33
  # Album.to_csv
34
- # Album.filter(:artist_id=>1).to_csv
34
+ # Album.where(:artist_id=>1).to_csv
35
35
  #
36
36
  # If you have an existing array of model instance you want to convert to
37
37
  # CSV, you can call the class to_csv method with the :array option:
@@ -48,7 +48,7 @@ module Sequel
48
48
  # The array_from_csv class method exists to parse arrays of model instances
49
49
  # from CSV:
50
50
  #
51
- # csv = Album.filter(:artist_id=>1).to_csv
51
+ # csv = Album.where(:artist_id=>1).to_csv
52
52
  # albums = Album.array_from_csv(csv)
53
53
  #
54
54
  # These do not necessarily round trip, since doing so would let users
@@ -12,7 +12,7 @@ module Sequel
12
12
  # plugin :dataset_associations
13
13
  # one_to_many :albums
14
14
  # end
15
- # Artist.filter(id=>1..100).albums
15
+ # Artist.where(id=>1..100).albums
16
16
  # # SELECT * FROM albums
17
17
  # # WHERE (albums.artist_id IN (
18
18
  # # SELECT id FROM artists
@@ -27,7 +27,7 @@ module Sequel
27
27
  # As the dataset methods return datasets, you can easily chain the
28
28
  # methods to get associated datasets of associated datasets:
29
29
  #
30
- # Artist.filter(id=>1..100).albums.filter{name < 'M'}.tags
30
+ # Artist.where(id=>1..100).albums.where{name < 'M'}.tags
31
31
  # # SELECT tags.* FROM tags
32
32
  # # WHERE (tags.id IN (
33
33
  # # SELECT albums_tags.tag_id FROM albums
@@ -83,15 +83,15 @@ module Sequel
83
83
  sds = opts[:limit] ? self : unordered
84
84
  ds = case r[:type]
85
85
  when :many_to_one
86
- ds.filter(r.qualified_primary_key=>sds.select(*Array(r[:qualified_key])))
86
+ ds.where(r.qualified_primary_key=>sds.select(*Array(r[:qualified_key])))
87
87
  when :one_to_one, :one_to_many
88
- r.send(:apply_filter_by_associations_limit_strategy, ds.filter(r.qualified_key=>sds.select(*Array(r.qualified_primary_key))))
88
+ r.send(:apply_filter_by_associations_limit_strategy, ds.where(r.qualified_key=>sds.select(*Array(r.qualified_primary_key))))
89
89
  when :many_to_many, :one_through_one
90
90
  mds = r.associated_class.dataset.
91
91
  join(r[:join_table], r[:right_keys].zip(r.right_primary_keys)).
92
92
  select(*Array(r.qualified_right_key)).
93
93
  where(r.qualify(r.join_table_alias, r[:left_keys])=>sds.select(*r.qualify(model.table_name, r[:left_primary_key_columns])))
94
- ds.filter(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
94
+ ds.where(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
95
95
  when :many_through_many, :one_through_many
96
96
  fe, *edges = r.edges
97
97
  edges << r.final_edge
@@ -109,11 +109,11 @@ module Sequel
109
109
  select(*Array(r.qualify(table, left))).
110
110
  where(r.qualify(fe[:table], fe[:right])=>sds.select(*r.qualify(model.table_name, r[:left_primary_key_columns])))
111
111
  edges.each{|e| mds = mds.join(e[:table], Array(e[:right]).zip(Array(e[:left])))}
112
- ds.filter(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
112
+ ds.where(r.qualified_right_primary_key=>r.send(:apply_filter_by_associations_limit_strategy, mds))
113
113
  when :pg_array_to_many
114
- ds.filter(Sequel[r.primary_key=>sds.select{Sequel.pg_array_op(r.qualify(r[:model].table_name, r[:key])).unnest}])
114
+ ds.where(Sequel[r.primary_key=>sds.select{Sequel.pg_array_op(r.qualify(r[:model].table_name, r[:key])).unnest}])
115
115
  when :many_to_pg_array
116
- ds.filter(Sequel.function(:coalesce, Sequel.pg_array_op(r[:key]).overlaps(sds.select{array_agg(r.qualify(r[:model].table_name, r.primary_key))}), false))
116
+ ds.where(Sequel.function(:coalesce, Sequel.pg_array_op(r[:key]).overlaps(sds.select{array_agg(r.qualify(r[:model].table_name, r.primary_key))}), false))
117
117
  else
118
118
  raise Error, "unrecognized association type for association #{name.inspect}: #{r[:type].inspect}"
119
119
  end
@@ -30,9 +30,9 @@ module Sequel
30
30
  module EagerEach
31
31
  module DatasetMethods
32
32
  # Don't call #all when attempting to load the columns.
33
- def columns
33
+ def columns!
34
34
  if use_eager_all?
35
- clone(:all_called=>true).columns
35
+ clone(:all_called=>true).columns!
36
36
  else
37
37
  super
38
38
  end
@@ -100,7 +100,7 @@ module Sequel
100
100
 
101
101
  # Apply the instance filters to the given dataset
102
102
  def apply_instance_filters(ds)
103
- instance_filters.inject(ds){|ds1, i| ds1.filter(*i[0], &i[1])}
103
+ instance_filters.inject(ds){|ds1, i| ds1.where(*i[0], &i[1])}
104
104
  end
105
105
 
106
106
  # Clear the instance filters.
@@ -55,7 +55,7 @@ module Sequel
55
55
  # of which return all objects in the dataset:
56
56
  #
57
57
  # Album.to_json
58
- # Album.filter(:artist_id=>1).to_json(:include=>:tags)
58
+ # Album.where(:artist_id=>1).to_json(:include=>:tags)
59
59
  #
60
60
  # If you have an existing array of model instances you want to convert to
61
61
  # JSON, you can call the class to_json method with the :array option:
@@ -72,7 +72,7 @@ module Sequel
72
72
  # The array_from_json class method exists to parse arrays of model instances
73
73
  # from json:
74
74
  #
75
- # json = Album.filter(:artist_id=>1).to_json
75
+ # json = Album.where(:artist_id=>1).to_json
76
76
  # albums = Album.array_from_json(json)
77
77
  #
78
78
  # These does not necessarily round trip, since doing so would let users
@@ -13,7 +13,7 @@ module Sequel
13
13
  # get the reviews for all of those albums:
14
14
  #
15
15
  # Album.plugin :lazy_attributes, :review
16
- # Album.filter{id<100}.all do |a|
16
+ # Album.where{id<100}.all do |a|
17
17
  # a.review
18
18
  # end
19
19
  #
@@ -62,10 +62,10 @@ module Sequel
62
62
  model.scope_proc = case scope = opts[:scope]
63
63
  when Symbol
64
64
  model.dataset = model.dataset.order_prepend(scope)
65
- proc{|obj| obj.model.filter(scope=>obj.send(scope))}
65
+ proc{|obj| obj.model.where(scope=>obj.send(scope))}
66
66
  when Array
67
67
  model.dataset = model.dataset.order_prepend(*scope)
68
- proc{|obj| obj.model.filter(scope.map{|s| [s, obj.get_column_value(s)]})}
68
+ proc{|obj| obj.model.where(scope.map{|s| [s, obj.get_column_value(s)]})}
69
69
  else
70
70
  scope
71
71
  end
@@ -123,11 +123,11 @@ module Sequel
123
123
  ds = list_dataset
124
124
  op, ds = if target < current
125
125
  target = 1 if target < 1
126
- [:+, ds.filter(position_field=>target...current)]
126
+ [:+, ds.where(position_field=>target...current)]
127
127
  else
128
128
  lp ||= last_position
129
129
  target = lp if target > lp
130
- [:-, ds.filter(position_field=>(current + 1)..target)]
130
+ [:-, ds.where(position_field=>(current + 1)..target)]
131
131
  end
132
132
  ds.update(position_field => Sequel::SQL::NumericExpression.new(op, position_field, 1))
133
133
  update(position_field => target)
@@ -67,9 +67,7 @@ module Sequel
67
67
  # Create a prepared statement based on the given dataset with a unique name for the given
68
68
  # type of query and values.
69
69
  def prepare_statement(ds, type, vals=OPTS)
70
- ps = ds.prepare(type, :"smpsp_#{NEXT.call}", vals)
71
- ps.log_sql = true
72
- ps
70
+ ds.clone(:log_sql=>true).prepare(type, :"smpsp_#{NEXT.call}", vals)
73
71
  end
74
72
 
75
73
  # Return a sorted array of columns for use as a hash key.
@@ -102,7 +100,7 @@ module Sequel
102
100
 
103
101
  # Return a prepared statement that can be used to refresh a row to get new column values after insertion.
104
102
  def prepared_refresh
105
- cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).filter(prepared_statement_key_array(primary_key)), :first)}
103
+ cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).where(prepared_statement_key_array(primary_key)), :first)}
106
104
  end
107
105
 
108
106
  # Return an array of two element arrays with the column symbol as the first entry and the
@@ -77,9 +77,7 @@ module Sequel
77
77
  end
78
78
  ds = ds.bind(h)
79
79
  end
80
- ps = ds.prepare(opts.returns_array? ? :select : :first, :"smpsap_#{NEXT.call}")
81
- ps.log_sql = true
82
- ps
80
+ ds.clone(:log_sql=>true).prepare(opts.returns_array? ? :select : :first, :"smpsap_#{NEXT.call}")
83
81
  end
84
82
  end
85
83
  end
@@ -33,7 +33,7 @@ module Sequel
33
33
  # Return a prepared statement that can be used to lookup a row given a dataset for the row matching
34
34
  # the primary key.
35
35
  def prepared_lookup_dataset(ds)
36
- cached_prepared_statement(:lookup_sql, ds.sql){prepare_statement(ds.filter(prepared_statement_key_array(primary_key).map{|k, v| [SQL::QualifiedIdentifier.new(ds.model.table_name, k), v]}), :first)}
36
+ cached_prepared_statement(:lookup_sql, ds.sql){prepare_statement(ds.where(prepared_statement_key_array(primary_key).map{|k, v| [SQL::QualifiedIdentifier.new(ds.model.table_name, k), v]}), :first)}
37
37
  end
38
38
  end
39
39
 
@@ -56,12 +56,12 @@ module Sequel
56
56
  #
57
57
  # # Eager loading - also populates the :parent and children associations
58
58
  # # for all ancestors and descendants
59
- # Model.filter(:id=>[1, 2]).eager(:ancestors, :descendants).all
59
+ # Model.where(:id=>[1, 2]).eager(:ancestors, :descendants).all
60
60
  #
61
61
  # # Eager loading children and grand children
62
- # Model.filter(:id=>[1, 2]).eager(:descendants=>2).all
62
+ # Model.where(:id=>[1, 2]).eager(:descendants=>2).all
63
63
  # # Eager loading children, grand children, and great grand children
64
- # Model.filter(:id=>[1, 2]).eager(:descendants=>3).all
64
+ # Model.where(:id=>[1, 2]).eager(:descendants=>3).all
65
65
  #
66
66
  # = Options
67
67
  #
@@ -150,11 +150,11 @@ module Sequel
150
150
  a[:read_only] = true unless a.has_key?(:read_only)
151
151
  a[:eager_loader_key] = key
152
152
  a[:dataset] ||= proc do
153
- base_ds = model.filter(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
153
+ base_ds = model.where(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
154
154
  recursive_ds = model.join(t, key_array.zip(prkey_array))
155
155
  if c = a[:conditions]
156
156
  (base_ds, recursive_ds) = [base_ds, recursive_ds].collect do |ds|
157
- (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.filter(*c) : ds.filter(c)
157
+ (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
158
158
  end
159
159
  end
160
160
  table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
@@ -196,13 +196,13 @@ module Sequel
196
196
  obj.associations[parent] = nil
197
197
  end
198
198
  r = model.association_reflection(ancestors)
199
- base_case = model.filter(prkey=>id_map.keys).
199
+ base_case = model.where(prkey=>id_map.keys).
200
200
  select(*ancestor_base_case_columns)
201
201
  recursive_case = model.join(t, key_array.zip(prkey_array)).
202
202
  select(*recursive_case_columns)
203
203
  if c = r[:conditions]
204
204
  (base_case, recursive_case) = [base_case, recursive_case].collect do |ds|
205
- (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.filter(*c) : ds.filter(c)
205
+ (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
206
206
  end
207
207
  end
208
208
  table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
@@ -245,11 +245,11 @@ module Sequel
245
245
  d[:read_only] = true unless d.has_key?(:read_only)
246
246
  la = d[:level_alias] ||= :x_level_x
247
247
  d[:dataset] ||= proc do
248
- base_ds = model.filter(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
248
+ base_ds = model.where(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
249
249
  recursive_ds = model.join(t, prkey_array.zip(key_array))
250
250
  if c = d[:conditions]
251
251
  (base_ds, recursive_ds) = [base_ds, recursive_ds].collect do |ds|
252
- (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.filter(*c) : ds.filter(c)
252
+ (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
253
253
  end
254
254
  end
255
255
  table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
@@ -294,21 +294,21 @@ module Sequel
294
294
  obj.associations[childrena] = []
295
295
  end
296
296
  r = model.association_reflection(descendants)
297
- base_case = model.filter(key=>id_map.keys).
297
+ base_case = model.where(key=>id_map.keys).
298
298
  select(*descendant_base_case_columns)
299
299
  recursive_case = model.join(t, prkey_array.zip(key_array)).
300
300
  select(*recursive_case_columns)
301
301
  if c = r[:conditions]
302
302
  (base_case, recursive_case) = [base_case, recursive_case].collect do |ds|
303
- (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.filter(*c) : ds.filter(c)
303
+ (c.is_a?(Array) && !Sequel.condition_specifier?(c)) ? ds.where(*c) : ds.where(c)
304
304
  end
305
305
  end
306
306
  if associations.is_a?(Integer)
307
307
  level = associations
308
308
  no_cache_level = level - 1
309
309
  associations = {}
310
- base_case = base_case.select_more(SQL::AliasedExpression.new(Sequel.cast(0, Integer), la))
311
- recursive_case = recursive_case.select_more(SQL::AliasedExpression.new(SQL::QualifiedIdentifier.new(t, la) + 1, la)).filter(SQL::QualifiedIdentifier.new(t, la) < level - 1)
310
+ base_case = base_case.select_append(SQL::AliasedExpression.new(Sequel.cast(0, Integer), la))
311
+ recursive_case = recursive_case.select_append(SQL::AliasedExpression.new(SQL::QualifiedIdentifier.new(t, la) + 1, la)).where(SQL::QualifiedIdentifier.new(t, la) < level - 1)
312
312
  end
313
313
  table_alias = model.dataset.schema_and_table(model.table_name)[1].to_sym
314
314
  ds = model.from(SQL::AliasedExpression.new(t, table_alias)).
@@ -111,7 +111,7 @@ module Sequel
111
111
  def server(s)
112
112
  ds = super
113
113
  if rp = row_proc
114
- ds.row_proc = proc{|r| rp.call(r).set_server(s)}
114
+ ds = ds.with_row_proc(proc{|r| rp.call(r).set_server(s)})
115
115
  end
116
116
  ds
117
117
  end
@@ -119,7 +119,8 @@ module Sequel
119
119
  lambda{|klass| klass.name.to_s}
120
120
  end
121
121
  @sti_key_chooser = opts[:key_chooser] || lambda{|inst| Array(inst.model.sti_key_map[inst.model]).last }
122
- dataset.row_proc = lambda{|r| model.sti_load(r)}
122
+
123
+ @dataset = @dataset.with_row_proc(model.method(:sti_load))
123
124
  end
124
125
  end
125
126
 
@@ -158,9 +159,9 @@ module Sequel
158
159
  key = Array(sti_key_map[subclass]).dup
159
160
  sti_subclass_added(key)
160
161
  rp = dataset.row_proc
161
- subclass.set_dataset(sti_dataset.filter(SQL::QualifiedIdentifier.new(sti_dataset.first_source_alias, sti_key)=>key), :inherited=>true)
162
+ subclass.set_dataset(sti_dataset.where(SQL::QualifiedIdentifier.new(sti_dataset.first_source_alias, sti_key)=>Sequel.delay{key}), :inherited=>true)
162
163
  subclass.instance_eval do
163
- dataset.row_proc = rp
164
+ @dataset = @dataset.with_row_proc(rp)
164
165
  @sti_key_array = key
165
166
  self.simple_table = nil
166
167
  end
@@ -187,7 +188,11 @@ module Sequel
187
188
  # If calling set_dataset manually, make sure to set the dataset
188
189
  # row proc to one that handles inheritance correctly.
189
190
  def set_dataset_row_proc(ds)
190
- ds.row_proc = @dataset.row_proc if @dataset
191
+ if @dataset
192
+ ds.with_row_proc(@dataset.row_proc)
193
+ else
194
+ super
195
+ end
191
196
  end
192
197
 
193
198
  # Return a class object. If a class is given, return it directly.
@@ -16,7 +16,7 @@ module Sequel
16
16
  #
17
17
  # Basically, this allows the following code to issue only two queries:
18
18
  #
19
- # Album.filter{id<100}.all do |a|
19
+ # Album.where{id<100}.all do |a|
20
20
  # a.artists
21
21
  # end
22
22
  # # SELECT * FROM albums WHERE (id < 100)
@@ -30,7 +30,7 @@ module Sequel
30
30
  # objects that the current object was retrieved with:
31
31
  #
32
32
  # # SELECT * FROM albums WHERE (id < 100)
33
- # albums = Album.filter{id<100}.all
33
+ # albums = Album.where{id<100}.all
34
34
  #
35
35
  # # Eagerly load all artists for these albums
36
36
  # # SELECT * FROM artists WHERE id IN (...)
@@ -45,7 +45,7 @@ module Sequel
45
45
  # You can also use the :eager option to specify dependent associations
46
46
  # to eager load:
47
47
  #
48
- # albums = Album.filter{id<100}.all
48
+ # albums = Album.where{id<100}.all
49
49
  #
50
50
  # # Eager load all artists for these albums, and all albums for those artists
51
51
  # # SELECT * FROM artists WHERE id IN (...)
@@ -54,7 +54,7 @@ module Sequel
54
54
  #
55
55
  # You can also use :eager to specify an eager callback. For example:
56
56
  #
57
- # albums = Album.filter{id<100}.all
57
+ # albums = Album.where{id<100}.all
58
58
  #
59
59
  # # Eagerly load all artists whose name starts with A-M for these albums
60
60
  # # SELECT * FROM artists WHERE name > 'N' AND id IN (...)
@@ -378,7 +378,7 @@ module Sequel
378
378
  a = Array(a)
379
379
  v = Array(v)
380
380
  next if v.empty? || !v.all?
381
- ds = o.class.filter(a.zip(v))
381
+ ds = o.class.where(a.zip(v))
382
382
  num_dups = ds.count
383
383
  allow = if num_dups == 0
384
384
  # No unique value in the database
@@ -204,7 +204,7 @@ module Sequel
204
204
  # must be unique. So if you are doing a soft delete of records, in which
205
205
  # the name must be unique, but only for active records:
206
206
  #
207
- # validates_unique(:name){|ds| ds.filter(:active)}
207
+ # validates_unique(:name){|ds| ds.where(:active)}
208
208
  #
209
209
  # You should also add a unique index in the
210
210
  # database, as this suffers from a fairly obvious race condition.
@@ -63,7 +63,7 @@ module Sequel
63
63
  # of which return all objects in the dataset:
64
64
  #
65
65
  # Album.to_xml
66
- # Album.filter(:artist_id=>1).to_xml(:include=>:tags)
66
+ # Album.where(:artist_id=>1).to_xml(:include=>:tags)
67
67
  #
68
68
  # If you have an existing array of model instances you want to convert to
69
69
  # XML, you can call the class to_xml method with the :array option:
@@ -80,7 +80,7 @@ module Sequel
80
80
  # The array_from_xml class method exists to parse arrays of model instances
81
81
  # from xml:
82
82
  #
83
- # xml = Album.filter(:artist_id=>1).to_xml
83
+ # xml = Album.where(:artist_id=>1).to_xml
84
84
  # albums = Album.array_from_xml(xml)
85
85
  #
86
86
  # These does not necessarily round trip, since doing so would let users