sequel 3.21.0 → 3.41.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.
- data/CHANGELOG +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +576 -0
- data/doc/opening_databases.rdoc +121 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +539 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +334 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +137 -16
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +77 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +168 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +227 -33
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +324 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +200 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +340 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +65 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +53 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -2,271 +2,197 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe "sharding plugin" do
|
|
4
4
|
before do
|
|
5
|
-
@db = Sequel
|
|
5
|
+
@db = Sequel.mock(:numrows=>1, :autoid=>proc{1}, :servers=>{:s1=>{}, :s2=>{}, :s3=>{}, :s4=>{}})
|
|
6
6
|
@Artist = Class.new(Sequel::Model(@db[:artists]))
|
|
7
7
|
@Artist.class_eval do
|
|
8
|
+
instance_dataset._fetch = dataset._fetch = {:id=>2, :name=>'YJM'}
|
|
8
9
|
columns :id, :name
|
|
9
|
-
|
|
10
|
-
def self.y
|
|
11
|
-
{:id=>2, :name=>'YJM'}
|
|
12
|
-
end
|
|
10
|
+
plugin :sharding
|
|
13
11
|
end
|
|
14
12
|
@Album = Class.new(Sequel::Model(@db[:albums]))
|
|
15
13
|
@Album.class_eval do
|
|
14
|
+
instance_dataset._fetch = dataset._fetch = {:id=>1, :name=>'RF', :artist_id=>2}
|
|
16
15
|
columns :id, :artist_id, :name
|
|
17
|
-
|
|
18
|
-
def self.ds_ext(m=nil)
|
|
19
|
-
@ds_ext = m if m
|
|
20
|
-
@ds_ext
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.y
|
|
24
|
-
{:id=>1, :name=>'RF', :artist_id=>2}
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
def _join_table_dataset(opts)
|
|
30
|
-
ds = super
|
|
31
|
-
m = model
|
|
32
|
-
ds.meta_def(:model){m}
|
|
33
|
-
ds.extend model.ds_ext
|
|
34
|
-
ds
|
|
35
|
-
end
|
|
16
|
+
plugin :sharding
|
|
36
17
|
end
|
|
37
18
|
@Tag = Class.new(Sequel::Model(@db[:tags]))
|
|
38
19
|
@Tag.class_eval do
|
|
20
|
+
instance_dataset._fetch = dataset._fetch = {:id=>3, :name=>'M'}
|
|
39
21
|
columns :id, :name
|
|
40
|
-
|
|
41
|
-
def self.y
|
|
42
|
-
{:id=>3, :name=>'M'}
|
|
43
|
-
end
|
|
22
|
+
plugin :sharding
|
|
44
23
|
end
|
|
45
|
-
models = [@Artist, @Album, @Tag]
|
|
46
24
|
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
47
25
|
@Album.many_to_one :artist, :class=>@Artist
|
|
48
26
|
@Album.many_to_many :tags, :class=>@Tag, :left_key=>:album_id, :right_key=>:tag_id, :join_table=>:albums_tags
|
|
49
|
-
|
|
50
|
-
def actions
|
|
51
|
-
@actions ||= []
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
models.each do |model|
|
|
55
|
-
model.extend m
|
|
56
|
-
model.plugin :sharding
|
|
57
|
-
model.dataset.extend(ds_ext = Module.new do
|
|
58
|
-
def insert(h={})
|
|
59
|
-
model.actions << [:insert, h.dup, opts[:server]]
|
|
60
|
-
1
|
|
61
|
-
end
|
|
62
|
-
def delete
|
|
63
|
-
model.actions << [:delete,(literal(opts[:where]) if opts[:where]), opts[:server]]
|
|
64
|
-
1
|
|
65
|
-
end
|
|
66
|
-
def update(h={})
|
|
67
|
-
model.actions << [:update, h.dup, (literal(opts[:where]) if opts[:where]), opts[:server]]
|
|
68
|
-
1
|
|
69
|
-
end
|
|
70
|
-
def fetch_rows(sql)
|
|
71
|
-
model.actions << [:fetch, (literal(opts[:where] || opts[:join]) if opts[:where] || opts[:join]), opts[:server]]
|
|
72
|
-
yield(model.y)
|
|
73
|
-
end
|
|
74
|
-
end)
|
|
75
|
-
@Album.ds_ext(ds_ext)
|
|
76
|
-
end
|
|
77
|
-
def @db.actions; @actions ||= []; end
|
|
78
|
-
def @db.transaction(opts)
|
|
79
|
-
actions << [:transaction, opts[:server]]
|
|
80
|
-
super
|
|
81
|
-
end
|
|
27
|
+
@db.sqls
|
|
82
28
|
end
|
|
83
29
|
|
|
84
30
|
specify "should allow you to instantiate a new object for a specified shard" do
|
|
85
31
|
@Album.new_using_server(:s1, :name=>'RF').save
|
|
86
|
-
@
|
|
32
|
+
@db.sqls.should == ["INSERT INTO albums (name) VALUES ('RF') -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
87
33
|
|
|
88
|
-
@Album.actions.clear
|
|
89
34
|
@Album.new_using_server(:s2){|o| o.name = 'MO'}.save
|
|
90
|
-
@
|
|
35
|
+
@db.sqls.should == ["INSERT INTO albums (name) VALUES ('MO') -- s2", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
91
36
|
end
|
|
92
37
|
|
|
93
38
|
specify "should allow you to create and save a new object for a specified shard" do
|
|
94
39
|
@Album.create_using_server(:s1, :name=>'RF')
|
|
95
|
-
@
|
|
96
|
-
|
|
97
|
-
@Album.actions.clear
|
|
40
|
+
@db.sqls.should == ["INSERT INTO albums (name) VALUES ('RF') -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
41
|
+
|
|
98
42
|
@Album.create_using_server(:s2){|o| o.name = 'MO'}
|
|
99
|
-
@
|
|
43
|
+
@db.sqls.should == ["INSERT INTO albums (name) VALUES ('MO') -- s2", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
100
44
|
end
|
|
101
45
|
|
|
102
46
|
specify "should have objects retrieved from a specific shard update that shard" do
|
|
103
47
|
@Album.server(:s1).first.update(:name=>'MO')
|
|
104
|
-
@
|
|
48
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "UPDATE albums SET name = 'MO' WHERE (id = 1) -- s1"]
|
|
105
49
|
end
|
|
106
50
|
|
|
107
51
|
specify "should have objects retrieved from a specific shard delete from that shard" do
|
|
108
52
|
@Album.server(:s1).first.delete
|
|
109
|
-
@
|
|
53
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "DELETE FROM albums WHERE (id = 1) -- s1"]
|
|
110
54
|
end
|
|
111
55
|
|
|
112
56
|
specify "should have objects retrieved from a specific shard reload from that shard" do
|
|
113
57
|
@Album.server(:s1).first.reload
|
|
114
|
-
@
|
|
58
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
115
59
|
end
|
|
116
60
|
|
|
117
61
|
specify "should use current dataset's shard when eager loading if eagerly loaded dataset doesn't have its own shard" do
|
|
118
62
|
albums = @Album.server(:s1).eager(:artist).all
|
|
119
|
-
@
|
|
120
|
-
|
|
121
|
-
@Artist.actions.clear
|
|
122
|
-
albums.length == 1
|
|
63
|
+
@db.sqls.should == ["SELECT * FROM albums -- s1", "SELECT * FROM artists WHERE (artists.id IN (2)) -- s1"]
|
|
64
|
+
albums.length.should == 1
|
|
123
65
|
albums.first.artist.save
|
|
124
|
-
@
|
|
66
|
+
@db.sqls.should == ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s1"]
|
|
125
67
|
end
|
|
126
68
|
|
|
127
69
|
specify "should not use current dataset's shard when eager loading if eagerly loaded dataset has its own shard" do
|
|
128
|
-
@Artist.dataset.opts[:server] = :s2
|
|
70
|
+
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
129
71
|
albums = @Album.server(:s1).eager(:artist).all
|
|
130
|
-
@
|
|
131
|
-
|
|
132
|
-
@Artist.actions.clear
|
|
133
|
-
albums.length == 1
|
|
72
|
+
@db.sqls.should == ["SELECT * FROM albums -- s1", "SELECT * FROM artists WHERE (artists.id IN (2)) -- s2"]
|
|
73
|
+
albums.length.should == 1
|
|
134
74
|
albums.first.artist.save
|
|
135
|
-
@
|
|
75
|
+
@db.sqls.should == ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
136
76
|
end
|
|
137
77
|
|
|
138
78
|
specify "should use current dataset's shard when eager graphing if eagerly graphed dataset doesn't have its own shard" do
|
|
139
79
|
ds = @Album.server(:s1).eager_graph(:artist)
|
|
140
|
-
|
|
141
|
-
super(sql)
|
|
142
|
-
yield({:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'})
|
|
143
|
-
end
|
|
80
|
+
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
144
81
|
albums = ds.all
|
|
145
|
-
@
|
|
146
|
-
albums.length == 1
|
|
82
|
+
@db.sqls.should == ["SELECT albums.id, albums.artist_id, albums.name, artist.id AS artist_id_0, artist.name AS artist_name FROM albums LEFT OUTER JOIN artists AS artist ON (artist.id = albums.artist_id) -- s1"]
|
|
83
|
+
albums.length.should == 1
|
|
147
84
|
albums.first.artist.save
|
|
148
|
-
@
|
|
85
|
+
@db.sqls.should == ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s1"]
|
|
149
86
|
end
|
|
150
87
|
|
|
151
88
|
specify "should not use current dataset's shard when eager graphing if eagerly graphed dataset has its own shard" do
|
|
152
|
-
@Artist.dataset.opts[:server] = :s2
|
|
89
|
+
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
153
90
|
ds = @Album.server(:s1).eager_graph(:artist)
|
|
154
|
-
|
|
155
|
-
super(sql)
|
|
156
|
-
yield({:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'})
|
|
157
|
-
end
|
|
91
|
+
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
158
92
|
albums = ds.all
|
|
159
|
-
@
|
|
160
|
-
albums.length == 1
|
|
93
|
+
@db.sqls.should == ["SELECT albums.id, albums.artist_id, albums.name, artist.id AS artist_id_0, artist.name AS artist_name FROM albums LEFT OUTER JOIN artists AS artist ON (artist.id = albums.artist_id) -- s1"]
|
|
94
|
+
albums.length.should == 1
|
|
161
95
|
albums.first.artist.save
|
|
162
|
-
@
|
|
96
|
+
@db.sqls.should == ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
163
97
|
end
|
|
164
98
|
|
|
165
99
|
specify "should use eagerly graphed dataset shard for eagerly graphed objects even if current dataset does not have a shard" do
|
|
166
|
-
@Artist.dataset.opts[:server] = :s2
|
|
100
|
+
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
167
101
|
ds = @Album.eager_graph(:artist)
|
|
168
|
-
|
|
169
|
-
super(sql)
|
|
170
|
-
yield({:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'})
|
|
171
|
-
end
|
|
102
|
+
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
172
103
|
albums = ds.all
|
|
173
|
-
@
|
|
174
|
-
albums.length == 1
|
|
104
|
+
@db.sqls.should == ["SELECT albums.id, albums.artist_id, albums.name, artist.id AS artist_id_0, artist.name AS artist_name FROM albums LEFT OUTER JOIN artists AS artist ON (artist.id = albums.artist_id)"]
|
|
105
|
+
albums.length.should == 1
|
|
175
106
|
albums.first.artist.save
|
|
176
|
-
@
|
|
107
|
+
@db.sqls.should == ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
177
108
|
end
|
|
178
109
|
|
|
179
110
|
specify "should have objects retrieved from a specific shard use associated objects from that shard, with modifications to the associated objects using that shard" do
|
|
180
111
|
album = @Album.server(:s1).first
|
|
181
|
-
@
|
|
112
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1"]
|
|
182
113
|
album.artist.update(:name=>'AS')
|
|
183
|
-
@
|
|
114
|
+
@db.sqls.should == ["SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1 -- s1", "UPDATE artists SET name = 'AS' WHERE (id = 2) -- s1"]
|
|
184
115
|
album.tags.map{|a| a.update(:name=>'SR')}
|
|
185
|
-
@
|
|
186
|
-
|
|
187
|
-
@Album.actions.clear
|
|
188
|
-
@Artist.actions.clear
|
|
116
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.album_id = 1)) -- s1", "UPDATE tags SET name = 'SR' WHERE (id = 3) -- s1"]
|
|
189
117
|
@Artist.server(:s2).first.albums.map{|a| a.update(:name=>'MO')}
|
|
190
|
-
@
|
|
191
|
-
@Album.actions.should == [[:fetch, "(albums.artist_id = 2)", :s2], [:update, {:name=>"MO"}, "(id = 1)", :s2]]
|
|
118
|
+
@db.sqls.should == ["SELECT * FROM artists LIMIT 1 -- s2", "SELECT * FROM albums WHERE (albums.artist_id = 2) -- s2", "UPDATE albums SET name = 'MO' WHERE (id = 1) -- s2"]
|
|
192
119
|
end
|
|
193
120
|
|
|
194
121
|
specify "should have objects retrieved from a specific shard add associated objects to that shard" do
|
|
195
122
|
album = @Album.server(:s1).first
|
|
196
123
|
artist = @Artist.server(:s2).first
|
|
197
|
-
@
|
|
198
|
-
@Artist.actions.clear
|
|
124
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
199
125
|
|
|
200
126
|
artist.add_album(:name=>'MO')
|
|
201
|
-
|
|
202
|
-
|
|
127
|
+
sqls = @db.sqls
|
|
128
|
+
["INSERT INTO albums (artist_id, name) VALUES (2, 'MO') -- s2", "INSERT INTO albums (name, artist_id) VALUES ('MO', 2) -- s2"].should include(sqls.shift)
|
|
129
|
+
sqls.should == ["SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
203
130
|
|
|
204
131
|
album.add_tag(:name=>'SR')
|
|
205
|
-
|
|
206
|
-
|
|
132
|
+
sqls = @db.sqls
|
|
133
|
+
["INSERT INTO albums_tags (album_id, tag_id) VALUES (1, 3) -- s1", "INSERT INTO albums_tags (tag_id, album_id) VALUES (3, 1) -- s1"].should include(sqls.pop)
|
|
134
|
+
sqls.should == ["INSERT INTO tags (name) VALUES ('SR') -- s1", "SELECT * FROM tags WHERE (id = 1) LIMIT 1 -- s1", ]
|
|
207
135
|
end
|
|
208
136
|
|
|
209
137
|
specify "should have objects retrieved from a specific shard remove associated objects from that shard" do
|
|
210
138
|
album = @Album.server(:s1).first
|
|
211
139
|
artist = @Artist.server(:s2).first
|
|
212
|
-
@
|
|
213
|
-
@Artist.actions.clear
|
|
140
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
214
141
|
|
|
215
142
|
artist.remove_album(1)
|
|
216
|
-
|
|
217
|
-
|
|
143
|
+
sqls = @db.sqls
|
|
144
|
+
["UPDATE albums SET artist_id = NULL, name = 'RF' WHERE (id = 1) -- s2", "UPDATE albums SET name = 'RF', artist_id = NULL WHERE (id = 1) -- s2"].should include(sqls.pop)
|
|
145
|
+
sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 2) AND (albums.id = 1)) LIMIT 1 -- s2"]
|
|
218
146
|
|
|
219
147
|
album.remove_tag(3)
|
|
220
|
-
@
|
|
221
|
-
@Album.actions.should == [[:delete, "((album_id = 1) AND (tag_id = 3))", :s1]]
|
|
148
|
+
@db.sqls.should == ["SELECT tags.* FROM tags INNER JOIN albums_tags ON ((albums_tags.tag_id = tags.id) AND (albums_tags.album_id = 1)) WHERE (tags.id = 3) LIMIT 1 -- s1", "DELETE FROM albums_tags WHERE ((album_id = 1) AND (tag_id = 3)) -- s1"]
|
|
222
149
|
end
|
|
223
150
|
|
|
224
151
|
specify "should have objects retrieved from a specific shard remove all associated objects from that shard" do
|
|
225
152
|
album = @Album.server(:s1).first
|
|
226
153
|
artist = @Artist.server(:s2).first
|
|
227
|
-
@
|
|
228
|
-
@Artist.actions.clear
|
|
154
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
229
155
|
|
|
230
156
|
artist.remove_all_albums
|
|
231
|
-
@
|
|
232
|
-
@Album.actions.clear
|
|
157
|
+
@db.sqls.should == ["UPDATE albums SET artist_id = NULL WHERE (artist_id = 2) -- s2"]
|
|
233
158
|
|
|
234
159
|
album.remove_all_tags
|
|
235
|
-
@
|
|
160
|
+
@db.sqls.should == ["DELETE FROM albums_tags WHERE (album_id = 1) -- s1"]
|
|
236
161
|
end
|
|
237
162
|
|
|
238
163
|
specify "should not override a server already set on an associated object" do
|
|
239
164
|
album = @Album.server(:s1).first
|
|
240
165
|
artist = @Artist.server(:s2).first
|
|
241
|
-
@
|
|
242
|
-
@Artist.actions.clear
|
|
166
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
243
167
|
|
|
244
168
|
artist.add_album(@Album.load(:id=>4, :name=>'MO').set_server(:s3))
|
|
245
|
-
|
|
246
|
-
@Album.actions.clear
|
|
169
|
+
["UPDATE albums SET artist_id = 2, name = 'MO' WHERE (id = 4) -- s3", "UPDATE albums SET name = 'MO', artist_id = 2 WHERE (id = 4) -- s3"].should include(@db.sqls.pop)
|
|
247
170
|
|
|
248
171
|
artist.remove_album(@Album.load(:id=>5, :name=>'T', :artist_id=>2).set_server(:s4))
|
|
249
172
|
# Should select from current object's shard to check existing association, but update associated object's shard
|
|
250
|
-
|
|
251
|
-
|
|
173
|
+
sqls = @db.sqls
|
|
174
|
+
["UPDATE albums SET artist_id = NULL, name = 'T' WHERE (id = 5) -- s4", "UPDATE albums SET name = 'T', artist_id = NULL WHERE (id = 5) -- s4"].should include(sqls.pop)
|
|
175
|
+
sqls.should == ["SELECT 1 AS one FROM albums WHERE ((albums.artist_id = 2) AND (id = 5)) LIMIT 1 -- s2"]
|
|
252
176
|
end
|
|
253
177
|
|
|
254
178
|
specify "should be able to set a shard to use for any object using set_server" do
|
|
255
179
|
@Album.server(:s1).first.set_server(:s2).reload
|
|
256
|
-
@
|
|
180
|
+
@db.sqls.should == ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
257
181
|
end
|
|
258
182
|
|
|
259
183
|
specify "should use transactions on the correct shard" do
|
|
260
184
|
@Album.use_transactions = true
|
|
261
185
|
@Album.server(:s2).first.save
|
|
262
|
-
|
|
263
|
-
|
|
186
|
+
sqls = @db.sqls
|
|
187
|
+
["UPDATE albums SET artist_id = 2, name = 'RF' WHERE (id = 1) -- s2", "UPDATE albums SET name = 'RF', artist_id = 2 WHERE (id = 1) -- s2"].should include(sqls.slice!(2))
|
|
188
|
+
sqls.should == ["SELECT * FROM albums LIMIT 1 -- s2", "BEGIN -- s2", "COMMIT -- s2"]
|
|
264
189
|
end
|
|
265
190
|
|
|
266
|
-
specify "should use
|
|
191
|
+
specify "should use override current shard when saving with given :server option" do
|
|
267
192
|
@Album.use_transactions = true
|
|
268
193
|
@Album.server(:s2).first.save(:server=>:s1)
|
|
269
|
-
|
|
270
|
-
|
|
194
|
+
sqls = @db.sqls
|
|
195
|
+
["UPDATE albums SET artist_id = 2, name = 'RF' WHERE (id = 1) -- s1", "UPDATE albums SET name = 'RF', artist_id = 2 WHERE (id = 1) -- s1"].should include(sqls.slice!(2))
|
|
196
|
+
sqls.should == ["SELECT * FROM albums LIMIT 1 -- s2", "BEGIN -- s1", "COMMIT -- s1"]
|
|
271
197
|
end
|
|
272
198
|
end
|
|
@@ -3,9 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
3
3
|
describe Sequel::Model, "#sti_key" do
|
|
4
4
|
before do
|
|
5
5
|
class ::StiTest < Sequel::Model
|
|
6
|
-
|
|
7
|
-
def kind=(x); self[:kind] = x; end
|
|
8
|
-
def _refresh(x); end
|
|
6
|
+
columns :id, :kind, :blah
|
|
9
7
|
plugin :single_table_inheritance, :kind
|
|
10
8
|
end
|
|
11
9
|
class ::StiTestSub1 < StiTest
|
|
@@ -22,7 +20,7 @@ describe Sequel::Model, "#sti_key" do
|
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
specify "should have simple_table = nil" do
|
|
25
|
-
StiTest.simple_table.should ==
|
|
23
|
+
StiTest.simple_table.should == "sti_tests"
|
|
26
24
|
StiTestSub1.simple_table.should == nil
|
|
27
25
|
end
|
|
28
26
|
|
|
@@ -30,15 +28,9 @@ describe Sequel::Model, "#sti_key" do
|
|
|
30
28
|
StiTest.plugin :single_table_inheritance, :blah
|
|
31
29
|
Object.send(:remove_const, :StiTestSub1)
|
|
32
30
|
Object.send(:remove_const, :StiTestSub2)
|
|
33
|
-
class ::StiTestSub1 < StiTest
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
def @ds.fetch_rows(sql)
|
|
38
|
-
yield({:blah=>'StiTest'})
|
|
39
|
-
yield({:blah=>'StiTestSub1'})
|
|
40
|
-
yield({:blah=>'StiTestSub2'})
|
|
41
|
-
end
|
|
31
|
+
class ::StiTestSub1 < StiTest; end
|
|
32
|
+
class ::StiTestSub2 < StiTest; end
|
|
33
|
+
@ds._fetch = [{:blah=>'StiTest'}, {:blah=>'StiTestSub1'}, {:blah=>'StiTestSub2'}]
|
|
42
34
|
StiTest.all.collect{|x| x.class}.should == [StiTest, StiTestSub1, StiTestSub2]
|
|
43
35
|
StiTest.dataset.sql.should == "SELECT * FROM sti_tests"
|
|
44
36
|
StiTestSub1.dataset.sql.should == "SELECT * FROM sti_tests WHERE (sti_tests.blah IN ('StiTestSub1'))"
|
|
@@ -46,18 +38,23 @@ describe Sequel::Model, "#sti_key" do
|
|
|
46
38
|
end
|
|
47
39
|
|
|
48
40
|
it "should return rows with the correct class based on the polymorphic_key value" do
|
|
49
|
-
|
|
50
|
-
yield({:kind=>'StiTest'})
|
|
51
|
-
yield({:kind=>'StiTestSub1'})
|
|
52
|
-
yield({:kind=>'StiTestSub2'})
|
|
53
|
-
end
|
|
41
|
+
@ds._fetch = [{:kind=>'StiTest'}, {:kind=>'StiTestSub1'}, {:kind=>'StiTestSub2'}]
|
|
54
42
|
StiTest.all.collect{|x| x.class}.should == [StiTest, StiTestSub1, StiTestSub2]
|
|
55
43
|
end
|
|
56
44
|
|
|
45
|
+
it "should return rows with the correct class based on the polymorphic_key value when retreiving by primary key" do
|
|
46
|
+
@ds._fetch = [{:kind=>'StiTestSub1'}]
|
|
47
|
+
StiTest[1].class.should == StiTestSub1
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should return rows with the correct class for subclasses based on the polymorphic_key value" do
|
|
51
|
+
class ::StiTestSub1Sub < StiTestSub1; end
|
|
52
|
+
StiTestSub1.dataset._fetch = [{:kind=>'StiTestSub1'}, {:kind=>'StiTestSub1Sub'}]
|
|
53
|
+
StiTestSub1.all.collect{|x| x.class}.should == [StiTestSub1, StiTestSub1Sub]
|
|
54
|
+
end
|
|
55
|
+
|
|
57
56
|
it "should fallback to the main class if the given class does not exist" do
|
|
58
|
-
|
|
59
|
-
yield({:kind=>'StiTestSub3'})
|
|
60
|
-
end
|
|
57
|
+
@ds._fetch = {:kind=>'StiTestSub3'}
|
|
61
58
|
StiTest.all.collect{|x| x.class}.should == [StiTest]
|
|
62
59
|
end
|
|
63
60
|
|
|
@@ -68,10 +65,7 @@ describe Sequel::Model, "#sti_key" do
|
|
|
68
65
|
Object
|
|
69
66
|
end
|
|
70
67
|
StiTest.plugin :single_table_inheritance, :kind
|
|
71
|
-
|
|
72
|
-
yield({:kind=>''})
|
|
73
|
-
yield({:kind=>nil})
|
|
74
|
-
end
|
|
68
|
+
@ds._fetch = [{:kind=>''}, {:kind=>nil}]
|
|
75
69
|
StiTest.all.collect{|x| x.class}.should == [StiTest, StiTest]
|
|
76
70
|
called.should == false
|
|
77
71
|
end
|
|
@@ -80,19 +74,19 @@ describe Sequel::Model, "#sti_key" do
|
|
|
80
74
|
StiTest.new.save
|
|
81
75
|
StiTestSub1.new.save
|
|
82
76
|
StiTestSub2.new.save
|
|
83
|
-
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')"]
|
|
77
|
+
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 10)) LIMIT 1"]
|
|
84
78
|
end
|
|
85
79
|
|
|
86
80
|
it "should have the before_create hook not override an existing value" do
|
|
87
81
|
StiTest.create(:kind=>'StiTestSub1')
|
|
88
|
-
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')"]
|
|
82
|
+
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1"]
|
|
89
83
|
end
|
|
90
84
|
|
|
91
85
|
it "should have the before_create hook handle columns with the same name as existing method names" do
|
|
92
86
|
StiTest.plugin :single_table_inheritance, :type
|
|
93
87
|
StiTest.columns :id, :type
|
|
94
88
|
StiTest.create
|
|
95
|
-
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (type) VALUES ('StiTest')"]
|
|
89
|
+
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (type) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1"]
|
|
96
90
|
end
|
|
97
91
|
|
|
98
92
|
it "should add a filter to model datasets inside subclasses hook to only retreive objects with the matching key" do
|
|
@@ -118,7 +112,7 @@ describe Sequel::Model, "#sti_key" do
|
|
|
118
112
|
before do
|
|
119
113
|
class ::StiTest2 < Sequel::Model
|
|
120
114
|
columns :id, :kind
|
|
121
|
-
def
|
|
115
|
+
def _save_refresh; end
|
|
122
116
|
end
|
|
123
117
|
end
|
|
124
118
|
after do
|
|
@@ -187,5 +181,47 @@ describe Sequel::Model, "#sti_key" do
|
|
|
187
181
|
proc{StiTest2.dataset.row_proc.call(:kind=>1)}.should raise_error(Sequel::Error)
|
|
188
182
|
proc{StiTest2.dataset.row_proc.call(:kind=>2)}.should raise_error(Sequel::Error)
|
|
189
183
|
end
|
|
184
|
+
|
|
185
|
+
it "should work with non-bijective mappings" do
|
|
186
|
+
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>'StiTest3', 1=>'StiTest3', 2=>'StiTest4'}
|
|
187
|
+
class ::StiTest3 < ::StiTest2; end
|
|
188
|
+
class ::StiTest4 < ::StiTest2; end
|
|
189
|
+
StiTest2.dataset.row_proc.call(:kind=>0).should be_a_instance_of(StiTest3)
|
|
190
|
+
StiTest2.dataset.row_proc.call(:kind=>1).should be_a_instance_of(StiTest3)
|
|
191
|
+
StiTest2.dataset.row_proc.call(:kind=>2).should be_a_instance_of(StiTest4)
|
|
192
|
+
|
|
193
|
+
StiTest3.create.kind.should == 1
|
|
194
|
+
StiTest4.create.kind.should == 2
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "should work with non-bijective mappings and key map procs" do
|
|
198
|
+
StiTest2.plugin :single_table_inheritance, :kind,
|
|
199
|
+
:key_map=>proc{|model| model.to_s == 'StiTest4' ? 2 : [0,1] }
|
|
200
|
+
class ::StiTest3 < ::StiTest2; end
|
|
201
|
+
class ::StiTest4 < ::StiTest2; end
|
|
202
|
+
|
|
203
|
+
StiTest2.dataset.sql.should == "SELECT * FROM sti_test2s"
|
|
204
|
+
StiTest3.dataset.sql.should == "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))"
|
|
205
|
+
StiTest4.dataset.sql.should == "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (2))"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "should create correct sql with non-bijective mappings" do
|
|
209
|
+
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>'StiTest3', 1=>'StiTest3', 2=>'StiTest4'}
|
|
210
|
+
class ::StiTest3 < ::StiTest2; end
|
|
211
|
+
class ::StiTest4 < ::StiTest2; end
|
|
212
|
+
|
|
213
|
+
StiTest2.dataset.sql.should == "SELECT * FROM sti_test2s"
|
|
214
|
+
StiTest3.dataset.sql.should == "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "should honor a :key_chooser" do
|
|
218
|
+
StiTest2.plugin :single_table_inheritance, :kind, :key_chooser => proc{|inst| inst.model.to_s.downcase }
|
|
219
|
+
class ::StiTest3 < ::StiTest2; end
|
|
220
|
+
class ::StiTest4 < ::StiTest2; end
|
|
221
|
+
|
|
222
|
+
StiTest3.create.kind.should == 'stitest3'
|
|
223
|
+
StiTest4.create.kind.should == 'stitest4'
|
|
224
|
+
end
|
|
225
|
+
|
|
190
226
|
end
|
|
191
227
|
end
|
|
@@ -5,7 +5,7 @@ describe "Sequel::Plugins::SkipCreateRefresh" do
|
|
|
5
5
|
c = Class.new(Sequel::Model(:a))
|
|
6
6
|
c.columns :id, :x
|
|
7
7
|
c.db.reset
|
|
8
|
-
c.
|
|
8
|
+
c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
|
|
9
9
|
c.create(:x=>1)
|
|
10
10
|
c.db.sqls.should == ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
|
|
11
11
|
|
|
@@ -1,80 +1,45 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
|
-
unless Object.const_defined?('Sequel')
|
|
3
|
-
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
4
|
-
require 'sequel/core'
|
|
5
|
-
end
|
|
6
|
-
unless Sequel.const_defined?('Model')
|
|
7
|
-
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
8
|
-
require 'sequel/model'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones to_dot')
|
|
12
|
-
{:hook_class_methods=>[], :schema=>[], :validation_class_methods=>[]}.each{|p, opts| Sequel::Model.plugin(p, *opts)}
|
|
13
|
-
|
|
14
|
-
def skip_warn(s)
|
|
15
|
-
warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
|
|
16
|
-
end
|
|
17
2
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def update(*args)
|
|
24
|
-
@db.execute update_sql(*args)
|
|
25
|
-
1
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def delete(*args)
|
|
29
|
-
@db.execute delete_sql(*args)
|
|
30
|
-
1
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def fetch_rows(sql)
|
|
34
|
-
return if sql =~ /information_schema/
|
|
35
|
-
@db.execute(sql)
|
|
36
|
-
yield({:id => 1, :x => 1})
|
|
3
|
+
if defined?(RSpec)
|
|
4
|
+
begin
|
|
5
|
+
require 'rspec/expectations'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
nil
|
|
37
8
|
end
|
|
9
|
+
end
|
|
38
10
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
11
|
+
unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
|
|
12
|
+
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
13
|
+
require 'sequel/no_core_ext'
|
|
42
14
|
end
|
|
43
15
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@sqls << sql
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def new_sqls
|
|
56
|
-
s = sqls
|
|
57
|
-
reset
|
|
58
|
-
s
|
|
59
|
-
end
|
|
16
|
+
begin
|
|
17
|
+
# Attempt to load ActiveSupport inflector first, so Sequel inflector
|
|
18
|
+
# can override it.
|
|
19
|
+
require 'active_support/inflector'
|
|
20
|
+
require 'active_support/core_ext/string/inflections'
|
|
21
|
+
rescue LoadError
|
|
22
|
+
nil
|
|
23
|
+
end
|
|
60
24
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
end
|
|
25
|
+
# Load most extensions by default, so that any conflicts are easily detectable.
|
|
26
|
+
Sequel.extension(*%w'string_date_time inflector pagination query pretty_table blank migration schema_dumper looser_typecasting sql_expr thread_local_timezones to_dot columns_introspection server_block arbitrary_servers pg_auto_parameterize pg_statement_cache pg_array pg_array_ops pg_hstore pg_hstore_ops pg_range pg_range_ops pg_json pg_inet pg_row pg_row_ops schema_caching null_dataset select_remove query_literals eval_inspect')
|
|
64
27
|
|
|
65
|
-
|
|
66
|
-
[[:id, {:primary_key=>true}]]
|
|
67
|
-
end
|
|
28
|
+
Sequel::Dataset.introspect_all_columns if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
|
68
29
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def dataset(opts=nil); MockDataset.new(self, opts); end
|
|
30
|
+
def skip_warn(s)
|
|
31
|
+
warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
|
|
72
32
|
end
|
|
73
33
|
|
|
34
|
+
Sequel.quote_identifiers = false
|
|
35
|
+
Sequel.identifier_input_method = nil
|
|
36
|
+
Sequel.identifier_output_method = nil
|
|
37
|
+
|
|
74
38
|
class << Sequel::Model
|
|
39
|
+
attr_writer :db_schema
|
|
75
40
|
alias orig_columns columns
|
|
76
41
|
def columns(*cols)
|
|
77
|
-
return
|
|
42
|
+
return super if cols.empty?
|
|
78
43
|
define_method(:columns){cols}
|
|
79
44
|
@dataset.instance_variable_set(:@columns, cols) if @dataset
|
|
80
45
|
def_column_accessor(*cols)
|
|
@@ -82,10 +47,12 @@ class << Sequel::Model
|
|
|
82
47
|
@db_schema = {}
|
|
83
48
|
cols.each{|c| @db_schema[c] = {}}
|
|
84
49
|
end
|
|
85
|
-
def simple_table
|
|
86
|
-
nil
|
|
87
|
-
end
|
|
88
50
|
end
|
|
89
51
|
|
|
90
|
-
Sequel::Model.db = MODEL_DB = MockDatabase.new
|
|
91
52
|
Sequel::Model.use_transactions = false
|
|
53
|
+
Sequel::Model.cache_anonymous_models = false
|
|
54
|
+
|
|
55
|
+
db = Sequel.mock(:fetch=>{:id => 1, :x => 1}, :numrows=>1, :autoid=>proc{|sql| 10})
|
|
56
|
+
def db.schema(*) [[:id, {:primary_key=>true}]] end
|
|
57
|
+
def db.reset() sqls end
|
|
58
|
+
Sequel::Model.db = MODEL_DB = db
|