sequel 3.21.0 → 3.39.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 +1061 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +103 -63
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +67 -51
- data/doc/advanced_associations.rdoc +189 -75
- data/doc/association_basics.rdoc +327 -79
- 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 +547 -0
- data/doc/opening_databases.rdoc +114 -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/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/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +17 -9
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- 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 +18 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +453 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/db2.rb +56 -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 +73 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -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 +7 -24
- 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 +66 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +279 -97
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +125 -222
- data/lib/sequel/adapters/mysql2.rb +65 -56
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +3 -5
- data/lib/sequel/adapters/oracle.rb +349 -53
- data/lib/sequel/adapters/postgres.rb +368 -138
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +343 -0
- data/lib/sequel/adapters/shared/firebird.rb +221 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +401 -116
- data/lib/sequel/adapters/shared/mysql.rb +424 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +257 -45
- data/lib/sequel/adapters/shared/postgres.rb +675 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +285 -96
- data/lib/sequel/adapters/sqlite.rb +101 -39
- 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 +28 -19
- data/lib/sequel/adapters/tinytds.rb +174 -22
- 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/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +11 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +33 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +43 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +38 -28
- 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 +190 -46
- data/lib/sequel/database/query.rb +272 -110
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +300 -67
- 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 +305 -54
- data/lib/sequel/dataset/sql.rb +720 -292
- 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/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 +537 -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 +313 -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 +208 -0
- data/lib/sequel/extensions/pg_range.rb +512 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +572 -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 +22 -4
- 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 +58 -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 +167 -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 +5 -3
- 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/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 +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +55 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +649 -122
- 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 +1 -1
- data/spec/adapters/mssql_spec.rb +194 -66
- data/spec/adapters/mysql_spec.rb +475 -306
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +1982 -325
- data/spec/adapters/spec_helper.rb +9 -6
- data/spec/adapters/sqlite_spec.rb +203 -75
- data/spec/core/connection_pool_spec.rb +218 -93
- data/spec/core/database_spec.rb +956 -522
- data/spec/core/dataset_spec.rb +1631 -1242
- data/spec/core/expression_filters_spec.rb +690 -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 +66 -32
- 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/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 +320 -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 +194 -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 +323 -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 +23 -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 +13 -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 +58 -67
- data/spec/extensions/validation_helpers_spec.rb +31 -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 +11 -5
- data/spec/integration/dataset_test.rb +717 -129
- 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 +604 -147
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +367 -57
- data/spec/integration/spec_helper.rb +42 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +31 -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 +209 -80
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -2,8 +2,6 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe Sequel::Model, "caching" do
|
|
4
4
|
before do
|
|
5
|
-
MODEL_DB.reset
|
|
6
|
-
|
|
7
5
|
@cache_class = Class.new(Hash) do
|
|
8
6
|
attr_accessor :ttl
|
|
9
7
|
def set(k, v, ttl); self[k] = v; @ttl = ttl; end
|
|
@@ -44,31 +42,14 @@ describe Sequel::Model, "caching" do
|
|
|
44
42
|
columns :name, :id
|
|
45
43
|
end
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
$cache_dataset_row = {:name => 'sharon', :id => 1}
|
|
49
45
|
@dataset = @c.dataset = @c3.dataset = @c4.dataset
|
|
50
|
-
|
|
51
|
-
@dataset.
|
|
52
|
-
def fetch_rows(sql)
|
|
53
|
-
$sqls << sql
|
|
54
|
-
yield $cache_dataset_row
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def update(values)
|
|
58
|
-
$sqls << update_sql(values)
|
|
59
|
-
$cache_dataset_row.merge!(values)
|
|
60
|
-
1
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def delete
|
|
64
|
-
$sqls << delete_sql
|
|
65
|
-
1
|
|
66
|
-
end
|
|
67
|
-
})
|
|
46
|
+
@dataset._fetch = {:name => 'sharon', :id => 1}
|
|
47
|
+
@dataset.numrows = 1
|
|
68
48
|
|
|
69
49
|
@c2 = Class.new(@c) do
|
|
70
50
|
def self.name; 'SubItem' end
|
|
71
51
|
end
|
|
52
|
+
@c.db.reset
|
|
72
53
|
end
|
|
73
54
|
|
|
74
55
|
it "should set the model's cache store" do
|
|
@@ -101,7 +82,7 @@ describe Sequel::Model, "caching" do
|
|
|
101
82
|
Class.new(@c).cache_ttl.should == 1234
|
|
102
83
|
end
|
|
103
84
|
|
|
104
|
-
it "should generate a cache key appropriate to the class" do
|
|
85
|
+
it "should generate a cache key appropriate to the class via the Model#cache_key" do
|
|
105
86
|
m = @c.new
|
|
106
87
|
m.values[:id] = 1
|
|
107
88
|
m.cache_key.should == "#{m.class}:1"
|
|
@@ -133,6 +114,11 @@ describe Sequel::Model, "caching" do
|
|
|
133
114
|
m.values[:b] = 789
|
|
134
115
|
m.cache_key.should == "#{m.class}:123,789,456"
|
|
135
116
|
end
|
|
117
|
+
|
|
118
|
+
it "should generate a cache key via the Model.cache_key method" do
|
|
119
|
+
@c.cache_key(1).should == "#{@c}:1"
|
|
120
|
+
@c.cache_key([1, 2]).should == "#{@c}:1,2"
|
|
121
|
+
end
|
|
136
122
|
|
|
137
123
|
it "should raise error if attempting to generate cache_key and primary key value is null" do
|
|
138
124
|
m = @c.new
|
|
@@ -154,27 +140,31 @@ describe Sequel::Model, "caching" do
|
|
|
154
140
|
end
|
|
155
141
|
|
|
156
142
|
it "should set the cache when reading from the database" do
|
|
157
|
-
|
|
143
|
+
@c.db.sqls.should == []
|
|
158
144
|
@cache.should be_empty
|
|
159
145
|
|
|
160
146
|
m = @c[1]
|
|
161
|
-
|
|
162
|
-
m.values.should ==
|
|
147
|
+
@c.db.sqls.should == ['SELECT * FROM items WHERE id = 1']
|
|
148
|
+
m.values.should == {:name=>"sharon", :id=>1}
|
|
163
149
|
@cache[m.cache_key].should == m
|
|
164
150
|
m2 = @c[1]
|
|
165
|
-
|
|
151
|
+
@c.db.sqls.should == []
|
|
166
152
|
m2.should == m
|
|
167
|
-
m2.values.should ==
|
|
153
|
+
m2.values.should == {:name=>"sharon", :id=>1}
|
|
168
154
|
|
|
169
|
-
$sqls.clear
|
|
170
155
|
m = @c2[1]
|
|
171
|
-
|
|
172
|
-
m.values.should ==
|
|
156
|
+
@c.db.sqls.should == ['SELECT * FROM items WHERE id = 1']
|
|
157
|
+
m.values.should == {:name=>"sharon", :id=>1}
|
|
173
158
|
@cache[m.cache_key].should == m
|
|
174
159
|
m2 = @c2[1]
|
|
175
|
-
|
|
160
|
+
@c.db.sqls.should == []
|
|
176
161
|
m2.should == m
|
|
177
|
-
m2.values.should ==
|
|
162
|
+
m2.values.should == {:name=>"sharon", :id=>1}
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "should handle lookups by nil primary keys" do
|
|
166
|
+
@c[nil].should == nil
|
|
167
|
+
@c.db.sqls.should == []
|
|
178
168
|
end
|
|
179
169
|
|
|
180
170
|
it "should delete the cache when writing to the database" do
|
|
@@ -183,14 +173,14 @@ describe Sequel::Model, "caching" do
|
|
|
183
173
|
m.name = 'hey'
|
|
184
174
|
m.save
|
|
185
175
|
@cache.has_key?(m.cache_key).should be_false
|
|
186
|
-
|
|
176
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
|
|
187
177
|
|
|
188
178
|
m = @c2[1]
|
|
189
179
|
@cache[m.cache_key].should == m
|
|
190
180
|
m.name = 'hey'
|
|
191
181
|
m.save
|
|
192
182
|
@cache.has_key?(m.cache_key).should be_false
|
|
193
|
-
|
|
183
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "UPDATE items SET name = 'hey' WHERE (id = 1)"]
|
|
194
184
|
end
|
|
195
185
|
|
|
196
186
|
it "should delete the cache when deleting the record" do
|
|
@@ -198,40 +188,33 @@ describe Sequel::Model, "caching" do
|
|
|
198
188
|
@cache[m.cache_key].should == m
|
|
199
189
|
m.delete
|
|
200
190
|
@cache.has_key?(m.cache_key).should be_false
|
|
201
|
-
|
|
191
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
|
|
202
192
|
|
|
203
193
|
m = @c2[1]
|
|
204
194
|
@cache[m.cache_key].should == m
|
|
205
195
|
m.delete
|
|
206
196
|
@cache.has_key?(m.cache_key).should be_false
|
|
207
|
-
|
|
197
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1", "DELETE FROM items WHERE id = 1"]
|
|
208
198
|
end
|
|
209
199
|
|
|
210
200
|
it "should support #[] as a shortcut to #find with hash" do
|
|
211
201
|
m = @c[:id => 3]
|
|
212
202
|
@cache[m.cache_key].should be_nil
|
|
213
|
-
|
|
203
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
|
214
204
|
m = @c[1]
|
|
215
205
|
@cache[m.cache_key].should == m
|
|
216
|
-
|
|
217
|
-
"SELECT * FROM items WHERE (id = 1) LIMIT 1"]
|
|
206
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1"]
|
|
218
207
|
@c[:id => 4]
|
|
219
|
-
|
|
220
|
-
"SELECT * FROM items WHERE (id = 1) LIMIT 1", \
|
|
221
|
-
"SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
208
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
222
209
|
|
|
223
|
-
$sqls.clear
|
|
224
210
|
m = @c2[:id => 3]
|
|
225
211
|
@cache[m.cache_key].should be_nil
|
|
226
|
-
|
|
212
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
|
227
213
|
m = @c2[1]
|
|
228
214
|
@cache[m.cache_key].should == m
|
|
229
|
-
|
|
230
|
-
"SELECT * FROM items WHERE (id = 1) LIMIT 1"]
|
|
215
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE id = 1"]
|
|
231
216
|
@c2[:id => 4]
|
|
232
|
-
|
|
233
|
-
"SELECT * FROM items WHERE (id = 1) LIMIT 1", \
|
|
234
|
-
"SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
217
|
+
@c.db.sqls.should == ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
|
235
218
|
end
|
|
236
219
|
|
|
237
220
|
it "should support ignore_exception option" do
|
|
@@ -245,6 +228,19 @@ describe Sequel::Model, "caching" do
|
|
|
245
228
|
end
|
|
246
229
|
|
|
247
230
|
it "should rescue an exception if cache_store is memcached and ignore_exception is enabled" do
|
|
248
|
-
@c4[1].values.should ==
|
|
231
|
+
@c4[1].values.should == {:name => 'sharon', :id => 1}
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it "should support Model.cache_get_pk for getting a value from the cache by primary key" do
|
|
235
|
+
@c.cache_get_pk(1).should == nil
|
|
236
|
+
m = @c[1]
|
|
237
|
+
@c.cache_get_pk(1).should == m
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should support Model.cache_delete_pk for removing a value from the cache by primary key" do
|
|
241
|
+
@c[1]
|
|
242
|
+
@c.cache_get_pk(1).should_not == nil
|
|
243
|
+
@c.cache_delete_pk(1).should == nil
|
|
244
|
+
@c.cache_get_pk(1).should == nil
|
|
249
245
|
end
|
|
250
246
|
end
|
|
@@ -2,17 +2,16 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe "class_table_inheritance plugin" do
|
|
4
4
|
before do
|
|
5
|
-
@db =
|
|
6
|
-
def db.schema(table, opts={})
|
|
5
|
+
@db = Sequel.mock(:autoid=>proc{|sql| 1})
|
|
6
|
+
def @db.schema(table, opts={})
|
|
7
7
|
{:employees=>[[:id, {:primary_key=>true, :type=>:integer}], [:name, {:type=>:string}], [:kind, {:type=>:string}]],
|
|
8
8
|
:managers=>[[:id, {:type=>:integer}], [:num_staff, {:type=>:integer}]],
|
|
9
9
|
:executives=>[[:id, {:type=>:integer}], [:num_managers, {:type=>:integer}]],
|
|
10
10
|
:staff=>[[:id, {:type=>:integer}], [:manager_id, {:type=>:integer}]],
|
|
11
|
-
}[table]
|
|
11
|
+
}[table.is_a?(Sequel::Dataset) ? table.first_source_table : table]
|
|
12
12
|
end
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def ds.columns
|
|
13
|
+
@db.extend_datasets do
|
|
14
|
+
def columns
|
|
16
15
|
{[:employees]=>[:id, :name, :kind],
|
|
17
16
|
[:managers]=>[:id, :num_staff],
|
|
18
17
|
[:executives]=>[:id, :num_managers],
|
|
@@ -22,13 +21,8 @@ describe "class_table_inheritance plugin" do
|
|
|
22
21
|
[:employees, :staff]=>[:id, :name, :kind, :manager_id],
|
|
23
22
|
}[opts[:from] + (opts[:join] || []).map{|x| x.table}]
|
|
24
23
|
end
|
|
25
|
-
def ds.insert(*args)
|
|
26
|
-
db << insert_sql(*args)
|
|
27
|
-
1
|
|
28
|
-
end
|
|
29
|
-
ds
|
|
30
24
|
end
|
|
31
|
-
class ::Employee < Sequel::Model(db)
|
|
25
|
+
class ::Employee < Sequel::Model(@db)
|
|
32
26
|
def _refresh(x); @values[:id] = 1 end
|
|
33
27
|
def self.columns
|
|
34
28
|
dataset.columns
|
|
@@ -44,7 +38,7 @@ describe "class_table_inheritance plugin" do
|
|
|
44
38
|
many_to_one :manager
|
|
45
39
|
end
|
|
46
40
|
@ds = Employee.dataset
|
|
47
|
-
@db.
|
|
41
|
+
@db.sqls
|
|
48
42
|
end
|
|
49
43
|
after do
|
|
50
44
|
Object.send(:remove_const, :Executive)
|
|
@@ -53,8 +47,8 @@ describe "class_table_inheritance plugin" do
|
|
|
53
47
|
Object.send(:remove_const, :Employee)
|
|
54
48
|
end
|
|
55
49
|
|
|
56
|
-
specify "should have simple_table = nil" do
|
|
57
|
-
Employee.simple_table.should ==
|
|
50
|
+
specify "should have simple_table = nil for subclasses" do
|
|
51
|
+
Employee.simple_table.should == "employees"
|
|
58
52
|
Manager.simple_table.should == nil
|
|
59
53
|
Executive.simple_table.should == nil
|
|
60
54
|
Staff.simple_table.should == nil
|
|
@@ -68,33 +62,18 @@ describe "class_table_inheritance plugin" do
|
|
|
68
62
|
end
|
|
69
63
|
|
|
70
64
|
it "should return rows with the correct class based on the polymorphic_key value" do
|
|
71
|
-
|
|
72
|
-
yield({:kind=>'Employee'})
|
|
73
|
-
yield({:kind=>'Manager'})
|
|
74
|
-
yield({:kind=>'Executive'})
|
|
75
|
-
yield({:kind=>'Staff'})
|
|
76
|
-
end
|
|
65
|
+
@ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Staff'}]
|
|
77
66
|
Employee.all.collect{|x| x.class}.should == [Employee, Manager, Executive, Staff]
|
|
78
67
|
end
|
|
79
68
|
|
|
80
69
|
it "should return rows with the correct class based on the polymorphic_key value for subclasses" do
|
|
81
|
-
|
|
82
|
-
def ds.fetch_rows(sql)
|
|
83
|
-
yield({:kind=>'Manager'})
|
|
84
|
-
yield({:kind=>'Executive'})
|
|
85
|
-
end
|
|
70
|
+
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
|
|
86
71
|
Manager.all.collect{|x| x.class}.should == [Manager, Executive]
|
|
87
72
|
end
|
|
88
73
|
|
|
89
74
|
it "should return rows with the current class if cti_key is nil" do
|
|
90
75
|
Employee.plugin(:class_table_inheritance)
|
|
91
|
-
ds = Employee
|
|
92
|
-
def ds.fetch_rows(sql)
|
|
93
|
-
yield({:kind=>'Employee'})
|
|
94
|
-
yield({:kind=>'Manager'})
|
|
95
|
-
yield({:kind=>'Executive'})
|
|
96
|
-
yield({:kind=>'Staff'})
|
|
97
|
-
end
|
|
76
|
+
@ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Staff'}]
|
|
98
77
|
Employee.all.collect{|x| x.class}.should == [Employee, Employee, Employee, Employee]
|
|
99
78
|
end
|
|
100
79
|
|
|
@@ -102,35 +81,19 @@ describe "class_table_inheritance plugin" do
|
|
|
102
81
|
Employee.plugin(:class_table_inheritance)
|
|
103
82
|
Object.send(:remove_const, :Executive)
|
|
104
83
|
Object.send(:remove_const, :Manager)
|
|
105
|
-
class ::Manager < Employee
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
end
|
|
109
|
-
ds = Manager.dataset
|
|
110
|
-
def ds.fetch_rows(sql)
|
|
111
|
-
yield({:kind=>'Manager'})
|
|
112
|
-
yield({:kind=>'Executive'})
|
|
113
|
-
end
|
|
84
|
+
class ::Manager < Employee; end
|
|
85
|
+
class ::Executive < Manager; end
|
|
86
|
+
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
|
|
114
87
|
Manager.all.collect{|x| x.class}.should == [Manager, Manager]
|
|
115
88
|
end
|
|
116
89
|
|
|
117
90
|
it "should fallback to the main class if the given class does not exist" do
|
|
118
|
-
|
|
119
|
-
yield({:kind=>'Employee'})
|
|
120
|
-
yield({:kind=>'Manager'})
|
|
121
|
-
yield({:kind=>'Blah'})
|
|
122
|
-
yield({:kind=>'Staff'})
|
|
123
|
-
end
|
|
91
|
+
@ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]
|
|
124
92
|
Employee.all.collect{|x| x.class}.should == [Employee, Manager, Employee, Staff]
|
|
125
93
|
end
|
|
126
94
|
|
|
127
95
|
it "should fallback to the main class if the given class does not exist in subclasses" do
|
|
128
|
-
|
|
129
|
-
def ds.fetch_rows(sql)
|
|
130
|
-
yield({:kind=>'Manager'})
|
|
131
|
-
yield({:kind=>'Executive'})
|
|
132
|
-
yield({:kind=>'Blah'})
|
|
133
|
-
end
|
|
96
|
+
Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Blah'}]
|
|
134
97
|
Manager.all.collect{|x| x.class}.should == [Manager, Executive, Manager]
|
|
135
98
|
end
|
|
136
99
|
|
|
@@ -167,19 +130,10 @@ describe "class_table_inheritance plugin" do
|
|
|
167
130
|
end
|
|
168
131
|
|
|
169
132
|
it "should lazily load attributes for columns in subclass tables" do
|
|
170
|
-
|
|
171
|
-
def ds.fetch_rows(sql)
|
|
172
|
-
@db << sql
|
|
173
|
-
yield({:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2})
|
|
174
|
-
end
|
|
133
|
+
Manager.instance_dataset._fetch = Manager.dataset._fetch = {:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2}
|
|
175
134
|
m = Manager[1]
|
|
176
135
|
@db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (id = 1) LIMIT 1']
|
|
177
|
-
|
|
178
|
-
ds = Executive.dataset
|
|
179
|
-
def ds.fetch_rows(sql)
|
|
180
|
-
@db << sql
|
|
181
|
-
yield({:num_managers=>3})
|
|
182
|
-
end
|
|
136
|
+
Executive.instance_dataset._fetch = Executive.dataset._fetch = {:num_managers=>3}
|
|
183
137
|
m.num_managers.should == 3
|
|
184
138
|
@db.sqls.should == ['SELECT num_managers FROM employees INNER JOIN managers USING (id) INNER JOIN executives USING (id) WHERE (id = 1) LIMIT 1']
|
|
185
139
|
m.values.should == {:id=>1, :name=>'J', :kind=>'Executive', :num_staff=>2, :num_managers=>3}
|
|
@@ -210,20 +164,22 @@ describe "class_table_inheritance plugin" do
|
|
|
210
164
|
|
|
211
165
|
it "should insert the correct rows into all tables when inserting" do
|
|
212
166
|
Executive.create(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
213
|
-
@db.sqls
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
167
|
+
sqls = @db.sqls
|
|
168
|
+
sqls.length.should == 3
|
|
169
|
+
sqls[0].should =~ /INSERT INTO employees \((name|kind), (name|kind)\) VALUES \('(E|Executive)', '(E|Executive)'\)/
|
|
170
|
+
sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \([12], [12]\)/
|
|
171
|
+
sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/
|
|
217
172
|
end
|
|
218
173
|
|
|
219
174
|
it "should insert the correct rows into all tables with a given primary key" do
|
|
220
175
|
e = Executive.new(:num_managers=>3, :num_staff=>2, :name=>'E')
|
|
221
176
|
e.id = 2
|
|
222
177
|
e.save
|
|
223
|
-
@db.sqls
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
178
|
+
sqls = @db.sqls
|
|
179
|
+
sqls.length.should == 3
|
|
180
|
+
sqls[0].should =~ /INSERT INTO employees \((name|kind|id), (name|kind|id), (name|kind|id)\) VALUES \(('E'|'Executive'|2), ('E'|'Executive'|2), ('E'|'Executive'|2)\)/
|
|
181
|
+
sqls[1].should =~ /INSERT INTO managers \((num_staff|id), (num_staff|id)\) VALUES \(2, 2\)/
|
|
182
|
+
sqls[2].should =~ /INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([23], [23]\)/
|
|
227
183
|
end
|
|
228
184
|
|
|
229
185
|
it "should update the correct rows in all tables when updating" do
|
|
@@ -232,21 +188,13 @@ describe "class_table_inheritance plugin" do
|
|
|
232
188
|
end
|
|
233
189
|
|
|
234
190
|
it "should handle many_to_one relationships correctly" do
|
|
235
|
-
|
|
236
|
-
def ds.fetch_rows(sql)
|
|
237
|
-
@db << sql
|
|
238
|
-
yield({:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3})
|
|
239
|
-
end
|
|
191
|
+
Manager.dataset._fetch = {:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3}
|
|
240
192
|
Staff.load(:manager_id=>3).manager.should == Executive.load(:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3)
|
|
241
193
|
@db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (managers.id = 3) LIMIT 1']
|
|
242
194
|
end
|
|
243
195
|
|
|
244
196
|
it "should handle one_to_many relationships correctly" do
|
|
245
|
-
|
|
246
|
-
def ds.fetch_rows(sql)
|
|
247
|
-
@db << sql
|
|
248
|
-
yield({:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3})
|
|
249
|
-
end
|
|
197
|
+
Staff.dataset._fetch = {:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3}
|
|
250
198
|
Executive.load(:id=>3).staff_members.should == [Staff.load(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)]
|
|
251
199
|
@db.sqls.should == ['SELECT * FROM employees INNER JOIN staff USING (id) WHERE (staff.manager_id = 3)']
|
|
252
200
|
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Sequel::Dataset.introspect_all_columns" do
|
|
4
|
+
before do
|
|
5
|
+
@db = MODEL_DB
|
|
6
|
+
@ds = @db[:a]
|
|
7
|
+
class Sequel::Dataset
|
|
8
|
+
# Handle case where introspect_all_columns has already been called
|
|
9
|
+
alias columns columns_without_introspection unless instance_methods(false).map{|x| x.to_s}.include?('columns')
|
|
10
|
+
end
|
|
11
|
+
Sequel::Dataset.introspect_all_columns
|
|
12
|
+
@db.reset
|
|
13
|
+
end
|
|
14
|
+
after do
|
|
15
|
+
class Sequel::Dataset
|
|
16
|
+
alias columns columns_without_introspection
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
specify "should turn on column introspection by default" do
|
|
21
|
+
@ds.select(:x).columns.should == [:x]
|
|
22
|
+
@db.sqls.length.should == 0
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "columns_introspection extension" do
|
|
27
|
+
before do
|
|
28
|
+
@db = MODEL_DB
|
|
29
|
+
@ds = @db[:a]
|
|
30
|
+
@ds.extend(Sequel::ColumnsIntrospection.dup) # dup to allow multiple places in class hierarchy
|
|
31
|
+
@db.reset
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
specify "should not issue a database query if the columns are already loaded" do
|
|
35
|
+
@ds.instance_variable_set(:@columns, [:x])
|
|
36
|
+
@ds.columns.should == [:x]
|
|
37
|
+
@db.sqls.length.should == 0
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
specify "should handle plain symbols without a database query" do
|
|
41
|
+
@ds.select(:x).columns.should == [:x]
|
|
42
|
+
@db.sqls.length.should == 0
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
specify "should handle qualified symbols without a database query" do
|
|
46
|
+
@ds.select(:t__x).columns.should == [:x]
|
|
47
|
+
@db.sqls.length.should == 0
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
specify "should handle aliased symbols without a database query" do
|
|
51
|
+
@ds.select(:x___a).columns.should == [:a]
|
|
52
|
+
@db.sqls.length.should == 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
specify "should handle qualified and aliased symbols without a database query" do
|
|
56
|
+
@ds.select(:t__x___a).columns.should == [:a]
|
|
57
|
+
@db.sqls.length.should == 0
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
specify "should handle SQL::Identifiers " do
|
|
61
|
+
@ds.select(Sequel.identifier(:x)).columns.should == [:x]
|
|
62
|
+
@db.sqls.length.should == 0
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
specify "should handle SQL::QualifiedIdentifiers" do
|
|
66
|
+
@ds.select(Sequel.qualify(:t, :x)).columns.should == [:x]
|
|
67
|
+
@ds.select(Sequel.identifier(:x).qualify(:t)).columns.should == [:x]
|
|
68
|
+
@db.sqls.length.should == 0
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
specify "should handle SQL::AliasedExpressions" do
|
|
72
|
+
@ds.select(Sequel.as(:x, :a)).columns.should == [:a]
|
|
73
|
+
@ds.select(Sequel.as(:x, Sequel.identifier(:a))).columns.should == [:a]
|
|
74
|
+
@db.sqls.length.should == 0
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
specify "should issue a database query if the wildcard is selected" do
|
|
78
|
+
@ds.columns
|
|
79
|
+
@db.sqls.length.should == 1
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
specify "should issue a database query if an unsupported type is used" do
|
|
83
|
+
@ds.select(1).columns
|
|
84
|
+
@db.sqls.length.should == 1
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
specify "should not have column introspection on by default" do
|
|
88
|
+
@db[:a].select(:x).columns
|
|
89
|
+
@db.sqls.length.should == 1
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -48,9 +48,10 @@ describe "Composition plugin" do
|
|
|
48
48
|
@c.composition :date, :composer=>proc{Date.new(year+1, month+2, day+3)}, :decomposer=>proc{[:year, :month, :day].each{|s| self.send("#{s}=", date.send(s) * 2)}}
|
|
49
49
|
@o.date.should == Date.new(2, 4, 6)
|
|
50
50
|
@o.save
|
|
51
|
-
MODEL_DB.sqls.last
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
sql = MODEL_DB.sqls.last
|
|
52
|
+
sql.should include("year = 4")
|
|
53
|
+
sql.should include("month = 8")
|
|
54
|
+
sql.should include("day = 12")
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
it "should allow call super in composition getter and setter method definition in class" do
|
|
@@ -139,8 +140,9 @@ describe "Composition plugin" do
|
|
|
139
140
|
@o.date.month.should == 6
|
|
140
141
|
@o.date = c.new(3, 4)
|
|
141
142
|
@o.save
|
|
142
|
-
MODEL_DB.sqls.last
|
|
143
|
-
|
|
143
|
+
sql = MODEL_DB.sqls.last
|
|
144
|
+
sql.should include("year = 6")
|
|
145
|
+
sql.should include("month = 12")
|
|
144
146
|
end
|
|
145
147
|
|
|
146
148
|
it ":mapping option should work with an array of two pairs of symbols" do
|
|
@@ -160,8 +162,9 @@ describe "Composition plugin" do
|
|
|
160
162
|
@o.date.m.should == 6
|
|
161
163
|
@o.date = c.new(3, 4)
|
|
162
164
|
@o.save
|
|
163
|
-
MODEL_DB.sqls.last
|
|
164
|
-
|
|
165
|
+
sql = MODEL_DB.sqls.last
|
|
166
|
+
sql.should include("year = 6")
|
|
167
|
+
sql.should include("month = 12")
|
|
165
168
|
end
|
|
166
169
|
|
|
167
170
|
it ":mapping option :composer should return nil if all values are nil" do
|
|
@@ -173,9 +176,10 @@ describe "Composition plugin" do
|
|
|
173
176
|
@c.composition :date, :mapping=>[:year, :month, :day]
|
|
174
177
|
@o.date = nil
|
|
175
178
|
@o.save
|
|
176
|
-
MODEL_DB.sqls.last
|
|
177
|
-
|
|
178
|
-
|
|
179
|
+
sql = MODEL_DB.sqls.last
|
|
180
|
+
sql.should include("year = NULL")
|
|
181
|
+
sql.should include("month = NULL")
|
|
182
|
+
sql.should include("day = NULL")
|
|
179
183
|
end
|
|
180
184
|
|
|
181
185
|
it "should work correctly with subclasses" do
|
|
@@ -184,8 +188,9 @@ describe "Composition plugin" do
|
|
|
184
188
|
o = c.load(:id=>1, :year=>1, :month=>2, :day=>3)
|
|
185
189
|
o.date.should == Date.new(1, 2, 3)
|
|
186
190
|
o.save
|
|
187
|
-
MODEL_DB.sqls.last
|
|
188
|
-
|
|
189
|
-
|
|
191
|
+
sql = MODEL_DB.sqls.last
|
|
192
|
+
sql.should include("year = 1")
|
|
193
|
+
sql.should include("month = 2")
|
|
194
|
+
sql.should include("day = 3")
|
|
190
195
|
end
|
|
191
196
|
end
|