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
data/spec/core/core_sql_spec.rb
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
2
|
-
|
|
3
|
-
describe "Array#all_two_pairs?" do
|
|
4
|
-
specify "should return false if empty" do
|
|
5
|
-
[].all_two_pairs?.should == false
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
specify "should return false if any of the elements is not an array" do
|
|
9
|
-
[1].all_two_pairs?.should == false
|
|
10
|
-
[[1,2],1].all_two_pairs?.should == false
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
specify "should return false if any of the elements has a length other than two" do
|
|
14
|
-
[[1,2],[]].all_two_pairs?.should == false
|
|
15
|
-
[[1,2],[1]].all_two_pairs?.should == false
|
|
16
|
-
[[1,2],[1,2,3]].all_two_pairs?.should == false
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
specify "should return true if all of the elements are arrays with a length of two" do
|
|
20
|
-
[[1,2]].all_two_pairs?.should == true
|
|
21
|
-
[[1,2],[1,2]].all_two_pairs?.should == true
|
|
22
|
-
[[1,2],[1,2],[1,2]].all_two_pairs?.should == true
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
describe "Array#case and Hash#case" do
|
|
27
|
-
before do
|
|
28
|
-
@d = Sequel::Dataset.new(nil)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify "should return SQL CASE expression" do
|
|
32
|
-
@d.literal({:x=>:y}.case(:z)).should == '(CASE WHEN x THEN y ELSE z END)'
|
|
33
|
-
@d.literal({:x=>:y}.case(:z, :exp)).should == '(CASE exp WHEN x THEN y ELSE z END)'
|
|
34
|
-
['(CASE WHEN x THEN y WHEN a THEN b ELSE z END)',
|
|
35
|
-
'(CASE WHEN a THEN b WHEN x THEN y ELSE z END)'].should(include(@d.literal({:x=>:y, :a=>:b}.case(:z))))
|
|
36
|
-
@d.literal([[:x, :y]].case(:z)).should == '(CASE WHEN x THEN y ELSE z END)'
|
|
37
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z)).should == '(CASE WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
38
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z, :exp)).should == '(CASE exp WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
39
|
-
@d.literal([[:x, :y], [:a, :b]].case(:z, :exp__w)).should == '(CASE exp.w WHEN x THEN y WHEN a THEN b ELSE z END)'
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
specify "should return SQL CASE expression with expression even if nil" do
|
|
43
|
-
@d.literal({:x=>:y}.case(:z, nil)).should == '(CASE NULL WHEN x THEN y ELSE z END)'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
specify "should raise an error if an array that isn't all two pairs is used" do
|
|
47
|
-
proc{[:b].case(:a)}.should raise_error(Sequel::Error)
|
|
48
|
-
proc{[:b, :c].case(:a)}.should raise_error(Sequel::Error)
|
|
49
|
-
proc{[[:b, :c], :d].case(:a)}.should raise_error(Sequel::Error)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
specify "should raise an error if an empty array/hash is used" do
|
|
53
|
-
proc{[].case(:a)}.should raise_error(Sequel::Error)
|
|
54
|
-
proc{{}.case(:a)}.should raise_error(Sequel::Error)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
describe "Array#sql_value_list and #sql_array" do
|
|
59
|
-
before do
|
|
60
|
-
@d = Sequel::Dataset.new(nil)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
specify "should treat the array as an SQL value list instead of conditions when used as a placeholder value" do
|
|
64
|
-
@d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]]).sql.should == 'SELECT * WHERE ((a, b) IN ((x = 1) AND (y = 2)))'
|
|
65
|
-
@d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_value_list).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
66
|
-
@d.filter("(a, b) IN ?", [[:x, 1], [:y, 2]].sql_array).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
specify "should be no difference when used as a hash value" do
|
|
70
|
-
@d.filter([:a, :b]=>[[:x, 1], [:y, 2]]).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
71
|
-
@d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_value_list).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
72
|
-
@d.filter([:a, :b]=>[[:x, 1], [:y, 2]].sql_array).sql.should == 'SELECT * WHERE ((a, b) IN ((x, 1), (y, 2)))'
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
describe "String#lit" do
|
|
77
|
-
before do
|
|
78
|
-
@ds = ds = MockDatabase.new.dataset
|
|
79
|
-
end
|
|
80
|
-
specify "should return an LiteralString object" do
|
|
81
|
-
'xyz'.lit.should be_a_kind_of(Sequel::LiteralString)
|
|
82
|
-
'xyz'.lit.to_s.should == 'xyz'
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
specify "should inhibit string literalization" do
|
|
86
|
-
Sequel::Database.new[:t].update_sql(:stamp => "NOW()".lit).should == \
|
|
87
|
-
"UPDATE t SET stamp = NOW()"
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
specify "should return a PlaceholderLiteralString object if args are given" do
|
|
91
|
-
a = 'DISTINCT ?'.lit(:a)
|
|
92
|
-
a.should be_a_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
93
|
-
@ds.literal(a).should == 'DISTINCT a'
|
|
94
|
-
@ds.quote_identifiers = true
|
|
95
|
-
@ds.literal(a).should == 'DISTINCT "a"'
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
specify "should handle named placeholders if given a single argument hash" do
|
|
99
|
-
a = 'DISTINCT :b'.lit(:b=>:a)
|
|
100
|
-
a.should be_a_kind_of(Sequel::SQL::PlaceholderLiteralString)
|
|
101
|
-
@ds.literal(a).should == 'DISTINCT a'
|
|
102
|
-
@ds.quote_identifiers = true
|
|
103
|
-
@ds.literal(a).should == 'DISTINCT "a"'
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
specify "should treat placeholder literal strings as generic expressions" do
|
|
107
|
-
a = ':b'.lit(:b=>:a)
|
|
108
|
-
@ds.literal(a + 1).should == "(a + 1)"
|
|
109
|
-
@ds.literal(a & :b).should == "(a AND b)"
|
|
110
|
-
@ds.literal(a.sql_string + :b).should == "(a || b)"
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
describe "String#to_sequel_blob" do
|
|
115
|
-
specify "should return a Blob object" do
|
|
116
|
-
'xyz'.to_sequel_blob.should be_a_kind_of(::Sequel::SQL::Blob)
|
|
117
|
-
'xyz'.to_sequel_blob.should == 'xyz'
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
specify "should retain binary data" do
|
|
121
|
-
"\1\2\3\4".to_sequel_blob.should == "\1\2\3\4"
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
describe "#desc" do
|
|
126
|
-
before do
|
|
127
|
-
@ds = Sequel::Dataset.new(nil)
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
specify "should format a DESC clause for a column ref" do
|
|
131
|
-
:test.desc.to_s(@ds).should == 'test DESC'
|
|
132
|
-
|
|
133
|
-
:items__price.desc.to_s(@ds).should == 'items.price DESC'
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
specify "should format a DESC clause for a function" do
|
|
137
|
-
:avg.sql_function(:test).desc.to_s(@ds).should == 'avg(test) DESC'
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
describe "#asc" do
|
|
142
|
-
before do
|
|
143
|
-
@ds = Sequel::Dataset.new(nil)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
specify "should format a ASC clause for a column ref" do
|
|
147
|
-
:test.asc.to_s(@ds).should == 'test ASC'
|
|
148
|
-
|
|
149
|
-
:items__price.asc.to_s(@ds).should == 'items.price ASC'
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
specify "should format a ASC clause for a function" do
|
|
153
|
-
:avg.sql_function(:test).asc.to_s(@ds).should == 'avg(test) ASC'
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
describe "#as" do
|
|
158
|
-
before do
|
|
159
|
-
@ds = Sequel::Dataset.new(nil)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
specify "should format a AS clause for a column ref" do
|
|
163
|
-
:test.as(:t).to_s(@ds).should == 'test AS t'
|
|
164
|
-
|
|
165
|
-
:items__price.as(:p).to_s(@ds).should == 'items.price AS p'
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
specify "should format a AS clause for a function" do
|
|
169
|
-
:avg.sql_function(:test).as(:avg).to_s(@ds).should == 'avg(test) AS avg'
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
specify "should format a AS clause for a literal value" do
|
|
173
|
-
'abc'.as(:abc).to_s(@ds).should == "'abc' AS abc"
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
describe "Column references" do
|
|
178
|
-
before do
|
|
179
|
-
@c = Class.new(Sequel::Dataset) do
|
|
180
|
-
def quoted_identifier(c); "`#{c}`"; end
|
|
181
|
-
end
|
|
182
|
-
@ds = @c.new(MockDatabase.new)
|
|
183
|
-
@ds.quote_identifiers = true
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
specify "should be quoted properly" do
|
|
187
|
-
@ds.literal(:xyz).should == "`xyz`"
|
|
188
|
-
@ds.literal(:xyz__abc).should == "`xyz`.`abc`"
|
|
189
|
-
|
|
190
|
-
@ds.literal(:xyz.as(:x)).should == "`xyz` AS `x`"
|
|
191
|
-
@ds.literal(:xyz__abc.as(:x)).should == "`xyz`.`abc` AS `x`"
|
|
192
|
-
|
|
193
|
-
@ds.literal(:xyz___x).should == "`xyz` AS `x`"
|
|
194
|
-
@ds.literal(:xyz__abc___x).should == "`xyz`.`abc` AS `x`"
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
specify "should be quoted properly in SQL functions" do
|
|
198
|
-
@ds.literal(:avg.sql_function(:xyz)).should == "avg(`xyz`)"
|
|
199
|
-
@ds.literal(:avg.sql_function(:xyz, 1)).should == "avg(`xyz`, 1)"
|
|
200
|
-
@ds.literal(:avg.sql_function(:xyz).as(:a)).should == "avg(`xyz`) AS `a`"
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
specify "should be quoted properly in ASC/DESC clauses" do
|
|
204
|
-
@ds.literal(:xyz.asc).should == "`xyz` ASC"
|
|
205
|
-
@ds.literal(:avg.sql_function(:xyz, 1).desc).should == "avg(`xyz`, 1) DESC"
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
specify "should be quoted properly in a cast function" do
|
|
209
|
-
@ds.literal(:x.cast(:integer)).should == "CAST(`x` AS integer)"
|
|
210
|
-
@ds.literal(:x__y.cast('varchar(20)')).should == "CAST(`x`.`y` AS varchar(20))"
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
describe "Blob" do
|
|
215
|
-
specify "#to_sequel_blob should return self" do
|
|
216
|
-
blob = "x".to_sequel_blob
|
|
217
|
-
blob.to_sequel_blob.object_id.should == blob.object_id
|
|
218
|
-
end
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
if RUBY_VERSION < '1.9.0'
|
|
222
|
-
describe "Symbol#[]" do
|
|
223
|
-
specify "should format an SQL Function" do
|
|
224
|
-
ds = Sequel::Dataset.new(nil)
|
|
225
|
-
ds.literal(:xyz[]).should == 'xyz()'
|
|
226
|
-
ds.literal(:xyz[1]).should == 'xyz(1)'
|
|
227
|
-
ds.literal(:xyz[1, 2, :abc[3]]).should == 'xyz(1, 2, abc(3))'
|
|
228
|
-
end
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
describe "Symbol#*" do
|
|
233
|
-
before do
|
|
234
|
-
@ds = Sequel::Dataset.new(nil)
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
specify "should format a qualified wildcard if no argument" do
|
|
238
|
-
:xyz.*.to_s(@ds).should == 'xyz.*'
|
|
239
|
-
:abc.*.to_s(@ds).should == 'abc.*'
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
specify "should format a filter expression if an argument" do
|
|
243
|
-
:xyz.*(3).to_s(@ds).should == '(xyz * 3)'
|
|
244
|
-
:abc.*(5).to_s(@ds).should == '(abc * 5)'
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
specify "should support qualified symbols if no argument" do
|
|
248
|
-
:xyz__abc.*.to_s(@ds).should == 'xyz.abc.*'
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
describe "Symbol" do
|
|
253
|
-
before do
|
|
254
|
-
@ds = Sequel::Dataset.new(nil)
|
|
255
|
-
@ds.quote_identifiers = true
|
|
256
|
-
@ds.identifier_input_method = :upcase
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
specify "#identifier should format an identifier" do
|
|
260
|
-
@ds.literal(:xyz__abc.identifier).should == '"XYZ__ABC"'
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
specify "#qualify should format a qualified column" do
|
|
264
|
-
@ds.literal(:xyz.qualify(:abc)).should == '"ABC"."XYZ"'
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
specify "#qualify should work on QualifiedIdentifiers" do
|
|
268
|
-
@ds.literal(:xyz.qualify(:abc).qualify(:def)).should == '"DEF"."ABC"."XYZ"'
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
specify "should be able to qualify an identifier" do
|
|
272
|
-
@ds.literal(:xyz.identifier.qualify(:xyz__abc)).should == '"XYZ"."ABC"."XYZ"'
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
specify "should be able to specify a schema.table.column" do
|
|
276
|
-
@ds.literal(:column.qualify(:table.qualify(:schema))).should == '"SCHEMA"."TABLE"."COLUMN"'
|
|
277
|
-
@ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).should == '"SCHEMA"."TABLE__NAME"."COLUMN"'
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
specify "should be able to specify order" do
|
|
281
|
-
@oe = :xyz.desc
|
|
282
|
-
@oe.class.should == Sequel::SQL::OrderedExpression
|
|
283
|
-
@oe.descending.should == true
|
|
284
|
-
@oe = :xyz.asc
|
|
285
|
-
@oe.class.should == Sequel::SQL::OrderedExpression
|
|
286
|
-
@oe.descending.should == false
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
describe "Dataset#literal" do
|
|
291
|
-
before do
|
|
292
|
-
@ds = MockDataset.new(nil)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
specify "should convert qualified symbol notation into dot notation" do
|
|
296
|
-
@ds.literal(:abc__def).should == 'abc.def'
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
specify "should convert AS symbol notation into SQL AS notation" do
|
|
300
|
-
@ds.literal(:xyz___x).should == 'xyz AS x'
|
|
301
|
-
@ds.literal(:abc__def___x).should == 'abc.def AS x'
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
specify "should support names with digits" do
|
|
305
|
-
@ds.literal(:abc2).should == 'abc2'
|
|
306
|
-
@ds.literal(:xx__yy3).should == 'xx.yy3'
|
|
307
|
-
@ds.literal(:ab34__temp3_4ax).should == 'ab34.temp3_4ax'
|
|
308
|
-
@ds.literal(:x1___y2).should == 'x1 AS y2'
|
|
309
|
-
@ds.literal(:abc2__def3___ggg4).should == 'abc2.def3 AS ggg4'
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
specify "should support upper case and lower case" do
|
|
313
|
-
@ds.literal(:ABC).should == 'ABC'
|
|
314
|
-
@ds.literal(:Zvashtoy__aBcD).should == 'Zvashtoy.aBcD'
|
|
315
|
-
end
|
|
316
|
-
|
|
317
|
-
specify "should support spaces inside column names" do
|
|
318
|
-
@ds.quote_identifiers = true
|
|
319
|
-
@ds.literal(:"AB C").should == '"AB C"'
|
|
320
|
-
@ds.literal(:"Zvas htoy__aB cD").should == '"Zvas htoy"."aB cD"'
|
|
321
|
-
@ds.literal(:"aB cD___XX XX").should == '"aB cD" AS "XX XX"'
|
|
322
|
-
@ds.literal(:"Zva shtoy__aB cD___XX XX").should == '"Zva shtoy"."aB cD" AS "XX XX"'
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
describe "Symbol" do
|
|
327
|
-
before do
|
|
328
|
-
@ds = Sequel::Dataset.new(MockDatabase.new)
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
specify "should support upper case outer functions" do
|
|
332
|
-
:COUNT.sql_function('1').to_s(@ds).should == "COUNT('1')"
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
specify "should inhibit string literalization" do
|
|
336
|
-
db = Sequel::Database.new
|
|
337
|
-
ds = db[:t]
|
|
338
|
-
ds.select(:COUNT.sql_function('1')).sql.should == "SELECT COUNT('1') FROM t"
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
specify "should support cast method" do
|
|
342
|
-
:abc.cast(:integer).to_s(@ds).should == "CAST(abc AS integer)"
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
specify "should support sql array accesses via sql_subscript" do
|
|
346
|
-
@ds.literal(:abc.sql_subscript(1)).should == "abc[1]"
|
|
347
|
-
@ds.literal(:abc__def.sql_subscript(1)).should == "abc.def[1]"
|
|
348
|
-
@ds.literal(:abc.sql_subscript(1)|2).should == "abc[1, 2]"
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
specify "should support cast_numeric and cast_string" do
|
|
352
|
-
x = :abc.cast_numeric
|
|
353
|
-
x.should be_a_kind_of(Sequel::SQL::NumericExpression)
|
|
354
|
-
x.to_s(@ds).should == "CAST(abc AS integer)"
|
|
355
|
-
|
|
356
|
-
x = :abc.cast_numeric(:real)
|
|
357
|
-
x.should be_a_kind_of(Sequel::SQL::NumericExpression)
|
|
358
|
-
x.to_s(@ds).should == "CAST(abc AS real)"
|
|
359
|
-
|
|
360
|
-
x = :abc.cast_string
|
|
361
|
-
x.should be_a_kind_of(Sequel::SQL::StringExpression)
|
|
362
|
-
x.to_s(@ds).should == "CAST(abc AS varchar(255))"
|
|
363
|
-
|
|
364
|
-
x = :abc.cast_string(:varchar)
|
|
365
|
-
x.should be_a_kind_of(Sequel::SQL::StringExpression)
|
|
366
|
-
x.to_s(@ds).should == "CAST(abc AS varchar(255))"
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
specify "should allow database independent types when casting" do
|
|
370
|
-
m = MockDatabase.new
|
|
371
|
-
m.instance_eval do
|
|
372
|
-
def cast_type_literal(type)
|
|
373
|
-
return :foo if type == Integer
|
|
374
|
-
return :bar if type == String
|
|
375
|
-
type
|
|
376
|
-
end
|
|
377
|
-
end
|
|
378
|
-
@ds2 = Sequel::Dataset.new(m)
|
|
379
|
-
:abc.cast(String).to_s(@ds).should == "CAST(abc AS varchar(255))"
|
|
380
|
-
:abc.cast(String).to_s(@ds2).should == "CAST(abc AS bar)"
|
|
381
|
-
:abc.cast(String).to_s(@ds2).should == "CAST(abc AS bar)"
|
|
382
|
-
:abc.cast_string.to_s(@ds2).should == "CAST(abc AS bar)"
|
|
383
|
-
:abc.cast_string(Integer).to_s(@ds2).should == "CAST(abc AS foo)"
|
|
384
|
-
:abc.cast_numeric.to_s(@ds2).should == "CAST(abc AS foo)"
|
|
385
|
-
:abc.cast_numeric(String).to_s(@ds2).should == "CAST(abc AS bar)"
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
specify "should support SQL EXTRACT function via #extract " do
|
|
389
|
-
:abc.extract(:year).to_s(@ds).should == "extract(year FROM abc)"
|
|
390
|
-
end
|
|
391
|
-
end
|
|
392
|
-
|
|
393
|
-
describe "Sequel::SQL::Function#==" do
|
|
394
|
-
specify "should be true for functions with the same name and arguments, false otherwise" do
|
|
395
|
-
a = :date.sql_function(:t)
|
|
396
|
-
b = :date.sql_function(:t)
|
|
397
|
-
a.should == b
|
|
398
|
-
(a == b).should == true
|
|
399
|
-
c = :date.sql_function(:c)
|
|
400
|
-
a.should_not == c
|
|
401
|
-
(a == c).should == false
|
|
402
|
-
d = :time.sql_function(:c)
|
|
403
|
-
a.should_not == d
|
|
404
|
-
c.should_not == d
|
|
405
|
-
(a == d).should == false
|
|
406
|
-
(c == d).should == false
|
|
407
|
-
end
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
describe "Sequel::SQL::OrderedExpression" do
|
|
411
|
-
specify "should #desc" do
|
|
412
|
-
@oe = :column.asc
|
|
413
|
-
@oe.descending.should == false
|
|
414
|
-
@oe.desc.descending.should == true
|
|
415
|
-
end
|
|
416
|
-
|
|
417
|
-
specify "should #asc" do
|
|
418
|
-
@oe = :column.desc
|
|
419
|
-
@oe.descending.should == true
|
|
420
|
-
@oe.asc.descending.should == false
|
|
421
|
-
end
|
|
422
|
-
|
|
423
|
-
specify "should #invert" do
|
|
424
|
-
@oe = :column.desc
|
|
425
|
-
@oe.invert.descending.should == false
|
|
426
|
-
@oe.invert.invert.descending.should == true
|
|
427
|
-
end
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
describe "Expression" do
|
|
431
|
-
specify "should consider objects == only if they have the same attributes" do
|
|
432
|
-
:column.qualify(:table).cast(:type).*(:numeric_column).asc.should == :column.qualify(:table).cast(:type).*(:numeric_column).asc
|
|
433
|
-
:other_column.qualify(:table).cast(:type).*(:numeric_column).asc.should_not == :column.qualify(:table).cast(:type).*(:numeric_column).asc
|
|
434
|
-
|
|
435
|
-
:column.qualify(:table).cast(:type).*(:numeric_column).asc.should eql(:column.qualify(:table).cast(:type).*(:numeric_column).asc)
|
|
436
|
-
:other_column.qualify(:table).cast(:type).*(:numeric_column).asc.should_not eql(:column.qualify(:table).cast(:type).*(:numeric_column).asc)
|
|
437
|
-
end
|
|
438
|
-
|
|
439
|
-
specify "should use the same hash value for objects that have the same attributes" do
|
|
440
|
-
:column.qualify(:table).cast(:type).*(:numeric_column).asc.hash.should == :column.qualify(:table).cast(:type).*(:numeric_column).asc.hash
|
|
441
|
-
:other_column.qualify(:table).cast(:type).*(:numeric_column).asc.hash.should_not == :column.qualify(:table).cast(:type).*(:numeric_column).asc.hash
|
|
442
|
-
|
|
443
|
-
h = {}
|
|
444
|
-
a = :column.qualify(:table).cast(:type).*(:numeric_column).asc
|
|
445
|
-
b = :column.qualify(:table).cast(:type).*(:numeric_column).asc
|
|
446
|
-
h[a] = 1
|
|
447
|
-
h[b] = 2
|
|
448
|
-
h[a].should == 2
|
|
449
|
-
h[b].should == 2
|
|
450
|
-
end
|
|
451
|
-
end
|