sequel 4.49.0 → 5.0.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 +70 -0
- data/README.rdoc +195 -136
- data/Rakefile +26 -42
- data/bin/sequel +3 -5
- data/doc/advanced_associations.rdoc +86 -163
- 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/schema_modification.rdoc +63 -60
- data/doc/security.rdoc +97 -88
- data/doc/sharding.rdoc +43 -30
- data/doc/sql.rdoc +53 -65
- data/doc/testing.rdoc +3 -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.rb +1 -1
- data/lib/sequel/adapters/ado.rb +9 -25
- data/lib/sequel/adapters/ado/access.rb +7 -13
- data/lib/sequel/adapters/ado/mssql.rb +2 -9
- data/lib/sequel/adapters/amalgalite.rb +3 -18
- data/lib/sequel/adapters/ibmdb.rb +9 -45
- data/lib/sequel/adapters/jdbc.rb +13 -73
- 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 +4 -25
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
- 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 +1 -15
- data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
- 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/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.rb +0 -19
- 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/oracle.rb +7 -13
- data/lib/sequel/adapters/postgres.rb +13 -57
- 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 +23 -224
- data/lib/sequel/adapters/shared/oracle.rb +13 -41
- data/lib/sequel/adapters/shared/postgres.rb +44 -259
- data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
- data/lib/sequel/adapters/shared/sqlite.rb +12 -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 +2 -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.rb +26 -28
- 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/core.rb +42 -101
- data/lib/sequel/database.rb +12 -2
- 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 +23 -55
- data/lib/sequel/database/query.rb +8 -13
- data/lib/sequel/database/schema_generator.rb +89 -64
- data/lib/sequel/database/schema_methods.rb +61 -79
- data/lib/sequel/database/transactions.rb +4 -24
- data/lib/sequel/dataset.rb +18 -10
- data/lib/sequel/dataset/actions.rb +53 -107
- data/lib/sequel/dataset/dataset_module.rb +3 -15
- data/lib/sequel/dataset/features.rb +30 -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 +71 -155
- data/lib/sequel/dataset/sql.rb +30 -225
- 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 +23 -40
- 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_hstore.rb +11 -50
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
- data/lib/sequel/extensions/pg_inet.rb +2 -15
- 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/model.rb +27 -62
- data/lib/sequel/model/associations.rb +128 -131
- data/lib/sequel/model/base.rb +171 -711
- 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/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 -22
- data/lib/sequel/version.rb +2 -2
- 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 +101 -480
- data/spec/adapters/oracle_spec.rb +1 -9
- data/spec/adapters/postgres_spec.rb +312 -565
- 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 +64 -244
- data/spec/core/dataset_spec.rb +81 -415
- data/spec/core/deprecated_spec.rb +3 -3
- data/spec/core/expression_filters_spec.rb +37 -144
- data/spec/core/mock_adapter_spec.rb +176 -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 +74 -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 +4 -59
- 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 +35 -1086
- 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 +1 -7
- 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 +1 -1
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +2 -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 +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +4 -1
- 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_hstore_ops_spec.rb +1 -1
- data/spec/extensions/pg_hstore_spec.rb +23 -32
- 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 +1 -1
- data/spec/extensions/prepared_statements_spec.rb +13 -48
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -12
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- 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 +1 -1
- 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 +2 -14
- 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/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 +3 -3
- 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 +1 -1
- 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 -12
- 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 +3 -3
- 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 +5 -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 +6 -22
- data/spec/integration/prepared_statement_test.rb +8 -88
- data/spec/integration/schema_test.rb +6 -6
- data/spec/integration/spec_helper.rb +13 -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 +18 -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 +17 -11
- data/spec/model/hooks_spec.rb +5 -300
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +15 -320
- data/spec/model/plugins_spec.rb +2 -16
- data/spec/model/record_spec.rb +29 -121
- data/spec/model/spec_helper.rb +5 -15
- data/spec/model/validations_spec.rb +1 -1
- data/spec/sequel_warning.rb +1 -12
- metadata +8 -64
- data/doc/active_record.rdoc +0 -927
- data/lib/sequel/adapters/cubrid.rb +0 -160
- data/lib/sequel/adapters/do.rb +0 -166
- 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/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.rb +0 -169
- 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/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
@@ -15,7 +15,7 @@ module Sequel
|
|
15
15
|
# Example:
|
16
16
|
#
|
17
17
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
18
|
-
# ds.where(:
|
18
|
+
# ds.where(id: pl.arg).exclude(name: pl.arg).limit(1)
|
19
19
|
# end
|
20
20
|
# loader.first(1, "foo")
|
21
21
|
# # SELECT * FROM items WHERE ((id = 1) AND (name != 'foo')) LIMIT 1
|
@@ -27,7 +27,7 @@ module Sequel
|
|
27
27
|
# Note that this method does not handle all possible cases. For example:
|
28
28
|
#
|
29
29
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
30
|
-
# ds.join(pl.arg, :
|
30
|
+
# ds.join(pl.arg, item_id: :id)
|
31
31
|
# end
|
32
32
|
# loader.all(:cart_items)
|
33
33
|
#
|
@@ -35,7 +35,7 @@ module Sequel
|
|
35
35
|
# best to add a table alias when joining:
|
36
36
|
#
|
37
37
|
# loader = Sequel::Dataset::PlaceholderLiteralizer.loader(DB[:items]) do |pl, ds|
|
38
|
-
# ds.join(Sequel.as(pl.arg, :t), :
|
38
|
+
# ds.join(Sequel.as(pl.arg, :t), item_id: :id)
|
39
39
|
# end
|
40
40
|
# loader.all(:cart_items)
|
41
41
|
#
|
@@ -107,7 +107,7 @@ module Sequel
|
|
107
107
|
end
|
108
108
|
|
109
109
|
# Record the offset at which the argument is used in the SQL query, and any
|
110
|
-
# transforming
|
110
|
+
# transforming block.
|
111
111
|
def use(sql, arg, transformer)
|
112
112
|
@args << [sql, sql.length, arg, transformer]
|
113
113
|
end
|
@@ -37,23 +37,10 @@ module Sequel
|
|
37
37
|
end
|
38
38
|
private_class_method :prepared_statements_module
|
39
39
|
|
40
|
-
def self.def_deprecated_opts_setter(mod, *meths)
|
41
|
-
meths.each do |meth|
|
42
|
-
mod.send(:define_method, :"#{meth}=") do |v|
|
43
|
-
# :nocov:
|
44
|
-
Sequel::Deprecation.deprecate("Dataset##{meth}=", "The API has changed, and this value should now be passed in as an option via Dataset#clone")
|
45
|
-
@opts[meth] = v
|
46
|
-
# :nocov:
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
40
|
# Default implementation of the argument mapper to allow
|
52
41
|
# native database support for bind variables and prepared
|
53
42
|
# statements (as opposed to the emulated ones used by default).
|
54
43
|
module ArgumentMapper
|
55
|
-
Dataset.def_deprecated_opts_setter(self, :prepared_statement_name, :bind_arguments)
|
56
|
-
|
57
44
|
# The name of the prepared statement, if any.
|
58
45
|
def prepared_statement_name
|
59
46
|
@opts[:prepared_statement_name]
|
@@ -89,11 +76,6 @@ module Sequel
|
|
89
76
|
# into the query, which works on all databases, as it is no different
|
90
77
|
# from using the dataset without bind variables.
|
91
78
|
module PreparedStatementMethods
|
92
|
-
Dataset.def_deprecated_opts_setter(self, :log_sql, :prepared_type, :prepared_args, :orig_dataset, :prepared_modify_values)
|
93
|
-
|
94
|
-
PLACEHOLDER_RE = /\A\$(.*)\z/
|
95
|
-
Sequel::Deprecation.deprecate_constant(self, :PLACEHOLDER_RE)
|
96
|
-
|
97
79
|
# Whether to log the full SQL query. By default, just the prepared statement
|
98
80
|
# name is generally logged on adapters that support native prepared statements.
|
99
81
|
def log_sql
|
@@ -141,6 +123,12 @@ module Sequel
|
|
141
123
|
orig_dataset.columns
|
142
124
|
end
|
143
125
|
|
126
|
+
# Disallow use of delayed evaluations in prepared statements.
|
127
|
+
def delayed_evaluation_sql_append(sql, delay)
|
128
|
+
raise Error, "delayed evaluations cannot be used in prepared statements" if @opts[:no_delayed_evaluations]
|
129
|
+
super
|
130
|
+
end
|
131
|
+
|
144
132
|
# Returns the SQL for the prepared statement, depending on
|
145
133
|
# the type of the statement and the prepared_modify_values.
|
146
134
|
def prepared_sql
|
@@ -188,13 +176,10 @@ module Sequel
|
|
188
176
|
|
189
177
|
protected
|
190
178
|
|
191
|
-
# Run the method based on the type of prepared statement
|
192
|
-
# :select running #all to get all of the rows, and the other
|
193
|
-
# types running the method with the same name as the type.
|
179
|
+
# Run the method based on the type of prepared statement.
|
194
180
|
def run(&block)
|
195
181
|
case prepared_type
|
196
182
|
when :select, :all
|
197
|
-
# Most common scenario, so listed first
|
198
183
|
all(&block)
|
199
184
|
when :each
|
200
185
|
each(&block)
|
@@ -208,18 +193,17 @@ module Sequel
|
|
208
193
|
elsif prepared_type == :delete
|
209
194
|
delete
|
210
195
|
else
|
211
|
-
|
196
|
+
public_send(prepared_type, *prepared_modify_values)
|
212
197
|
end
|
213
198
|
when :insert_pk
|
214
199
|
fetch_rows(prepared_sql){|r| return r.values.first}
|
215
200
|
when Array
|
216
201
|
case prepared_type[0]
|
217
202
|
when :map, :as_hash, :to_hash, :to_hash_groups
|
218
|
-
|
203
|
+
public_send(*prepared_type, &block)
|
219
204
|
end
|
220
205
|
else
|
221
|
-
|
222
|
-
all(&block)
|
206
|
+
raise Error, "unsupported prepared statement type used: #{prepared_type.inspect}"
|
223
207
|
end
|
224
208
|
end
|
225
209
|
|
@@ -235,8 +219,7 @@ module Sequel
|
|
235
219
|
@opts[:bind_vars].has_key?(k)
|
236
220
|
end
|
237
221
|
|
238
|
-
# The symbol cache should always be skipped, since placeholders
|
239
|
-
# are symbols.
|
222
|
+
# The symbol cache should always be skipped, since placeholders are symbols.
|
240
223
|
def skip_symbol_cache?
|
241
224
|
true
|
242
225
|
end
|
@@ -286,7 +269,7 @@ module Sequel
|
|
286
269
|
# already been set for this dataset, they are updated with the contents
|
287
270
|
# of bind_vars.
|
288
271
|
#
|
289
|
-
# DB[:table].where(:id
|
272
|
+
# DB[:table].where(id: :$id).bind(id: 1).call(:first)
|
290
273
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
291
274
|
# # => {:id=>1}
|
292
275
|
def bind(bind_vars={})
|
@@ -307,7 +290,7 @@ module Sequel
|
|
307
290
|
# run the sql with the bind variables specified in the hash. +values+ is a hash passed to
|
308
291
|
# insert or update (if one of those types is used), which may contain placeholders.
|
309
292
|
#
|
310
|
-
# DB[:table].where(:id
|
293
|
+
# DB[:table].where(id: :$id).call(:first, id: 1)
|
311
294
|
# # SELECT * FROM table WHERE id = ? LIMIT 1 -- (1)
|
312
295
|
# # => {:id=>1}
|
313
296
|
def call(type, bind_variables={}, *values, &block)
|
@@ -315,36 +298,25 @@ module Sequel
|
|
315
298
|
end
|
316
299
|
|
317
300
|
# Prepare an SQL statement for later execution. Takes a type similar to #call,
|
318
|
-
# and the +name+ symbol of the prepared statement.
|
319
|
-
# it should always be provided as a symbol for the name of the prepared statement,
|
320
|
-
# as some databases require that prepared statements have names.
|
301
|
+
# and the +name+ symbol of the prepared statement.
|
321
302
|
#
|
322
303
|
# This returns a clone of the dataset extended with PreparedStatementMethods,
|
323
304
|
# which you can +call+ with the hash of bind variables to use.
|
324
305
|
# The prepared statement is also stored in
|
325
|
-
# the associated
|
306
|
+
# the associated Database, where it can be called by name.
|
326
307
|
# The following usage is identical:
|
327
308
|
#
|
328
|
-
# ps = DB[:table].where(:name
|
309
|
+
# ps = DB[:table].where(name: :$name).prepare(:first, :select_by_name)
|
329
310
|
#
|
330
|
-
# ps.call(:
|
311
|
+
# ps.call(name: 'Blah')
|
331
312
|
# # SELECT * FROM table WHERE name = ? -- ('Blah')
|
332
313
|
# # => {:id=>1, :name=>'Blah'}
|
333
314
|
#
|
334
|
-
# DB.call(:select_by_name, :
|
335
|
-
def prepare(type, name
|
336
|
-
ps = to_prepared_statement(type, values, :name=>name, :extend=>prepared_statement_modules)
|
337
|
-
|
338
|
-
|
339
|
-
ps.prepared_sql
|
340
|
-
db.set_prepared_statement(name, ps)
|
341
|
-
else
|
342
|
-
# :nocov:
|
343
|
-
# SEQUEL5: Add coverage
|
344
|
-
Sequel::Deprecation.deprecate("Dataset#prepare will change to requiring a name argument in Sequel 5, please update your code") unless name
|
345
|
-
# :nocov:
|
346
|
-
end
|
347
|
-
|
315
|
+
# DB.call(:select_by_name, name: 'Blah') # Same thing
|
316
|
+
def prepare(type, name, *values)
|
317
|
+
ps = to_prepared_statement(type, values, :name=>name, :extend=>prepared_statement_modules, :no_delayed_evaluations=>true)
|
318
|
+
ps.prepared_sql
|
319
|
+
db.set_prepared_statement(name, ps)
|
348
320
|
ps
|
349
321
|
end
|
350
322
|
|
@@ -357,7 +329,7 @@ module Sequel
|
|
357
329
|
mods += [PreparedStatementMethods]
|
358
330
|
|
359
331
|
bind.
|
360
|
-
clone(:prepared_statement_name=>opts[:name], :prepared_type=>type, :prepared_modify_values=>values, :orig_dataset=>self, :no_cache_sql=>true, :prepared_args=>@opts[:prepared_args]||[]).
|
332
|
+
clone(:prepared_statement_name=>opts[:name], :prepared_type=>type, :prepared_modify_values=>values, :orig_dataset=>self, :no_cache_sql=>true, :prepared_args=>@opts[:prepared_args]||[], :no_delayed_evaluations=>opts[:no_delayed_evaluations]).
|
361
333
|
with_extend(*mods)
|
362
334
|
end
|
363
335
|
|
data/lib/sequel/dataset/query.rb
CHANGED
@@ -14,13 +14,12 @@ module Sequel
|
|
14
14
|
|
15
15
|
EMPTY_ARRAY = [].freeze
|
16
16
|
|
17
|
-
# The dataset options that require the removal of cached columns
|
18
|
-
# if changed.
|
17
|
+
# The dataset options that require the removal of cached columns if changed.
|
19
18
|
COLUMN_CHANGE_OPTS = [:select, :sql, :from, :join].freeze
|
20
19
|
|
21
20
|
# Which options don't affect the SQL generation. Used by simple_select_all?
|
22
21
|
# to determine if this is a simple SELECT * FROM table.
|
23
|
-
NON_SQL_OPTIONS = [:server, :graph, :
|
22
|
+
NON_SQL_OPTIONS = [:server, :graph, :row_proc, :quote_identifiers, :skip_symbol_cache].freeze
|
24
23
|
|
25
24
|
# These symbols have _join methods created (e.g. inner_join) that
|
26
25
|
# call join_table with the symbol, passing along the arguments and
|
@@ -37,14 +36,13 @@ module Sequel
|
|
37
36
|
|
38
37
|
# Methods that return modified datasets
|
39
38
|
QUERY_METHODS = ((<<-METHS).split.map(&:to_sym) + JOIN_METHODS).freeze
|
40
|
-
add_graph_aliases
|
39
|
+
add_graph_aliases distinct except exclude exclude_having
|
41
40
|
filter for_update from from_self graph grep group group_and_count group_append group_by having intersect invert
|
42
41
|
limit lock_style naked offset or order order_append order_by order_more order_prepend qualify
|
43
42
|
reverse reverse_order select select_all select_append select_group select_more server
|
44
43
|
set_graph_aliases unfiltered ungraphed ungrouped union
|
45
44
|
unlimited unordered where with with_recursive with_sql
|
46
45
|
METHS
|
47
|
-
# SEQUEL5: Remove and, exclude_where
|
48
46
|
|
49
47
|
# Register an extension callback for Dataset objects. ext should be the
|
50
48
|
# extension name symbol, and mod should either be a Module that the
|
@@ -67,12 +65,6 @@ module Sequel
|
|
67
65
|
Sequel.synchronize{EXTENSIONS[ext] = block}
|
68
66
|
end
|
69
67
|
|
70
|
-
# Alias for where.
|
71
|
-
def and(*cond, &block)
|
72
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#and", "Use #where, or use the sequel_4_dataset_methods extension")
|
73
|
-
where(*cond, &block)
|
74
|
-
end
|
75
|
-
|
76
68
|
# On Ruby 2.4+, use clone(:freeze=>false) to create clones, because
|
77
69
|
# we use true freezing in that case, and we need to modify the opts
|
78
70
|
# in the frozen copy.
|
@@ -89,13 +81,13 @@ module Sequel
|
|
89
81
|
# If the options changed include options in COLUMN_CHANGE_OPTS, the cached
|
90
82
|
# columns are deleted. This method should generally not be called
|
91
83
|
# directly by user code.
|
92
|
-
def clone(opts =
|
84
|
+
def clone(opts = (return self; nil))
|
93
85
|
c = super(:freeze=>false)
|
94
86
|
c.opts.merge!(opts)
|
95
87
|
unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
|
96
88
|
c.clear_columns_cache
|
97
89
|
end
|
98
|
-
c.freeze
|
90
|
+
c.freeze
|
99
91
|
c
|
100
92
|
end
|
101
93
|
else
|
@@ -106,7 +98,7 @@ module Sequel
|
|
106
98
|
unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
|
107
99
|
c.clear_columns_cache
|
108
100
|
end
|
109
|
-
c.
|
101
|
+
c.opts.freeze
|
110
102
|
c
|
111
103
|
end
|
112
104
|
# :nocov:
|
@@ -140,10 +132,10 @@ module Sequel
|
|
140
132
|
# DB[:items].except(DB[:other_items])
|
141
133
|
# # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS t1
|
142
134
|
#
|
143
|
-
# DB[:items].except(DB[:other_items], :
|
135
|
+
# DB[:items].except(DB[:other_items], all: true, from_self: false)
|
144
136
|
# # SELECT * FROM items EXCEPT ALL SELECT * FROM other_items
|
145
137
|
#
|
146
|
-
# DB[:items].except(DB[:other_items], :
|
138
|
+
# DB[:items].except(DB[:other_items], alias: :i)
|
147
139
|
# # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS i
|
148
140
|
def except(dataset, opts=OPTS)
|
149
141
|
raise(InvalidOperation, "EXCEPT not supported") unless supports_intersect_except?
|
@@ -154,10 +146,10 @@ module Sequel
|
|
154
146
|
# Performs the inverse of Dataset#where. Note that if you have multiple filter
|
155
147
|
# conditions, this is not the same as a negation of all conditions.
|
156
148
|
#
|
157
|
-
# DB[:items].exclude(:
|
149
|
+
# DB[:items].exclude(category: 'software')
|
158
150
|
# # SELECT * FROM items WHERE (category != 'software')
|
159
151
|
#
|
160
|
-
# DB[:items].exclude(:
|
152
|
+
# DB[:items].exclude(category: 'software', id: 3)
|
161
153
|
# # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
|
162
154
|
#
|
163
155
|
# Also note that SQL uses 3-valued boolean logic (+true+, +false+, +NULL+), so
|
@@ -165,7 +157,7 @@ module Sequel
|
|
165
157
|
# not match rows that were NULL originally. If you take the earlier
|
166
158
|
# example:
|
167
159
|
#
|
168
|
-
# DB[:items].exclude(:
|
160
|
+
# DB[:items].exclude(category: 'software')
|
169
161
|
# # SELECT * FROM items WHERE (category != 'software')
|
170
162
|
#
|
171
163
|
# Note that this does not match rows where +category+ is +NULL+. This
|
@@ -173,7 +165,7 @@ module Sequel
|
|
173
165
|
# or not the +NULL+ category is +software+. You can explicitly
|
174
166
|
# specify how to handle +NULL+ values if you want:
|
175
167
|
#
|
176
|
-
# DB[:items].exclude(Sequel.~(:
|
168
|
+
# DB[:items].exclude(Sequel.~(category: nil) & {category: 'software'})
|
177
169
|
# # SELECT * FROM items WHERE ((category IS NULL) OR (category != 'software'))
|
178
170
|
def exclude(*cond, &block)
|
179
171
|
add_filter(:where, cond, true, &block)
|
@@ -190,12 +182,6 @@ module Sequel
|
|
190
182
|
add_filter(:having, cond, true, &block)
|
191
183
|
end
|
192
184
|
|
193
|
-
# Alias for exclude.
|
194
|
-
def exclude_where(*cond, &block)
|
195
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#exclude_where", "Use #exclude, or use the sequel_4_dataset_methods extension")
|
196
|
-
exclude(*cond, &block)
|
197
|
-
end
|
198
|
-
|
199
185
|
if TRUE_FREEZE
|
200
186
|
# Return a clone of the dataset loaded with the given dataset extensions.
|
201
187
|
# If no related extension file exists or the extension does not have
|
@@ -203,7 +189,7 @@ module Sequel
|
|
203
189
|
def extension(*a)
|
204
190
|
c = _clone(:freeze=>false)
|
205
191
|
c.send(:_extension!, a)
|
206
|
-
c.freeze
|
192
|
+
c.freeze
|
207
193
|
c
|
208
194
|
end
|
209
195
|
else
|
@@ -269,7 +255,10 @@ module Sequel
|
|
269
255
|
end
|
270
256
|
|
271
257
|
# Returns a dataset selecting from the current dataset.
|
272
|
-
#
|
258
|
+
# Options:
|
259
|
+
# :alias :: Controls the alias of the table
|
260
|
+
# :column_aliases :: Also aliases columns, using derived column lists.
|
261
|
+
# Only used in conjunction with :alias.
|
273
262
|
#
|
274
263
|
# ds = DB[:items].order(:name).select(:id, :name)
|
275
264
|
# # SELECT id,name FROM items ORDER BY name
|
@@ -277,10 +266,10 @@ module Sequel
|
|
277
266
|
# ds.from_self
|
278
267
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS t1
|
279
268
|
#
|
280
|
-
# ds.from_self(:
|
269
|
+
# ds.from_self(alias: :foo)
|
281
270
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo
|
282
271
|
#
|
283
|
-
# ds.from_self(:
|
272
|
+
# ds.from_self(alias: :foo, column_aliases: [:c1, :c2])
|
284
273
|
# # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo(c1, c2)
|
285
274
|
def from_self(opts=OPTS)
|
286
275
|
fs = {}
|
@@ -293,9 +282,9 @@ module Sequel
|
|
293
282
|
end
|
294
283
|
|
295
284
|
# Match any of the columns to any of the patterns. The terms can be
|
296
|
-
# strings (which use LIKE) or regular expressions
|
297
|
-
#
|
298
|
-
#
|
285
|
+
# strings (which use LIKE) or regular expressions if the database supports that.
|
286
|
+
# Note that the total number of pattern matches will be
|
287
|
+
# Array(columns).length * Array(terms).length,
|
299
288
|
# which could cause performance issues.
|
300
289
|
#
|
301
290
|
# Options (all are boolean):
|
@@ -316,15 +305,15 @@ module Sequel
|
|
316
305
|
# # SELECT * FROM items WHERE ((a LIKE '%test%' ESCAPE '\') OR (a LIKE 'foo' ESCAPE '\')
|
317
306
|
# # OR (b LIKE '%test%' ESCAPE '\') OR (b LIKE 'foo' ESCAPE '\'))
|
318
307
|
#
|
319
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
308
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true)
|
320
309
|
# # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (b LIKE '%foo%' ESCAPE '\'))
|
321
310
|
# # AND ((a LIKE '%bar%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
|
322
311
|
#
|
323
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
312
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_columns: true)
|
324
313
|
# # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (a LIKE '%bar%' ESCAPE '\'))
|
325
314
|
# # AND ((b LIKE '%foo%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
|
326
315
|
#
|
327
|
-
# dataset.grep([:a, :b], %w'%foo% %bar%', :
|
316
|
+
# dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true, all_columns: true)
|
328
317
|
# # SELECT * FROM a WHERE ((a LIKE '%foo%' ESCAPE '\') AND (b LIKE '%foo%' ESCAPE '\')
|
329
318
|
# # AND (a LIKE '%bar%' ESCAPE '\') AND (b LIKE '%bar%' ESCAPE '\'))
|
330
319
|
def grep(columns, patterns, opts=OPTS)
|
@@ -372,11 +361,11 @@ module Sequel
|
|
372
361
|
# # SELECT first_name, last_name, count(*) AS count FROM items GROUP BY first_name, last_name
|
373
362
|
# # => [{:first_name=>'a', :last_name=>'b', :count=>1}, ...]
|
374
363
|
#
|
375
|
-
# DB[:items].group_and_count(:
|
364
|
+
# DB[:items].group_and_count(Sequel[:first_name].as(:name)).all
|
376
365
|
# # SELECT first_name AS name, count(*) AS count FROM items GROUP BY first_name
|
377
366
|
# # => [{:name=>'a', :count=>1}, ...]
|
378
367
|
#
|
379
|
-
# DB[:items].group_and_count{substr(first_name, 1, 1).as(initial)}.all
|
368
|
+
# DB[:items].group_and_count{substr(:first_name, 1, 1).as(:initial)}.all
|
380
369
|
# # SELECT substr(first_name, 1, 1) AS initial, count(*) AS count FROM items GROUP BY substr(first_name, 1, 1)
|
381
370
|
# # => [{:initial=>'a', :count=>1}, ...]
|
382
371
|
def group_and_count(*columns, &block)
|
@@ -414,7 +403,7 @@ module Sequel
|
|
414
403
|
|
415
404
|
# Returns a copy of the dataset with the HAVING conditions changed. See #where for argument types.
|
416
405
|
#
|
417
|
-
# DB[:items].group(:sum).having(:
|
406
|
+
# DB[:items].group(:sum).having(sum: 10)
|
418
407
|
# # SELECT * FROM items GROUP BY sum HAVING (sum = 10)
|
419
408
|
def having(*cond, &block)
|
420
409
|
add_filter(:having, cond, &block)
|
@@ -432,10 +421,10 @@ module Sequel
|
|
432
421
|
# DB[:items].intersect(DB[:other_items])
|
433
422
|
# # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS t1
|
434
423
|
#
|
435
|
-
# DB[:items].intersect(DB[:other_items], :
|
424
|
+
# DB[:items].intersect(DB[:other_items], all: true, from_self: false)
|
436
425
|
# # SELECT * FROM items INTERSECT ALL SELECT * FROM other_items
|
437
426
|
#
|
438
|
-
# DB[:items].intersect(DB[:other_items], :
|
427
|
+
# DB[:items].intersect(DB[:other_items], alias: :i)
|
439
428
|
# # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS i
|
440
429
|
def intersect(dataset, opts=OPTS)
|
441
430
|
raise(InvalidOperation, "INTERSECT not supported") unless supports_intersect_except?
|
@@ -446,10 +435,10 @@ module Sequel
|
|
446
435
|
# Inverts the current WHERE and HAVING clauses. If there is neither a
|
447
436
|
# WHERE or HAVING clause, adds a WHERE clause that is always false.
|
448
437
|
#
|
449
|
-
# DB[:items].where(:
|
438
|
+
# DB[:items].where(category: 'software').invert
|
450
439
|
# # SELECT * FROM items WHERE (category != 'software')
|
451
440
|
#
|
452
|
-
# DB[:items].where(:
|
441
|
+
# DB[:items].where(category: 'software', id: 3).invert
|
453
442
|
# # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
|
454
443
|
#
|
455
444
|
# See documentation for exclude for how inversion is handled in regards
|
@@ -521,10 +510,10 @@ module Sequel
|
|
521
510
|
# DB[:a].join_table(:cross, :b)
|
522
511
|
# # SELECT * FROM a CROSS JOIN b
|
523
512
|
#
|
524
|
-
# DB[:a].join_table(:inner, DB[:b], :
|
513
|
+
# DB[:a].join_table(:inner, DB[:b], c: d)
|
525
514
|
# # SELECT * FROM a INNER JOIN (SELECT * FROM b) AS t1 ON (t1.c = a.d)
|
526
515
|
#
|
527
|
-
# DB[:a].join_table(:left, :
|
516
|
+
# DB[:a].join_table(:left, Sequel[:b].as(:c), [:d])
|
528
517
|
# # SELECT * FROM a LEFT JOIN b AS c USING (d)
|
529
518
|
#
|
530
519
|
# DB[:a].natural_join(:b).join_table(:inner, :c) do |ta, jta, js|
|
@@ -624,7 +613,7 @@ module Sequel
|
|
624
613
|
# or JOIN clauses, it will surround the subquery with LATERAL to enable it
|
625
614
|
# to deal with previous tables in the query:
|
626
615
|
#
|
627
|
-
# DB.from(:a, DB[:b].where(:
|
616
|
+
# DB.from(:a, DB[:b].where(Sequel[:a][:c]=>Sequel[:b][:d]).lateral)
|
628
617
|
# # SELECT * FROM a, LATERAL (SELECT * FROM b WHERE (a.c = b.d))
|
629
618
|
def lateral
|
630
619
|
clone(:lateral=>true)
|
@@ -676,8 +665,7 @@ module Sequel
|
|
676
665
|
|
677
666
|
# Returns a cloned dataset without a row_proc.
|
678
667
|
#
|
679
|
-
# ds = DB[:items]
|
680
|
-
# ds.row_proc = proc(&:invert)
|
668
|
+
# ds = DB[:items].with_row_proc(:invert.to_proc)
|
681
669
|
# ds.all # => [{2=>:id}]
|
682
670
|
# ds.naked.all # => [{:id=>2}]
|
683
671
|
def naked
|
@@ -699,13 +687,13 @@ module Sequel
|
|
699
687
|
|
700
688
|
# Adds an alternate filter to an existing WHERE clause using OR. If there
|
701
689
|
# is no WHERE clause, then the default is WHERE true, and OR would be redundant,
|
702
|
-
# so return
|
690
|
+
# so return the dataset in that case.
|
703
691
|
#
|
704
692
|
# DB[:items].where(:a).or(:b) # SELECT * FROM items WHERE a OR b
|
705
693
|
# DB[:items].or(:b) # SELECT * FROM items
|
706
694
|
def or(*cond, &block)
|
707
695
|
if @opts[:where].nil?
|
708
|
-
|
696
|
+
self
|
709
697
|
else
|
710
698
|
add_filter(:where, cond, false, :OR, &block)
|
711
699
|
end
|
@@ -720,7 +708,7 @@ module Sequel
|
|
720
708
|
# DB[:items].order(:name) # SELECT * FROM items ORDER BY name
|
721
709
|
# DB[:items].order(:a, :b) # SELECT * FROM items ORDER BY a, b
|
722
710
|
# DB[:items].order(Sequel.lit('a + b')) # SELECT * FROM items ORDER BY a + b
|
723
|
-
# DB[:items].order(:a + :b) # SELECT * FROM items ORDER BY (a + b)
|
711
|
+
# DB[:items].order(Sequel[:a] + :b) # SELECT * FROM items ORDER BY (a + b)
|
724
712
|
# DB[:items].order(Sequel.desc(:name)) # SELECT * FROM items ORDER BY name DESC
|
725
713
|
# DB[:items].order(Sequel.asc(:name, :nulls=>:last)) # SELECT * FROM items ORDER BY name ASC NULLS LAST
|
726
714
|
# DB[:items].order{sum(name).desc} # SELECT * FROM items ORDER BY sum(name) DESC
|
@@ -762,14 +750,14 @@ module Sequel
|
|
762
750
|
|
763
751
|
# Qualify to the given table, or first source if no table is given.
|
764
752
|
#
|
765
|
-
# DB[:items].where(:
|
753
|
+
# DB[:items].where(id: 1).qualify
|
766
754
|
# # SELECT items.* FROM items WHERE (items.id = 1)
|
767
755
|
#
|
768
|
-
# DB[:items].where(:
|
756
|
+
# DB[:items].where(id: 1).qualify(:i)
|
769
757
|
# # SELECT i.* FROM items WHERE (i.id = 1)
|
770
758
|
def qualify(table=first_source)
|
771
759
|
o = @opts
|
772
|
-
return
|
760
|
+
return self if o[:sql]
|
773
761
|
h = {}
|
774
762
|
(o.keys & QUALIFY_KEYS).each do |k|
|
775
763
|
h[k] = qualified_expression(o[k], table)
|
@@ -864,7 +852,7 @@ module Sequel
|
|
864
852
|
# DB[:items].select_group(:a, :b)
|
865
853
|
# # SELECT a, b FROM items GROUP BY a, b
|
866
854
|
#
|
867
|
-
# DB[:items].select_group(:
|
855
|
+
# DB[:items].select_group(Sequel[:c].as(:a)){f(c2)}
|
868
856
|
# # SELECT c AS a, f(c2) FROM items GROUP BY c, f(c2)
|
869
857
|
def select_group(*columns, &block)
|
870
858
|
virtual_row_columns(columns, block)
|
@@ -915,26 +903,9 @@ module Sequel
|
|
915
903
|
end
|
916
904
|
end
|
917
905
|
|
918
|
-
# Unbind bound variables from this dataset's filter and return an array of two
|
919
|
-
# objects. The first object is a modified dataset where the filter has been
|
920
|
-
# replaced with one that uses bound variable placeholders. The second object
|
921
|
-
# is the hash of unbound variables. You can then prepare and execute (or just
|
922
|
-
# call) the dataset with the bound variables to get results.
|
923
|
-
#
|
924
|
-
# ds, bv = DB[:items].where(:a=>1).unbind
|
925
|
-
# ds # SELECT * FROM items WHERE (a = $a)
|
926
|
-
# bv # {:a => 1}
|
927
|
-
# ds.call(:select, bv)
|
928
|
-
def unbind
|
929
|
-
Sequel::Deprecation.deprecate("Dataset#unbind", "Switch to using placeholders manually instead of unbinding them")
|
930
|
-
u = Unbinder.new
|
931
|
-
ds = clone(:where=>u.transform(opts[:where]), :join=>u.transform(opts[:join]))
|
932
|
-
[ds, u.binds]
|
933
|
-
end
|
934
|
-
|
935
906
|
# Returns a copy of the dataset with no filters (HAVING or WHERE clause) applied.
|
936
907
|
#
|
937
|
-
# DB[:items].group(:a).having(:
|
908
|
+
# DB[:items].group(:a).having(a: 1).where(:b).unfiltered
|
938
909
|
# # SELECT * FROM items GROUP BY a
|
939
910
|
def unfiltered
|
940
911
|
cached_dataset(:_unfiltered_ds){clone(:where => nil, :having => nil)}
|
@@ -942,7 +913,7 @@ module Sequel
|
|
942
913
|
|
943
914
|
# Returns a copy of the dataset with no grouping (GROUP or HAVING clause) applied.
|
944
915
|
#
|
945
|
-
# DB[:items].group(:a).having(:
|
916
|
+
# DB[:items].group(:a).having(a: 1).where(:b).ungrouped
|
946
917
|
# # SELECT * FROM items WHERE b
|
947
918
|
def ungrouped
|
948
919
|
cached_dataset(:_ungrouped_ds){clone(:group => nil, :having => nil)}
|
@@ -959,10 +930,10 @@ module Sequel
|
|
959
930
|
# DB[:items].union(DB[:other_items])
|
960
931
|
# # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS t1
|
961
932
|
#
|
962
|
-
# DB[:items].union(DB[:other_items], :
|
933
|
+
# DB[:items].union(DB[:other_items], all: true, from_self: false)
|
963
934
|
# # SELECT * FROM items UNION ALL SELECT * FROM other_items
|
964
935
|
#
|
965
|
-
# DB[:items].union(DB[:other_items], :
|
936
|
+
# DB[:items].union(DB[:other_items], alias: :i)
|
966
937
|
# # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS i
|
967
938
|
def union(dataset, opts=OPTS)
|
968
939
|
compound_clone(:union, dataset, opts)
|
@@ -986,18 +957,10 @@ module Sequel
|
|
986
957
|
#
|
987
958
|
# Accepts the following argument types:
|
988
959
|
#
|
989
|
-
# Hash :: list of equality/inclusion expressions
|
990
|
-
# Array :: depends:
|
991
|
-
# * If first member is a string, assumes the rest of the arguments
|
992
|
-
# are parameters and interpolates them into the string.
|
993
|
-
# * If all members are arrays of length two, treats the same way
|
994
|
-
# as a hash, except it allows for duplicate keys to be
|
995
|
-
# specified.
|
996
|
-
# * Otherwise, treats each argument as a separate condition.
|
997
|
-
# String :: taken literally
|
960
|
+
# Hash, Array of pairs :: list of equality/inclusion expressions
|
998
961
|
# Symbol :: taken as a boolean column argument (e.g. WHERE active)
|
999
|
-
# Sequel::SQL::BooleanExpression :: an existing condition expression,
|
1000
|
-
#
|
962
|
+
# Sequel::SQL::BooleanExpression, Sequel::LiteralString :: an existing condition expression, probably created
|
963
|
+
# using the Sequel expression filter DSL.
|
1001
964
|
#
|
1002
965
|
# where also accepts a block, which should return one of the above argument
|
1003
966
|
# types, and is treated the same way. This block yields a virtual row object,
|
@@ -1008,16 +971,16 @@ module Sequel
|
|
1008
971
|
#
|
1009
972
|
# Examples:
|
1010
973
|
#
|
1011
|
-
# DB[:items].where(:
|
974
|
+
# DB[:items].where(id: 3)
|
1012
975
|
# # SELECT * FROM items WHERE (id = 3)
|
1013
976
|
#
|
1014
|
-
# DB[:items].where('price < ?', 100)
|
977
|
+
# DB[:items].where(Sequel.lit('price < ?', 100))
|
1015
978
|
# # SELECT * FROM items WHERE price < 100
|
1016
979
|
#
|
1017
980
|
# DB[:items].where([[:id, [1,2,3]], [:id, 0..10]])
|
1018
981
|
# # SELECT * FROM items WHERE ((id IN (1, 2, 3)) AND ((id >= 0) AND (id <= 10)))
|
1019
982
|
#
|
1020
|
-
# DB[:items].where('price < 100')
|
983
|
+
# DB[:items].where(Sequel.lit('price < 100'))
|
1021
984
|
# # SELECT * FROM items WHERE price < 100
|
1022
985
|
#
|
1023
986
|
# DB[:items].where(:active)
|
@@ -1028,7 +991,7 @@ module Sequel
|
|
1028
991
|
#
|
1029
992
|
# Multiple where calls can be chained for scoping:
|
1030
993
|
#
|
1031
|
-
# software = dataset.where(:
|
994
|
+
# software = dataset.where(category: 'software').where{price < 100}
|
1032
995
|
# # SELECT * FROM items WHERE ((category = 'software') AND (price < 100))
|
1033
996
|
#
|
1034
997
|
# See the {"Dataset Filtering" guide}[rdoc-ref:doc/dataset_filtering.rdoc] for more examples and details.
|
@@ -1042,7 +1005,7 @@ module Sequel
|
|
1042
1005
|
# :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
|
1043
1006
|
# :recursive :: Specify that this is a recursive CTE
|
1044
1007
|
#
|
1045
|
-
# DB[:items].with(:items, DB[:syx].where(:name.like('A%')))
|
1008
|
+
# DB[:items].with(:items, DB[:syx].where(Sequel[:name].like('A%')))
|
1046
1009
|
# # WITH items AS (SELECT * FROM syx WHERE (name LIKE 'A%' ESCAPE '\')) SELECT * FROM items
|
1047
1010
|
def with(name, dataset, opts=OPTS)
|
1048
1011
|
raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
|
@@ -1061,15 +1024,15 @@ module Sequel
|
|
1061
1024
|
# :union_all :: Set to false to use UNION instead of UNION ALL combining the nonrecursive and recursive parts.
|
1062
1025
|
#
|
1063
1026
|
# DB[:t].with_recursive(:t,
|
1064
|
-
# DB[:i1].select(:id, :parent_id).where(:
|
1065
|
-
# DB[:i1].join(:t, :
|
1027
|
+
# DB[:i1].select(:id, :parent_id).where(parent_id: nil),
|
1028
|
+
# DB[:i1].join(:t, id: :parent_id).select(Sequel[:i1][:id], Sequel[:i1][:parent_id]),
|
1066
1029
|
# :args=>[:id, :parent_id])
|
1067
1030
|
#
|
1068
|
-
# # WITH RECURSIVE
|
1069
|
-
# # SELECT
|
1031
|
+
# # WITH RECURSIVE t(id, parent_id) AS (
|
1032
|
+
# # SELECT id, parent_id FROM i1 WHERE (parent_id IS NULL)
|
1070
1033
|
# # UNION ALL
|
1071
|
-
# # SELECT
|
1072
|
-
# # ) SELECT * FROM
|
1034
|
+
# # SELECT i1.id, i1.parent_id FROM i1 INNER JOIN t ON (t.id = i1.parent_id)
|
1035
|
+
# # ) SELECT * FROM t
|
1073
1036
|
def with_recursive(name, nonrecursive, recursive, opts=OPTS)
|
1074
1037
|
raise(Error, 'This datatset does not support common table expressions') unless supports_cte?
|
1075
1038
|
if hoist_cte?(nonrecursive)
|
@@ -1093,7 +1056,7 @@ module Sequel
|
|
1093
1056
|
c = _clone(:freeze=>false)
|
1094
1057
|
c.extend(*mods) unless mods.empty?
|
1095
1058
|
c.extend(DatasetModule.new(&block)) if block
|
1096
|
-
c.freeze
|
1059
|
+
c.freeze
|
1097
1060
|
c
|
1098
1061
|
end
|
1099
1062
|
else
|
@@ -1111,7 +1074,7 @@ module Sequel
|
|
1111
1074
|
#
|
1112
1075
|
# ds = DB[:items]
|
1113
1076
|
# ds.all # => [{:id=>2}]
|
1114
|
-
# ds.with_row_proc(
|
1077
|
+
# ds.with_row_proc(:invert.to_proc).all # => [{2=>:id}]
|
1115
1078
|
def with_row_proc(callable)
|
1116
1079
|
clone(:row_proc=>callable)
|
1117
1080
|
end
|
@@ -1132,7 +1095,7 @@ module Sequel
|
|
1132
1095
|
# Note that datasets that specify custom SQL using this method will generally
|
1133
1096
|
# ignore future dataset methods that modify the SQL used, as specifying custom SQL
|
1134
1097
|
# overrides Sequel's SQL generator. You should probably limit yourself to the following
|
1135
|
-
# dataset methods when using this method:
|
1098
|
+
# dataset methods when using this method, or use the implicit_subquery extension:
|
1136
1099
|
#
|
1137
1100
|
# * each
|
1138
1101
|
# * all
|
@@ -1146,13 +1109,9 @@ module Sequel
|
|
1146
1109
|
# * update (if an UPDATE statement, with no arguments)
|
1147
1110
|
# * insert (if an INSERT statement, with no arguments)
|
1148
1111
|
# * truncate (if a TRUNCATE statement, with no arguments)
|
1149
|
-
#
|
1150
|
-
# If you want to use arbitrary dataset methods on a dataset that uses custom SQL, call
|
1151
|
-
# from_self on the dataset, which wraps the custom SQL in a subquery, and allows normal
|
1152
|
-
# dataset methods that modify the SQL to work.
|
1153
1112
|
def with_sql(sql, *args)
|
1154
1113
|
if sql.is_a?(Symbol)
|
1155
|
-
sql =
|
1114
|
+
sql = public_send(sql, *args)
|
1156
1115
|
else
|
1157
1116
|
sql = SQL::PlaceholderLiteralString.new(sql, args) unless args.empty?
|
1158
1117
|
end
|
@@ -1220,30 +1179,18 @@ module Sequel
|
|
1220
1179
|
|
1221
1180
|
def add_filter(clause, cond, invert=false, combine=:AND, &block)
|
1222
1181
|
if cond == EMPTY_ARRAY && !block
|
1223
|
-
|
1224
|
-
#raise Error, "must provide an argument to a filtering method if not passing a block" # SEQUEL5
|
1182
|
+
raise Error, "must provide an argument to a filtering method if not passing a block"
|
1225
1183
|
end
|
1226
1184
|
|
1227
1185
|
cond = cond.first if cond.size == 1
|
1228
1186
|
|
1229
1187
|
empty = cond == OPTS || cond == EMPTY_ARRAY
|
1230
|
-
old_empty = cond.respond_to?(:empty?) && cond.empty?
|
1231
|
-
if old_empty && !empty
|
1232
|
-
Sequel::Deprecation.deprecate("Treating #{cond.inspect} as a empty filter expression", "Only {} and [] are considered empty expressions now")
|
1233
|
-
empty = true
|
1234
|
-
end
|
1235
1188
|
|
1236
1189
|
if empty && !block
|
1237
|
-
|
1190
|
+
self
|
1238
1191
|
else
|
1239
1192
|
if cond == nil
|
1240
|
-
|
1241
|
-
Sequel::Deprecation.deprecate("Ignoring explicit nil argument when passing a block to a filtering method", "Do not pass an explicit nil argument to the filtering method, only pass the block")
|
1242
|
-
end
|
1243
|
-
unless @opts[clause]
|
1244
|
-
Sequel::Deprecation.deprecate("Ignoring explicit nil argument to a filtering method if dataset has no explicit filter", "Starting in Sequel 5, this will add a NULL condition")
|
1245
|
-
end
|
1246
|
-
#cond = Sequel::NULL # SEQUEL5
|
1193
|
+
cond = Sequel::NULL
|
1247
1194
|
end
|
1248
1195
|
if empty && block
|
1249
1196
|
cond = nil
|
@@ -1256,17 +1203,6 @@ module Sequel
|
|
1256
1203
|
end
|
1257
1204
|
end
|
1258
1205
|
|
1259
|
-
# :nocov:
|
1260
|
-
def _filter_or_exclude(invert, clause, *cond, &block)
|
1261
|
-
Sequel::Deprecation.deprecate("Sequel::Dataset#_filter/_filter_or_exclude (private methods)", "Switch to calling a public dataset filtering method directly")
|
1262
|
-
add_filter(clause, cond, invert, &block)
|
1263
|
-
end
|
1264
|
-
|
1265
|
-
def _filter(clause, *cond, &block)
|
1266
|
-
_filter_or_exclude(false, clause, *cond, &block)
|
1267
|
-
end
|
1268
|
-
# :nocov:
|
1269
|
-
|
1270
1206
|
# The default :qualify option to use for join tables if one is not specified.
|
1271
1207
|
def default_join_table_qualification
|
1272
1208
|
:symbol
|
@@ -1290,22 +1226,13 @@ module Sequel
|
|
1290
1226
|
when Array
|
1291
1227
|
if Sequel.condition_specifier?(expr)
|
1292
1228
|
SQL::BooleanExpression.from_value_pairs(expr)
|
1293
|
-
#else # SEQUEL5
|
1294
|
-
# raise(Error, "Invalid filter expression: #{expr.inspect}")
|
1295
|
-
elsif (sexpr = expr[0]).is_a?(String)
|
1296
|
-
Sequel::Deprecation.deprecate("Calling a dataset filtering method with multiple arguments or an array where the first argument/element is a string", "Use Sequel.lit(#{sexpr.inspect}#{", #{expr[1..-1].map(&:inspect).join(', ')}" if expr.length > 1}) to create an SQL fragment expression and pass that to the dataset filtering method, or use the auto_literal_strings extension")
|
1297
|
-
SQL::PlaceholderLiteralString.new(sexpr, expr[1..-1], true)
|
1298
1229
|
else
|
1299
|
-
|
1300
|
-
SQL::BooleanExpression.new(:AND, *expr.map{|x| filter_expr(x)})
|
1230
|
+
raise Error, "Invalid filter expression: #{expr.inspect}"
|
1301
1231
|
end
|
1302
|
-
when Proc
|
1303
|
-
Sequel::Deprecation.deprecate("Passing Proc objects as filter arguments", "Pass them as blocks to the filtering methods or to Sequel.expr")
|
1304
|
-
filter_expr(Sequel.virtual_row(&expr))
|
1305
1232
|
when LiteralString
|
1306
1233
|
LiteralString.new("(#{expr})")
|
1307
|
-
when Numeric, SQL::NumericExpression, SQL::StringExpression
|
1308
|
-
raise
|
1234
|
+
when Numeric, SQL::NumericExpression, SQL::StringExpression, Proc, String
|
1235
|
+
raise Error, "Invalid filter expression: #{expr.inspect}"
|
1309
1236
|
when TrueClass, FalseClass
|
1310
1237
|
if supports_where_true?
|
1311
1238
|
SQL::BooleanExpression.new(:NOOP, expr)
|
@@ -1314,9 +1241,6 @@ module Sequel
|
|
1314
1241
|
else
|
1315
1242
|
SQL::Constants::SQLFALSE
|
1316
1243
|
end
|
1317
|
-
when String
|
1318
|
-
Sequel::Deprecation.deprecate("Calling a dataset filtering method with a plain string", "Use Sequel.lit(#{expr.inspect}) to create a literal string and pass that to the dataset filtering method, or use the auto_literal_strings extension")
|
1319
|
-
LiteralString.new("(#{expr})")
|
1320
1244
|
when PlaceholderLiteralizer::Argument
|
1321
1245
|
expr.transform{|v| filter_expr(v)}
|
1322
1246
|
when SQL::PlaceholderLiteralString
|
@@ -1361,14 +1285,6 @@ module Sequel
|
|
1361
1285
|
server?(:default)
|
1362
1286
|
end
|
1363
1287
|
|
1364
|
-
# SEQUEL5: Remove
|
1365
|
-
def non_sql_options
|
1366
|
-
# :nocov:
|
1367
|
-
Sequel::Deprecation.deprecate("Dataset#non_sql_options (private method)", "Convert the related code to use the non_sql_option? method")
|
1368
|
-
NON_SQL_OPTIONS
|
1369
|
-
# :nocov:
|
1370
|
-
end
|
1371
|
-
|
1372
1288
|
# Whether the given option key does not affect the generated SQL.
|
1373
1289
|
def non_sql_option?(key)
|
1374
1290
|
NON_SQL_OPTIONS.include?(key)
|