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
data/lib/sequel/exceptions.rb
CHANGED
@@ -75,7 +75,7 @@ module Sequel
|
|
75
75
|
|
76
76
|
(
|
77
77
|
# Error raised on an invalid operation, such as trying to update or delete
|
78
|
-
# a joined or grouped dataset.
|
78
|
+
# a joined or grouped dataset when the database does not support that.
|
79
79
|
InvalidOperation = Class.new(Error)
|
80
80
|
).name
|
81
81
|
|
@@ -113,20 +113,4 @@ module Sequel
|
|
113
113
|
# and won't reraise it (unless a reraise is requested).
|
114
114
|
Rollback = Class.new(Error)
|
115
115
|
).name
|
116
|
-
|
117
|
-
# SEQUEL5: Remove
|
118
|
-
(UnbindDuplicate = Class.new(Error)).name
|
119
|
-
|
120
|
-
Error::AdapterNotFound = AdapterNotFound
|
121
|
-
Error::InvalidOperation = InvalidOperation
|
122
|
-
Error::InvalidValue = InvalidValue
|
123
|
-
Error::PoolTimeoutError = PoolTimeout
|
124
|
-
Error::Rollback = Rollback
|
125
|
-
|
126
|
-
Sequel::Deprecation.deprecate_constant(self, :UnbindDuplicate)
|
127
|
-
Sequel::Deprecation.deprecate_constant(Error, :AdapterNotFound)
|
128
|
-
Sequel::Deprecation.deprecate_constant(Error, :InvalidOperation)
|
129
|
-
Sequel::Deprecation.deprecate_constant(Error, :InvalidValue)
|
130
|
-
Sequel::Deprecation.deprecate_constant(Error, :PoolTimeoutError)
|
131
|
-
Sequel::Deprecation.deprecate_constant(Error, :Rollback)
|
132
116
|
end
|
@@ -4,13 +4,6 @@ module Sequel
|
|
4
4
|
module Plugins
|
5
5
|
module PgRow
|
6
6
|
module DatabaseMethods
|
7
|
-
ESCAPE_RE = /("|\\)/.freeze
|
8
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
|
9
|
-
ESCAPE_REPLACEMENT = '\\\\\1'.freeze
|
10
|
-
Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACEMENT)
|
11
|
-
COMMA = ','
|
12
|
-
Sequel::Deprecation.deprecate_constant(self, :COMMA)
|
13
|
-
|
14
7
|
# Handle Sequel::Model instances in bound variables.
|
15
8
|
def bound_variable_arg(arg, conn)
|
16
9
|
case arg
|
@@ -27,7 +27,7 @@ module Sequel
|
|
27
27
|
|
28
28
|
# Return the string that #print will print via puts.
|
29
29
|
def self.string(records, columns = nil) # records is an array of hashes
|
30
|
-
columns ||= records.first.keys.
|
30
|
+
columns ||= records.first.keys.sort
|
31
31
|
sizes = column_sizes(records, columns)
|
32
32
|
sep_line = separator_line(columns, sizes)
|
33
33
|
|
@@ -37,8 +37,6 @@ module Sequel
|
|
37
37
|
array.join("\n")
|
38
38
|
end
|
39
39
|
|
40
|
-
### Private Module Methods ###
|
41
|
-
|
42
40
|
# Hash of the maximum size of the value for each column
|
43
41
|
def self.column_sizes(records, columns) # :nodoc:
|
44
42
|
sizes = Hash.new {0}
|
@@ -9,34 +9,34 @@
|
|
9
9
|
# Then you can pass arbitrary connection options for the server/shard
|
10
10
|
# to use as a hash:
|
11
11
|
#
|
12
|
-
# DB[:table].server(:
|
12
|
+
# DB[:table].server(host: '...', database: '...').all
|
13
13
|
#
|
14
14
|
# Because Sequel can never be sure that the connection will be reused,
|
15
15
|
# arbitrary connections are disconnected as soon as the outermost block
|
16
16
|
# that uses them exits. So this example uses the same connection:
|
17
17
|
#
|
18
|
-
# DB.transaction(:
|
19
|
-
# DB.transaction(:
|
18
|
+
# DB.transaction(server: {host: '...', database: '...'}) do |c|
|
19
|
+
# DB.transaction(server: {host: '...', database: '...'}) do |c2|
|
20
20
|
# # c == c2
|
21
21
|
# end
|
22
22
|
# end
|
23
23
|
#
|
24
24
|
# But this example does not:
|
25
25
|
#
|
26
|
-
# DB.transaction(:
|
26
|
+
# DB.transaction(server: {host: '...', database: '...'}) do |c|
|
27
27
|
# end
|
28
|
-
# DB.transaction(:
|
28
|
+
# DB.transaction(server: {host: '...', database: '...'}) do |c2|
|
29
29
|
# # c != c2
|
30
30
|
# end
|
31
31
|
#
|
32
32
|
# You can use this extension in conjunction with the server_block
|
33
33
|
# extension:
|
34
34
|
#
|
35
|
-
# DB.with_server(:
|
35
|
+
# DB.with_server(host: '...', database: '...') do
|
36
36
|
# DB.synchronize do
|
37
37
|
# # All of these use the host/database given to with_server
|
38
|
-
# DB[:table].insert(:
|
39
|
-
# DB[:table].update(:
|
38
|
+
# DB[:table].insert(c: 1)
|
39
|
+
# DB[:table].update(c: 2)
|
40
40
|
# DB.tables
|
41
41
|
# DB[:table].all
|
42
42
|
# end
|
@@ -46,8 +46,8 @@
|
|
46
46
|
# extension may want to do the following to so that you don't need
|
47
47
|
# to call synchronize separately:
|
48
48
|
#
|
49
|
-
# def DB.with_server(*)
|
50
|
-
# super{synchronize{yield}}
|
49
|
+
# def DB.with_server(*a)
|
50
|
+
# super(*a){synchronize{yield}}
|
51
51
|
# end
|
52
52
|
#
|
53
53
|
# Note that this extension only works with the sharded threaded connection
|
@@ -22,7 +22,7 @@
|
|
22
22
|
# generally want to create it first, before creating any other application
|
23
23
|
# tables.
|
24
24
|
#
|
25
|
-
# Because migrations
|
25
|
+
# Because migrations instance_exec the up and down blocks on a database,
|
26
26
|
# using this extension in a migration can be done via:
|
27
27
|
#
|
28
28
|
# Sequel.migration do
|
@@ -43,7 +43,7 @@
|
|
43
43
|
# similar to the validation_helpers model plugin API. However,
|
44
44
|
# instead of having separate validates_* methods, it just adds a validate
|
45
45
|
# method that accepts a block to the schema generators. Like the
|
46
|
-
# create_table and alter_table blocks, this block is
|
46
|
+
# create_table and alter_table blocks, this block is instance_execed and
|
47
47
|
# offers its own DSL. Example:
|
48
48
|
#
|
49
49
|
# DB.create_table(:table) do
|
@@ -56,8 +56,8 @@
|
|
56
56
|
# end
|
57
57
|
# end
|
58
58
|
#
|
59
|
-
#
|
60
|
-
# already use
|
59
|
+
# instance_exec is used in this case because create_table and alter_table
|
60
|
+
# already use instance_exec, so losing access to the surrounding receiver
|
61
61
|
# is not an issue.
|
62
62
|
#
|
63
63
|
# Here's a breakdown of the constraints created for each constraint validation
|
@@ -196,9 +196,9 @@ module Sequel
|
|
196
196
|
@generator.validation({:type=>:drop, :name=>constraint})
|
197
197
|
end
|
198
198
|
|
199
|
-
# Alias of
|
199
|
+
# Alias of instance_exec for a nicer API.
|
200
200
|
def process(&block)
|
201
|
-
|
201
|
+
instance_exec(&block)
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
@@ -260,7 +260,7 @@ module Sequel
|
|
260
260
|
super do
|
261
261
|
extend CreateTableGeneratorMethods
|
262
262
|
@validations = []
|
263
|
-
|
263
|
+
instance_exec(&block) if block
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -308,7 +308,7 @@ module Sequel
|
|
308
308
|
super do
|
309
309
|
extend AlterTableGeneratorMethods
|
310
310
|
@validations = []
|
311
|
-
|
311
|
+
instance_exec(&block) if block
|
312
312
|
end
|
313
313
|
end
|
314
314
|
|
@@ -374,10 +374,10 @@ module Sequel
|
|
374
374
|
when :max_length
|
375
375
|
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.char_length(c) <= arg}))
|
376
376
|
when *REVERSE_OPERATOR_MAP.keys
|
377
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).
|
377
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.identifier(c).public_send(REVERSE_OPERATOR_MAP[validation_type], arg)}))
|
378
378
|
when :length_range
|
379
379
|
op = arg.exclude_end? ? :< : :<=
|
380
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).
|
380
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| (Sequel.char_length(c) >= arg.begin) & Sequel.char_length(c).public_send(op, arg.end)}))
|
381
381
|
arg = "#{arg.begin}..#{'.' if arg.exclude_end?}#{arg.end}"
|
382
382
|
when :format
|
383
383
|
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| {c => arg}}))
|
@@ -407,7 +407,7 @@ module Sequel
|
|
407
407
|
raise Error, "validates includes only supports arrays and ranges currently, cannot handle: #{arg.inspect}"
|
408
408
|
end
|
409
409
|
when :like, :ilike
|
410
|
-
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.
|
410
|
+
generator_add_constraint_from_validation(generator, val, Sequel.&(*columns.map{|c| Sequel.public_send(validation_type, c, arg)}))
|
411
411
|
when :unique
|
412
412
|
generator.unique(columns, :name=>constraint)
|
413
413
|
columns = [columns.join(',')]
|
@@ -21,8 +21,8 @@ class Array
|
|
21
21
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
|
22
22
|
# conditions.
|
23
23
|
#
|
24
|
-
# ~[[:a, true]] # SQL: a IS NOT TRUE
|
25
|
-
# ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
|
24
|
+
# ~[[:a, true]] # SQL: (a IS NOT TRUE)
|
25
|
+
# ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
26
26
|
def ~
|
27
27
|
Sequel.~(self)
|
28
28
|
end
|
@@ -30,7 +30,7 @@ class Array
|
|
30
30
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
|
31
31
|
# default value and expression.
|
32
32
|
#
|
33
|
-
# [[{:
|
33
|
+
# [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
34
34
|
# [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
35
35
|
def case(*args)
|
36
36
|
::Sequel::SQL::CaseExpression.new(self, *args)
|
@@ -42,16 +42,12 @@ class Array
|
|
42
42
|
# this array as a value in a filter, but may be necessary if you are using it as a
|
43
43
|
# value with placeholder SQL:
|
44
44
|
#
|
45
|
-
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
|
46
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
|
47
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
|
45
|
+
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
46
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
|
47
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
48
48
|
def sql_value_list
|
49
49
|
::Sequel::SQL::ValueList.new(self)
|
50
50
|
end
|
51
|
-
def sql_array
|
52
|
-
Sequel::Deprecation.deprecate("Array#sql_array in the core_extensions extension", "Use Array#sql_value_list instead")
|
53
|
-
sql_value_list
|
54
|
-
end
|
55
51
|
|
56
52
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching all of the
|
57
53
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
@@ -60,8 +56,8 @@ class Array
|
|
60
56
|
# and want to use the = operator instead of the IN operator (which is used by default for
|
61
57
|
# arrays of two element arrays).
|
62
58
|
#
|
63
|
-
# [[:a, true]].sql_expr # SQL: a IS TRUE
|
64
|
-
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
|
59
|
+
# [[:a, true]].sql_expr # SQL: (a IS TRUE)
|
60
|
+
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
65
61
|
def sql_expr
|
66
62
|
Sequel[self]
|
67
63
|
end
|
@@ -69,8 +65,8 @@ class Array
|
|
69
65
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
|
70
66
|
# of the conditions.
|
71
67
|
#
|
72
|
-
# [[:a, true]].sql_negate # SQL: a IS NOT TRUE
|
73
|
-
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
68
|
+
# [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
|
69
|
+
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
74
70
|
def sql_negate
|
75
71
|
Sequel.negate(self)
|
76
72
|
end
|
@@ -78,8 +74,8 @@ class Array
|
|
78
74
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
|
79
75
|
# conditions.
|
80
76
|
#
|
81
|
-
# [[:a, true]].sql_or # SQL: a IS TRUE
|
82
|
-
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
|
77
|
+
# [[:a, true]].sql_or # SQL: (a IS TRUE)
|
78
|
+
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
83
79
|
def sql_or
|
84
80
|
Sequel.or(self)
|
85
81
|
end
|
@@ -90,9 +86,9 @@ class Array
|
|
90
86
|
# concatenation.
|
91
87
|
#
|
92
88
|
# [:a].sql_string_join # SQL: a
|
93
|
-
# [:a, :b].sql_string_join # SQL: a || b
|
94
|
-
# [:a, 'b'].sql_string_join # SQL: a || 'b'
|
95
|
-
# ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
|
89
|
+
# [:a, :b].sql_string_join # SQL: (a || b)
|
90
|
+
# [:a, 'b'].sql_string_join # SQL: (a || 'b')
|
91
|
+
# ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
|
96
92
|
def sql_string_join(joiner=nil)
|
97
93
|
Sequel.join(self, joiner)
|
98
94
|
end
|
@@ -104,8 +100,8 @@ class Hash
|
|
104
100
|
# all of the conditions in this hash and the condition specified by
|
105
101
|
# the given argument.
|
106
102
|
#
|
107
|
-
# {:
|
108
|
-
# {:
|
103
|
+
# {a: 1} & :b # SQL: ((a = 1) AND b)
|
104
|
+
# {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
|
109
105
|
def &(ce)
|
110
106
|
::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
|
111
107
|
end
|
@@ -114,8 +110,8 @@ class Hash
|
|
114
110
|
# all of the conditions in this hash or the condition specified by
|
115
111
|
# the given argument.
|
116
112
|
#
|
117
|
-
# {:
|
118
|
-
# {:
|
113
|
+
# {a: 1} | :b # SQL: ((a = 1) OR b)
|
114
|
+
# {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
|
119
115
|
def |(ce)
|
120
116
|
::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
|
121
117
|
end
|
@@ -123,19 +119,17 @@ class Hash
|
|
123
119
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
|
124
120
|
# conditions.
|
125
121
|
#
|
126
|
-
# ~{:
|
127
|
-
# ~{:
|
122
|
+
# ~{a: true} # SQL: (a IS NOT TRUE)
|
123
|
+
# ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
128
124
|
def ~
|
129
125
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
|
130
126
|
end
|
131
127
|
|
132
128
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
|
133
|
-
# default value.
|
134
|
-
# conditions should be orthogonal.
|
129
|
+
# default value.
|
135
130
|
#
|
136
|
-
# {{:
|
137
|
-
# {:
|
138
|
-
# # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
|
131
|
+
# {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
132
|
+
# {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
139
133
|
def case(*args)
|
140
134
|
::Sequel::SQL::CaseExpression.new(to_a, *args)
|
141
135
|
end
|
@@ -144,8 +138,8 @@ class Hash
|
|
144
138
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
145
139
|
# assumes that hashes specify this type of condition.
|
146
140
|
#
|
147
|
-
# {:
|
148
|
-
# {:
|
141
|
+
# {a: true}.sql_expr # SQL: (a IS TRUE)
|
142
|
+
# {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
149
143
|
def sql_expr
|
150
144
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self)
|
151
145
|
end
|
@@ -153,8 +147,8 @@ class Hash
|
|
153
147
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
|
154
148
|
# of the conditions.
|
155
149
|
#
|
156
|
-
# {:
|
157
|
-
# {:
|
150
|
+
# {a: true}.sql_negate # SQL: (a IS NOT TRUE)
|
151
|
+
# {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
158
152
|
def sql_negate
|
159
153
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
|
160
154
|
end
|
@@ -162,8 +156,8 @@ class Hash
|
|
162
156
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
|
163
157
|
# conditions.
|
164
158
|
#
|
165
|
-
# {:
|
166
|
-
# {:
|
159
|
+
# {a: true}.sql_or # SQL: (a IS TRUE)
|
160
|
+
# {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
167
161
|
def sql_or
|
168
162
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
|
169
163
|
end
|
@@ -177,16 +171,16 @@ class String
|
|
177
171
|
# Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
|
178
172
|
# literalization, e.g.:
|
179
173
|
#
|
180
|
-
# DB[:items].where(:
|
181
|
-
#
|
174
|
+
# DB[:items].where(abc: 'def')
|
175
|
+
# # "SELECT * FROM items WHERE (abc = 'def')"
|
182
176
|
#
|
183
|
-
# DB[:items].where(:
|
184
|
-
#
|
177
|
+
# DB[:items].where(abc: 'def'.lit)
|
178
|
+
# # "SELECT * FROM items WHERE (abc = def)"
|
185
179
|
#
|
186
180
|
# You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
|
187
181
|
#
|
188
|
-
#
|
189
|
-
#
|
182
|
+
# DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
|
183
|
+
# # "SELECT count(DISTINCT a) FROM items"
|
190
184
|
def lit(*args)
|
191
185
|
args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
|
192
186
|
end
|
@@ -209,19 +203,15 @@ class Symbol
|
|
209
203
|
include Sequel::SQL::SubscriptMethods
|
210
204
|
include Sequel::SQL::ComplexExpressionMethods
|
211
205
|
|
212
|
-
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
213
|
-
# prevent splitting the symbol.
|
206
|
+
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
214
207
|
#
|
215
|
-
# :
|
216
|
-
# :a__b.identifier # SQL: "a__b"
|
208
|
+
# :a.identifier # SQL: "a"
|
217
209
|
def identifier
|
218
210
|
Sequel::SQL::Identifier.new(self)
|
219
211
|
end
|
220
212
|
|
221
213
|
# Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
|
222
|
-
# and the given arguments.
|
223
|
-
# is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
|
224
|
-
# doesn't override methods defined by ruby itself.
|
214
|
+
# and the given arguments.
|
225
215
|
#
|
226
216
|
# :now.sql_function # SQL: now()
|
227
217
|
# :sum.sql_function(:a) # SQL: sum(a)
|
@@ -17,8 +17,8 @@ module Sequel::CoreRefinements
|
|
17
17
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, not matching all of the
|
18
18
|
# conditions.
|
19
19
|
#
|
20
|
-
# ~[[:a, true]] # SQL: a IS NOT TRUE
|
21
|
-
# ~[[:a, 1], [:b, [2, 3]]] # SQL: a != 1 OR b NOT IN (2, 3)
|
20
|
+
# ~[[:a, true]] # SQL: (a IS NOT TRUE)
|
21
|
+
# ~[[:a, 1], [:b, [2, 3]]] # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
22
22
|
def ~
|
23
23
|
Sequel.~(self)
|
24
24
|
end
|
@@ -26,7 +26,7 @@ module Sequel::CoreRefinements
|
|
26
26
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this array as the conditions and the given
|
27
27
|
# default value and expression.
|
28
28
|
#
|
29
|
-
# [[{:
|
29
|
+
# [[{a: [2,3]}, 1]].case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
30
30
|
# [[:a, 1], [:b, 2]].case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
31
31
|
def case(*args)
|
32
32
|
::Sequel::SQL::CaseExpression.new(self, *args)
|
@@ -38,9 +38,9 @@ module Sequel::CoreRefinements
|
|
38
38
|
# this array as a value in a filter, but may be necessary if you are using it as a
|
39
39
|
# value with placeholder SQL:
|
40
40
|
#
|
41
|
-
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4))
|
42
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4))
|
43
|
-
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: (a, b) IN ((1, 2), (3, 4))
|
41
|
+
# DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
42
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: ((a, b) IN ((1 = 2) AND (3 = 4)))
|
43
|
+
# DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]].sql_value_list) # SQL: ((a, b) IN ((1, 2), (3, 4)))
|
44
44
|
def sql_value_list
|
45
45
|
::Sequel::SQL::ValueList.new(self)
|
46
46
|
end
|
@@ -52,8 +52,8 @@ module Sequel::CoreRefinements
|
|
52
52
|
# and want to use the = operator instead of the IN operator (which is used by default for
|
53
53
|
# arrays of two element arrays).
|
54
54
|
#
|
55
|
-
# [[:a, true]].sql_expr # SQL: a IS TRUE
|
56
|
-
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: a = 1 AND b IN (2, 3)
|
55
|
+
# [[:a, true]].sql_expr # SQL: (a IS TRUE)
|
56
|
+
# [[:a, 1], [:b, [2, 3]]].sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
57
57
|
def sql_expr
|
58
58
|
Sequel[self]
|
59
59
|
end
|
@@ -61,8 +61,8 @@ module Sequel::CoreRefinements
|
|
61
61
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching none
|
62
62
|
# of the conditions.
|
63
63
|
#
|
64
|
-
# [[:a, true]].sql_negate # SQL: a IS NOT TRUE
|
65
|
-
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: a != 1 AND b NOT IN (2, 3)
|
64
|
+
# [[:a, true]].sql_negate # SQL: (a IS NOT TRUE)
|
65
|
+
# [[:a, 1], [:b, [2, 3]]].sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
66
66
|
def sql_negate
|
67
67
|
Sequel.negate(self)
|
68
68
|
end
|
@@ -70,8 +70,8 @@ module Sequel::CoreRefinements
|
|
70
70
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this array, matching any of the
|
71
71
|
# conditions.
|
72
72
|
#
|
73
|
-
# [[:a, true]].sql_or # SQL: a IS TRUE
|
74
|
-
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: a = 1 OR b IN (2, 3)
|
73
|
+
# [[:a, true]].sql_or # SQL: (a IS TRUE)
|
74
|
+
# [[:a, 1], [:b, [2, 3]]].sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
75
75
|
def sql_or
|
76
76
|
Sequel.or(self)
|
77
77
|
end
|
@@ -82,9 +82,9 @@ module Sequel::CoreRefinements
|
|
82
82
|
# concatenation.
|
83
83
|
#
|
84
84
|
# [:a].sql_string_join # SQL: a
|
85
|
-
# [:a, :b].sql_string_join # SQL: a || b
|
86
|
-
# [:a, 'b'].sql_string_join # SQL: a || 'b'
|
87
|
-
# ['a', :b].sql_string_join(' ') # SQL: 'a' || ' ' || b
|
85
|
+
# [:a, :b].sql_string_join # SQL: (a || b)
|
86
|
+
# [:a, 'b'].sql_string_join # SQL: (a || 'b')
|
87
|
+
# ['a', :b].sql_string_join(' ') # SQL: ('a' || ' ' || b)
|
88
88
|
def sql_string_join(joiner=nil)
|
89
89
|
Sequel.join(self, joiner)
|
90
90
|
end
|
@@ -95,8 +95,8 @@ module Sequel::CoreRefinements
|
|
95
95
|
# all of the conditions in this hash and the condition specified by
|
96
96
|
# the given argument.
|
97
97
|
#
|
98
|
-
# {:
|
99
|
-
# {:
|
98
|
+
# {a: 1} & :b # SQL: ((a = 1) AND b)
|
99
|
+
# {a: true} & ~:b # SQL: ((a IS TRUE) AND NOT b)
|
100
100
|
def &(ce)
|
101
101
|
::Sequel::SQL::BooleanExpression.new(:AND, self, ce)
|
102
102
|
end
|
@@ -105,8 +105,8 @@ module Sequel::CoreRefinements
|
|
105
105
|
# all of the conditions in this hash or the condition specified by
|
106
106
|
# the given argument.
|
107
107
|
#
|
108
|
-
# {:
|
109
|
-
# {:
|
108
|
+
# {a: 1} | :b # SQL: ((a = 1) OR b)
|
109
|
+
# {a: true} | ~:b # SQL: ((a IS TRUE) OR NOT b)
|
110
110
|
def |(ce)
|
111
111
|
::Sequel::SQL::BooleanExpression.new(:OR, self, ce)
|
112
112
|
end
|
@@ -114,19 +114,17 @@ module Sequel::CoreRefinements
|
|
114
114
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, not matching all of the
|
115
115
|
# conditions.
|
116
116
|
#
|
117
|
-
# ~{:
|
118
|
-
# ~{:
|
117
|
+
# ~{a: true} # SQL: (a IS NOT TRUE)
|
118
|
+
# ~{a: 1, b: [2, 3]} # SQL: ((a != 1) OR (b NOT IN (2, 3)))
|
119
119
|
def ~
|
120
120
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR, true)
|
121
121
|
end
|
122
122
|
|
123
123
|
# Return a <tt>Sequel::SQL::CaseExpression</tt> with this hash as the conditions and the given
|
124
|
-
# default value.
|
125
|
-
# conditions should be orthogonal.
|
124
|
+
# default value.
|
126
125
|
#
|
127
|
-
# {{:
|
128
|
-
# {:
|
129
|
-
# # or: CASE c WHEN b THEN 2 WHEN a THEN 1 ELSE d END
|
126
|
+
# {{a: [2,3]}=>1}.case(0) # SQL: CASE WHEN (a IN (2, 3)) THEN 1 ELSE 0 END
|
127
|
+
# {a: 1, b: 2}.case(:d, :c) # SQL: CASE c WHEN a THEN 1 WHEN b THEN 2 ELSE d END
|
130
128
|
def case(*args)
|
131
129
|
::Sequel::SQL::CaseExpression.new(to_a, *args)
|
132
130
|
end
|
@@ -135,8 +133,8 @@ module Sequel::CoreRefinements
|
|
135
133
|
# conditions. Rarely do you need to call this explicitly, as Sequel generally
|
136
134
|
# assumes that hashes specify this type of condition.
|
137
135
|
#
|
138
|
-
# {:
|
139
|
-
# {:
|
136
|
+
# {a: true}.sql_expr # SQL: (a IS TRUE)
|
137
|
+
# {a: 1, b: [2, 3]}.sql_expr # SQL: ((a = 1) AND (b IN (2, 3)))
|
140
138
|
def sql_expr
|
141
139
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self)
|
142
140
|
end
|
@@ -144,8 +142,8 @@ module Sequel::CoreRefinements
|
|
144
142
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching none
|
145
143
|
# of the conditions.
|
146
144
|
#
|
147
|
-
# {:
|
148
|
-
# {:
|
145
|
+
# {a: true}.sql_negate # SQL: (a IS NOT TRUE)
|
146
|
+
# {a: 1, b: [2, 3]}.sql_negate # SQL: ((a != 1) AND (b NOT IN (2, 3)))
|
149
147
|
def sql_negate
|
150
148
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :AND, true)
|
151
149
|
end
|
@@ -153,8 +151,8 @@ module Sequel::CoreRefinements
|
|
153
151
|
# Return a <tt>Sequel::SQL::BooleanExpression</tt> created from this hash, matching any of the
|
154
152
|
# conditions.
|
155
153
|
#
|
156
|
-
# {:
|
157
|
-
# {:
|
154
|
+
# {a: true}.sql_or # SQL: (a IS TRUE)
|
155
|
+
# {a: 1, b: [2, 3]}.sql_or # SQL: ((a = 1) OR (b IN (2, 3)))
|
158
156
|
def sql_or
|
159
157
|
::Sequel::SQL::BooleanExpression.from_value_pairs(self, :OR)
|
160
158
|
end
|
@@ -167,16 +165,16 @@ module Sequel::CoreRefinements
|
|
167
165
|
# Converts a string into a <tt>Sequel::LiteralString</tt>, in order to override string
|
168
166
|
# literalization, e.g.:
|
169
167
|
#
|
170
|
-
# DB[:items].where(:
|
171
|
-
#
|
168
|
+
# DB[:items].where(abc: 'def')
|
169
|
+
# # "SELECT * FROM items WHERE (abc = 'def')"
|
172
170
|
#
|
173
|
-
# DB[:items].where(:
|
174
|
-
#
|
171
|
+
# DB[:items].where(abc: 'def'.lit)
|
172
|
+
# # "SELECT * FROM items WHERE (abc = def)"
|
175
173
|
#
|
176
174
|
# You can also provide arguments, to create a <tt>Sequel::SQL::PlaceholderLiteralString</tt>:
|
177
175
|
#
|
178
|
-
#
|
179
|
-
#
|
176
|
+
# DB[:items].select{|o| o.count('DISTINCT ?'.lit(:a))}
|
177
|
+
# # "SELECT count(DISTINCT a) FROM items"
|
180
178
|
def lit(*args)
|
181
179
|
args.empty? ? Sequel::LiteralString.new(self) : Sequel::SQL::PlaceholderLiteralString.new(self, args)
|
182
180
|
end
|
@@ -199,19 +197,15 @@ module Sequel::CoreRefinements
|
|
199
197
|
include Sequel::SQL::SubscriptMethods
|
200
198
|
include Sequel::SQL::ComplexExpressionMethods
|
201
199
|
|
202
|
-
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
203
|
-
# prevent splitting the symbol.
|
200
|
+
# Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>.
|
204
201
|
#
|
205
|
-
# :
|
206
|
-
# :a__b.identifier # SQL: "a__b"
|
202
|
+
# :ab.identifier # SQL: "a"
|
207
203
|
def identifier
|
208
204
|
Sequel::SQL::Identifier.new(self)
|
209
205
|
end
|
210
206
|
|
211
207
|
# Returns a <tt>Sequel::SQL::Function</tt> with this as the function name,
|
212
|
-
# and the given arguments.
|
213
|
-
# is less than 1.9.0. Ruby 1.9 defines <tt>Symbol#[]</tt>, and Sequel
|
214
|
-
# doesn't override methods defined by ruby itself.
|
208
|
+
# and the given arguments.
|
215
209
|
#
|
216
210
|
# :now.sql_function # SQL: now()
|
217
211
|
# :sum.sql_function(:a) # SQL: sum(a)
|