sequel 4.49.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +130 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +6 -9
- data/doc/advanced_associations.rdoc +91 -168
- data/doc/association_basics.rdoc +197 -274
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +66 -43
- data/doc/code_order.rdoc +1 -8
- data/doc/core_extensions.rdoc +81 -56
- data/doc/dataset_basics.rdoc +8 -17
- data/doc/dataset_filtering.rdoc +81 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/mass_assignment.rdoc +73 -30
- data/doc/migration.rdoc +19 -36
- data/doc/model_dataset_method_design.rdoc +14 -17
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +10 -10
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +52 -70
- data/doc/opening_databases.rdoc +39 -32
- data/doc/postgresql.rdoc +48 -38
- data/doc/prepared_statements.rdoc +27 -22
- data/doc/querying.rdoc +173 -150
- 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.2.0.txt +33 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/schema_modification.rdoc +78 -64
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +4 -5
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +18 -17
- data/doc/validations.rdoc +48 -45
- data/doc/virtual_rows.rdoc +87 -115
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc/db2.rb +8 -37
- data/lib/sequel/adapters/jdbc/derby.rb +4 -50
- data/lib/sequel/adapters/jdbc/h2.rb +6 -26
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
- data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
- data/lib/sequel/adapters/jdbc.rb +18 -74
- data/lib/sequel/adapters/mock.rb +4 -30
- data/lib/sequel/adapters/mysql.rb +7 -44
- data/lib/sequel/adapters/mysql2.rb +5 -23
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -12
- data/lib/sequel/adapters/odbc/oracle.rb +1 -1
- data/lib/sequel/adapters/odbc.rb +0 -19
- data/lib/sequel/adapters/oracle.rb +8 -13
- data/lib/sequel/adapters/postgres.rb +28 -150
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +11 -51
- data/lib/sequel/adapters/shared/db2.rb +3 -61
- data/lib/sequel/adapters/shared/mssql.rb +21 -157
- data/lib/sequel/adapters/shared/mysql.rb +61 -227
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +58 -264
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +22 -101
- data/lib/sequel/adapters/sqlanywhere.rb +4 -23
- data/lib/sequel/adapters/sqlite.rb +2 -19
- data/lib/sequel/adapters/tinytds.rb +5 -15
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
- data/lib/sequel/adapters/utils/replace.rb +0 -5
- data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
- data/lib/sequel/ast_transformer.rb +3 -94
- data/lib/sequel/connection_pool/sharded_single.rb +1 -4
- data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
- data/lib/sequel/connection_pool/single.rb +0 -2
- data/lib/sequel/connection_pool/threaded.rb +94 -110
- data/lib/sequel/connection_pool.rb +38 -28
- data/lib/sequel/core.rb +42 -101
- data/lib/sequel/database/connecting.rb +23 -60
- data/lib/sequel/database/dataset.rb +6 -9
- data/lib/sequel/database/dataset_defaults.rb +4 -48
- data/lib/sequel/database/features.rb +5 -4
- data/lib/sequel/database/logging.rb +2 -9
- data/lib/sequel/database/misc.rb +36 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +93 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/database.rb +12 -2
- data/lib/sequel/dataset/actions.rb +57 -107
- data/lib/sequel/dataset/dataset_module.rb +4 -16
- data/lib/sequel/dataset/features.rb +35 -30
- data/lib/sequel/dataset/graph.rb +40 -49
- data/lib/sequel/dataset/misc.rb +12 -37
- data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
- data/lib/sequel/dataset/prepared_statements.rb +23 -51
- data/lib/sequel/dataset/query.rb +91 -161
- data/lib/sequel/dataset/sql.rb +33 -225
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/deprecated.rb +18 -27
- data/lib/sequel/exceptions.rb +1 -17
- data/lib/sequel/extensions/_model_pg_row.rb +0 -7
- data/lib/sequel/extensions/_pretty_table.rb +1 -3
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/connection_expiration.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +11 -11
- data/lib/sequel/extensions/core_extensions.rb +39 -49
- data/lib/sequel/extensions/core_refinements.rb +39 -45
- data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
- data/lib/sequel/extensions/date_arithmetic.rb +7 -7
- data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/eval_inspect.rb +4 -11
- data/lib/sequel/extensions/freeze_datasets.rb +1 -69
- data/lib/sequel/extensions/from_block.rb +1 -35
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/identifier_mangling.rb +9 -19
- data/lib/sequel/extensions/implicit_subquery.rb +2 -2
- data/lib/sequel/extensions/inflector.rb +4 -4
- data/lib/sequel/extensions/migration.rb +27 -43
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
- data/lib/sequel/extensions/null_dataset.rb +2 -8
- data/lib/sequel/extensions/pagination.rb +1 -17
- data/lib/sequel/extensions/pg_array.rb +20 -189
- data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
- data/lib/sequel/extensions/pg_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +3 -16
- data/lib/sequel/extensions/pg_interval.rb +1 -20
- data/lib/sequel/extensions/pg_json.rb +7 -27
- data/lib/sequel/extensions/pg_loose_count.rb +1 -1
- data/lib/sequel/extensions/pg_range.rb +6 -121
- data/lib/sequel/extensions/pg_range_ops.rb +1 -3
- data/lib/sequel/extensions/pg_row.rb +5 -77
- data/lib/sequel/extensions/pg_row_ops.rb +2 -13
- data/lib/sequel/extensions/query.rb +3 -4
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/schema_dumper.rb +13 -13
- data/lib/sequel/extensions/select_remove.rb +3 -3
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/sql_comments.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/symbol_aref.rb +6 -20
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/model/associations.rb +129 -131
- data/lib/sequel/model/base.rb +133 -731
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +0 -3
- data/lib/sequel/model/exceptions.rb +2 -6
- data/lib/sequel/model/inflections.rb +1 -26
- data/lib/sequel/model/plugins.rb +1 -0
- data/lib/sequel/model.rb +27 -62
- data/lib/sequel/plugins/active_model.rb +2 -5
- data/lib/sequel/plugins/association_dependencies.rb +15 -15
- data/lib/sequel/plugins/association_pks.rb +14 -28
- data/lib/sequel/plugins/association_proxies.rb +6 -7
- data/lib/sequel/plugins/auto_validations.rb +4 -4
- data/lib/sequel/plugins/before_after_save.rb +0 -43
- data/lib/sequel/plugins/blacklist_security.rb +9 -8
- data/lib/sequel/plugins/boolean_readers.rb +3 -3
- data/lib/sequel/plugins/boolean_subsets.rb +2 -2
- data/lib/sequel/plugins/caching.rb +5 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
- data/lib/sequel/plugins/column_conflicts.rb +2 -2
- data/lib/sequel/plugins/column_select.rb +2 -2
- data/lib/sequel/plugins/composition.rb +15 -24
- data/lib/sequel/plugins/constraint_validations.rb +4 -3
- data/lib/sequel/plugins/csv_serializer.rb +13 -20
- data/lib/sequel/plugins/dataset_associations.rb +2 -2
- data/lib/sequel/plugins/def_dataset_method.rb +5 -5
- data/lib/sequel/plugins/defaults_setter.rb +1 -1
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/finder.rb +16 -10
- data/lib/sequel/plugins/force_encoding.rb +1 -7
- data/lib/sequel/plugins/hook_class_methods.rb +4 -106
- data/lib/sequel/plugins/input_transformer.rb +10 -11
- data/lib/sequel/plugins/insert_returning_select.rb +1 -9
- data/lib/sequel/plugins/instance_filters.rb +5 -5
- data/lib/sequel/plugins/instance_hooks.rb +7 -52
- data/lib/sequel/plugins/inverted_subsets.rb +3 -1
- data/lib/sequel/plugins/json_serializer.rb +19 -19
- data/lib/sequel/plugins/lazy_attributes.rb +1 -10
- data/lib/sequel/plugins/list.rb +6 -6
- data/lib/sequel/plugins/many_through_many.rb +11 -8
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/nested_attributes.rb +18 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +8 -2
- data/lib/sequel/plugins/pg_row.rb +2 -11
- data/lib/sequel/plugins/prepared_statements.rb +13 -66
- data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +7 -7
- data/lib/sequel/plugins/serialization.rb +15 -33
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +2 -8
- data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/static_cache.rb +8 -9
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +1 -1
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/timestamps.rb +6 -7
- data/lib/sequel/plugins/touch.rb +4 -8
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +2 -2
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/update_or_create.rb +3 -3
- data/lib/sequel/plugins/update_refresh.rb +3 -3
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validation_class_methods.rb +10 -9
- data/lib/sequel/plugins/validation_contexts.rb +4 -4
- data/lib/sequel/plugins/validation_helpers.rb +26 -25
- data/lib/sequel/plugins/whitelist_security.rb +13 -9
- data/lib/sequel/plugins/xml_serializer.rb +24 -25
- data/lib/sequel/sql.rb +145 -276
- data/lib/sequel/timezones.rb +8 -23
- data/lib/sequel/version.rb +2 -2
- data/lib/sequel.rb +1 -1
- data/spec/adapter_spec.rb +1 -1
- data/spec/adapters/db2_spec.rb +2 -103
- data/spec/adapters/mssql_spec.rb +89 -68
- data/spec/adapters/mysql_spec.rb +111 -478
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +459 -664
- data/spec/adapters/spec_helper.rb +12 -31
- data/spec/adapters/sqlanywhere_spec.rb +2 -77
- data/spec/adapters/sqlite_spec.rb +8 -146
- data/spec/bin_spec.rb +11 -16
- data/spec/core/connection_pool_spec.rb +173 -74
- data/spec/core/database_spec.rb +96 -244
- data/spec/core/dataset_spec.rb +99 -414
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +241 -4
- data/spec/core/object_graph_spec.rb +11 -60
- data/spec/core/placeholder_literalizer_spec.rb +1 -14
- data/spec/core/schema_generator_spec.rb +51 -40
- data/spec/core/schema_spec.rb +88 -77
- data/spec/core/spec_helper.rb +6 -24
- data/spec/core/version_spec.rb +1 -1
- data/spec/core_extensions_spec.rb +7 -83
- data/spec/core_model_spec.rb +2 -2
- data/spec/deprecation_helper.rb +2 -14
- data/spec/extensions/accessed_columns_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +2 -2
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +30 -92
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/auto_literal_strings_spec.rb +1 -12
- data/spec/extensions/auto_validations_spec.rb +1 -1
- data/spec/extensions/blacklist_security_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
- data/spec/extensions/column_conflicts_spec.rb +1 -1
- data/spec/extensions/column_select_spec.rb +4 -4
- data/spec/extensions/columns_introspection_spec.rb +1 -1
- data/spec/extensions/columns_updated_spec.rb +1 -1
- data/spec/extensions/composition_spec.rb +8 -30
- data/spec/extensions/connection_expiration_spec.rb +3 -3
- data/spec/extensions/connection_validator_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
- data/spec/extensions/constraint_validations_spec.rb +1 -1
- data/spec/extensions/core_refinements_spec.rb +1 -3
- data/spec/extensions/csv_serializer_spec.rb +4 -9
- data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +2 -1
- data/spec/extensions/dataset_source_alias_spec.rb +1 -1
- data/spec/extensions/date_arithmetic_spec.rb +3 -3
- data/spec/extensions/def_dataset_method_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +8 -9
- data/spec/extensions/dirty_spec.rb +1 -1
- data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
- data/spec/extensions/eager_each_spec.rb +2 -2
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/error_splitter_spec.rb +1 -1
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +1 -1
- data/spec/extensions/force_encoding_spec.rb +2 -5
- data/spec/extensions/freeze_datasets_spec.rb +1 -1
- data/spec/extensions/graph_each_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +1 -194
- data/spec/extensions/identifier_mangling_spec.rb +17 -170
- data/spec/extensions/implicit_subquery_spec.rb +1 -5
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/input_transformer_spec.rb +7 -2
- data/spec/extensions/insert_returning_select_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -95
- data/spec/extensions/inverted_subsets_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +1 -1
- data/spec/extensions/lazy_attributes_spec.rb +1 -7
- data/spec/extensions/list_spec.rb +5 -6
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +25 -33
- data/spec/extensions/migration_spec.rb +12 -2
- data/spec/extensions/modification_detection_spec.rb +1 -1
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +1 -29
- data/spec/extensions/null_dataset_spec.rb +1 -11
- data/spec/extensions/optimistic_locking_spec.rb +2 -2
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +22 -26
- data/spec/extensions/pg_array_ops_spec.rb +1 -1
- data/spec/extensions/pg_array_spec.rb +3 -48
- data/spec/extensions/pg_enum_spec.rb +1 -1
- data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +22 -31
- data/spec/extensions/pg_inet_ops_spec.rb +1 -1
- data/spec/extensions/pg_inet_spec.rb +1 -14
- data/spec/extensions/pg_interval_spec.rb +3 -13
- data/spec/extensions/pg_json_ops_spec.rb +1 -1
- data/spec/extensions/pg_json_spec.rb +1 -13
- data/spec/extensions/pg_loose_count_spec.rb +1 -1
- data/spec/extensions/pg_range_ops_spec.rb +1 -1
- data/spec/extensions/pg_range_spec.rb +3 -88
- data/spec/extensions/pg_row_ops_spec.rb +1 -1
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pg_row_spec.rb +1 -44
- data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
- data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +40 -9
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +23 -34
- data/spec/extensions/round_timestamps_spec.rb +1 -5
- data/spec/extensions/s_spec.rb +1 -1
- data/spec/extensions/schema_caching_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +43 -32
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +5 -17
- data/spec/extensions/server_block_spec.rb +1 -1
- data/spec/extensions/server_logging_spec.rb +2 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/shared_caching_spec.rb +1 -28
- data/spec/extensions/single_table_inheritance_spec.rb +2 -5
- data/spec/extensions/singular_table_names_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +5 -27
- data/spec/extensions/split_array_nil_spec.rb +1 -1
- data/spec/extensions/split_values_spec.rb +1 -1
- data/spec/extensions/sql_comments_spec.rb +1 -1
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/subset_conditions_spec.rb +1 -1
- data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
- data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
- data/spec/extensions/synchronize_sql_spec.rb +124 -0
- data/spec/extensions/table_select_spec.rb +4 -4
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +5 -7
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -1
- data/spec/extensions/update_or_create_spec.rb +12 -16
- data/spec/extensions/update_primary_key_spec.rb +4 -3
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +10 -13
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +3 -3
- data/spec/extensions/validation_contexts_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +10 -44
- data/spec/extensions/whitelist_security_spec.rb +5 -5
- data/spec/extensions/xml_serializer_spec.rb +8 -13
- data/spec/guards_helper.rb +2 -1
- data/spec/integration/associations_test.rb +1 -23
- data/spec/integration/database_test.rb +7 -7
- data/spec/integration/dataset_test.rb +12 -47
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +4 -82
- data/spec/integration/plugin_test.rb +7 -23
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +10 -10
- data/spec/integration/spec_helper.rb +17 -21
- data/spec/integration/timezone_test.rb +5 -5
- data/spec/integration/transaction_test.rb +3 -55
- data/spec/integration/type_test.rb +9 -9
- data/spec/model/association_reflection_spec.rb +24 -9
- data/spec/model/associations_spec.rb +124 -303
- data/spec/model/base_spec.rb +43 -137
- data/spec/model/class_dataset_methods_spec.rb +2 -20
- data/spec/model/dataset_methods_spec.rb +1 -20
- data/spec/model/eager_loading_spec.rb +48 -17
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +29 -339
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +33 -129
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +19 -65
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do/mysql.rb +0 -69
- data/lib/sequel/adapters/do/postgres.rb +0 -46
- data/lib/sequel/adapters/do/sqlite3.rb +0 -41
- data/lib/sequel/adapters/do.rb +0 -166
- data/lib/sequel/adapters/jdbc/as400.rb +0 -92
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
- data/lib/sequel/adapters/odbc/progress.rb +0 -12
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -261
- data/lib/sequel/adapters/shared/informix.rb +0 -63
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -50
- data/lib/sequel/adapters/swift/postgres.rb +0 -49
- data/lib/sequel/adapters/swift/sqlite.rb +0 -48
- data/lib/sequel/adapters/swift.rb +0 -169
- data/lib/sequel/adapters/utils/pg_types.rb +0 -4
- data/lib/sequel/dataset/mutation.rb +0 -98
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
- data/lib/sequel/extensions/filter_having.rb +0 -65
- data/lib/sequel/extensions/hash_aliases.rb +0 -51
- data/lib/sequel/extensions/meta_def.rb +0 -37
- data/lib/sequel/extensions/query_literals.rb +0 -86
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
- data/lib/sequel/extensions/set_overrides.rb +0 -82
- data/lib/sequel/no_core_ext.rb +0 -4
- data/lib/sequel/plugins/association_autoreloading.rb +0 -11
- data/lib/sequel/plugins/identifier_columns.rb +0 -49
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
- data/lib/sequel/plugins/schema.rb +0 -84
- data/lib/sequel/plugins/scissors.rb +0 -37
- data/spec/core/dataset_mutation_spec.rb +0 -253
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/filter_having_spec.rb +0 -42
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/hash_aliases_spec.rb +0 -26
- data/spec/extensions/identifier_columns_spec.rb +0 -19
- data/spec/extensions/meta_def_spec.rb +0 -35
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
- data/spec/extensions/query_literals_spec.rb +0 -185
- data/spec/extensions/schema_spec.rb +0 -123
- data/spec/extensions/scissors_spec.rb +0 -27
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
- data/spec/extensions/set_overrides_spec.rb +0 -75
|
@@ -12,12 +12,11 @@ module Sequel
|
|
|
12
12
|
# Action methods defined by Sequel that execute code on the database.
|
|
13
13
|
ACTION_METHODS = (<<-METHS).split.map(&:to_sym).freeze
|
|
14
14
|
<< [] all as_hash avg count columns columns! delete each
|
|
15
|
-
empty? fetch_rows first first! get import insert
|
|
16
|
-
map max min multi_insert paged_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
18
|
where_all where_each where_single_value
|
|
19
19
|
METHS
|
|
20
|
-
# SEQUEL5: Remove interval, range
|
|
21
20
|
|
|
22
21
|
# The clone options to use when retriveing columns for a dataset.
|
|
23
22
|
COLUMNS_CLONE_OPTIONS = {:distinct => nil, :limit => 1, :offset=>nil, :where=>nil, :having=>nil, :order=>nil, :row_proc=>nil, :graph=>nil, :eager_graph=>nil}.freeze
|
|
@@ -25,7 +24,7 @@ module Sequel
|
|
|
25
24
|
# Inserts the given argument into the database. Returns self so it
|
|
26
25
|
# can be used safely when chaining:
|
|
27
26
|
#
|
|
28
|
-
# DB[:items] << {:
|
|
27
|
+
# DB[:items] << {id: 0, name: 'Zero'} << DB[:old_items].select(:id, name)
|
|
29
28
|
def <<(arg)
|
|
30
29
|
insert(arg)
|
|
31
30
|
self
|
|
@@ -33,8 +32,8 @@ module Sequel
|
|
|
33
32
|
|
|
34
33
|
# Returns the first record matching the conditions. Examples:
|
|
35
34
|
#
|
|
36
|
-
# DB[:table][:
|
|
37
|
-
# # => {:id
|
|
35
|
+
# DB[:table][id: 1] # SELECT * FROM table WHERE (id = 1) LIMIT 1
|
|
36
|
+
# # => {:id=>1}
|
|
38
37
|
def [](*conditions)
|
|
39
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
|
|
40
39
|
first(*conditions)
|
|
@@ -92,6 +91,8 @@ module Sequel
|
|
|
92
91
|
end
|
|
93
92
|
end
|
|
94
93
|
|
|
94
|
+
COUNT_SELECT = Sequel.function(:count).*.as(:count)
|
|
95
|
+
|
|
95
96
|
# Returns the number of records in the dataset. If an argument is provided,
|
|
96
97
|
# it is used as the argument to count. If a block is provided, it is
|
|
97
98
|
# treated as a virtual row, and the result is used as the argument to
|
|
@@ -106,8 +107,7 @@ module Sequel
|
|
|
106
107
|
def count(arg=(no_arg=true), &block)
|
|
107
108
|
if no_arg && !block
|
|
108
109
|
cached_dataset(:_count_ds) do
|
|
109
|
-
aggregate_dataset.select(
|
|
110
|
-
#aggregate_dataset.select(COUNT_SELECT).single_value_ds # SEQUEL5
|
|
110
|
+
aggregate_dataset.select(COUNT_SELECT).single_value_ds
|
|
111
111
|
end.single_value!.to_i
|
|
112
112
|
else
|
|
113
113
|
if block
|
|
@@ -121,12 +121,8 @@ module Sequel
|
|
|
121
121
|
_aggregate(:count, arg)
|
|
122
122
|
end
|
|
123
123
|
end
|
|
124
|
-
# SEQUEL5
|
|
125
|
-
#COUNT_SELECT = Sequel.function(:count).*.as(:count)
|
|
126
|
-
#private_constant :COUNT_SELECT
|
|
127
124
|
|
|
128
|
-
# Deletes the records in the dataset
|
|
129
|
-
# number of records deleted, but that is adapter dependent.
|
|
125
|
+
# Deletes the records in the dataset, returning the number of records deleted.
|
|
130
126
|
#
|
|
131
127
|
# DB[:table].delete # DELETE * FROM table
|
|
132
128
|
# # => 3
|
|
@@ -157,24 +153,22 @@ module Sequel
|
|
|
157
153
|
self
|
|
158
154
|
end
|
|
159
155
|
|
|
156
|
+
EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
|
|
157
|
+
|
|
160
158
|
# Returns true if no records exist in the dataset, false otherwise
|
|
161
159
|
#
|
|
162
160
|
# DB[:table].empty? # SELECT 1 AS one FROM table LIMIT 1
|
|
163
161
|
# # => false
|
|
164
162
|
def empty?
|
|
165
163
|
cached_dataset(:_empty_ds) do
|
|
166
|
-
single_value_ds.unordered.select(
|
|
167
|
-
# single_value_ds.unordered.select(EMPTY_SELECT) # SEQUEL5
|
|
164
|
+
single_value_ds.unordered.select(EMPTY_SELECT)
|
|
168
165
|
end.single_value!.nil?
|
|
169
166
|
end
|
|
170
|
-
# SEQUEL5
|
|
171
|
-
#EMPTY_SELECT = Sequel::SQL::AliasedExpression.new(1, :one)
|
|
172
|
-
#private_constant :EMPTY_SELECT
|
|
173
167
|
|
|
168
|
+
# Returns the first matching record if no arguments are given.
|
|
174
169
|
# If a integer argument is given, it is interpreted as a limit, and then returns all
|
|
175
|
-
# matching records up to that limit. If
|
|
176
|
-
#
|
|
177
|
-
# argument(s) is passed, it is given to filter and the
|
|
170
|
+
# matching records up to that limit. If any other type of
|
|
171
|
+
# argument(s) is passed, it is treated as a filter and the
|
|
178
172
|
# first matching record is returned. If a block is given, it is used
|
|
179
173
|
# to filter the dataset before returning anything.
|
|
180
174
|
#
|
|
@@ -189,19 +183,19 @@ module Sequel
|
|
|
189
183
|
# DB[:table].first(2) # SELECT * FROM table LIMIT 2
|
|
190
184
|
# # => [{:id=>6}, {:id=>4}]
|
|
191
185
|
#
|
|
192
|
-
# DB[:table].first(:
|
|
186
|
+
# DB[:table].first(id: 2) # SELECT * FROM table WHERE (id = 2) LIMIT 1
|
|
193
187
|
# # => {:id=>2}
|
|
194
188
|
#
|
|
195
|
-
# DB[:table].first("id = 3") # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
|
189
|
+
# DB[:table].first(Sequel.lit("id = 3")) # SELECT * FROM table WHERE (id = 3) LIMIT 1
|
|
196
190
|
# # => {:id=>3}
|
|
197
191
|
#
|
|
198
|
-
# DB[:table].first("id = ?", 4) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
|
192
|
+
# DB[:table].first(Sequel.lit("id = ?", 4)) # SELECT * FROM table WHERE (id = 4) LIMIT 1
|
|
199
193
|
# # => {:id=>4}
|
|
200
194
|
#
|
|
201
195
|
# DB[:table].first{id > 2} # SELECT * FROM table WHERE (id > 2) LIMIT 1
|
|
202
196
|
# # => {:id=>5}
|
|
203
197
|
#
|
|
204
|
-
# DB[:table].first("id > ?", 4){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
|
198
|
+
# DB[:table].first(Sequel.lit("id > ?", 4)){id < 6} # SELECT * FROM table WHERE ((id > 4) AND (id < 6)) LIMIT 1
|
|
205
199
|
# # => {:id=>5}
|
|
206
200
|
#
|
|
207
201
|
# DB[:table].first(2){id < 2} # SELECT * FROM table WHERE (id < 2) LIMIT 2
|
|
@@ -361,7 +355,8 @@ module Sequel
|
|
|
361
355
|
end
|
|
362
356
|
|
|
363
357
|
# Inserts values into the associated table. The returned value is generally
|
|
364
|
-
# the value of the primary key for the inserted row,
|
|
358
|
+
# the value of the autoincremented primary key for the inserted row, assuming that
|
|
359
|
+
# the a single row is inserted and the table has an autoincrementing primary key.
|
|
365
360
|
#
|
|
366
361
|
# +insert+ handles a number of different argument formats:
|
|
367
362
|
# no arguments or single empty hash :: Uses DEFAULT VALUES
|
|
@@ -387,7 +382,7 @@ module Sequel
|
|
|
387
382
|
# DB[:items].insert([:a, :b], [1,2])
|
|
388
383
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
|
389
384
|
#
|
|
390
|
-
# DB[:items].insert(:
|
|
385
|
+
# DB[:items].insert(a: 1, b: 2)
|
|
391
386
|
# # INSERT INTO items (a, b) VALUES (1, 2)
|
|
392
387
|
#
|
|
393
388
|
# DB[:items].insert(DB[:old_items])
|
|
@@ -404,26 +399,6 @@ module Sequel
|
|
|
404
399
|
end
|
|
405
400
|
end
|
|
406
401
|
|
|
407
|
-
# Returns the interval between minimum and maximum values for the given
|
|
408
|
-
# column/expression. Uses a virtual row block if no argument is given.
|
|
409
|
-
#
|
|
410
|
-
# DB[:table].interval(:id) # SELECT (max(id) - min(id)) FROM table LIMIT 1
|
|
411
|
-
# # => 6
|
|
412
|
-
# DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
|
|
413
|
-
# # => 7
|
|
414
|
-
def interval(column=Sequel.virtual_row(&Proc.new))
|
|
415
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#interval", "Use #max - #min, or use the sequel_4_dataset_methods extension")
|
|
416
|
-
if loader = cached_placeholder_literalizer(:_interval_loader) do |pl|
|
|
417
|
-
arg = pl.arg
|
|
418
|
-
aggregate_dataset.limit(1).select((SQL::Function.new(:max, arg) - SQL::Function.new(:min, arg)).as(:interval))
|
|
419
|
-
end
|
|
420
|
-
|
|
421
|
-
loader.get(column)
|
|
422
|
-
else
|
|
423
|
-
aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
|
|
424
|
-
end
|
|
425
|
-
end
|
|
426
|
-
|
|
427
402
|
# Reverses the order and then runs #first with the given arguments and block. Note that this
|
|
428
403
|
# will not necessarily give you the last record in the dataset,
|
|
429
404
|
# unless you have an unambiguous order. If there is not
|
|
@@ -439,8 +414,8 @@ module Sequel
|
|
|
439
414
|
reverse.first(*args, &block)
|
|
440
415
|
end
|
|
441
416
|
|
|
442
|
-
# Maps column values for each record in the dataset (if
|
|
443
|
-
#
|
|
417
|
+
# Maps column values for each record in the dataset (if an argument is given)
|
|
418
|
+
# or performs the stock mapping functionality of +Enumerable+ otherwise.
|
|
444
419
|
# Raises an +Error+ if both an argument and block are given.
|
|
445
420
|
#
|
|
446
421
|
# DB[:table].map(:id) # SELECT * FROM table
|
|
@@ -492,7 +467,7 @@ module Sequel
|
|
|
492
467
|
# This is a front end for import that allows you to submit an array of
|
|
493
468
|
# hashes instead of arrays of columns and values:
|
|
494
469
|
#
|
|
495
|
-
# DB[:table].multi_insert([{:
|
|
470
|
+
# DB[:table].multi_insert([{x: 1}, {x: 2}])
|
|
496
471
|
# # INSERT INTO table (x) VALUES (1)
|
|
497
472
|
# # INSERT INTO table (x) VALUES (2)
|
|
498
473
|
#
|
|
@@ -519,6 +494,10 @@ module Sequel
|
|
|
519
494
|
# Sequel checks that the datasets using this method have an order, but it cannot
|
|
520
495
|
# ensure that the order is unambiguous.
|
|
521
496
|
#
|
|
497
|
+
# Note that this method is not safe to use on many adapters if you are
|
|
498
|
+
# running additional queries inside the provided block. If you are
|
|
499
|
+
# running queries inside the block, use a separate thread or shard inside +paged_each+.
|
|
500
|
+
#
|
|
522
501
|
# Options:
|
|
523
502
|
# :rows_per_fetch :: The number of rows to fetch per query. Defaults to 1000.
|
|
524
503
|
# :strategy :: The strategy to use for paging of results. By default this is :offset,
|
|
@@ -528,7 +507,7 @@ module Sequel
|
|
|
528
507
|
# selecting the columns you are ordering by, and none of the columns can contain
|
|
529
508
|
# NULLs. Note that some Sequel adapters have optimized implementations that will
|
|
530
509
|
# use cursors or streaming regardless of the :strategy option used.
|
|
531
|
-
# :filter_values :: If the :
|
|
510
|
+
# :filter_values :: If the strategy: :filter option is used, this option should be a proc
|
|
532
511
|
# that accepts the last retreived row for the previous page and an array of
|
|
533
512
|
# ORDER BY expressions, and returns an array of values relating to those
|
|
534
513
|
# expressions for the last retrieved row. You will need to use this option
|
|
@@ -548,13 +527,13 @@ module Sequel
|
|
|
548
527
|
# # SELECT * FROM table ORDER BY id LIMIT 100 OFFSET 100
|
|
549
528
|
# # ...
|
|
550
529
|
#
|
|
551
|
-
# DB[:table].order(:id).paged_each(:
|
|
530
|
+
# DB[:table].order(:id).paged_each(strategy: :filter){|row| }
|
|
552
531
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
|
553
532
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
|
554
533
|
# # ...
|
|
555
534
|
#
|
|
556
|
-
# DB[:table].order(:
|
|
557
|
-
# :
|
|
535
|
+
# DB[:table].order(:id).paged_each(strategy: :filter,
|
|
536
|
+
# filter_values: lambda{|row, exprs| [row[:id]]}){|row| }
|
|
558
537
|
# # SELECT * FROM table ORDER BY id LIMIT 1000
|
|
559
538
|
# # SELECT * FROM table WHERE id > 1001 ORDER BY id LIMIT 1000
|
|
560
539
|
# # ...
|
|
@@ -618,30 +597,6 @@ module Sequel
|
|
|
618
597
|
self
|
|
619
598
|
end
|
|
620
599
|
|
|
621
|
-
# Returns a +Range+ instance made from the minimum and maximum values for the
|
|
622
|
-
# given column/expression. Uses a virtual row block if no argument is given.
|
|
623
|
-
#
|
|
624
|
-
# DB[:table].range(:id) # SELECT max(id) AS v1, min(id) AS v2 FROM table LIMIT 1
|
|
625
|
-
# # => 1..10
|
|
626
|
-
# DB[:table].interval{function(column)} # SELECT max(function(column)) AS v1, min(function(column)) AS v2 FROM table LIMIT 1
|
|
627
|
-
# # => 0..7
|
|
628
|
-
def range(column=Sequel.virtual_row(&Proc.new))
|
|
629
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#range", "Use #min..#max, or use the sequel_4_dataset_methods extension")
|
|
630
|
-
r = if loader = cached_placeholder_literalizer(:_range_loader) do |pl|
|
|
631
|
-
arg = pl.arg
|
|
632
|
-
aggregate_dataset.limit(1).select(SQL::Function.new(:min, arg).as(:v1), SQL::Function.new(:max, arg).as(:v2))
|
|
633
|
-
end
|
|
634
|
-
|
|
635
|
-
loader.first(column)
|
|
636
|
-
else
|
|
637
|
-
aggregate_dataset.select{[min(column).as(v1), max(column).as(v2)]}.first
|
|
638
|
-
end
|
|
639
|
-
|
|
640
|
-
if r
|
|
641
|
-
(r[:v1]..r[:v2])
|
|
642
|
-
end
|
|
643
|
-
end
|
|
644
|
-
|
|
645
600
|
# Returns a hash with key_column values as keys and value_column values as
|
|
646
601
|
# values. Similar to as_hash, but only selects the columns given. Like
|
|
647
602
|
# as_hash, it accepts an optional :hash parameter, into which entries will
|
|
@@ -657,8 +612,7 @@ module Sequel
|
|
|
657
612
|
# # {[1, 3]=>['a', 'c'], [2, 4]=>['b', 'd'], ...}
|
|
658
613
|
#
|
|
659
614
|
# When using this method, you must be sure that each expression has an alias
|
|
660
|
-
# that Sequel can determine.
|
|
661
|
-
# on the expression and providing an alias.
|
|
615
|
+
# that Sequel can determine.
|
|
662
616
|
def select_hash(key_column, value_column, opts = OPTS)
|
|
663
617
|
_select_hash(:as_hash, key_column, value_column, opts)
|
|
664
618
|
end
|
|
@@ -677,8 +631,7 @@ module Sequel
|
|
|
677
631
|
# # {['a', 'b']=>[['c', 1], ['d', 2], ...], ...}
|
|
678
632
|
#
|
|
679
633
|
# When using this method, you must be sure that each expression has an alias
|
|
680
|
-
# that Sequel can determine.
|
|
681
|
-
# on the expression and providing an alias.
|
|
634
|
+
# that Sequel can determine.
|
|
682
635
|
def select_hash_groups(key_column, value_column, opts = OPTS)
|
|
683
636
|
_select_hash(:to_hash_groups, key_column, value_column, opts)
|
|
684
637
|
end
|
|
@@ -701,8 +654,7 @@ module Sequel
|
|
|
701
654
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
|
702
655
|
#
|
|
703
656
|
# If you provide an array of expressions, you must be sure that each entry
|
|
704
|
-
# in the array has an alias that Sequel can determine.
|
|
705
|
-
# by calling the #as method on the expression and providing an alias.
|
|
657
|
+
# in the array has an alias that Sequel can determine.
|
|
706
658
|
def select_map(column=nil, &block)
|
|
707
659
|
_select_map(column, false, &block)
|
|
708
660
|
end
|
|
@@ -721,8 +673,7 @@ module Sequel
|
|
|
721
673
|
# # => [[1, 'A'], [2, 'B'], [3, 'C'], ...]
|
|
722
674
|
#
|
|
723
675
|
# If you provide an array of expressions, you must be sure that each entry
|
|
724
|
-
# in the array has an alias that Sequel can determine.
|
|
725
|
-
# by calling the #as method on the expression and providing an alias.
|
|
676
|
+
# in the array has an alias that Sequel can determine.
|
|
726
677
|
def select_order_map(column=nil, &block)
|
|
727
678
|
_select_map(column, true, &block)
|
|
728
679
|
end
|
|
@@ -817,21 +768,21 @@ module Sequel
|
|
|
817
768
|
return naked.as_hash(key_column, value_column, opts) if row_proc
|
|
818
769
|
if value_column.is_a?(Array)
|
|
819
770
|
if key_column.is_a?(Array)
|
|
820
|
-
|
|
771
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r.values_at(*value_column)}
|
|
821
772
|
else
|
|
822
|
-
|
|
773
|
+
public_send(meth){|r| h[r[key_column]] = r.values_at(*value_column)}
|
|
823
774
|
end
|
|
824
775
|
else
|
|
825
776
|
if key_column.is_a?(Array)
|
|
826
|
-
|
|
777
|
+
public_send(meth){|r| h[r.values_at(*key_column)] = r[value_column]}
|
|
827
778
|
else
|
|
828
|
-
|
|
779
|
+
public_send(meth){|r| h[r[key_column]] = r[value_column]}
|
|
829
780
|
end
|
|
830
781
|
end
|
|
831
782
|
elsif key_column.is_a?(Array)
|
|
832
|
-
|
|
783
|
+
public_send(meth){|r| h[key_column.map{|k| r[k]}] = r}
|
|
833
784
|
else
|
|
834
|
-
|
|
785
|
+
public_send(meth){|r| h[r[key_column]] = r}
|
|
835
786
|
end
|
|
836
787
|
h
|
|
837
788
|
end
|
|
@@ -872,21 +823,21 @@ module Sequel
|
|
|
872
823
|
return naked.to_hash_groups(key_column, value_column, opts) if row_proc
|
|
873
824
|
if value_column.is_a?(Array)
|
|
874
825
|
if key_column.is_a?(Array)
|
|
875
|
-
|
|
826
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r.values_at(*value_column)}
|
|
876
827
|
else
|
|
877
|
-
|
|
828
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r.values_at(*value_column)}
|
|
878
829
|
end
|
|
879
830
|
else
|
|
880
831
|
if key_column.is_a?(Array)
|
|
881
|
-
|
|
832
|
+
public_send(meth){|r| (h[r.values_at(*key_column)] ||= []) << r[value_column]}
|
|
882
833
|
else
|
|
883
|
-
|
|
834
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r[value_column]}
|
|
884
835
|
end
|
|
885
836
|
end
|
|
886
837
|
elsif key_column.is_a?(Array)
|
|
887
|
-
|
|
838
|
+
public_send(meth){|r| (h[key_column.map{|k| r[k]}] ||= []) << r}
|
|
888
839
|
else
|
|
889
|
-
|
|
840
|
+
public_send(meth){|r| (h[r[key_column]] ||= []) << r}
|
|
890
841
|
end
|
|
891
842
|
h
|
|
892
843
|
end
|
|
@@ -899,15 +850,14 @@ module Sequel
|
|
|
899
850
|
execute_ddl(truncate_sql)
|
|
900
851
|
end
|
|
901
852
|
|
|
902
|
-
# Updates values for the dataset. The returned value is
|
|
903
|
-
#
|
|
904
|
-
# a hash where the keys are columns to set and values are the values to
|
|
853
|
+
# Updates values for the dataset. The returned value is the number of rows updated.
|
|
854
|
+
# +values+ should be a hash where the keys are columns to set and values are the values to
|
|
905
855
|
# which to set the columns.
|
|
906
856
|
#
|
|
907
|
-
# DB[:table].update(:
|
|
857
|
+
# DB[:table].update(x: nil) # UPDATE table SET x = NULL
|
|
908
858
|
# # => 10
|
|
909
859
|
#
|
|
910
|
-
# DB[:table].update(:
|
|
860
|
+
# DB[:table].update(x: Sequel[:x]+1, y: 0) # UPDATE table SET x = (x + 1), y = 0
|
|
911
861
|
# # => 10
|
|
912
862
|
def update(values=OPTS, &block)
|
|
913
863
|
sql = update_sql(values)
|
|
@@ -922,7 +872,7 @@ module Sequel
|
|
|
922
872
|
# yielding each row to the given block. Basically the same as where(cond).all(&block),
|
|
923
873
|
# except it can be optimized to not create an intermediate dataset.
|
|
924
874
|
#
|
|
925
|
-
# DB[:table].where_all(:
|
|
875
|
+
# DB[:table].where_all(id: [1,2,3])
|
|
926
876
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
|
927
877
|
def where_all(cond, &block)
|
|
928
878
|
if loader = _where_loader
|
|
@@ -936,7 +886,7 @@ module Sequel
|
|
|
936
886
|
# yielding each row to the given block. Basically the same as where(cond).each(&block),
|
|
937
887
|
# except it can be optimized to not create an intermediate dataset.
|
|
938
888
|
#
|
|
939
|
-
# DB[:table].where_each(:
|
|
889
|
+
# DB[:table].where_each(id: [1,2,3]){|row| p row}
|
|
940
890
|
# # SELECT * FROM table WHERE (id IN (1, 2, 3))
|
|
941
891
|
def where_each(cond, &block)
|
|
942
892
|
if loader = _where_loader
|
|
@@ -951,7 +901,7 @@ module Sequel
|
|
|
951
901
|
# a single column. Basically the same as where(cond).single_value,
|
|
952
902
|
# except it can be optimized to not create an intermediate dataset.
|
|
953
903
|
#
|
|
954
|
-
# DB[:table].select(:name).where_single_value(:
|
|
904
|
+
# DB[:table].select(:name).where_single_value(id: 1)
|
|
955
905
|
# # SELECT name FROM table WHERE (id = 1) LIMIT 1
|
|
956
906
|
def where_single_value(cond)
|
|
957
907
|
if loader = cached_placeholder_literalizer(:_where_single_value_loader) do |pl|
|
|
@@ -1069,7 +1019,7 @@ module Sequel
|
|
|
1069
1019
|
# Internals of +select_hash+ and +select_hash_groups+
|
|
1070
1020
|
def _select_hash(meth, key_column, value_column, opts=OPTS)
|
|
1071
1021
|
select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
|
|
1072
|
-
|
|
1022
|
+
public_send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column), opts)
|
|
1073
1023
|
end
|
|
1074
1024
|
|
|
1075
1025
|
# Internals of +select_map+ and +select_order_map+
|
|
@@ -17,22 +17,10 @@ module Sequel
|
|
|
17
17
|
# DB[:table].active.with_id_and_name.by_id
|
|
18
18
|
# # SELECT id, name FROM table WHERE active ORDER BY id
|
|
19
19
|
class DatasetModule < ::Module
|
|
20
|
-
%w'where exclude exclude_having having'.map(&:to_sym).each do |meth|
|
|
21
|
-
define_method(meth) do |name, *args, &block|
|
|
22
|
-
if block || args.flatten.any?{|arg| arg.is_a?(Proc)}
|
|
23
|
-
define_method(name){send(meth, *args, &block)}
|
|
24
|
-
else
|
|
25
|
-
key = :"_#{meth}_#{name}_ds"
|
|
26
|
-
define_method(name) do
|
|
27
|
-
cached_dataset(key){send(meth, *args)}
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
20
|
meths = (<<-METHS).split.map(&:to_sym)
|
|
21
|
+
where exclude exclude_having having
|
|
34
22
|
distinct grep group group_and_count group_append
|
|
35
|
-
limit offset order order_append order_prepend
|
|
23
|
+
limit offset order order_append order_prepend reverse
|
|
36
24
|
select select_all select_append select_group server
|
|
37
25
|
METHS
|
|
38
26
|
|
|
@@ -40,11 +28,11 @@ module Sequel
|
|
|
40
28
|
def self.def_dataset_caching_method(mod, meth)
|
|
41
29
|
mod.send(:define_method, meth) do |name, *args, &block|
|
|
42
30
|
if block
|
|
43
|
-
define_method(name){
|
|
31
|
+
define_method(name){public_send(meth, *args, &block)}
|
|
44
32
|
else
|
|
45
33
|
key = :"_#{meth}_#{name}_ds"
|
|
46
34
|
define_method(name) do
|
|
47
|
-
cached_dataset(key){
|
|
35
|
+
cached_dataset(key){public_send(meth, *args)}
|
|
48
36
|
end
|
|
49
37
|
end
|
|
50
38
|
end
|
|
@@ -14,39 +14,38 @@ module Sequel
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# Whether this dataset will provide accurate number of rows matched for
|
|
17
|
-
# delete and update statements. Accurate in this case is the number of
|
|
17
|
+
# delete and update statements, true by default. Accurate in this case is the number of
|
|
18
18
|
# rows matched by the dataset's filter.
|
|
19
19
|
def provides_accurate_rows_matched?
|
|
20
20
|
true
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
# Whether you must use a column alias list for recursive CTEs
|
|
24
|
-
# default).
|
|
23
|
+
# Whether you must use a column alias list for recursive CTEs, false by default.
|
|
25
24
|
def recursive_cte_requires_column_aliases?
|
|
26
25
|
false
|
|
27
26
|
end
|
|
28
27
|
|
|
29
|
-
# Whether the dataset requires SQL standard datetimes
|
|
30
|
-
# as most allow strings with ISO 8601 format
|
|
28
|
+
# Whether the dataset requires SQL standard datetimes. False by default,
|
|
29
|
+
# as most allow strings with ISO 8601 format.
|
|
31
30
|
def requires_sql_standard_datetimes?
|
|
32
31
|
false
|
|
33
32
|
end
|
|
34
33
|
|
|
35
34
|
# Whether type specifiers are required for prepared statement/bound
|
|
36
|
-
# variable argument placeholders (i.e. :bv__integer)
|
|
35
|
+
# variable argument placeholders (i.e. :bv__integer), false by default.
|
|
37
36
|
def requires_placeholder_type_specifiers?
|
|
38
37
|
false
|
|
39
38
|
end
|
|
40
39
|
|
|
41
|
-
# Whether the dataset supports common table expressions
|
|
40
|
+
# Whether the dataset supports common table expressions, false by default.
|
|
42
41
|
# If given, +type+ can be :select, :insert, :update, or :delete, in which case it
|
|
43
42
|
# determines whether WITH is supported for the respective statement type.
|
|
44
43
|
def supports_cte?(type=:select)
|
|
45
44
|
false
|
|
46
45
|
end
|
|
47
46
|
|
|
48
|
-
# Whether the dataset supports common table expressions
|
|
49
|
-
#
|
|
47
|
+
# Whether the dataset supports common table expressions in subqueries, false by default.
|
|
48
|
+
# If false, applies the WITH clause to the main query, which can cause issues
|
|
50
49
|
# if multiple WITH clauses use the same name.
|
|
51
50
|
def supports_cte_in_subqueries?
|
|
52
51
|
false
|
|
@@ -64,23 +63,23 @@ module Sequel
|
|
|
64
63
|
false
|
|
65
64
|
end
|
|
66
65
|
|
|
67
|
-
# Whether the dataset supports CUBE with GROUP BY.
|
|
66
|
+
# Whether the dataset supports CUBE with GROUP BY, false by default.
|
|
68
67
|
def supports_group_cube?
|
|
69
68
|
false
|
|
70
69
|
end
|
|
71
70
|
|
|
72
|
-
# Whether the dataset supports ROLLUP with GROUP BY.
|
|
71
|
+
# Whether the dataset supports ROLLUP with GROUP BY, false by default.
|
|
73
72
|
def supports_group_rollup?
|
|
74
73
|
false
|
|
75
74
|
end
|
|
76
75
|
|
|
77
|
-
# Whether the dataset supports GROUPING SETS with GROUP BY.
|
|
76
|
+
# Whether the dataset supports GROUPING SETS with GROUP BY, false by default.
|
|
78
77
|
def supports_grouping_sets?
|
|
79
78
|
false
|
|
80
79
|
end
|
|
81
80
|
|
|
82
81
|
# Whether this dataset supports the +insert_select+ method for returning all columns values
|
|
83
|
-
# directly from an insert query.
|
|
82
|
+
# directly from an insert query, false by default.
|
|
84
83
|
def supports_insert_select?
|
|
85
84
|
supports_returning?(:insert)
|
|
86
85
|
end
|
|
@@ -95,33 +94,34 @@ module Sequel
|
|
|
95
94
|
true
|
|
96
95
|
end
|
|
97
96
|
|
|
98
|
-
# Whether the dataset supports the IS TRUE syntax.
|
|
97
|
+
# Whether the dataset supports the IS TRUE syntax, true by default.
|
|
99
98
|
def supports_is_true?
|
|
100
99
|
true
|
|
101
100
|
end
|
|
102
101
|
|
|
103
|
-
# Whether the dataset supports the JOIN table USING (column1, ...) syntax.
|
|
102
|
+
# Whether the dataset supports the JOIN table USING (column1, ...) syntax, true by default.
|
|
103
|
+
# If false, support is emulated using JOIN table ON (table.column1 = other_table.column1).
|
|
104
104
|
def supports_join_using?
|
|
105
105
|
true
|
|
106
106
|
end
|
|
107
107
|
|
|
108
|
-
# Whether the dataset supports LATERAL for subqueries in the FROM or JOIN clauses.
|
|
108
|
+
# Whether the dataset supports LATERAL for subqueries in the FROM or JOIN clauses, false by default.
|
|
109
109
|
def supports_lateral_subqueries?
|
|
110
110
|
false
|
|
111
111
|
end
|
|
112
112
|
|
|
113
|
-
# Whether limits are supported in correlated subqueries
|
|
113
|
+
# Whether limits are supported in correlated subqueries, true by default.
|
|
114
114
|
def supports_limits_in_correlated_subqueries?
|
|
115
115
|
true
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
# Whether modifying joined datasets is supported.
|
|
118
|
+
# Whether modifying joined datasets is supported, false by default.
|
|
119
119
|
def supports_modifying_joins?
|
|
120
120
|
false
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
# Whether the IN/NOT IN operators support multiple columns when an
|
|
124
|
-
# array of values is given.
|
|
124
|
+
# array of values is given, true by default.
|
|
125
125
|
def supports_multiple_column_in?
|
|
126
126
|
true
|
|
127
127
|
end
|
|
@@ -132,12 +132,12 @@ module Sequel
|
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
# Whether the dataset supports or can fully emulate the DISTINCT ON clause,
|
|
135
|
-
# including respecting the ORDER BY clause, false by default
|
|
135
|
+
# including respecting the ORDER BY clause, false by default.
|
|
136
136
|
def supports_ordered_distinct_on?
|
|
137
137
|
supports_distinct_on?
|
|
138
138
|
end
|
|
139
139
|
|
|
140
|
-
# Whether the dataset supports pattern matching by regular expressions.
|
|
140
|
+
# Whether the dataset supports pattern matching by regular expressions, false by default.
|
|
141
141
|
def supports_regexp?
|
|
142
142
|
false
|
|
143
143
|
end
|
|
@@ -147,39 +147,39 @@ module Sequel
|
|
|
147
147
|
false
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
# Whether the RETURNING clause is supported for the given type of query.
|
|
150
|
+
# Whether the RETURNING clause is supported for the given type of query, false by default.
|
|
151
151
|
# +type+ can be :insert, :update, or :delete.
|
|
152
152
|
def supports_returning?(type)
|
|
153
153
|
false
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
# Whether the dataset supports skipping locked rows when returning data.
|
|
156
|
+
# Whether the dataset supports skipping locked rows when returning data, false by default.
|
|
157
157
|
def supports_skip_locked?
|
|
158
158
|
false
|
|
159
159
|
end
|
|
160
160
|
|
|
161
|
-
# Whether the database supports SELECT *, column FROM table
|
|
161
|
+
# Whether the database supports <tt>SELECT *, column FROM table</tt>, true by default.
|
|
162
162
|
def supports_select_all_and_column?
|
|
163
163
|
true
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
-
# Whether the dataset supports timezones in literal timestamps
|
|
166
|
+
# Whether the dataset supports timezones in literal timestamps, false by default.
|
|
167
167
|
def supports_timestamp_timezones?
|
|
168
168
|
false
|
|
169
169
|
end
|
|
170
170
|
|
|
171
|
-
# Whether the dataset supports fractional seconds in literal timestamps
|
|
171
|
+
# Whether the dataset supports fractional seconds in literal timestamps, true by default.
|
|
172
172
|
def supports_timestamp_usecs?
|
|
173
173
|
true
|
|
174
174
|
end
|
|
175
175
|
|
|
176
|
-
# Whether the dataset supports window functions.
|
|
176
|
+
# Whether the dataset supports window functions, false by default.
|
|
177
177
|
def supports_window_functions?
|
|
178
178
|
false
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
# Whether the dataset supports WHERE TRUE (or WHERE 1 for databases that
|
|
182
|
-
# that use 1 for true).
|
|
182
|
+
# that use 1 for true), true by default.
|
|
183
183
|
def supports_where_true?
|
|
184
184
|
true
|
|
185
185
|
end
|
|
@@ -187,12 +187,17 @@ module Sequel
|
|
|
187
187
|
private
|
|
188
188
|
|
|
189
189
|
# Whether insert(nil) or insert({}) must be emulated by
|
|
190
|
-
# using at least one value
|
|
190
|
+
# using at least one value.
|
|
191
191
|
def insert_supports_empty_values?
|
|
192
192
|
true
|
|
193
193
|
end
|
|
194
194
|
|
|
195
|
-
# Whether
|
|
195
|
+
# Whether common table expressions are supported in UNION/INTERSECT/EXCEPT clauses.
|
|
196
|
+
def supports_cte_in_compounds?
|
|
197
|
+
supports_cte_in_subqueries?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Whether the database supports quoting function names.
|
|
196
201
|
def supports_quoted_function_names?
|
|
197
202
|
false
|
|
198
203
|
end
|