sequel 4.36.0 → 5.61.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 +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
@@ -10,17 +10,21 @@ module Sequel
|
|
10
10
|
# ---------------------
|
11
11
|
|
12
12
|
# Action methods defined by Sequel that execute code on the database.
|
13
|
-
ACTION_METHODS = (<<-METHS).split.map(&:to_sym)
|
14
|
-
<< [] all avg count columns columns! delete each
|
15
|
-
empty? fetch_rows first first! get import insert
|
16
|
-
map max min multi_insert paged_each
|
13
|
+
ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
|
14
|
+
<< [] all as_hash avg count columns columns! delete each
|
15
|
+
empty? fetch_rows first first! get import insert last
|
16
|
+
map max min multi_insert paged_each select_hash select_hash_groups select_map select_order_map
|
17
17
|
single_record single_record! single_value single_value! sum to_hash to_hash_groups truncate update
|
18
|
+
where_all where_each where_single_value
|
18
19
|
METHS
|
19
20
|
|
21
|
+
# The clone options to use when retrieving columns for a dataset.
|
22
|
+
COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 0, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
|
23
|
+
|
20
24
|
# Inserts the given argument into the database. Returns self so it
|
21
25
|
# can be used safely when chaining:
|
22
26
|
#
|
23
|
-
# DB[:items] << {:
|
27
|
+
# DB[:items] << {id: 0, name: 'Zero'} << DB[:old_items].select(:id, name)
|
24
28
|
def <<(arg)
|
25
29
|
insert(arg)
|
26
30
|
self
|
@@ -28,10 +32,10 @@ module Sequel
|
|
28
32
|
|
29
33
|
# Returns the first record matching the conditions. Examples:
|
30
34
|
#
|
31
|
-
# DB[:table][:
|
32
|
-
# # => {:id
|
35
|
+
# DB[:table][id: 1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
|
36
|
+
# # => {:id=>1}
|
33
37
|
def [](*conditions)
|
34
|
-
raise(Error,
|
38
|
+
raise(Error, 'You cannot call Dataset#[] with an integer or with no arguments') if (conditions.length == 1 and conditions.first.is_a?(Integer)) or conditions.length == 0
|
35
39
|
first(*conditions)
|
36
40
|
end
|
37
41
|
|
@@ -54,8 +58,9 @@ module Sequel
|
|
54
58
|
# # => 3
|
55
59
|
# DB[:table].avg{function(column)} # SELECT avg(function(column)) FROM table LIMIT 1
|
56
60
|
# # => 1
|
57
|
-
def avg(
|
58
|
-
|
61
|
+
def avg(arg=(no_arg = true), &block)
|
62
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
63
|
+
_aggregate(:avg, arg)
|
59
64
|
end
|
60
65
|
|
61
66
|
# Returns the columns in the result set in order as an array of symbols.
|
@@ -68,11 +73,7 @@ module Sequel
|
|
68
73
|
# DB[:table].columns
|
69
74
|
# # => [:id, :name]
|
70
75
|
def columns
|
71
|
-
|
72
|
-
ds = unfiltered.unordered.naked.clone(:distinct => nil, :limit => 1, :offset=>nil)
|
73
|
-
ds.each{break}
|
74
|
-
@columns = ds.instance_variable_get(:@columns)
|
75
|
-
@columns || []
|
76
|
+
_columns || columns!
|
76
77
|
end
|
77
78
|
|
78
79
|
# Ignore any cached column information and perform a query to retrieve
|
@@ -81,10 +82,18 @@ module Sequel
|
|
81
82
|
# DB[:table].columns!
|
82
83
|
# # => [:id, :name]
|
83
84
|
def columns!
|
84
|
-
|
85
|
-
|
85
|
+
ds = clone(COLUMNS_CLONE_OPTIONS)
|
86
|
+
ds.each{break}
|
87
|
+
|
88
|
+
if cols = ds.cache[:_columns]
|
89
|
+
self.columns = cols
|
90
|
+
else
|
91
|
+
[]
|
92
|
+
end
|
86
93
|
end
|
87
94
|
|
95
|
+
COUNT_SELECT = Sequel.function(:count).*.as(:count)
|
96
|
+
|
88
97
|
# Returns the number of records in the dataset. If an argument is provided,
|
89
98
|
# it is used as the argument to count. If a block is provided, it is
|
90
99
|
# treated as a virtual row, and the result is used as the argument to
|
@@ -97,22 +106,24 @@ module Sequel
|
|
97
106
|
# DB[:table].count{foo(column)} # SELECT count(foo(column)) AS count FROM table LIMIT 1
|
98
107
|
# # => 1
|
99
108
|
def count(arg=(no_arg=true), &block)
|
100
|
-
if no_arg
|
109
|
+
if no_arg && !block
|
110
|
+
cached_dataset(:_count_ds) do
|
111
|
+
aggregate_dataset.select(COUNT_SELECT).single_value_ds
|
112
|
+
end.single_value!.to_i
|
113
|
+
else
|
101
114
|
if block
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
115
|
+
if no_arg
|
116
|
+
arg = Sequel.virtual_row(&block)
|
117
|
+
else
|
118
|
+
raise Error, 'cannot provide both argument and block to Dataset#count'
|
119
|
+
end
|
106
120
|
end
|
107
|
-
|
108
|
-
|
109
|
-
else
|
110
|
-
aggregate_dataset.get{count(arg).as(:count)}
|
121
|
+
|
122
|
+
_aggregate(:count, arg)
|
111
123
|
end
|
112
124
|
end
|
113
|
-
|
114
|
-
# Deletes the records in the dataset
|
115
|
-
# number of records deleted, but that is adapter dependent.
|
125
|
+
|
126
|
+
# Deletes the records in the dataset, returning the number of records deleted.
|
116
127
|
#
|
117
128
|
# DB[:table].delete # DELETE * FROM table
|
118
129
|
# # => 3
|
@@ -135,27 +146,30 @@ module Sequel
|
|
135
146
|
# running queries inside the block, you should use +all+ instead of +each+
|
136
147
|
# for the outer queries, or use a separate thread or shard inside +each+.
|
137
148
|
def each
|
138
|
-
if
|
139
|
-
fetch_rows(select_sql){|r| yield
|
149
|
+
if rp = row_proc
|
150
|
+
fetch_rows(select_sql){|r| yield rp.call(r)}
|
140
151
|
else
|
141
152
|
fetch_rows(select_sql){|r| yield r}
|
142
153
|
end
|
143
154
|
self
|
144
155
|
end
|
145
156
|
|
157
|
+
EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
|
158
|
+
|
146
159
|
# Returns true if no records exist in the dataset, false otherwise
|
147
160
|
#
|
148
161
|
# DB[:table].empty? # SELECT 1 AS one FROM table LIMIT 1
|
149
162
|
# # => false
|
150
163
|
def empty?
|
151
|
-
|
152
|
-
|
164
|
+
cached_dataset(:_empty_ds) do
|
165
|
+
single_value_ds.unordered.select(EMPTY_SELECT)
|
166
|
+
end.single_value!.nil?
|
153
167
|
end
|
154
168
|
|
169
|
+
# Returns the first matching record if no arguments are given.
|
155
170
|
# If a integer argument is given, it is interpreted as a limit, and then returns all
|
156
|
-
# matching records up to that limit. If
|
157
|
-
#
|
158
|
-
# argument(s) is passed, it is given to filter and the
|
171
|
+
# matching records up to that limit. If any other type of
|
172
|
+
# argument(s) is passed, it is treated as a filter and the
|
159
173
|
# first matching record is returned. If a block is given, it is used
|
160
174
|
# to filter the dataset before returning anything.
|
161
175
|
#
|
@@ -170,35 +184,65 @@ module Sequel
|
|
170
184
|
# DB[:table].first(2) # SELECT * FROM table LIMIT 2
|
171
185
|
# # => [{:id=>6}, {:id=>4}]
|
172
186
|
#
|
173
|
-
# DB[:table].first(:
|
187
|
+
# DB[:table].first(id: 2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
|
174
188
|
# # => {:id=>2}
|
175
189
|
#
|
176
|
-
# DB[:table].first("id = 3") # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
190
|
+
# DB[:table].first(Sequel.lit("id = 3")) # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
177
191
|
# # => {:id=>3}
|
178
192
|
#
|
179
|
-
# DB[:table].first("id = ?", 4) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
193
|
+
# DB[:table].first(Sequel.lit("id = ?", 4)) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
180
194
|
# # => {:id=>4}
|
181
195
|
#
|
182
196
|
# DB[:table].first{id > 2} # SELECT * FROM table WHERE (id > 2) LIMIT 1
|
183
197
|
# # => {:id=>5}
|
184
198
|
#
|
185
|
-
# DB[:table].first("id > ?", 4){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
199
|
+
# DB[:table].first(Sequel.lit("id > ?", 4)){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
186
200
|
# # => {:id=>5}
|
187
201
|
#
|
188
202
|
# DB[:table].first(2){id < 2} # SELECT * FROM table WHERE (id < 2) LIMIT 2
|
189
203
|
# # => [{:id=>1}]
|
190
204
|
def first(*args, &block)
|
191
|
-
|
205
|
+
case args.length
|
206
|
+
when 0
|
207
|
+
unless block
|
208
|
+
return single_record
|
209
|
+
end
|
210
|
+
when 1
|
211
|
+
arg = args[0]
|
212
|
+
if arg.is_a?(Integer)
|
213
|
+
res = if block
|
214
|
+
if loader = cached_placeholder_literalizer(:_first_integer_cond_loader) do |pl|
|
215
|
+
where(pl.arg).limit(pl.arg)
|
216
|
+
end
|
192
217
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
218
|
+
loader.all(filter_expr(&block), arg)
|
219
|
+
else
|
220
|
+
where(&block).limit(arg).all
|
221
|
+
end
|
222
|
+
else
|
223
|
+
if loader = cached_placeholder_literalizer(:_first_integer_loader) do |pl|
|
224
|
+
limit(pl.arg)
|
225
|
+
end
|
226
|
+
|
227
|
+
loader.all(arg)
|
228
|
+
else
|
229
|
+
limit(arg).all
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
return res
|
234
|
+
end
|
235
|
+
where_args = args
|
236
|
+
args = arg
|
237
|
+
end
|
238
|
+
|
239
|
+
if loader = cached_where_placeholder_literalizer(where_args||args, block, :_first_cond_loader) do |pl|
|
240
|
+
_single_record_ds.where(pl.arg)
|
201
241
|
end
|
242
|
+
|
243
|
+
loader.first(filter_expr(args, &block))
|
244
|
+
else
|
245
|
+
_single_record_ds.where(args, &block).single_record!
|
202
246
|
end
|
203
247
|
end
|
204
248
|
|
@@ -229,15 +273,32 @@ module Sequel
|
|
229
273
|
def get(column=(no_arg=true; nil), &block)
|
230
274
|
ds = naked
|
231
275
|
if block
|
232
|
-
raise(Error,
|
276
|
+
raise(Error, 'Must call Dataset#get with an argument or a block, not both') unless no_arg
|
233
277
|
ds = ds.select(&block)
|
234
278
|
column = ds.opts[:select]
|
235
279
|
column = nil if column.is_a?(Array) && column.length < 2
|
236
280
|
else
|
237
|
-
|
238
|
-
|
281
|
+
case column
|
282
|
+
when Array
|
283
|
+
ds = ds.select(*column)
|
284
|
+
when LiteralString, Symbol, SQL::Identifier, SQL::QualifiedIdentifier, SQL::AliasedExpression
|
285
|
+
if loader = cached_placeholder_literalizer(:_get_loader) do |pl|
|
286
|
+
ds.single_value_ds.select(pl.arg)
|
287
|
+
end
|
288
|
+
|
289
|
+
return loader.get(column)
|
290
|
+
end
|
291
|
+
|
292
|
+
ds = ds.select(column)
|
239
293
|
else
|
240
|
-
|
294
|
+
if loader = cached_placeholder_literalizer(:_get_alias_loader) do |pl|
|
295
|
+
ds.single_value_ds.select(Sequel.as(pl.arg, :v))
|
296
|
+
end
|
297
|
+
|
298
|
+
return loader.get(column)
|
299
|
+
end
|
300
|
+
|
301
|
+
ds = ds.select(Sequel.as(column, :v))
|
241
302
|
end
|
242
303
|
end
|
243
304
|
|
@@ -272,6 +333,7 @@ module Sequel
|
|
272
333
|
# after every 50 records.
|
273
334
|
# :return :: When this is set to :primary_key, returns an array of
|
274
335
|
# autoincremented primary key values for the rows inserted.
|
336
|
+
# This does not have an effect if +values+ is a Dataset.
|
275
337
|
# :server :: Set the server/shard to use for the transaction and insert
|
276
338
|
# queries.
|
277
339
|
# :slice :: Same as :commit_every, :commit_every takes precedence.
|
@@ -279,7 +341,7 @@ module Sequel
|
|
279
341
|
return @db.transaction{insert(columns, values)} if values.is_a?(Dataset)
|
280
342
|
|
281
343
|
return if values.empty?
|
282
|
-
raise(Error,
|
344
|
+
raise(Error, 'Using Sequel::Dataset#import with an empty column array is not allowed') if columns.empty?
|
283
345
|
ds = opts[:server] ? server(opts[:server]) : self
|
284
346
|
|
285
347
|
if slice_size = opts.fetch(:commit_every, opts.fetch(:slice, default_import_slice))
|
@@ -296,7 +358,8 @@ module Sequel
|
|
296
358
|
end
|
297
359
|
|
298
360
|
# Inserts values into the associated table. The returned value is generally
|
299
|
-
# the value of the primary key for the inserted row,
|
361
|
+
# the value of the autoincremented primary key for the inserted row, assuming that
|
362
|
+
# a single row is inserted and the table has an autoincrementing primary key.
|
300
363
|
#
|
301
364
|
# +insert+ handles a number of different argument formats:
|
302
365
|
# no arguments or single empty hash :: Uses DEFAULT VALUES
|
@@ -322,7 +385,7 @@ module Sequel
|
|
322
385
|
# DB[:items].insert([:a, :b], [1,2])
|
323
386
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
324
387
|
#
|
325
|
-
# DB[:items].insert(:
|
388
|
+
# DB[:items].insert(a: 1, b: 2)
|
326
389
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
327
390
|
#
|
328
391
|
# DB[:items].insert(DB[:old_items])
|
@@ -339,17 +402,6 @@ module Sequel
|
|
339
402
|
end
|
340
403
|
end
|
341
404
|
|
342
|
-
# Returns the interval between minimum and maximum values for the given
|
343
|
-
# column/expression. Uses a virtual row block if no argument is given.
|
344
|
-
#
|
345
|
-
# DB[:table].interval(:id) # SELECT (max(id) - min(id)) FROM table LIMIT 1
|
346
|
-
# # => 6
|
347
|
-
# DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
|
348
|
-
# # => 7
|
349
|
-
def interval(column=Sequel.virtual_row(&Proc.new))
|
350
|
-
aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
|
351
|
-
end
|
352
|
-
|
353
405
|
# Reverses the order and then runs #first with the given arguments and block. Note that this
|
354
406
|
# will not necessarily give you the last record in the dataset,
|
355
407
|
# unless you have an unambiguous order. If there is not
|
@@ -365,8 +417,8 @@ module Sequel
|
|
365
417
|
reverse.first(*args, &block)
|
366
418
|
end
|
367
419
|
|
368
|
-
# Maps column values for each record in the dataset (if
|
369
|
-
#
|
420
|
+
# Maps column values for each record in the dataset (if an argument is given)
|
421
|
+
# or performs the stock mapping functionality of +Enumerable+ otherwise.
|
370
422
|
# Raises an +Error+ if both an argument and block are given.
|
371
423
|
#
|
372
424
|
# DB[:table].map(:id) # SELECT * FROM table
|
@@ -381,7 +433,7 @@ module Sequel
|
|
381
433
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
382
434
|
def map(column=nil, &block)
|
383
435
|
if column
|
384
|
-
raise(Error,
|
436
|
+
raise(Error, 'Must call Dataset#map with either an argument or a block, not both') if block
|
385
437
|
return naked.map(column) if row_proc
|
386
438
|
if column.is_a?(Array)
|
387
439
|
super(){|r| r.values_at(*column)}
|
@@ -400,8 +452,58 @@ module Sequel
|
|
400
452
|
# # => 10
|
401
453
|
# DB[:table].max{function(column)} # SELECT max(function(column)) FROM table LIMIT 1
|
402
454
|
# # => 7
|
403
|
-
def max(
|
404
|
-
|
455
|
+
def max(arg=(no_arg = true), &block)
|
456
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
457
|
+
_aggregate(:max, arg)
|
458
|
+
end
|
459
|
+
|
460
|
+
# Execute a MERGE statement, which allows for INSERT, UPDATE, and DELETE
|
461
|
+
# behavior in a single query, based on whether rows from a source table
|
462
|
+
# match rows in the current table, based on the join conditions.
|
463
|
+
#
|
464
|
+
# Unless the dataset uses static SQL, to use #merge, you must first have
|
465
|
+
# called #merge_using to specify the merge source and join conditions.
|
466
|
+
# You will then likely to call one or more of the following methods
|
467
|
+
# to specify MERGE behavior by adding WHEN [NOT] MATCHED clauses:
|
468
|
+
#
|
469
|
+
# * #merge_insert
|
470
|
+
# * #merge_update
|
471
|
+
# * #merge_delete
|
472
|
+
#
|
473
|
+
# The WHEN [NOT] MATCHED clauses are added to the SQL in the order these
|
474
|
+
# methods were called on the dataset. If none of these methods are
|
475
|
+
# called, an error is raised.
|
476
|
+
#
|
477
|
+
# Example:
|
478
|
+
#
|
479
|
+
# DB[:m1]
|
480
|
+
# merge_using(:m2, i1: :i2).
|
481
|
+
# merge_insert(i1: :i2, a: Sequel[:b]+11).
|
482
|
+
# merge_delete{a > 30}.
|
483
|
+
# merge_update(i1: Sequel[:i1]+:i2+10, a: Sequel[:a]+:b+20).
|
484
|
+
# merge
|
485
|
+
#
|
486
|
+
# SQL:
|
487
|
+
#
|
488
|
+
# MERGE INTO m1 USING m2 ON (i1 = i2)
|
489
|
+
# WHEN NOT MATCHED THEN INSERT (i1, a) VALUES (i2, (b + 11))
|
490
|
+
# WHEN MATCHED AND (a > 30) THEN DELETE
|
491
|
+
# WHEN MATCHED THEN UPDATE SET i1 = (i1 + i2 + 10), a = (a + b + 20)
|
492
|
+
#
|
493
|
+
# On PostgreSQL, two additional merge methods are supported, for the
|
494
|
+
# PostgreSQL-specific DO NOTHING syntax.
|
495
|
+
#
|
496
|
+
# * #merge_do_nothing_when_matched
|
497
|
+
# * #merge_do_nothing_when_not_matched
|
498
|
+
#
|
499
|
+
# This method is supported on Oracle, but Oracle's MERGE support is
|
500
|
+
# non-standard, and has the following issues:
|
501
|
+
#
|
502
|
+
# * DELETE clause requires UPDATE clause
|
503
|
+
# * DELETE clause requires a condition
|
504
|
+
# * DELETE clause only affects rows updated by UPDATE clause
|
505
|
+
def merge
|
506
|
+
execute_ddl(merge_sql)
|
405
507
|
end
|
406
508
|
|
407
509
|
# Returns the minimum value for the given column/expression.
|
@@ -411,14 +513,15 @@ module Sequel
|
|
411
513
|
# # => 1
|
412
514
|
# DB[:table].min{function(column)} # SELECT min(function(column)) FROM table LIMIT 1
|
413
515
|
# # => 0
|
414
|
-
def min(
|
415
|
-
|
516
|
+
def min(arg=(no_arg = true), &block)
|
517
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
518
|
+
_aggregate(:min, arg)
|
416
519
|
end
|
417
520
|
|
418
521
|
# This is a front end for import that allows you to submit an array of
|
419
522
|
# hashes instead of arrays of columns and values:
|
420
523
|
#
|
421
|
-
# DB[:table].multi_insert([{:
|
524
|
+
# DB[:table].multi_insert([{x: 1}, {x: 2}])
|
422
525
|
# # INSERT INTO table (x) VALUES (1)
|
423
526
|
# # INSERT INTO table (x) VALUES (2)
|
424
527
|
#
|
@@ -433,7 +536,7 @@ module Sequel
|
|
433
536
|
import(columns, hashes.map{|h| columns.map{|c| h[c]}}, opts)
|
434
537
|
end
|
435
538
|
|
436
|
-
# Yields each row in the dataset, but
|
539
|
+
# Yields each row in the dataset, but internally uses multiple queries as needed to
|
437
540
|
# process the entire result set without keeping all rows in the dataset in memory,
|
438
541
|
# even if the underlying driver buffers all query results in memory.
|
439
542
|
#
|
@@ -445,6 +548,10 @@ module Sequel
|
|
445
548
|
# Sequel checks that the datasets using this method have an order, but it cannot
|
446
549
|
# ensure that the order is unambiguous.
|
447
550
|
#
|
551
|
+
# Note that this method is not safe to use on many adapters if you are
|
552
|
+
# running additional queries inside the provided block. If you are
|
553
|
+
# running queries inside the block, use a separate thread or shard inside +paged_each+.
|
554
|
+
#
|
448
555
|
# Options:
|
449
556
|
# :rows_per_fetch :: The number of rows to fetch per query. Defaults to 1000.
|
450
557
|
# :strategy :: The strategy to use for paging of results. By default this is :offset,
|
@@ -454,8 +561,8 @@ module Sequel
|
|
454
561
|
# selecting the columns you are ordering by, and none of the columns can contain
|
455
562
|
# NULLs. Note that some Sequel adapters have optimized implementations that will
|
456
563
|
# use cursors or streaming regardless of the :strategy option used.
|
457
|
-
# :filter_values :: If the :
|
458
|
-
# that accepts the last
|
564
|
+
# :filter_values :: If the strategy: :filter option is used, this option should be a proc
|
565
|
+
# that accepts the last retrieved row for the previous page and an array of
|
459
566
|
# ORDER BY expressions, and returns an array of values relating to those
|
460
567
|
# expressions for the last retrieved row. You will need to use this option
|
461
568
|
# if your ORDER BY expressions are not simple columns, if they contain
|
@@ -474,13 +581,13 @@ module Sequel
|
|
474
581
|
# # SELECT * FROM table ORDER BY id LIMIT 100 OFFSET 100
|
475
582
|
# # ...
|
476
583
|
#
|
477
|
-
# DB[:table].order(:id).paged_each(:
|
584
|
+
# DB[:table].order(:id).paged_each(strategy: :filter){|row| }
|
478
585
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
479
586
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
480
587
|
# # ...
|
481
588
|
#
|
482
|
-
# DB[:table].order(:
|
483
|
-
# :
|
589
|
+
# DB[:table].order(:id).paged_each(strategy: :filter,
|
590
|
+
# filter_values: lambda{|row, exprs| [row[:id]]}){|row| }
|
484
591
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
485
592
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
486
593
|
# # ...
|
@@ -488,7 +595,7 @@ module Sequel
|
|
488
595
|
unless @opts[:order]
|
489
596
|
raise Sequel::Error, "Dataset#paged_each requires the dataset be ordered"
|
490
597
|
end
|
491
|
-
unless
|
598
|
+
unless defined?(yield)
|
492
599
|
return enum_for(:paged_each, opts)
|
493
600
|
end
|
494
601
|
|
@@ -544,56 +651,45 @@ module Sequel
|
|
544
651
|
self
|
545
652
|
end
|
546
653
|
|
547
|
-
# Returns a +Range+ instance made from the minimum and maximum values for the
|
548
|
-
# given column/expression. Uses a virtual row block if no argument is given.
|
549
|
-
#
|
550
|
-
# DB[:table].range(:id) # SELECT max(id) AS v1, min(id) AS v2 FROM table LIMIT 1
|
551
|
-
# # => 1..10
|
552
|
-
# DB[:table].interval{function(column)} # SELECT max(function(column)) AS v1, min(function(column)) AS v2 FROM table LIMIT 1
|
553
|
-
# # => 0..7
|
554
|
-
def range(column=Sequel.virtual_row(&Proc.new))
|
555
|
-
if r = aggregate_dataset.select{[min(column).as(v1), max(column).as(v2)]}.first
|
556
|
-
(r[:v1]..r[:v2])
|
557
|
-
end
|
558
|
-
end
|
559
|
-
|
560
654
|
# Returns a hash with key_column values as keys and value_column values as
|
561
|
-
# values. Similar to
|
562
|
-
#
|
655
|
+
# values. Similar to as_hash, but only selects the columns given. Like
|
656
|
+
# as_hash, it accepts an optional :hash parameter, into which entries will
|
563
657
|
# be merged.
|
564
658
|
#
|
565
|
-
# DB[:table].select_hash(:id, :name)
|
659
|
+
# DB[:table].select_hash(:id, :name)
|
660
|
+
# # SELECT id, name FROM table
|
566
661
|
# # => {1=>'a', 2=>'b', ...}
|
567
662
|
#
|
568
663
|
# You can also provide an array of column names for either the key_column,
|
569
664
|
# the value column, or both:
|
570
665
|
#
|
571
|
-
# DB[:table].select_hash([:id, :foo], [:name, :bar])
|
572
|
-
# #
|
666
|
+
# DB[:table].select_hash([:id, :foo], [:name, :bar])
|
667
|
+
# # SELECT id, foo, name, bar FROM table
|
668
|
+
# # => {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
|
573
669
|
#
|
574
670
|
# When using this method, you must be sure that each expression has an alias
|
575
|
-
# that Sequel can determine.
|
576
|
-
# on the expression and providing an alias.
|
671
|
+
# that Sequel can determine.
|
577
672
|
def select_hash(key_column, value_column, opts = OPTS)
|
578
|
-
_select_hash(:
|
673
|
+
_select_hash(:as_hash, key_column, value_column, opts)
|
579
674
|
end
|
580
675
|
|
581
676
|
# Returns a hash with key_column values as keys and an array of value_column values.
|
582
677
|
# Similar to to_hash_groups, but only selects the columns given. Like to_hash_groups,
|
583
678
|
# it accepts an optional :hash parameter, into which entries will be merged.
|
584
679
|
#
|
585
|
-
# DB[:table].select_hash_groups(:name, :id)
|
680
|
+
# DB[:table].select_hash_groups(:name, :id)
|
681
|
+
# # SELECT id, name FROM table
|
586
682
|
# # => {'a'=>[1, 4, ...], 'b'=>[2, ...], ...}
|
587
683
|
#
|
588
684
|
# You can also provide an array of column names for either the key_column,
|
589
685
|
# the value column, or both:
|
590
686
|
#
|
591
|
-
# DB[:table].select_hash_groups([:first, :middle], [:last, :id])
|
592
|
-
# #
|
687
|
+
# DB[:table].select_hash_groups([:first, :middle], [:last, :id])
|
688
|
+
# # SELECT first, middle, last, id FROM table
|
689
|
+
# # => {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
|
593
690
|
#
|
594
691
|
# When using this method, you must be sure that each expression has an alias
|
595
|
-
# that Sequel can determine.
|
596
|
-
# on the expression and providing an alias.
|
692
|
+
# that Sequel can determine.
|
597
693
|
def select_hash_groups(key_column, value_column, opts = OPTS)
|
598
694
|
_select_hash(:to_hash_groups, key_column, value_column, opts)
|
599
695
|
end
|
@@ -616,8 +712,7 @@ module Sequel
|
|
616
712
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
617
713
|
#
|
618
714
|
# If you provide an array of expressions, you must be sure that each entry
|
619
|
-
# in the array has an alias that Sequel can determine.
|
620
|
-
# by calling the #as method on the expression and providing an alias.
|
715
|
+
# in the array has an alias that Sequel can determine.
|
621
716
|
def select_map(column=nil, &block)
|
622
717
|
_select_map(column, false, &block)
|
623
718
|
end
|
@@ -636,8 +731,7 @@ module Sequel
|
|
636
731
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
637
732
|
#
|
638
733
|
# If you provide an array of expressions, you must be sure that each entry
|
639
|
-
# in the array has an alias that Sequel can determine.
|
640
|
-
# by calling the #as method on the expression and providing an alias.
|
734
|
+
# in the array has an alias that Sequel can determine.
|
641
735
|
def select_order_map(column=nil, &block)
|
642
736
|
_select_map(column, true, &block)
|
643
737
|
end
|
@@ -649,7 +743,7 @@ module Sequel
|
|
649
743
|
# DB[:test].single_record # SELECT * FROM test LIMIT 1
|
650
744
|
# # => {:column_name=>'value'}
|
651
745
|
def single_record
|
652
|
-
|
746
|
+
_single_record_ds.single_record!
|
653
747
|
end
|
654
748
|
|
655
749
|
# Returns the first record in dataset, without limiting the dataset. Returns nil if
|
@@ -671,9 +765,10 @@ module Sequel
|
|
671
765
|
# DB[:test].single_value # SELECT * FROM test LIMIT 1
|
672
766
|
# # => 'value'
|
673
767
|
def single_value
|
674
|
-
|
768
|
+
single_value_ds.each do |r|
|
675
769
|
r.each{|_, v| return v}
|
676
770
|
end
|
771
|
+
nil
|
677
772
|
end
|
678
773
|
|
679
774
|
# Returns the first value of the first record in the dataset, without limiting the dataset.
|
@@ -695,8 +790,9 @@ module Sequel
|
|
695
790
|
# # => 55
|
696
791
|
# DB[:table].sum{function(column)} # SELECT sum(function(column)) FROM table LIMIT 1
|
697
792
|
# # => 10
|
698
|
-
def sum(
|
699
|
-
|
793
|
+
def sum(arg=(no_arg = true), &block)
|
794
|
+
arg = Sequel.virtual_row(&block) if no_arg
|
795
|
+
_aggregate(:sum, arg)
|
700
796
|
end
|
701
797
|
|
702
798
|
# Returns a hash with one column used as key and another used as value.
|
@@ -704,52 +800,57 @@ module Sequel
|
|
704
800
|
# will overwrite the value of the previous row(s). If the value_column
|
705
801
|
# is not given or nil, uses the entire hash as the value.
|
706
802
|
#
|
707
|
-
# DB[:table].
|
803
|
+
# DB[:table].as_hash(:id, :name) # SELECT * FROM table
|
708
804
|
# # {1=>'Jim', 2=>'Bob', ...}
|
709
805
|
#
|
710
|
-
# DB[:table].
|
806
|
+
# DB[:table].as_hash(:id) # SELECT * FROM table
|
711
807
|
# # {1=>{:id=>1, :name=>'Jim'}, 2=>{:id=>2, :name=>'Bob'}, ...}
|
712
808
|
#
|
713
809
|
# You can also provide an array of column names for either the key_column,
|
714
810
|
# the value column, or both:
|
715
811
|
#
|
716
|
-
# DB[:table].
|
812
|
+
# DB[:table].as_hash([:id, :foo], [:name, :bar]) # SELECT * FROM table
|
717
813
|
# # {[1, 3]=>['Jim', 'bo'], [2, 4]=>['Bob', 'be'], ...}
|
718
814
|
#
|
719
|
-
# DB[:table].
|
720
|
-
# # {[1, 'Jim']=>{:id=>1, :name=>'Jim'}, [2, 'Bob'=>{:id=>2, :name=>'Bob'}, ...}
|
815
|
+
# DB[:table].as_hash([:id, :name]) # SELECT * FROM table
|
816
|
+
# # {[1, 'Jim']=>{:id=>1, :name=>'Jim'}, [2, 'Bob']=>{:id=>2, :name=>'Bob'}, ...}
|
721
817
|
#
|
722
818
|
# Options:
|
723
819
|
# :all :: Use all instead of each to retrieve the objects
|
724
820
|
# :hash :: The object into which the values will be placed. If this is not
|
725
821
|
# given, an empty hash is used. This can be used to use a hash with
|
726
822
|
# a default value or default proc.
|
727
|
-
def
|
823
|
+
def as_hash(key_column, value_column = nil, opts = OPTS)
|
728
824
|
h = opts[:hash] || {}
|
729
825
|
meth = opts[:all] ? :all : :each
|
730
826
|
if value_column
|
731
|
-
return naked.
|
827
|
+
return naked.as_hash(key_column, value_column, opts) if row_proc
|
732
828
|
if value_column.is_a?(Array)
|
733
829
|
if key_column.is_a?(Array)
|
734
|
-
|
830
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
|
735
831
|
else
|
736
|
-
|
832
|
+
public_send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
|
737
833
|
end
|
738
834
|
else
|
739
835
|
if key_column.is_a?(Array)
|
740
|
-
|
836
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
|
741
837
|
else
|
742
|
-
|
838
|
+
public_send(meth){|r| h[r[key_column]] = r[value_column]}
|
743
839
|
end
|
744
840
|
end
|
745
841
|
elsif key_column.is_a?(Array)
|
746
|
-
|
842
|
+
public_send(meth){|r| h[key_column.map{|k| r[k]}] = r}
|
747
843
|
else
|
748
|
-
|
844
|
+
public_send(meth){|r| h[r[key_column]] = r}
|
749
845
|
end
|
750
846
|
h
|
751
847
|
end
|
752
848
|
|
849
|
+
# Alias of as_hash for backwards compatibility.
|
850
|
+
def to_hash(*a)
|
851
|
+
as_hash(*a)
|
852
|
+
end
|
853
|
+
|
753
854
|
# Returns a hash with one column used as key and the values being an
|
754
855
|
# array of column values. If the value_column is not given or nil, uses
|
755
856
|
# the entire hash as the value.
|
@@ -774,7 +875,6 @@ module Sequel
|
|
774
875
|
# :hash :: The object into which the values will be placed. If this is not
|
775
876
|
# given, an empty hash is used. This can be used to use a hash with
|
776
877
|
# a default value or default proc.
|
777
|
-
# to start with a new, empty hash.
|
778
878
|
def to_hash_groups(key_column, value_column = nil, opts = OPTS)
|
779
879
|
h = opts[:hash] || {}
|
780
880
|
meth = opts[:all] ? :all : :each
|
@@ -782,21 +882,21 @@ module Sequel
|
|
782
882
|
return naked.to_hash_groups(key_column, value_column, opts) if row_proc
|
783
883
|
if value_column.is_a?(Array)
|
784
884
|
if key_column.is_a?(Array)
|
785
|
-
|
885
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
|
786
886
|
else
|
787
|
-
|
887
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
|
788
888
|
end
|
789
889
|
else
|
790
890
|
if key_column.is_a?(Array)
|
791
|
-
|
891
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
|
792
892
|
else
|
793
|
-
|
893
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
|
794
894
|
end
|
795
895
|
end
|
796
896
|
elsif key_column.is_a?(Array)
|
797
|
-
|
897
|
+
public_send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
|
798
898
|
else
|
799
|
-
|
899
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r}
|
800
900
|
end
|
801
901
|
h
|
802
902
|
end
|
@@ -809,15 +909,14 @@ module Sequel
|
|
809
909
|
execute_ddl(truncate_sql)
|
810
910
|
end
|
811
911
|
|
812
|
-
# Updates values for the dataset. The returned value is
|
813
|
-
#
|
814
|
-
# a hash where the keys are columns to set and values are the values to
|
912
|
+
# Updates values for the dataset. The returned value is the number of rows updated.
|
913
|
+
# +values+ should be a hash where the keys are columns to set and values are the values to
|
815
914
|
# which to set the columns.
|
816
915
|
#
|
817
|
-
# DB[:table].update(:
|
916
|
+
# DB[:table].update(x: nil) # UPDATE table SET x = NULL
|
818
917
|
# # => 10
|
819
918
|
#
|
820
|
-
# DB[:table].update(:
|
919
|
+
# DB[:table].update(x: Sequel[:x]+1, y: 0) # UPDATE table SET x = (x + 1), y = 0
|
821
920
|
# # => 10
|
822
921
|
def update(values=OPTS, &block)
|
823
922
|
sql = update_sql(values)
|
@@ -828,6 +927,52 @@ module Sequel
|
|
828
927
|
end
|
829
928
|
end
|
830
929
|
|
930
|
+
# Return an array of all rows matching the given filter condition, also
|
931
|
+
# yielding each row to the given block. Basically the same as where(cond).all(&block),
|
932
|
+
# except it can be optimized to not create an intermediate dataset.
|
933
|
+
#
|
934
|
+
# DB[:table].where_all(id: [1,2,3])
|
935
|
+
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
936
|
+
def where_all(cond, &block)
|
937
|
+
if loader = _where_loader([cond], nil)
|
938
|
+
loader.all(filter_expr(cond), &block)
|
939
|
+
else
|
940
|
+
where(cond).all(&block)
|
941
|
+
end
|
942
|
+
end
|
943
|
+
|
944
|
+
# Iterate over all rows matching the given filter condition,
|
945
|
+
# yielding each row to the given block. Basically the same as where(cond).each(&block),
|
946
|
+
# except it can be optimized to not create an intermediate dataset.
|
947
|
+
#
|
948
|
+
# DB[:table].where_each(id: [1,2,3]){|row| p row}
|
949
|
+
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
950
|
+
def where_each(cond, &block)
|
951
|
+
if loader = _where_loader([cond], nil)
|
952
|
+
loader.each(filter_expr(cond), &block)
|
953
|
+
else
|
954
|
+
where(cond).each(&block)
|
955
|
+
end
|
956
|
+
end
|
957
|
+
|
958
|
+
# Filter the datasets using the given filter condition, then return a single value.
|
959
|
+
# This assumes that the dataset has already been setup to limit the selection to
|
960
|
+
# a single column. Basically the same as where(cond).single_value,
|
961
|
+
# except it can be optimized to not create an intermediate dataset.
|
962
|
+
#
|
963
|
+
# DB[:table].select(:name).where_single_value(id: 1)
|
964
|
+
# # SELECT name FROM table WHERE (id = 1) LIMIT 1
|
965
|
+
def where_single_value(cond)
|
966
|
+
if loader = cached_where_placeholder_literalizer([cond], nil, :_where_single_value_loader) do |pl|
|
967
|
+
single_value_ds.where(pl.arg)
|
968
|
+
end
|
969
|
+
|
970
|
+
loader.get(filter_expr(cond))
|
971
|
+
else
|
972
|
+
where(cond).single_value
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
831
976
|
# Run the given SQL and return an array of all rows. If a block is given,
|
832
977
|
# each row is yielded to the block after all rows are loaded. See with_sql_each.
|
833
978
|
def with_sql_all(sql, &block)
|
@@ -843,14 +988,11 @@ module Sequel
|
|
843
988
|
alias with_sql_update with_sql_delete
|
844
989
|
|
845
990
|
# Run the given SQL and yield each returned row to the block.
|
846
|
-
#
|
847
|
-
# This method should not be called on a shared dataset if the columns selected
|
848
|
-
# in the given SQL do not match the columns in the receiver.
|
849
991
|
def with_sql_each(sql)
|
850
|
-
if
|
851
|
-
fetch_rows(sql){|r| yield
|
992
|
+
if rp = row_proc
|
993
|
+
_with_sql_dataset.fetch_rows(sql){|r| yield rp.call(r)}
|
852
994
|
else
|
853
|
-
fetch_rows(sql){|r| yield r}
|
995
|
+
_with_sql_dataset.fetch_rows(sql){|r| yield r}
|
854
996
|
end
|
855
997
|
self
|
856
998
|
end
|
@@ -883,7 +1025,8 @@ module Sequel
|
|
883
1025
|
# separate insert commands for each row. Otherwise, call #multi_insert_sql
|
884
1026
|
# and execute each statement it gives separately.
|
885
1027
|
def _import(columns, values, opts)
|
886
|
-
trans_opts = Hash[opts]
|
1028
|
+
trans_opts = Hash[opts]
|
1029
|
+
trans_opts[:server] = @opts[:server]
|
887
1030
|
if opts[:return] == :primary_key
|
888
1031
|
@db.transaction(trans_opts){values.map{|v| insert(columns, v)}}
|
889
1032
|
else
|
@@ -899,9 +1042,15 @@ module Sequel
|
|
899
1042
|
|
900
1043
|
# Returns an array of the first value in each row.
|
901
1044
|
def _select_map_single
|
902
|
-
|
1045
|
+
k = nil
|
1046
|
+
map{|r| r[k||=r.keys.first]}
|
903
1047
|
end
|
904
1048
|
|
1049
|
+
# A dataset for returning single values from the current dataset.
|
1050
|
+
def single_value_ds
|
1051
|
+
clone(:limit=>1).ungraphed.naked
|
1052
|
+
end
|
1053
|
+
|
905
1054
|
private
|
906
1055
|
|
907
1056
|
# Internals of all and with_sql_all
|
@@ -913,10 +1062,21 @@ module Sequel
|
|
913
1062
|
a
|
914
1063
|
end
|
915
1064
|
|
1065
|
+
# Cached placeholder literalizer for methods that return values using aggregate functions.
|
1066
|
+
def _aggregate(function, arg)
|
1067
|
+
if loader = cached_placeholder_literalizer(:"_#{function}_loader") do |pl|
|
1068
|
+
aggregate_dataset.limit(1).select(SQL::Function.new(function, pl.arg).as(function))
|
1069
|
+
end
|
1070
|
+
loader.get(arg)
|
1071
|
+
else
|
1072
|
+
aggregate_dataset.get(SQL::Function.new(function, arg).as(function))
|
1073
|
+
end
|
1074
|
+
end
|
1075
|
+
|
916
1076
|
# Internals of +select_hash+ and +select_hash_groups+
|
917
1077
|
def _select_hash(meth, key_column, value_column, opts=OPTS)
|
918
1078
|
select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
|
919
|
-
|
1079
|
+
public_send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
|
920
1080
|
end
|
921
1081
|
|
922
1082
|
# Internals of +select_map+ and +select_order_map+
|
@@ -933,6 +1093,18 @@ module Sequel
|
|
933
1093
|
end
|
934
1094
|
end
|
935
1095
|
|
1096
|
+
# A cached dataset for a single record for this dataset.
|
1097
|
+
def _single_record_ds
|
1098
|
+
cached_dataset(:_single_record_ds){clone(:limit=>1)}
|
1099
|
+
end
|
1100
|
+
|
1101
|
+
# Loader used for where_all and where_each.
|
1102
|
+
def _where_loader(where_args, where_block)
|
1103
|
+
cached_where_placeholder_literalizer(where_args, where_block, :_where_loader) do |pl|
|
1104
|
+
where(pl.arg)
|
1105
|
+
end
|
1106
|
+
end
|
1107
|
+
|
936
1108
|
# Automatically alias the given expression if it does not have an identifiable alias.
|
937
1109
|
def auto_alias_expression(v)
|
938
1110
|
case v
|
@@ -951,7 +1123,7 @@ module Sequel
|
|
951
1123
|
|
952
1124
|
# Set the server to use to :default unless it is already set in the passed opts
|
953
1125
|
def default_server_opts(opts)
|
954
|
-
if @db.sharded?
|
1126
|
+
if @db.sharded? && !opts.has_key?(:server)
|
955
1127
|
opts = Hash[opts]
|
956
1128
|
opts[:server] = @opts[:server] || :default
|
957
1129
|
end
|
@@ -962,7 +1134,7 @@ module Sequel
|
|
962
1134
|
# :read_only server unless a specific server is set.
|
963
1135
|
def execute(sql, opts=OPTS, &block)
|
964
1136
|
db = @db
|
965
|
-
if db.sharded?
|
1137
|
+
if db.sharded? && !opts.has_key?(:server)
|
966
1138
|
opts = Hash[opts]
|
967
1139
|
opts[:server] = @opts[:server] || (@opts[:lock] ? :default : :read_only)
|
968
1140
|
opts
|
@@ -1052,11 +1224,10 @@ module Sequel
|
|
1052
1224
|
Sequel.|(*cond)
|
1053
1225
|
end
|
1054
1226
|
|
1055
|
-
#
|
1056
|
-
# identifier_output_method.
|
1227
|
+
# Downcase identifiers by default when outputing them from the database.
|
1057
1228
|
def output_identifier(v)
|
1058
1229
|
v = 'untitled' if v == ''
|
1059
|
-
|
1230
|
+
v.to_s.downcase.to_sym
|
1060
1231
|
end
|
1061
1232
|
|
1062
1233
|
# This is run inside .all, after all of the records have been loaded
|
@@ -1105,5 +1276,18 @@ module Sequel
|
|
1105
1276
|
c
|
1106
1277
|
end
|
1107
1278
|
end
|
1279
|
+
|
1280
|
+
# Cached dataset to use for with_sql_#{all,each,first,single_value}.
|
1281
|
+
# This is used so that the columns returned by the given SQL do not
|
1282
|
+
# affect the receiver of the with_sql_* method.
|
1283
|
+
def _with_sql_dataset
|
1284
|
+
if @opts[:_with_sql_ds]
|
1285
|
+
self
|
1286
|
+
else
|
1287
|
+
cached_dataset(:_with_sql_ds) do
|
1288
|
+
clone(:_with_sql_ds=>true)
|
1289
|
+
end
|
1290
|
+
end
|
1291
|
+
end
|
1108
1292
|
end
|
1109
1293
|
end
|