sequel 4.22.0 → 4.23.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 +22 -0
- data/README.rdoc +6 -0
- data/Rakefile +59 -81
- data/doc/migration.rdoc +2 -0
- data/doc/release_notes/4.23.0.txt +65 -0
- data/doc/sharding.rdoc +16 -14
- data/doc/testing.rdoc +61 -77
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/mock.rb +0 -1
- data/lib/sequel/adapters/postgres.rb +1 -0
- data/lib/sequel/adapters/postgresql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +3 -3
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +9 -1
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/transactions.rb +2 -1
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +12 -12
- data/lib/sequel/extensions/date_arithmetic.rb +0 -4
- data/lib/sequel/extensions/pagination.rb +14 -2
- data/lib/sequel/extensions/pg_enum.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +1 -1
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -0
- data/lib/sequel/plugins/delay_add_association.rb +50 -0
- data/lib/sequel/plugins/list.rb +2 -2
- data/lib/sequel/plugins/nested_attributes.rb +8 -28
- data/lib/sequel/plugins/update_refresh.rb +50 -0
- data/lib/sequel/plugins/validate_associated.rb +55 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +29 -29
- data/spec/adapters/firebird_spec.rb +97 -103
- data/spec/adapters/informix_spec.rb +25 -25
- data/spec/adapters/mssql_spec.rb +156 -172
- data/spec/adapters/mysql_spec.rb +334 -359
- data/spec/adapters/oracle_spec.rb +67 -69
- data/spec/adapters/postgres_spec.rb +1298 -1249
- data/spec/adapters/spec_helper.rb +2 -35
- data/spec/adapters/sqlanywhere_spec.rb +39 -39
- data/spec/adapters/sqlite_spec.rb +203 -200
- data/spec/bin_spec.rb +57 -59
- data/spec/core/connection_pool_spec.rb +402 -401
- data/spec/core/database_spec.rb +953 -944
- data/spec/core/dataset_spec.rb +2178 -2168
- data/spec/core/deprecated_spec.rb +19 -19
- data/spec/core/expression_filters_spec.rb +415 -415
- data/spec/core/mock_adapter_spec.rb +212 -212
- data/spec/core/object_graph_spec.rb +73 -73
- data/spec/core/placeholder_literalizer_spec.rb +71 -71
- data/spec/core/schema_generator_spec.rb +44 -44
- data/spec/core/schema_spec.rb +470 -472
- data/spec/core/spec_helper.rb +5 -20
- data/spec/core/version_spec.rb +2 -2
- data/spec/core_extensions_spec.rb +320 -320
- data/spec/extensions/accessed_columns_spec.rb +12 -12
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +2 -2
- data/spec/extensions/arbitrary_servers_spec.rb +23 -23
- data/spec/extensions/association_dependencies_spec.rb +34 -34
- data/spec/extensions/association_pks_spec.rb +98 -98
- data/spec/extensions/association_proxies_spec.rb +33 -33
- data/spec/extensions/auto_validations_spec.rb +46 -46
- data/spec/extensions/blacklist_security_spec.rb +19 -18
- data/spec/extensions/blank_spec.rb +36 -36
- data/spec/extensions/boolean_readers_spec.rb +36 -36
- data/spec/extensions/caching_spec.rb +82 -82
- data/spec/extensions/class_table_inheritance_spec.rb +72 -72
- data/spec/extensions/column_conflicts_spec.rb +19 -14
- data/spec/extensions/column_select_spec.rb +19 -19
- data/spec/extensions/columns_introspection_spec.rb +43 -43
- data/spec/extensions/composition_spec.rb +64 -64
- data/spec/extensions/connection_validator_spec.rb +92 -90
- data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
- data/spec/extensions/constraint_validations_spec.rb +80 -80
- data/spec/extensions/core_refinements_spec.rb +220 -220
- data/spec/extensions/csv_serializer_spec.rb +44 -44
- data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
- data/spec/extensions/dataset_associations_spec.rb +65 -65
- data/spec/extensions/dataset_source_alias_spec.rb +16 -16
- data/spec/extensions/date_arithmetic_spec.rb +51 -58
- data/spec/extensions/defaults_setter_spec.rb +19 -19
- data/spec/extensions/delay_add_association_spec.rb +52 -0
- data/spec/extensions/dirty_spec.rb +51 -51
- data/spec/extensions/eager_each_spec.rb +8 -8
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
- data/spec/extensions/error_splitter_spec.rb +2 -2
- data/spec/extensions/error_sql_spec.rb +4 -4
- data/spec/extensions/eval_inspect_spec.rb +3 -3
- data/spec/extensions/filter_having_spec.rb +8 -8
- data/spec/extensions/force_encoding_spec.rb +30 -30
- data/spec/extensions/from_block_spec.rb +7 -7
- data/spec/extensions/graph_each_spec.rb +19 -19
- data/spec/extensions/hash_aliases_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +100 -100
- data/spec/extensions/inflector_spec.rb +54 -54
- data/spec/extensions/input_transformer_spec.rb +10 -10
- data/spec/extensions/insert_returning_select_spec.rb +8 -8
- data/spec/extensions/instance_filters_spec.rb +26 -26
- data/spec/extensions/instance_hooks_spec.rb +85 -85
- data/spec/extensions/json_serializer_spec.rb +68 -68
- data/spec/extensions/lazy_attributes_spec.rb +49 -49
- data/spec/extensions/list_spec.rb +77 -75
- data/spec/extensions/looser_typecasting_spec.rb +16 -16
- data/spec/extensions/many_through_many_spec.rb +627 -627
- data/spec/extensions/meta_def_spec.rb +7 -7
- data/spec/extensions/migration_spec.rb +217 -217
- data/spec/extensions/modification_detection_spec.rb +20 -20
- data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
- data/spec/extensions/named_timezones_spec.rb +18 -18
- data/spec/extensions/nested_attributes_spec.rb +107 -107
- data/spec/extensions/null_dataset_spec.rb +24 -24
- data/spec/extensions/optimistic_locking_spec.rb +21 -21
- data/spec/extensions/pagination_spec.rb +52 -52
- data/spec/extensions/pg_array_associations_spec.rb +273 -273
- data/spec/extensions/pg_array_ops_spec.rb +52 -52
- data/spec/extensions/pg_array_spec.rb +152 -152
- data/spec/extensions/pg_enum_spec.rb +13 -13
- data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
- data/spec/extensions/pg_hstore_spec.rb +84 -84
- data/spec/extensions/pg_inet_spec.rb +15 -15
- data/spec/extensions/pg_interval_spec.rb +29 -29
- data/spec/extensions/pg_json_ops_spec.rb +86 -84
- data/spec/extensions/pg_json_spec.rb +104 -104
- data/spec/extensions/pg_loose_count_spec.rb +6 -6
- data/spec/extensions/pg_range_ops_spec.rb +24 -24
- data/spec/extensions/pg_range_spec.rb +143 -143
- data/spec/extensions/pg_row_ops_spec.rb +14 -14
- data/spec/extensions/pg_row_plugin_spec.rb +12 -12
- data/spec/extensions/pg_row_spec.rb +118 -118
- data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
- data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
- data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
- data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
- data/spec/extensions/prepared_statements_spec.rb +28 -28
- data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
- data/spec/extensions/pretty_table_spec.rb +16 -16
- data/spec/extensions/query_literals_spec.rb +37 -37
- data/spec/extensions/query_spec.rb +32 -32
- data/spec/extensions/rcte_tree_spec.rb +141 -141
- data/spec/extensions/round_timestamps_spec.rb +21 -21
- data/spec/extensions/schema_caching_spec.rb +8 -8
- data/spec/extensions/schema_dumper_spec.rb +78 -78
- data/spec/extensions/schema_spec.rb +31 -27
- data/spec/extensions/scissors_spec.rb +3 -3
- data/spec/extensions/select_remove_spec.rb +14 -14
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
- data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
- data/spec/extensions/serialization_spec.rb +79 -78
- data/spec/extensions/server_block_spec.rb +17 -17
- data/spec/extensions/set_overrides_spec.rb +30 -30
- data/spec/extensions/sharding_spec.rb +65 -65
- data/spec/extensions/shared_caching_spec.rb +29 -29
- data/spec/extensions/single_table_inheritance_spec.rb +79 -79
- data/spec/extensions/skip_create_refresh_spec.rb +3 -3
- data/spec/extensions/spec_helper.rb +4 -29
- data/spec/extensions/split_array_nil_spec.rb +9 -9
- data/spec/extensions/split_values_spec.rb +7 -7
- data/spec/extensions/sql_expr_spec.rb +32 -32
- data/spec/extensions/static_cache_spec.rb +123 -123
- data/spec/extensions/string_date_time_spec.rb +34 -34
- data/spec/extensions/string_stripper_spec.rb +15 -15
- data/spec/extensions/subclasses_spec.rb +31 -31
- data/spec/extensions/table_select_spec.rb +15 -15
- data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
- data/spec/extensions/thread_local_timezones_spec.rb +13 -13
- data/spec/extensions/timestamps_spec.rb +40 -40
- data/spec/extensions/to_dot_spec.rb +34 -34
- data/spec/extensions/touch_spec.rb +52 -52
- data/spec/extensions/tree_spec.rb +72 -72
- data/spec/extensions/typecast_on_load_spec.rb +25 -25
- data/spec/extensions/unlimited_update_spec.rb +2 -2
- data/spec/extensions/update_or_create_spec.rb +36 -36
- data/spec/extensions/update_primary_key_spec.rb +35 -35
- data/spec/extensions/update_refresh_spec.rb +41 -0
- data/spec/extensions/validate_associated_spec.rb +52 -0
- data/spec/extensions/validation_class_methods_spec.rb +314 -317
- data/spec/extensions/validation_helpers_spec.rb +195 -195
- data/spec/extensions/xml_serializer_spec.rb +48 -48
- data/spec/guards_helper.rb +55 -0
- data/spec/integration/associations_test.rb +1089 -1088
- data/spec/integration/database_test.rb +29 -29
- data/spec/integration/dataset_test.rb +661 -661
- data/spec/integration/eager_loader_test.rb +147 -147
- data/spec/integration/migrator_test.rb +122 -122
- data/spec/integration/model_test.rb +70 -70
- data/spec/integration/plugin_test.rb +682 -640
- data/spec/integration/prepared_statement_test.rb +172 -172
- data/spec/integration/schema_test.rb +245 -245
- data/spec/integration/spec_helper.rb +1 -64
- data/spec/integration/timezone_test.rb +17 -17
- data/spec/integration/transaction_test.rb +87 -87
- data/spec/integration/type_test.rb +33 -33
- data/spec/model/association_reflection_spec.rb +130 -121
- data/spec/model/associations_spec.rb +1112 -1113
- data/spec/model/base_spec.rb +197 -196
- data/spec/model/class_dataset_methods_spec.rb +118 -118
- data/spec/model/dataset_methods_spec.rb +49 -49
- data/spec/model/eager_loading_spec.rb +705 -702
- data/spec/model/hooks_spec.rb +169 -168
- data/spec/model/inflector_spec.rb +5 -5
- data/spec/model/model_spec.rb +287 -297
- data/spec/model/plugins_spec.rb +47 -47
- data/spec/model/record_spec.rb +534 -535
- data/spec/model/spec_helper.rb +3 -21
- data/spec/model/validations_spec.rb +72 -70
- data/spec/spec_config.rb +8 -0
- metadata +41 -9
- data/lib/sequel/adapters/fdbsql.rb +0 -286
- data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
- data/lib/sequel/adapters/openbase.rb +0 -54
- data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
- data/spec/adapters/fdbsql_spec.rb +0 -429
- data/spec/rspec_helper.rb +0 -22
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
with_server_specs = shared_description do
|
|
4
|
+
it "should set the default server to use in the block" do
|
|
5
5
|
@db.with_server(:a){@db[:t].all}
|
|
6
|
-
@db.sqls.
|
|
6
|
+
@db.sqls.must_equal ["SELECT * FROM t -- a"]
|
|
7
7
|
@db.with_server(:b){@db[:t].all}
|
|
8
|
-
@db.sqls.
|
|
8
|
+
@db.sqls.must_equal ["SELECT * FROM t -- b"]
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
it "should have no affect after the block" do
|
|
12
12
|
@db.with_server(:a){@db[:t].all}
|
|
13
|
-
@db.sqls.
|
|
13
|
+
@db.sqls.must_equal ["SELECT * FROM t -- a"]
|
|
14
14
|
@db[:t].all
|
|
15
|
-
@db.sqls.
|
|
15
|
+
@db.sqls.must_equal ["SELECT * FROM t"]
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
it "should not override specific server inside the block" do
|
|
19
19
|
@db.with_server(:a){@db[:t].server(:b).all}
|
|
20
|
-
@db.sqls.
|
|
20
|
+
@db.sqls.must_equal ["SELECT * FROM t -- b"]
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
it "should work correctly when blocks are nested" do
|
|
24
24
|
@db[:t].all
|
|
25
25
|
@db.with_server(:a) do
|
|
26
26
|
@db[:t].all
|
|
@@ -28,16 +28,16 @@ shared_examples_for "Database#with_server" do
|
|
|
28
28
|
@db[:t].all
|
|
29
29
|
end
|
|
30
30
|
@db[:t].all
|
|
31
|
-
@db.sqls.
|
|
31
|
+
@db.sqls.must_equal ["SELECT * FROM t", "SELECT * FROM t -- a", "SELECT * FROM t -- b", "SELECT * FROM t -- a", "SELECT * FROM t"]
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
it "should work correctly for inserts/updates/deletes" do
|
|
35
35
|
@db.with_server(:a) do
|
|
36
36
|
@db[:t].insert
|
|
37
37
|
@db[:t].update(:a=>1)
|
|
38
38
|
@db[:t].delete
|
|
39
39
|
end
|
|
40
|
-
@db.sqls.
|
|
40
|
+
@db.sqls.must_equal ["INSERT INTO t DEFAULT VALUES -- a", "UPDATE t SET a = 1 -- a", "DELETE FROM t -- a"]
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -47,7 +47,7 @@ describe "Database#with_server single threaded" do
|
|
|
47
47
|
@db.extension :server_block
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
include with_server_specs
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
describe "Database#with_server multi threaded" do
|
|
@@ -56,9 +56,9 @@ describe "Database#with_server multi threaded" do
|
|
|
56
56
|
@db.extension :server_block
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
include with_server_specs
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
it "should respect multithreaded access" do
|
|
62
62
|
q, q1 = Queue.new, Queue.new
|
|
63
63
|
|
|
64
64
|
t = nil
|
|
@@ -83,7 +83,7 @@ describe "Database#with_server multi threaded" do
|
|
|
83
83
|
@db[:t].all
|
|
84
84
|
q1.push nil
|
|
85
85
|
t.join
|
|
86
|
-
@db.sqls.
|
|
86
|
+
@db.sqls.must_equal ["SELECT * FROM t", "SELECT * FROM t -- a", "SELECT * FROM t", "SELECT * FROM t -- c", "SELECT * FROM t -- d",
|
|
87
87
|
"SELECT * FROM t -- b", "SELECT * FROM t -- a", "SELECT * FROM t", "SELECT * FROM t -- c", "SELECT * FROM t"]
|
|
88
88
|
end
|
|
89
89
|
end
|
|
@@ -5,30 +5,30 @@ describe "Sequel::Dataset #set_defaults" do
|
|
|
5
5
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides).set_defaults(:x=>1)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
@ds.insert_sql.
|
|
10
|
-
@ds.insert_sql(:x=>2).
|
|
11
|
-
@ds.insert_sql(:y=>2).
|
|
12
|
-
@ds.set_defaults(:y=>2).insert_sql.
|
|
13
|
-
@ds.set_defaults(:x=>2).insert_sql.
|
|
8
|
+
it "should set the default values for inserts" do
|
|
9
|
+
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
|
10
|
+
@ds.insert_sql(:x=>2).must_equal "INSERT INTO items (x) VALUES (2)"
|
|
11
|
+
@ds.insert_sql(:y=>2).must_match(/INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/)
|
|
12
|
+
@ds.set_defaults(:y=>2).insert_sql.must_match(/INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/)
|
|
13
|
+
@ds.set_defaults(:x=>2).insert_sql.must_equal "INSERT INTO items (x) VALUES (2)"
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
@ds.update_sql.
|
|
18
|
-
@ds.update_sql(:x=>2).
|
|
19
|
-
@ds.update_sql(:y=>2).
|
|
20
|
-
@ds.set_defaults(:y=>2).update_sql.
|
|
21
|
-
@ds.set_defaults(:x=>2).update_sql.
|
|
16
|
+
it "should set the default values for updates" do
|
|
17
|
+
@ds.update_sql.must_equal "UPDATE items SET x = 1"
|
|
18
|
+
@ds.update_sql(:x=>2).must_equal "UPDATE items SET x = 2"
|
|
19
|
+
@ds.update_sql(:y=>2).must_match(/UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/)
|
|
20
|
+
@ds.set_defaults(:y=>2).update_sql.must_match(/UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/)
|
|
21
|
+
@ds.set_defaults(:x=>2).update_sql.must_equal "UPDATE items SET x = 2"
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
@ds.update_sql('y = 2').
|
|
24
|
+
it "should not affect String update arguments" do
|
|
25
|
+
@ds.update_sql('y = 2').must_equal "UPDATE items SET y = 2"
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
it "should have working mutation method" do
|
|
29
29
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides)
|
|
30
30
|
@ds.set_defaults!(:x=>1)
|
|
31
|
-
@ds.insert_sql.
|
|
31
|
+
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -37,25 +37,25 @@ describe "Sequel::Dataset #set_overrides" do
|
|
|
37
37
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides).set_overrides(:x=>1)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
@ds.insert_sql.
|
|
42
|
-
@ds.insert_sql(:x=>2).
|
|
43
|
-
@ds.insert_sql(:y=>2).
|
|
44
|
-
@ds.set_overrides(:y=>2).insert_sql.
|
|
45
|
-
@ds.set_overrides(:x=>2).insert_sql.
|
|
40
|
+
it "should override the given values for inserts" do
|
|
41
|
+
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
|
42
|
+
@ds.insert_sql(:x=>2).must_equal "INSERT INTO items (x) VALUES (1)"
|
|
43
|
+
@ds.insert_sql(:y=>2).must_match(/INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/)
|
|
44
|
+
@ds.set_overrides(:y=>2).insert_sql.must_match(/INSERT INTO items \([xy], [xy]\) VALUES \([21], [21]\)/)
|
|
45
|
+
@ds.set_overrides(:x=>2).insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
@ds.update_sql.
|
|
50
|
-
@ds.update_sql(:x=>2).
|
|
51
|
-
@ds.update_sql(:y=>2).
|
|
52
|
-
@ds.set_overrides(:y=>2).update_sql.
|
|
53
|
-
@ds.set_overrides(:x=>2).update_sql.
|
|
48
|
+
it "should override the given values for updates" do
|
|
49
|
+
@ds.update_sql.must_equal "UPDATE items SET x = 1"
|
|
50
|
+
@ds.update_sql(:x=>2).must_equal "UPDATE items SET x = 1"
|
|
51
|
+
@ds.update_sql(:y=>2).must_match(/UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/)
|
|
52
|
+
@ds.set_overrides(:y=>2).update_sql.must_match(/UPDATE items SET (x = 1|y = 2), (x = 1|y = 2)/)
|
|
53
|
+
@ds.set_overrides(:x=>2).update_sql.must_equal "UPDATE items SET x = 1"
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
it "should have working mutation method" do
|
|
57
57
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides)
|
|
58
58
|
@ds.set_overrides!(:x=>1)
|
|
59
|
-
@ds.insert_sql.
|
|
59
|
+
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
|
60
60
|
end
|
|
61
61
|
end
|
|
@@ -27,172 +27,172 @@ describe "sharding plugin" do
|
|
|
27
27
|
@db.sqls
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
it "should allow you to instantiate a new object for a specified shard" do
|
|
31
31
|
@Album.new_using_server(:s1, :name=>'RF').save
|
|
32
|
-
@db.sqls.
|
|
32
|
+
@db.sqls.must_equal ["INSERT INTO albums (name) VALUES ('RF') -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
33
33
|
|
|
34
34
|
@Album.new_using_server(:s2){|o| o.name = 'MO'}.save
|
|
35
|
-
@db.sqls.
|
|
35
|
+
@db.sqls.must_equal ["INSERT INTO albums (name) VALUES ('MO') -- s2", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it "should allow you to create and save a new object for a specified shard" do
|
|
39
39
|
@Album.create_using_server(:s1, :name=>'RF')
|
|
40
|
-
@db.sqls.
|
|
40
|
+
@db.sqls.must_equal ["INSERT INTO albums (name) VALUES ('RF') -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
41
41
|
|
|
42
42
|
@Album.create_using_server(:s2){|o| o.name = 'MO'}
|
|
43
|
-
@db.sqls.
|
|
43
|
+
@db.sqls.must_equal ["INSERT INTO albums (name) VALUES ('MO') -- s2", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
it "should have objects retrieved from a specific shard update that shard" do
|
|
47
47
|
@Album.server(:s1).first.update(:name=>'MO')
|
|
48
|
-
@db.sqls.
|
|
48
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "UPDATE albums SET name = 'MO' WHERE (id = 1) -- s1"]
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
it "should have objects retrieved from a specific shard delete from that shard" do
|
|
52
52
|
@Album.server(:s1).first.delete
|
|
53
|
-
@db.sqls.
|
|
53
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "DELETE FROM albums WHERE (id = 1) -- s1"]
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
it "should have objects retrieved from a specific shard reload from that shard" do
|
|
57
57
|
@Album.server(:s1).first.reload
|
|
58
|
-
@db.sqls.
|
|
58
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s1"]
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
it "should use current dataset's shard when eager loading if eagerly loaded dataset doesn't have its own shard" do
|
|
62
62
|
albums = @Album.server(:s1).eager(:artist).all
|
|
63
|
-
@db.sqls.
|
|
64
|
-
albums.length.
|
|
63
|
+
@db.sqls.must_equal ["SELECT * FROM albums -- s1", "SELECT * FROM artists WHERE (artists.id IN (2)) -- s1"]
|
|
64
|
+
albums.length.must_equal 1
|
|
65
65
|
albums.first.artist.save
|
|
66
|
-
@db.sqls.
|
|
66
|
+
@db.sqls.must_equal ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s1"]
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
it "should not use current dataset's shard when eager loading if eagerly loaded dataset has its own shard" do
|
|
70
70
|
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
71
71
|
albums = @Album.server(:s1).eager(:artist).all
|
|
72
|
-
@db.sqls.
|
|
73
|
-
albums.length.
|
|
72
|
+
@db.sqls.must_equal ["SELECT * FROM albums -- s1", "SELECT * FROM artists WHERE (artists.id IN (2)) -- s2"]
|
|
73
|
+
albums.length.must_equal 1
|
|
74
74
|
albums.first.artist.save
|
|
75
|
-
@db.sqls.
|
|
75
|
+
@db.sqls.must_equal ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
it "should use current dataset's shard when eager graphing if eagerly graphed dataset doesn't have its own shard" do
|
|
79
79
|
ds = @Album.server(:s1).eager_graph(:artist)
|
|
80
80
|
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
81
81
|
albums = ds.all
|
|
82
|
-
@db.sqls.
|
|
83
|
-
albums.length.
|
|
82
|
+
@db.sqls.must_equal ["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.must_equal 1
|
|
84
84
|
albums.first.artist.save
|
|
85
|
-
@db.sqls.
|
|
85
|
+
@db.sqls.must_equal ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s1"]
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
it "should not use current dataset's shard when eager graphing if eagerly graphed dataset has its own shard" do
|
|
89
89
|
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
90
90
|
ds = @Album.server(:s1).eager_graph(:artist)
|
|
91
91
|
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
92
92
|
albums = ds.all
|
|
93
|
-
@db.sqls.
|
|
94
|
-
albums.length.
|
|
93
|
+
@db.sqls.must_equal ["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.must_equal 1
|
|
95
95
|
albums.first.artist.save
|
|
96
|
-
@db.sqls.
|
|
96
|
+
@db.sqls.must_equal ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it "should use eagerly graphed dataset shard for eagerly graphed objects even if current dataset does not have a shard" do
|
|
100
100
|
@Artist.instance_dataset.opts[:server] = @Artist.dataset.opts[:server] = :s2
|
|
101
101
|
ds = @Album.eager_graph(:artist)
|
|
102
102
|
ds._fetch = {:id=>1, :artist_id=>2, :name=>'RF', :artist_id_0=>2, :artist_name=>'YJM'}
|
|
103
103
|
albums = ds.all
|
|
104
|
-
@db.sqls.
|
|
105
|
-
albums.length.
|
|
104
|
+
@db.sqls.must_equal ["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.must_equal 1
|
|
106
106
|
albums.first.artist.save
|
|
107
|
-
@db.sqls.
|
|
107
|
+
@db.sqls.must_equal ["UPDATE artists SET name = 'YJM' WHERE (id = 2) -- s2"]
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
it "should have objects retrieved from a specific shard use associated objects from that shard, with modifications to the associated objects using that shard" do
|
|
111
111
|
album = @Album.server(:s1).first
|
|
112
|
-
@db.sqls.
|
|
112
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1"]
|
|
113
113
|
album.artist.update(:name=>'AS')
|
|
114
|
-
@db.sqls.
|
|
114
|
+
@db.sqls.must_equal ["SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1 -- s1", "UPDATE artists SET name = 'AS' WHERE (id = 2) -- s1"]
|
|
115
115
|
album.tags.map{|a| a.update(:name=>'SR')}
|
|
116
|
-
@db.sqls.
|
|
116
|
+
@db.sqls.must_equal ["SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE (albums_tags.album_id = 1) -- s1", "UPDATE tags SET name = 'SR' WHERE (id = 3) -- s1"]
|
|
117
117
|
@Artist.server(:s2).first.albums.map{|a| a.update(:name=>'MO')}
|
|
118
|
-
@db.sqls.
|
|
118
|
+
@db.sqls.must_equal ["SELECT * FROM artists LIMIT 1 -- s2", "SELECT * FROM albums WHERE (albums.artist_id = 2) -- s2", "UPDATE albums SET name = 'MO' WHERE (id = 1) -- s2"]
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
it "should have objects retrieved from a specific shard add associated objects to that shard" do
|
|
122
122
|
album = @Album.server(:s1).first
|
|
123
123
|
artist = @Artist.server(:s2).first
|
|
124
|
-
@db.sqls.
|
|
124
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
125
125
|
|
|
126
126
|
artist.add_album(:name=>'MO')
|
|
127
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"].
|
|
129
|
-
sqls.
|
|
128
|
+
["INSERT INTO albums (artist_id, name) VALUES (2, 'MO') -- s2", "INSERT INTO albums (name, artist_id) VALUES ('MO', 2) -- s2"].must_include(sqls.shift)
|
|
129
|
+
sqls.must_equal ["SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
130
130
|
|
|
131
131
|
album.add_tag(:name=>'SR')
|
|
132
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"].
|
|
134
|
-
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"].must_include(sqls.pop)
|
|
134
|
+
sqls.must_equal ["INSERT INTO tags (name) VALUES ('SR') -- s1", "SELECT * FROM tags WHERE (id = 1) LIMIT 1 -- s1", ]
|
|
135
135
|
end
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it "should have objects retrieved from a specific shard remove associated objects from that shard" do
|
|
138
138
|
album = @Album.server(:s1).first
|
|
139
139
|
artist = @Artist.server(:s2).first
|
|
140
|
-
@db.sqls.
|
|
140
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
141
141
|
|
|
142
142
|
artist.remove_album(1)
|
|
143
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"].
|
|
145
|
-
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"].must_include(sqls.pop)
|
|
145
|
+
sqls.must_equal ["SELECT * FROM albums WHERE ((albums.artist_id = 2) AND (albums.id = 1)) LIMIT 1 -- s2"]
|
|
146
146
|
|
|
147
147
|
album.remove_tag(3)
|
|
148
|
-
@db.sqls.
|
|
148
|
+
@db.sqls.must_equal ["SELECT tags.* FROM tags INNER JOIN albums_tags ON (albums_tags.tag_id = tags.id) WHERE ((albums_tags.album_id = 1) AND (tags.id = 3)) LIMIT 1 -- s1", "DELETE FROM albums_tags WHERE ((album_id = 1) AND (tag_id = 3)) -- s1"]
|
|
149
149
|
end
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
it "should have objects retrieved from a specific shard remove all associated objects from that shard" do
|
|
152
152
|
album = @Album.server(:s1).first
|
|
153
153
|
artist = @Artist.server(:s2).first
|
|
154
|
-
@db.sqls.
|
|
154
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
155
155
|
|
|
156
156
|
artist.remove_all_albums
|
|
157
|
-
@db.sqls.
|
|
157
|
+
@db.sqls.must_equal ["UPDATE albums SET artist_id = NULL WHERE (artist_id = 2) -- s2"]
|
|
158
158
|
|
|
159
159
|
album.remove_all_tags
|
|
160
|
-
@db.sqls.
|
|
160
|
+
@db.sqls.must_equal ["DELETE FROM albums_tags WHERE (album_id = 1) -- s1"]
|
|
161
161
|
end
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
it "should not override a server already set on an associated object" do
|
|
164
164
|
@Album.server(:s1).first
|
|
165
165
|
artist = @Artist.server(:s2).first
|
|
166
|
-
@db.sqls.
|
|
166
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM artists LIMIT 1 -- s2"]
|
|
167
167
|
|
|
168
168
|
artist.add_album(@Album.load(:id=>4, :name=>'MO').set_server(:s3))
|
|
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"].
|
|
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"].must_include(@db.sqls.pop)
|
|
170
170
|
|
|
171
171
|
artist.remove_album(@Album.load(:id=>5, :name=>'T', :artist_id=>2).set_server(:s4))
|
|
172
172
|
# Should select from current object's shard to check existing association, but update associated object's shard
|
|
173
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"].
|
|
175
|
-
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"].must_include(sqls.pop)
|
|
175
|
+
sqls.must_equal ["SELECT 1 AS one FROM albums WHERE ((albums.artist_id = 2) AND (id = 5)) LIMIT 1 -- s2"]
|
|
176
176
|
end
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
it "should be able to set a shard to use for any object using set_server" do
|
|
179
179
|
@Album.server(:s1).first.set_server(:s2).reload
|
|
180
|
-
@db.sqls.
|
|
180
|
+
@db.sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s1", "SELECT * FROM albums WHERE (id = 1) LIMIT 1 -- s2"]
|
|
181
181
|
end
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
it "should use transactions on the correct shard" do
|
|
184
184
|
@Album.use_transactions = true
|
|
185
185
|
@Album.server(:s2).first.save
|
|
186
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"].
|
|
188
|
-
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"].must_include(sqls.slice!(2))
|
|
188
|
+
sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s2", "BEGIN -- s2", "COMMIT -- s2"]
|
|
189
189
|
end
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
it "should use override current shard when saving with given :server option" do
|
|
192
192
|
@Album.use_transactions = true
|
|
193
193
|
@Album.server(:s2).first.save(:server=>:s1)
|
|
194
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"].
|
|
196
|
-
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"].must_include(sqls.slice!(2))
|
|
196
|
+
sqls.must_equal ["SELECT * FROM albums LIMIT 1 -- s2", "BEGIN -- s1", "COMMIT -- s1"]
|
|
197
197
|
end
|
|
198
198
|
end
|
|
@@ -21,75 +21,75 @@ describe "Shared caching behavior" do
|
|
|
21
21
|
Object.send(:remove_const, :LookupModel)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
many_to_one_cpk_specs = shared_description do
|
|
25
25
|
it "should use a simple primary key lookup when retrieving many_to_one associated records with a composite key" do
|
|
26
|
-
@db.sqls.
|
|
27
|
-
@c.load(:id=>3, :caching_model_id=>1, :caching_model_id2=>2).caching_model2.
|
|
28
|
-
@c.load(:id=>3, :caching_model_id=>2, :caching_model_id2=>1).caching_model2.
|
|
29
|
-
@db.sqls.
|
|
26
|
+
@db.sqls.must_equal []
|
|
27
|
+
@c.load(:id=>3, :caching_model_id=>1, :caching_model_id2=>2).caching_model2.must_be_same_as(@cm12)
|
|
28
|
+
@c.load(:id=>3, :caching_model_id=>2, :caching_model_id2=>1).caching_model2.must_be_same_as(@cm21)
|
|
29
|
+
@db.sqls.must_equal []
|
|
30
30
|
@db.fetch = []
|
|
31
|
-
@c.load(:id=>4, :caching_model_id=>2, :caching_model_id2=>2).caching_model2.
|
|
31
|
+
@c.load(:id=>4, :caching_model_id=>2, :caching_model_id2=>2).caching_model2.must_equal nil
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
many_to_one_pk_specs = shared_description do
|
|
36
36
|
it "should use a simple primary key lookup when retrieving many_to_one associated records" do
|
|
37
37
|
@cc.set_primary_key([:id, :id2])
|
|
38
|
-
@db.sqls.
|
|
39
|
-
@c.load(:id=>3, :caching_model_id=>1).caching_model.
|
|
40
|
-
@c.load(:id=>4, :caching_model_id=>2).caching_model.
|
|
41
|
-
@db.sqls.
|
|
38
|
+
@db.sqls.must_equal []
|
|
39
|
+
@c.load(:id=>3, :caching_model_id=>1).caching_model.must_be_same_as(@cm1)
|
|
40
|
+
@c.load(:id=>4, :caching_model_id=>2).caching_model.must_be_same_as(@cm2)
|
|
41
|
+
@db.sqls.must_equal []
|
|
42
42
|
@db.fetch = []
|
|
43
|
-
@c.load(:id=>4, :caching_model_id=>3).caching_model.
|
|
43
|
+
@c.load(:id=>4, :caching_model_id=>3).caching_model.must_equal nil
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "should not use a simple primary key lookup if the assocation has a nil :key option" do
|
|
47
47
|
@c.many_to_one :caching_model, :key=>nil, :dataset=>proc{CachingModel.filter(:caching_model_id=>caching_model_id)}
|
|
48
48
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
49
|
-
@db.sqls.
|
|
49
|
+
@db.sqls.wont_equal []
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "should not use a simple primary key lookup if the assocation has a nil :key option" do
|
|
53
53
|
@c.many_to_one :caching_model, :many_to_one_pk_lookup=>false
|
|
54
54
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
55
|
-
@db.sqls.
|
|
55
|
+
@db.sqls.wont_equal []
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
it "should not use a simple primary key lookup if the assocation's :primary_key option doesn't match the primary key of the associated class" do
|
|
59
59
|
@c.many_to_one :caching_model, :primary_key=>:id2
|
|
60
60
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
61
|
-
@db.sqls.
|
|
61
|
+
@db.sqls.wont_equal []
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
it "should not use a simple primary key lookup if the assocation has :conditions" do
|
|
65
65
|
@c.many_to_one :caching_model, :conditions=>{:a=>1}
|
|
66
66
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
67
|
-
@db.sqls.
|
|
67
|
+
@db.sqls.wont_equal []
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
it "should not use a simple primary key lookup if the assocation has :select" do
|
|
71
71
|
@c.many_to_one :caching_model, :select=>[:a, :b]
|
|
72
72
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
73
|
-
@db.sqls.
|
|
73
|
+
@db.sqls.wont_equal []
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
it "should not use a simple primary key lookup if the assocation has a block" do
|
|
77
77
|
@c.many_to_one(:caching_model){|ds| ds.where{a > 1}}
|
|
78
78
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
79
|
-
@db.sqls.
|
|
79
|
+
@db.sqls.wont_equal []
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
it "should not use a simple primary key lookup if the assocation has a non-default :dataset option" do
|
|
83
83
|
cc = @cc
|
|
84
84
|
@c.many_to_one :caching_model, :dataset=>proc{cc.where(:id=>caching_model_id)}
|
|
85
85
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
86
|
-
@db.sqls.
|
|
86
|
+
@db.sqls.wont_equal []
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
it "should use a simple primary key lookup if explicitly set" do
|
|
90
90
|
@c.many_to_one :caching_model, :select=>[:a, :b], :many_to_one_pk_lookup=>true
|
|
91
91
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
92
|
-
@db.sqls.
|
|
92
|
+
@db.sqls.must_equal []
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
it "should not use a simple primary key lookup if the prepared_statements_associations method is being used" do
|
|
@@ -101,8 +101,8 @@ describe "Shared caching behavior" do
|
|
|
101
101
|
columns :id, :caching_model_id
|
|
102
102
|
many_to_one :caching_model, :class=>c2
|
|
103
103
|
end
|
|
104
|
-
c.load(:id=>3, :caching_model_id=>1).caching_model.
|
|
105
|
-
@db.sqls.
|
|
104
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.must_equal c2.load(:id=>1)
|
|
105
|
+
@db.sqls.wont_equal []
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
it "should use a simple primary key lookup if the prepared_statements_associations method is being used but associated model also uses caching" do
|
|
@@ -112,8 +112,8 @@ describe "Shared caching behavior" do
|
|
|
112
112
|
columns :id, :caching_model_id
|
|
113
113
|
many_to_one :caching_model
|
|
114
114
|
end
|
|
115
|
-
c.load(:id=>3, :caching_model_id=>1).caching_model.
|
|
116
|
-
@db.sqls.
|
|
115
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.must_be_same_as(@cm1)
|
|
116
|
+
@db.sqls.must_equal []
|
|
117
117
|
end
|
|
118
118
|
end
|
|
119
119
|
|
|
@@ -137,8 +137,8 @@ describe "Shared caching behavior" do
|
|
|
137
137
|
@db.sqls
|
|
138
138
|
end
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
include many_to_one_cpk_specs
|
|
141
|
+
include many_to_one_pk_specs
|
|
142
142
|
end
|
|
143
143
|
|
|
144
144
|
describe "With static_cache plugin with single key" do
|
|
@@ -150,13 +150,13 @@ describe "Shared caching behavior" do
|
|
|
150
150
|
@db.sqls
|
|
151
151
|
end
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
include many_to_one_pk_specs
|
|
154
154
|
|
|
155
155
|
it "should not issue regular query if primary key lookup returns no rows" do
|
|
156
156
|
def @cc.primary_key_lookup(pk); end
|
|
157
157
|
@c.many_to_one :caching_model
|
|
158
158
|
@c.load(:id=>3, :caching_model_id=>1).caching_model
|
|
159
|
-
@db.sqls.
|
|
159
|
+
@db.sqls.must_equal []
|
|
160
160
|
end
|
|
161
161
|
end
|
|
162
162
|
|
|
@@ -170,6 +170,6 @@ describe "Shared caching behavior" do
|
|
|
170
170
|
@db.sqls
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
include many_to_one_cpk_specs
|
|
174
174
|
end
|
|
175
175
|
end
|