sequel 3.48.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +114 -0
- data/Rakefile +10 -7
- data/doc/association_basics.rdoc +25 -23
- data/doc/code_order.rdoc +7 -0
- data/doc/core_extensions.rdoc +0 -10
- data/doc/object_model.rdoc +4 -1
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.0.0.txt +262 -0
- data/doc/security.rdoc +0 -28
- data/doc/testing.rdoc +8 -14
- data/lib/sequel/adapters/ado.rb +7 -11
- data/lib/sequel/adapters/ado/access.rb +8 -8
- data/lib/sequel/adapters/ado/mssql.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +7 -7
- data/lib/sequel/adapters/db2.rb +5 -9
- data/lib/sequel/adapters/dbi.rb +2 -6
- data/lib/sequel/adapters/do.rb +4 -4
- data/lib/sequel/adapters/firebird.rb +4 -4
- data/lib/sequel/adapters/ibmdb.rb +8 -8
- data/lib/sequel/adapters/informix.rb +2 -10
- data/lib/sequel/adapters/jdbc.rb +17 -17
- data/lib/sequel/adapters/jdbc/as400.rb +2 -2
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/informix.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
- data/lib/sequel/adapters/mock.rb +7 -7
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +4 -4
- data/lib/sequel/adapters/odbc.rb +2 -6
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -5
- data/lib/sequel/adapters/oracle.rb +13 -17
- data/lib/sequel/adapters/postgres.rb +20 -25
- data/lib/sequel/adapters/shared/cubrid.rb +3 -3
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/firebird.rb +7 -7
- data/lib/sequel/adapters/shared/mssql.rb +9 -9
- data/lib/sequel/adapters/shared/mysql.rb +29 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
- data/lib/sequel/adapters/shared/oracle.rb +22 -13
- data/lib/sequel/adapters/shared/postgres.rb +61 -46
- data/lib/sequel/adapters/shared/sqlite.rb +9 -9
- data/lib/sequel/adapters/sqlite.rb +17 -11
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +8 -8
- data/lib/sequel/ast_transformer.rb +3 -1
- data/lib/sequel/connection_pool.rb +4 -2
- data/lib/sequel/connection_pool/sharded_single.rb +2 -2
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
- data/lib/sequel/connection_pool/threaded.rb +7 -7
- data/lib/sequel/core.rb +4 -67
- data/lib/sequel/database.rb +1 -0
- data/lib/sequel/database/connecting.rb +2 -8
- data/lib/sequel/database/dataset.rb +2 -7
- data/lib/sequel/database/dataset_defaults.rb +0 -18
- data/lib/sequel/database/features.rb +4 -4
- data/lib/sequel/database/misc.rb +6 -8
- data/lib/sequel/database/query.rb +5 -61
- data/lib/sequel/database/schema_generator.rb +22 -20
- data/lib/sequel/database/schema_methods.rb +48 -20
- data/lib/sequel/database/transactions.rb +7 -17
- data/lib/sequel/dataset.rb +2 -0
- data/lib/sequel/dataset/actions.rb +23 -91
- data/lib/sequel/dataset/features.rb +1 -4
- data/lib/sequel/dataset/graph.rb +3 -47
- data/lib/sequel/dataset/misc.rb +4 -33
- data/lib/sequel/dataset/prepared_statements.rb +3 -1
- data/lib/sequel/dataset/query.rb +116 -240
- data/lib/sequel/dataset/sql.rb +19 -97
- data/lib/sequel/deprecated.rb +0 -16
- data/lib/sequel/exceptions.rb +0 -3
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -12
- data/lib/sequel/extensions/constraint_validations.rb +3 -3
- data/lib/sequel/extensions/core_extensions.rb +0 -9
- data/lib/sequel/extensions/date_arithmetic.rb +1 -2
- data/lib/sequel/extensions/graph_each.rb +11 -0
- data/lib/sequel/extensions/migration.rb +5 -5
- data/lib/sequel/extensions/null_dataset.rb +11 -13
- data/lib/sequel/extensions/pagination.rb +3 -6
- data/lib/sequel/extensions/pg_array.rb +6 -4
- data/lib/sequel/extensions/pg_array_ops.rb +35 -1
- data/lib/sequel/extensions/pg_json.rb +12 -2
- data/lib/sequel/extensions/pg_json_ops.rb +266 -0
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_range_ops.rb +0 -8
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pretty_table.rb +0 -4
- data/lib/sequel/extensions/query.rb +3 -8
- data/lib/sequel/extensions/schema_caching.rb +0 -7
- data/lib/sequel/extensions/schema_dumper.rb +10 -17
- data/lib/sequel/extensions/select_remove.rb +0 -4
- data/lib/sequel/extensions/set_overrides.rb +28 -0
- data/lib/sequel/extensions/to_dot.rb +6 -10
- data/lib/sequel/model.rb +6 -7
- data/lib/sequel/model/associations.rb +127 -182
- data/lib/sequel/model/base.rb +88 -211
- data/lib/sequel/model/errors.rb +0 -13
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/after_initialize.rb +11 -17
- data/lib/sequel/plugins/association_autoreloading.rb +1 -47
- data/lib/sequel/plugins/association_dependencies.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +2 -8
- data/lib/sequel/plugins/blacklist_security.rb +32 -2
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/composition.rb +10 -8
- data/lib/sequel/plugins/constraint_validations.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +4 -0
- data/lib/sequel/plugins/defaults_setter.rb +8 -6
- data/lib/sequel/plugins/dirty.rb +6 -6
- data/lib/sequel/plugins/force_encoding.rb +13 -8
- data/lib/sequel/plugins/hook_class_methods.rb +1 -7
- data/lib/sequel/plugins/json_serializer.rb +13 -74
- data/lib/sequel/plugins/lazy_attributes.rb +2 -4
- data/lib/sequel/plugins/list.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +4 -11
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/optimistic_locking.rb +3 -5
- data/lib/sequel/plugins/pg_array_associations.rb +453 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +5 -4
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +7 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -2
- data/lib/sequel/plugins/tree.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +19 -4
- data/lib/sequel/plugins/validation_class_methods.rb +0 -30
- data/lib/sequel/plugins/validation_helpers.rb +13 -31
- data/lib/sequel/plugins/xml_serializer.rb +18 -57
- data/lib/sequel/sql.rb +20 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/db2_spec.rb +14 -23
- data/spec/adapters/firebird_spec.rb +25 -29
- data/spec/adapters/informix_spec.rb +11 -14
- data/spec/adapters/mssql_spec.rb +71 -77
- data/spec/adapters/mysql_spec.rb +165 -172
- data/spec/adapters/oracle_spec.rb +36 -39
- data/spec/adapters/postgres_spec.rb +175 -100
- data/spec/adapters/spec_helper.rb +13 -11
- data/spec/adapters/sqlite_spec.rb +36 -44
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +55 -55
- data/spec/core/dataset_spec.rb +45 -249
- data/spec/core/deprecated_spec.rb +0 -8
- data/spec/core/expression_filters_spec.rb +23 -5
- data/spec/core/object_graph_spec.rb +4 -66
- data/spec/core/schema_spec.rb +35 -12
- data/spec/core/spec_helper.rb +3 -2
- data/spec/core_extensions_spec.rb +17 -19
- data/spec/extensions/arbitrary_servers_spec.rb +2 -3
- data/spec/extensions/association_dependencies_spec.rb +14 -14
- data/spec/extensions/auto_validations_spec.rb +7 -0
- data/spec/extensions/blacklist_security_spec.rb +5 -5
- data/spec/extensions/blank_spec.rb +2 -0
- data/spec/extensions/class_table_inheritance_spec.rb +2 -2
- data/spec/extensions/columns_introspection_spec.rb +2 -29
- data/spec/extensions/composition_spec.rb +10 -17
- data/spec/extensions/core_refinements_spec.rb +5 -1
- data/spec/extensions/dataset_associations_spec.rb +18 -0
- data/spec/extensions/date_arithmetic_spec.rb +2 -2
- data/spec/extensions/defaults_setter_spec.rb +9 -9
- data/spec/extensions/dirty_spec.rb +0 -5
- data/spec/extensions/eval_inspect_spec.rb +2 -0
- data/spec/extensions/force_encoding_spec.rb +2 -18
- data/spec/extensions/hash_aliases_spec.rb +8 -0
- data/spec/extensions/hook_class_methods_spec.rb +39 -58
- data/spec/extensions/inflector_spec.rb +2 -0
- data/spec/extensions/instance_filters_spec.rb +8 -8
- data/spec/extensions/json_serializer_spec.rb +1 -41
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +106 -109
- data/spec/extensions/migration_spec.rb +2 -0
- data/spec/extensions/named_timezones_spec.rb +1 -0
- data/spec/extensions/pg_array_associations_spec.rb +603 -0
- data/spec/extensions/pg_array_ops_spec.rb +25 -0
- data/spec/extensions/pg_array_spec.rb +9 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
- data/spec/extensions/pg_hstore_spec.rb +1 -0
- data/spec/extensions/pg_json_ops_spec.rb +131 -0
- data/spec/extensions/pg_json_spec.rb +10 -4
- data/spec/extensions/pg_range_ops_spec.rb +2 -5
- data/spec/extensions/pg_range_spec.rb +6 -2
- data/spec/extensions/pg_row_ops_spec.rb +2 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
- data/spec/extensions/rcte_tree_spec.rb +15 -15
- data/spec/extensions/schema_dumper_spec.rb +0 -1
- data/spec/extensions/schema_spec.rb +9 -9
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +18 -29
- data/spec/extensions/set_overrides_spec.rb +4 -0
- data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
- data/spec/extensions/single_table_inheritance_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +8 -9
- data/spec/extensions/sql_expr_spec.rb +2 -0
- data/spec/extensions/string_date_time_spec.rb +2 -0
- data/spec/extensions/string_stripper_spec.rb +2 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
- data/spec/extensions/thread_local_timezones_spec.rb +2 -0
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +24 -24
- data/spec/extensions/tree_spec.rb +7 -7
- data/spec/extensions/typecast_on_load_spec.rb +8 -1
- data/spec/extensions/update_primary_key_spec.rb +10 -10
- data/spec/extensions/validation_class_methods_spec.rb +10 -39
- data/spec/extensions/validation_helpers_spec.rb +29 -47
- data/spec/extensions/xml_serializer_spec.rb +1 -23
- data/spec/integration/associations_test.rb +231 -40
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +64 -64
- data/spec/integration/eager_loader_test.rb +28 -28
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +21 -21
- data/spec/integration/prepared_statement_test.rb +7 -7
- data/spec/integration/schema_test.rb +115 -110
- data/spec/integration/spec_helper.rb +17 -27
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +10 -10
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +2 -28
- data/spec/model/associations_spec.rb +239 -188
- data/spec/model/base_spec.rb +27 -68
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +160 -172
- data/spec/model/hooks_spec.rb +62 -79
- data/spec/model/model_spec.rb +36 -51
- data/spec/model/plugins_spec.rb +5 -19
- data/spec/model/record_spec.rb +125 -151
- data/spec/model/spec_helper.rb +8 -6
- data/spec/model/validations_spec.rb +4 -17
- data/spec/spec_config.rb +2 -10
- metadata +50 -56
- data/lib/sequel/deprecated_core_extensions.rb +0 -135
- data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
- data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
- data/lib/sequel/plugins/identity_map.rb +0 -260
- data/lib/sequel_core.rb +0 -2
- data/lib/sequel_model.rb +0 -2
- data/spec/extensions/association_autoreloading_spec.rb +0 -102
- data/spec/extensions/identity_map_spec.rb +0 -337
- data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
- data/spec/extensions/pg_statement_cache_spec.rb +0 -208
- data/spec/rcov.opts +0 -8
- data/spec/spec_config.rb.example +0 -10
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
+
Sequel.extension :pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops
|
|
4
|
+
|
|
3
5
|
describe "Sequel::Postgres::ArrayOp" do
|
|
4
6
|
before do
|
|
5
7
|
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
|
@@ -18,6 +20,10 @@ describe "Sequel::Postgres::ArrayOp" do
|
|
|
18
20
|
@db.literal(@a[1][2]).should == "a[1][2]"
|
|
19
21
|
end
|
|
20
22
|
|
|
23
|
+
it "#[] with a range should return an ArrayOp" do
|
|
24
|
+
@db.literal(@a[1..2].any).should == "ANY(a[1:2])"
|
|
25
|
+
end
|
|
26
|
+
|
|
21
27
|
it "#any should use the ANY method" do
|
|
22
28
|
@db.literal(1=>@a.any).should == "(1 = ANY(a))"
|
|
23
29
|
end
|
|
@@ -43,6 +49,16 @@ describe "Sequel::Postgres::ArrayOp" do
|
|
|
43
49
|
@db.literal(@a.concat(:b)).should == "(a || b)"
|
|
44
50
|
end
|
|
45
51
|
|
|
52
|
+
it "#remove should remove the element from the array" do
|
|
53
|
+
@db.literal(@a.remove(1)).should == "array_remove(a, 1)"
|
|
54
|
+
@db.literal(@a.remove(1)[2]).should == "array_remove(a, 1)[2]"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "#remove should replace the element in the array with another" do
|
|
58
|
+
@db.literal(@a.replace(1, 2)).should == "array_replace(a, 1, 2)"
|
|
59
|
+
@db.literal(@a.replace(1, 2)[3]).should == "array_replace(a, 1, 2)[3]"
|
|
60
|
+
end
|
|
61
|
+
|
|
46
62
|
it "#unshift should use the || operator in prepend mode" do
|
|
47
63
|
@db.literal(@a.unshift(:b)).should == "(b || a)"
|
|
48
64
|
end
|
|
@@ -68,6 +84,15 @@ describe "Sequel::Postgres::ArrayOp" do
|
|
|
68
84
|
@db.literal(@a.join(':', '*')).should == "array_to_string(a, ':', '*')"
|
|
69
85
|
end
|
|
70
86
|
|
|
87
|
+
it "#hstore should convert the item to an hstore using the hstore function" do
|
|
88
|
+
@db.literal(@a.hstore).should == "hstore(a)"
|
|
89
|
+
@db.literal(@a.hstore['a']).should == "(hstore(a) -> 'a')"
|
|
90
|
+
@db.literal(@a.hstore(:b)).should == "hstore(a, b)"
|
|
91
|
+
@db.literal(@a.hstore(:b)['a']).should == "(hstore(a, b) -> 'a')"
|
|
92
|
+
@db.literal(@a.hstore(%w'1')).should == "hstore(a, ARRAY['1'])"
|
|
93
|
+
@db.literal(@a.hstore(%w'1')['a']).should == "(hstore(a, ARRAY['1']) -> 'a')"
|
|
94
|
+
end
|
|
95
|
+
|
|
71
96
|
it "#unnest should use the unnest function" do
|
|
72
97
|
@db.literal(@a.unnest).should == "unnest(a)"
|
|
73
98
|
end
|
|
@@ -2,10 +2,13 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe "pg_array extension" do
|
|
4
4
|
before(:all) do
|
|
5
|
+
Sequel.extension :pg_array
|
|
5
6
|
@pg_types = Sequel::Postgres::PG_TYPES.dup
|
|
7
|
+
@pg_named_types = Sequel::Postgres::PG_NAMED_TYPES.dup
|
|
6
8
|
end
|
|
7
9
|
after(:all) do
|
|
8
10
|
Sequel::Postgres::PG_TYPES.replace(@pg_types)
|
|
11
|
+
Sequel::Postgres::PG_NAMED_TYPES.replace(@pg_named_types)
|
|
9
12
|
end
|
|
10
13
|
|
|
11
14
|
before do
|
|
@@ -357,10 +360,15 @@ describe "pg_array extension" do
|
|
|
357
360
|
@db.typecast_value(:banana_array, %w'1 2').should == [1,2]
|
|
358
361
|
end
|
|
359
362
|
|
|
360
|
-
it "should set appropriate timestamp conversion procs when
|
|
363
|
+
it "should set appropriate timestamp conversion procs when resetting conversion procs" do
|
|
364
|
+
Sequel::Postgres::PG_NAMED_TYPES[:foo] = proc{|v| v*2}
|
|
365
|
+
@db.fetch = [[{:oid=>2222, :typname=>'foo'}], [{:oid=>2222, :typarray=>2223, :typname=>'foo'}]]
|
|
366
|
+
@db.reset_conversion_procs
|
|
361
367
|
procs = @db.conversion_procs
|
|
362
368
|
procs[1185].call('{"2011-10-20 11:12:13"}').should == [Time.local(2011, 10, 20, 11, 12, 13)]
|
|
363
369
|
procs[1115].call('{"2011-10-20 11:12:13"}').should == [Time.local(2011, 10, 20, 11, 12, 13)]
|
|
370
|
+
procs[2222].call('1').should == '11'
|
|
371
|
+
procs[2223].call('{"2"}').should == ['22']
|
|
364
372
|
end
|
|
365
373
|
|
|
366
374
|
it "should return correct results for Database#schema_type_class" do
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
+
Sequel.extension :pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops
|
|
4
|
+
|
|
3
5
|
describe "Sequel::Postgres::HStoreOp" do
|
|
4
6
|
before do
|
|
5
7
|
@ds = Sequel.connect('mock://postgres', :quote_identifiers=>false).dataset
|
|
@@ -42,6 +44,17 @@ describe "Sequel::Postgres::HStoreOp" do
|
|
|
42
44
|
@ds.literal(@h[%w'a'][0]).should == "(h -> ARRAY['a'])[0]"
|
|
43
45
|
end
|
|
44
46
|
|
|
47
|
+
it "#[] should not return a PGArrayOp if given an array but pg_array_op is not supported" do
|
|
48
|
+
begin
|
|
49
|
+
module Sequel::Postgres::HStoreOp::Sequel
|
|
50
|
+
SQL = ::Sequel::SQL
|
|
51
|
+
end
|
|
52
|
+
@ds.literal(@h[%w'a']).should_not be_a_kind_of(Sequel::Postgres::ArrayOp)
|
|
53
|
+
ensure
|
|
54
|
+
Sequel::Postgres::HStoreOp.send(:remove_const, :Sequel)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
45
58
|
it "#[] should return a PGArrayOp if given a PGArray" do
|
|
46
59
|
@ds.literal(@h[Sequel.pg_array(%w'a')][0]).should == "(h -> ARRAY['a'])[0]"
|
|
47
60
|
end
|
|
@@ -2,6 +2,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe "pg_hstore extension" do
|
|
4
4
|
before do
|
|
5
|
+
Sequel.extension :pg_array, :pg_hstore
|
|
5
6
|
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
|
6
7
|
@m = Sequel::Postgres
|
|
7
8
|
@c = @m::HStore
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
Sequel.extension :pg_array, :pg_array_ops, :pg_json, :pg_json_ops
|
|
4
|
+
|
|
5
|
+
describe "Sequel::Postgres::JSONOp" do
|
|
6
|
+
before do
|
|
7
|
+
@db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
|
|
8
|
+
@j = Sequel.pg_json_op(:j)
|
|
9
|
+
@l = proc{|o| @db.literal(o)}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should have #[] get the element" do
|
|
13
|
+
@l[@j[1]].should == "(j -> 1)"
|
|
14
|
+
@l[@j['a']].should == "(j -> 'a')"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should have #[] accept an array" do
|
|
18
|
+
@l[@j[%w'a b']].should == "(j #> ARRAY['a','b'])"
|
|
19
|
+
@l[@j[Sequel.pg_array(%w'a b')]].should == "(j #> ARRAY['a','b'])"
|
|
20
|
+
@l[@j[Sequel.pg_array(:a)]].should == "(j #> a)"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should have #[] return a JSONOp" do
|
|
24
|
+
@l[@j[1][2]].should == "((j -> 1) -> 2)"
|
|
25
|
+
@l[@j[%w'a b'][2]].should == "((j #> ARRAY['a','b']) -> 2)"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should have #get be an alias to #[]" do
|
|
29
|
+
@l[@j.get(1)].should == "(j -> 1)"
|
|
30
|
+
@l[@j.get(%w'a b')].should == "(j #> ARRAY['a','b'])"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should have #get_text get the element as text" do
|
|
34
|
+
@l[@j.get_text(1)].should == "(j ->> 1)"
|
|
35
|
+
@l[@j.get_text('a')].should == "(j ->> 'a')"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should have #get_text accept an array" do
|
|
39
|
+
@l[@j.get_text(%w'a b')].should == "(j #>> ARRAY['a','b'])"
|
|
40
|
+
@l[@j.get_text(Sequel.pg_array(%w'a b'))].should == "(j #>> ARRAY['a','b'])"
|
|
41
|
+
@l[@j.get_text(Sequel.pg_array(:a))].should == "(j #>> a)"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should have #get_text return an SQL::StringExpression" do
|
|
45
|
+
@l[@j.get_text(1) + 'a'].should == "((j ->> 1) || 'a')"
|
|
46
|
+
@l[@j.get_text(%w'a b') + 'a'].should == "((j #>> ARRAY['a','b']) || 'a')"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should have #array_length use the json_array_length function" do
|
|
50
|
+
@l[@j.array_length].should == "json_array_length(j)"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should have #array_length return a numeric expression" do
|
|
54
|
+
@l[@j.array_length & 1].should == "(json_array_length(j) & 1)"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should have #each use the json_each function" do
|
|
58
|
+
@l[@j.each].should == "json_each(j)"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should have #each_text use the json_each_text function" do
|
|
62
|
+
@l[@j.each_text].should == "json_each_text(j)"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should have #extract use the json_extract_path function" do
|
|
66
|
+
@l[@j.extract('a')].should == "json_extract_path(j, 'a')"
|
|
67
|
+
@l[@j.extract('a', 'b')].should == "json_extract_path(j, 'a', 'b')"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should have #extract return a JSONOp" do
|
|
71
|
+
@l[@j.extract('a')[1]].should == "(json_extract_path(j, 'a') -> 1)"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should have #extract_text use the json_extract_path_text function" do
|
|
75
|
+
@l[@j.extract_text('a')].should == "json_extract_path_text(j, 'a')"
|
|
76
|
+
@l[@j.extract_text('a', 'b')].should == "json_extract_path_text(j, 'a', 'b')"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should have #extract_text return an SQL::StringExpression" do
|
|
80
|
+
@l[@j.extract_text('a') + 'a'].should == "(json_extract_path_text(j, 'a') || 'a')"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should have #keys use the json_object_keys function" do
|
|
84
|
+
@l[@j.keys].should == "json_object_keys(j)"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "should have #array_elements use the json_array_elements function" do
|
|
88
|
+
@l[@j.array_elements].should == "json_array_elements(j)"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should have #populate use the json_populate_record function" do
|
|
92
|
+
@l[@j.populate(:a)].should == "json_populate_record(a, j)"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should have #populate_set use the json_populate_record function" do
|
|
96
|
+
@l[@j.populate_set(:a)].should == "json_populate_recordset(a, j)"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "#pg_json should return self" do
|
|
100
|
+
@j.pg_json.should equal(@j)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "Sequel.pg_json_op should return arg for JSONOp" do
|
|
104
|
+
Sequel.pg_json_op(@j).should equal(@j)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "should be able to turn expressions into json ops using pg_json" do
|
|
108
|
+
@db.literal(Sequel.qualify(:b, :a).pg_json[1]).should == "(b.a -> 1)"
|
|
109
|
+
@db.literal(Sequel.function(:a, :b).pg_json[1]).should == "(a(b) -> 1)"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "should be able to turn literal strings into json ops using pg_json" do
|
|
113
|
+
@db.literal(Sequel.lit('a').pg_json[1]).should == "(a -> 1)"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should be able to turn symbols into json ops using Sequel.pg_json_op" do
|
|
117
|
+
@db.literal(Sequel.pg_json_op(:a)[1]).should == "(a -> 1)"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should be able to turn symbols into json ops using Sequel.pg_json" do
|
|
121
|
+
@db.literal(Sequel.pg_json(:a)[1]).should == "(a -> 1)"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "should allow transforming JSONArray instances into ArrayOp instances" do
|
|
125
|
+
@db.literal(Sequel.pg_json([1,2]).op[1]).should == "('[1,2]'::json -> 1)"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "should allow transforming JSONHash instances into ArrayOp instances" do
|
|
129
|
+
@db.literal(Sequel.pg_json('a'=>1).op['a']).should == "('{\"a\":1}'::json -> 'a')"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
+
Sequel.extension :pg_array, :pg_json
|
|
4
|
+
|
|
3
5
|
describe "pg_json extension" do
|
|
4
6
|
before(:all) do
|
|
5
7
|
m = Sequel::Postgres
|
|
@@ -36,6 +38,14 @@ describe "pg_json extension" do
|
|
|
36
38
|
@m.parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.should == {'a'=>'b', 'c'=>{'d'=>'e'}}
|
|
37
39
|
end
|
|
38
40
|
|
|
41
|
+
it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_json" do
|
|
42
|
+
@m.db_parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.should == {'a'=>'b', 'c'=>{'d'=>'e'}}
|
|
43
|
+
@m.db_parse_json('[1, [2], {"a": "b"}]').to_a.should == [1, [2], {'a'=>'b'}]
|
|
44
|
+
@m.db_parse_json('1').should == 1
|
|
45
|
+
@m.db_parse_json('"b"').should == 'b'
|
|
46
|
+
@m.db_parse_json('1.1').should == 1.1
|
|
47
|
+
end
|
|
48
|
+
|
|
39
49
|
it "should raise an error when attempting to parse invalid json" do
|
|
40
50
|
proc{@m.parse_json('')}.should raise_error(Sequel::InvalidValue)
|
|
41
51
|
proc{@m.parse_json('1')}.should raise_error(Sequel::InvalidValue)
|
|
@@ -69,10 +79,6 @@ describe "pg_json extension" do
|
|
|
69
79
|
Sequel.pg_json(a).should equal(a)
|
|
70
80
|
end
|
|
71
81
|
|
|
72
|
-
it "should have Sequel.pg_json raise an Error if called with a non-hash or array" do
|
|
73
|
-
proc{Sequel.pg_json(:a)}.should raise_error(Sequel::Error)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
82
|
it "should have JSONHash#to_hash method for getting underlying hash" do
|
|
77
83
|
Sequel.pg_json({}).to_hash.should be_a_kind_of(Hash)
|
|
78
84
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
+
Sequel.extension :pg_array, :pg_range, :pg_range_ops
|
|
4
|
+
|
|
3
5
|
describe "Sequel::Postgres::RangeOp" do
|
|
4
6
|
before do
|
|
5
7
|
@ds = Sequel.connect('mock://postgres', :quote_identifiers=>false).dataset
|
|
@@ -38,11 +40,6 @@ describe "Sequel::Postgres::RangeOp" do
|
|
|
38
40
|
@ds.literal(@h.adjacent_to(@h)).should == "(h -|- h)"
|
|
39
41
|
end
|
|
40
42
|
|
|
41
|
-
qspecify "should define methods for the deprecated PostgreSQL range operators" do
|
|
42
|
-
@ds.literal(@h.starts_before(@h)).should == "(h &< h)"
|
|
43
|
-
@ds.literal(@h.ends_after(@h)).should == "(h &> h)"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
43
|
it "should define methods for all of the PostgreSQL range functions" do
|
|
47
44
|
@ds.literal(@h.lower).should == "lower(h)"
|
|
48
45
|
@ds.literal(@h.upper).should == "upper(h)"
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
describe "pg_range extension" do
|
|
4
5
|
before(:all) do
|
|
6
|
+
Sequel.extension :pg_array, :pg_range
|
|
5
7
|
@pg_types = Sequel::Postgres::PG_TYPES.dup
|
|
6
8
|
end
|
|
7
9
|
after(:all) do
|
|
@@ -213,13 +215,15 @@ describe "pg_range extension" do
|
|
|
213
215
|
end
|
|
214
216
|
end
|
|
215
217
|
|
|
216
|
-
it "should set appropriate timestamp range conversion procs when
|
|
218
|
+
it "should set appropriate timestamp range conversion procs when resetting conversion procs" do
|
|
219
|
+
@db.reset_conversion_procs
|
|
217
220
|
procs = @db.conversion_procs
|
|
218
221
|
procs[3908].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').should == (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
|
|
219
222
|
procs[3910].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').should == (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
|
|
220
223
|
end
|
|
221
224
|
|
|
222
|
-
it "should set appropriate timestamp range array conversion procs when
|
|
225
|
+
it "should set appropriate timestamp range array conversion procs when resetting conversion procs" do
|
|
226
|
+
@db.reset_conversion_procs
|
|
223
227
|
procs = @db.conversion_procs
|
|
224
228
|
procs[3909].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').should == [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
|
|
225
229
|
procs[3911].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').should == [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
|
|
@@ -19,6 +19,7 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
19
19
|
@Artist.plugin :prepared_statements_associations
|
|
20
20
|
@Album.plugin :prepared_statements_associations
|
|
21
21
|
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
22
|
+
@Artist.one_to_one :album, :class=>@Album, :key=>:artist_id
|
|
22
23
|
@Album.many_to_one :artist, :class=>@Artist
|
|
23
24
|
@Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>:album_id
|
|
24
25
|
@Artist.plugin :many_through_many
|
|
@@ -30,6 +31,9 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
30
31
|
@Artist.load(:id=>1).albums
|
|
31
32
|
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1) -- prepared"]
|
|
32
33
|
|
|
34
|
+
@Artist.load(:id=>1).album
|
|
35
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1) LIMIT 1 -- prepared"]
|
|
36
|
+
|
|
33
37
|
@Album.load(:id=>1, :artist_id=>2).artist
|
|
34
38
|
@db.sqls.should == ["SELECT * FROM artists WHERE (artists.id = 2) LIMIT 1 -- prepared"]
|
|
35
39
|
|
|
@@ -42,6 +46,7 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
42
46
|
|
|
43
47
|
specify "should run correct SQL for composite key associations" do
|
|
44
48
|
@Artist.one_to_many :albums, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
|
|
49
|
+
@Artist.one_to_one :album, :class=>@Album, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
|
|
45
50
|
@Album.many_to_one :artist, :class=>@Artist, :key=>[:artist_id, :artist_id2], :primary_key=>[:id, :id2]
|
|
46
51
|
@Album.many_to_many :tags, :class=>@Tag, :join_table=>:albums_tags, :left_key=>[:album_id, :album_id2], :right_key=>[:tag_id, :tag_id2], :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
|
|
47
52
|
@Artist.many_through_many :tags, [[:albums, [:artist_id, :artist_id2], [:id, :id2]], [:albums_tags, [:album_id, :album_id2], [:tag_id, :tag_id2]]], :class=>@Tag, :right_primary_key=>[:id, :id2], :left_primary_key=>[:id, :id2]
|
|
@@ -49,6 +54,9 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
49
54
|
@Artist.load(:id=>1, :id2=>2).albums
|
|
50
55
|
@db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) -- prepared"]
|
|
51
56
|
|
|
57
|
+
@Artist.load(:id=>1, :id2=>2).album
|
|
58
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((albums.artist_id = 1) AND (albums.artist_id2 = 2)) LIMIT 1 -- prepared"]
|
|
59
|
+
|
|
52
60
|
@Album.load(:id=>1, :artist_id=>2, :artist_id2=>3).artist
|
|
53
61
|
@db.sqls.should == ["SELECT * FROM artists WHERE ((artists.id = 2) AND (artists.id2 = 3)) LIMIT 1 -- prepared"]
|
|
54
62
|
|
|
@@ -89,10 +97,23 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
89
97
|
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
90
98
|
end
|
|
91
99
|
|
|
92
|
-
specify "should
|
|
93
|
-
@
|
|
100
|
+
specify "should use a prepared statement if the associated dataset has conditions" do
|
|
101
|
+
@Album.dataset = @Album.dataset.where(:a=>2)
|
|
102
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
103
|
+
@Artist.load(:id=>1).albums
|
|
104
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
specify "should use a prepared statement if the :conditions association option" do
|
|
108
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{:a=>2}
|
|
94
109
|
@Artist.load(:id=>1).albums
|
|
95
|
-
@db.sqls.should == ["SELECT * FROM albums WHERE ((a =
|
|
110
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
specify "should not use a prepared statement if :conditions association option uses an identifier" do
|
|
114
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id, :conditions=>{Sequel.identifier('a')=>2}
|
|
115
|
+
@Artist.load(:id=>1).albums
|
|
116
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE ((a = 2) AND (albums.artist_id = 1)) -- prepared"]
|
|
96
117
|
end
|
|
97
118
|
|
|
98
119
|
specify "should run a regular query if :dataset option is used when defining the association" do
|
|
@@ -103,9 +124,9 @@ describe "Sequel::Plugins::PreparedStatementsAssociations" do
|
|
|
103
124
|
end
|
|
104
125
|
|
|
105
126
|
specify "should run a regular query if :cloning an association that doesn't used prepared statements" do
|
|
106
|
-
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
|
127
|
+
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id do |ds| ds end
|
|
107
128
|
@Artist.one_to_many :oalbums, :clone=>:albums
|
|
108
129
|
@Artist.load(:id=>1).oalbums
|
|
109
|
-
@db.sqls.should == ["SELECT * FROM albums WHERE (
|
|
130
|
+
@db.sqls.should == ["SELECT * FROM albums WHERE (albums.artist_id = 1)"]
|
|
110
131
|
end
|
|
111
132
|
end
|
|
@@ -2,14 +2,14 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
|
2
2
|
|
|
3
3
|
describe Sequel::Model, "rcte_tree" do
|
|
4
4
|
before do
|
|
5
|
-
@c = Class.new(Sequel::Model(
|
|
5
|
+
@c = Class.new(Sequel::Model(DB[:nodes]))
|
|
6
6
|
@c.class_eval do
|
|
7
7
|
def self.name; 'Node'; end
|
|
8
8
|
columns :id, :name, :parent_id, :i, :pi
|
|
9
9
|
end
|
|
10
10
|
@ds = @c.dataset
|
|
11
11
|
@o = @c.load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
12
|
-
|
|
12
|
+
DB.reset
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
it "should define the correct associations" do
|
|
@@ -102,7 +102,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
102
102
|
{:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>1}, {:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>2},
|
|
103
103
|
{:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>2}, {:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>1}]]
|
|
104
104
|
os = @ds.eager(:ancestors).all
|
|
105
|
-
sqls =
|
|
105
|
+
sqls = DB.sqls
|
|
106
106
|
sqls.first.should == "SELECT * FROM nodes"
|
|
107
107
|
sqls.last.should =~ /WITH t AS \(SELECT id AS x_root_x, nodes\.\* FROM nodes WHERE \(id IN \([12], [12]\)\) UNION ALL SELECT t\.x_root_x, nodes\.\* FROM nodes INNER JOIN t ON \(t\.parent_id = nodes\.id\)\) SELECT \* FROM t AS nodes/
|
|
108
108
|
os.should == [@c.load(:id=>2, :parent_id=>1, :name=>'AA'), @c.load(:id=>6, :parent_id=>2, :name=>'C'), @c.load(:id=>7, :parent_id=>1, :name=>'D'), @c.load(:id=>9, :parent_id=>nil, :name=>'E')]
|
|
@@ -114,7 +114,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
114
114
|
os.map{|o| o.parent.parent if o.parent}.should == [@c.load(:id=>8, :name=>'?', :parent_id=>nil), @c.load(:id=>1, :name=>'00', :parent_id=>8), @c.load(:id=>8, :name=>'?', :parent_id=>nil), nil]
|
|
115
115
|
os.map{|o| o.parent.parent.parent if o.parent and o.parent.parent}.should == [nil, @c.load(:id=>8, :name=>'?', :parent_id=>nil), nil, nil]
|
|
116
116
|
os.map{|o| o.parent.parent.parent.parent if o.parent and o.parent.parent and o.parent.parent.parent}.should == [nil, nil, nil, nil]
|
|
117
|
-
|
|
117
|
+
DB.sqls.should == []
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
it "should eagerly load ancestors when giving options" do
|
|
@@ -124,7 +124,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
124
124
|
{:i=>1, :name=>'00', :pi=>8, :kal=>1}, {:i=>1, :name=>'00', :pi=>8, :kal=>2},
|
|
125
125
|
{:i=>8, :name=>'?', :pi=>nil, :kal=>2}, {:i=>8, :name=>'?', :pi=>nil, :kal=>1}]]
|
|
126
126
|
os = @ds.eager(:as).all
|
|
127
|
-
sqls =
|
|
127
|
+
sqls = DB.sqls
|
|
128
128
|
sqls.first.should == "SELECT * FROM nodes"
|
|
129
129
|
sqls.last.should =~ /WITH cte AS \(SELECT i AS kal, nodes\.\* FROM nodes WHERE \(i IN \([12], [12]\)\) UNION ALL SELECT cte\.kal, nodes\.\* FROM nodes INNER JOIN cte ON \(cte\.pi = nodes\.i\)\) SELECT \* FROM cte/
|
|
130
130
|
os.should == [@c.load(:i=>2, :pi=>1, :name=>'AA'), @c.load(:i=>6, :pi=>2, :name=>'C'), @c.load(:i=>7, :pi=>1, :name=>'D'), @c.load(:i=>9, :pi=>nil, :name=>'E')]
|
|
@@ -145,7 +145,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
145
145
|
{:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>1}, {:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>2},
|
|
146
146
|
{:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>2}, {:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>1}]]
|
|
147
147
|
@ds.eager(:ancestors).all
|
|
148
|
-
sqls =
|
|
148
|
+
sqls = DB.sqls
|
|
149
149
|
sqls.first.should == "SELECT * FROM nodes"
|
|
150
150
|
sqls.last.should =~ /WITH t AS \(SELECT id AS x_root_x, nodes\.\* FROM nodes WHERE \(\(id IN \([12], [12]\)\) AND \(i = 1\)\) UNION ALL SELECT t\.x_root_x, nodes\.\* FROM nodes INNER JOIN t ON \(t\.parent_id = nodes\.id\) WHERE \(i = 1\)\) SELECT \* FROM t AS nodes WHERE \(i = 1\)/
|
|
151
151
|
end
|
|
@@ -157,7 +157,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
157
157
|
{:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>6}, {:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>2},
|
|
158
158
|
{:id=>4, :name=>'?', :parent_id=>7, :x_root_x=>7}, {:id=>5, :name=>'?', :parent_id=>4, :x_root_x=>7}]]
|
|
159
159
|
os = @ds.eager(:descendants).all
|
|
160
|
-
sqls =
|
|
160
|
+
sqls = DB.sqls
|
|
161
161
|
sqls.first.should == "SELECT * FROM nodes"
|
|
162
162
|
sqls.last.should =~ /WITH t AS \(SELECT parent_id AS x_root_x, nodes\.\* FROM nodes WHERE \(parent_id IN \([267], [267], [267]\)\) UNION ALL SELECT t\.x_root_x, nodes\.\* FROM nodes INNER JOIN t ON \(t\.id = nodes\.parent_id\)\) SELECT \* FROM t AS nodes/
|
|
163
163
|
os.should == [@c.load(:id=>2, :parent_id=>1, :name=>'AA'), @c.load(:id=>6, :parent_id=>2, :name=>'C'), @c.load(:id=>7, :parent_id=>1, :name=>'D')]
|
|
@@ -167,7 +167,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
167
167
|
os.map{|o| o.children}.should == [[@c.load(:id=>6, :parent_id=>2, :name=>'C'), @c.load(:id=>9, :parent_id=>2, :name=>'E')], [@c.load(:id=>3, :name=>'00', :parent_id=>6)], [@c.load(:id=>4, :name=>'?', :parent_id=>7)]]
|
|
168
168
|
os.map{|o1| o1.children.map{|o2| o2.children}}.should == [[[@c.load(:id=>3, :name=>'00', :parent_id=>6)], []], [[]], [[@c.load(:id=>5, :name=>'?', :parent_id=>4)]]]
|
|
169
169
|
os.map{|o1| o1.children.map{|o2| o2.children.map{|o3| o3.children}}}.should == [[[[]], []], [[]], [[[]]]]
|
|
170
|
-
|
|
170
|
+
DB.sqls.should == []
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
it "should eagerly load descendants when giving options" do
|
|
@@ -177,7 +177,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
177
177
|
{:i=>3, :name=>'00', :pi=>6, :kal=>6}, {:i=>3, :name=>'00', :pi=>6, :kal=>2},
|
|
178
178
|
{:i=>4, :name=>'?', :pi=>7, :kal=>7}, {:i=>5, :name=>'?', :pi=>4, :kal=>7}]]
|
|
179
179
|
os = @ds.eager(:ds).all
|
|
180
|
-
sqls =
|
|
180
|
+
sqls = DB.sqls
|
|
181
181
|
sqls.first.should == "SELECT * FROM nodes"
|
|
182
182
|
sqls.last.should =~ /WITH cte AS \(SELECT pi AS kal, nodes\.\* FROM nodes WHERE \(pi IN \([267], [267], [267]\)\) UNION ALL SELECT cte\.kal, nodes\.\* FROM nodes INNER JOIN cte ON \(cte\.i = nodes\.pi\)\) SELECT \* FROM cte/
|
|
183
183
|
os.should == [@c.load(:i=>2, :pi=>1, :name=>'AA'), @c.load(:i=>6, :pi=>2, :name=>'C'), @c.load(:i=>7, :pi=>1, :name=>'D')]
|
|
@@ -187,7 +187,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
187
187
|
os.map{|o| o.cs}.should == [[@c.load(:i=>6, :pi=>2, :name=>'C'), @c.load(:i=>9, :pi=>2, :name=>'E')], [@c.load(:i=>3, :name=>'00', :pi=>6)], [@c.load(:i=>4, :name=>'?', :pi=>7)]]
|
|
188
188
|
os.map{|o1| o1.cs.map{|o2| o2.cs}}.should == [[[@c.load(:i=>3, :name=>'00', :pi=>6)], []], [[]], [[@c.load(:i=>5, :name=>'?', :pi=>4)]]]
|
|
189
189
|
os.map{|o1| o1.cs.map{|o2| o2.cs.map{|o3| o3.cs}}}.should == [[[[]], []], [[]], [[[]]]]
|
|
190
|
-
|
|
190
|
+
DB.sqls.should == []
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
it "should eagerly load descendants to a given level" do
|
|
@@ -197,7 +197,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
197
197
|
{:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>6, :x_level_x=>0}, {:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>2, :x_level_x=>1},
|
|
198
198
|
{:id=>4, :name=>'?', :parent_id=>7, :x_root_x=>7, :x_level_x=>0}, {:id=>5, :name=>'?', :parent_id=>4, :x_root_x=>7, :x_level_x=>1}]]
|
|
199
199
|
os = @ds.eager(:descendants=>2).all
|
|
200
|
-
sqls =
|
|
200
|
+
sqls = DB.sqls
|
|
201
201
|
sqls.first.should == "SELECT * FROM nodes"
|
|
202
202
|
sqls.last.should =~ /WITH t AS \(SELECT parent_id AS x_root_x, nodes\.\*, 0 AS x_level_x FROM nodes WHERE \(parent_id IN \([267], [267], [267]\)\) UNION ALL SELECT t\.x_root_x, nodes\.\*, \(t\.x_level_x \+ 1\) AS x_level_x FROM nodes INNER JOIN t ON \(t\.id = nodes\.parent_id\) WHERE \(t\.x_level_x < 1\)\) SELECT \* FROM t AS nodes/
|
|
203
203
|
os.should == [@c.load(:id=>2, :parent_id=>1, :name=>'AA'), @c.load(:id=>6, :parent_id=>2, :name=>'C'), @c.load(:id=>7, :parent_id=>1, :name=>'D')]
|
|
@@ -207,7 +207,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
207
207
|
os.map{|o| o.associations[:children]}.should == [[@c.load(:id=>6, :parent_id=>2, :name=>'C'), @c.load(:id=>9, :parent_id=>2, :name=>'E')], [@c.load(:id=>3, :name=>'00', :parent_id=>6)], [@c.load(:id=>4, :name=>'?', :parent_id=>7)]]
|
|
208
208
|
os.map{|o1| o1.associations[:children].map{|o2| o2.associations[:children]}}.should == [[[@c.load(:id=>3, :name=>'00', :parent_id=>6)], []], [[]], [[@c.load(:id=>5, :name=>'?', :parent_id=>4)]]]
|
|
209
209
|
os.map{|o1| o1.associations[:children].map{|o2| o2.associations[:children].map{|o3| o3.associations[:children]}}}.should == [[[[]], []], [[]], [[nil]]]
|
|
210
|
-
|
|
210
|
+
DB.sqls.should == []
|
|
211
211
|
end
|
|
212
212
|
|
|
213
213
|
it "should eagerly load descendants to a given level when giving options" do
|
|
@@ -217,7 +217,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
217
217
|
{:i=>3, :name=>'00', :pi=>6, :kal=>6, :lal=>0}, {:i=>3, :name=>'00', :pi=>6, :kal=>2, :lal=>1},
|
|
218
218
|
{:i=>4, :name=>'?', :pi=>7, :kal=>7, :lal=>0}, {:i=>5, :name=>'?', :pi=>4, :kal=>7, :lal=>1}]]
|
|
219
219
|
os = @ds.eager(:ds=>2).all
|
|
220
|
-
sqls =
|
|
220
|
+
sqls = DB.sqls
|
|
221
221
|
sqls.first.should == "SELECT * FROM nodes"
|
|
222
222
|
sqls.last.should =~ /WITH cte AS \(SELECT pi AS kal, nodes\.\*, 0 AS lal FROM nodes WHERE \(pi IN \([267], [267], [267]\)\) UNION ALL SELECT cte\.kal, nodes\.\*, \(cte\.lal \+ 1\) AS lal FROM nodes INNER JOIN cte ON \(cte\.i = nodes\.pi\) WHERE \(cte\.lal < 1\)\) SELECT \* FROM cte/
|
|
223
223
|
os.should == [@c.load(:i=>2, :pi=>1, :name=>'AA'), @c.load(:i=>6, :pi=>2, :name=>'C'), @c.load(:i=>7, :pi=>1, :name=>'D')]
|
|
@@ -227,7 +227,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
227
227
|
os.map{|o| o.associations[:cs]}.should == [[@c.load(:i=>6, :pi=>2, :name=>'C'), @c.load(:i=>9, :pi=>2, :name=>'E')], [@c.load(:i=>3, :name=>'00', :pi=>6)], [@c.load(:i=>4, :name=>'?', :pi=>7)]]
|
|
228
228
|
os.map{|o1| o1.associations[:cs].map{|o2| o2.associations[:cs]}}.should == [[[@c.load(:i=>3, :name=>'00', :pi=>6)], []], [[]], [[@c.load(:i=>5, :name=>'?', :pi=>4)]]]
|
|
229
229
|
os.map{|o1| o1.associations[:cs].map{|o2| o2.associations[:cs].map{|o3| o3.associations[:cs]}}}.should == [[[[]], []], [[]], [[nil]]]
|
|
230
|
-
|
|
230
|
+
DB.sqls.should == []
|
|
231
231
|
end
|
|
232
232
|
|
|
233
233
|
it "should eagerly load descendants respecting association option :conditions" do
|
|
@@ -237,7 +237,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
237
237
|
{:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>6}, {:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>2},
|
|
238
238
|
{:id=>4, :name=>'?', :parent_id=>7, :x_root_x=>7}, {:id=>5, :name=>'?', :parent_id=>4, :x_root_x=>7}]]
|
|
239
239
|
@ds.eager(:descendants).all
|
|
240
|
-
sqls =
|
|
240
|
+
sqls = DB.sqls
|
|
241
241
|
sqls.first.should == "SELECT * FROM nodes"
|
|
242
242
|
sqls.last.should =~ /WITH t AS \(SELECT parent_id AS x_root_x, nodes\.\* FROM nodes WHERE \(\(parent_id IN \([267], [267], [267]\)\) AND \(i = 1\)\) UNION ALL SELECT t\.x_root_x, nodes\.\* FROM nodes INNER JOIN t ON \(t\.id = nodes\.parent_id\) WHERE \(i = 1\)\) SELECT \* FROM t AS nodes WHERE \(i = 1\)/
|
|
243
243
|
end
|