sequel 3.21.0 → 3.36.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 +855 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +23 -7
- data/Rakefile +42 -24
- data/bin/sequel +26 -8
- data/doc/active_record.rdoc +1 -0
- data/doc/advanced_associations.rdoc +171 -11
- data/doc/association_basics.rdoc +293 -43
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +8 -0
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +85 -552
- data/doc/model_hooks.rdoc +78 -27
- data/doc/object_model.rdoc +541 -0
- data/doc/opening_databases.rdoc +97 -50
- data/doc/prepared_statements.rdoc +40 -14
- data/doc/querying.rdoc +28 -4
- data/doc/reflection.rdoc +30 -4
- 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/schema_modification.rdoc +572 -0
- data/doc/sharding.rdoc +95 -3
- data/doc/testing.rdoc +129 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +51 -2
- 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 +1 -57
- 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 +47 -0
- data/lib/sequel/adapters/jdbc/derby.rb +287 -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 +29 -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 +58 -48
- 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 +265 -94
- data/lib/sequel/adapters/mock.rb +361 -0
- data/lib/sequel/adapters/mysql.rb +118 -222
- data/lib/sequel/adapters/mysql2.rb +58 -57
- data/lib/sequel/adapters/odbc/mssql.rb +15 -7
- 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 +356 -107
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +342 -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 +335 -118
- data/lib/sequel/adapters/shared/mysql.rb +340 -76
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +243 -45
- data/lib/sequel/adapters/shared/postgres.rb +524 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +265 -89
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +9 -12
- data/lib/sequel/adapters/swift/postgres.rb +9 -74
- data/lib/sequel/adapters/swift/sqlite.rb +8 -6
- data/lib/sequel/adapters/swift.rb +8 -7
- data/lib/sequel/adapters/tinytds.rb +161 -21
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -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 +28 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +38 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +118 -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 +150 -46
- data/lib/sequel/database/query.rb +215 -65
- data/lib/sequel/database/schema_generator.rb +64 -20
- data/lib/sequel/database/schema_methods.rb +212 -54
- data/lib/sequel/dataset/actions.rb +322 -85
- data/lib/sequel/dataset/features.rb +96 -8
- data/lib/sequel/dataset/graph.rb +38 -11
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +237 -44
- data/lib/sequel/dataset/sql.rb +698 -278
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +79 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
- data/lib/sequel/extensions/migration.rb +97 -11
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/null_dataset.rb +90 -0
- data/lib/sequel/extensions/pg_array.rb +460 -0
- data/lib/sequel/extensions/pg_array_ops.rb +220 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
- data/lib/sequel/extensions/pg_hstore.rb +296 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
- data/lib/sequel/extensions/pg_inet.rb +89 -0
- data/lib/sequel/extensions/pg_json.rb +178 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
- data/lib/sequel/extensions/pretty_table.rb +5 -71
- data/lib/sequel/extensions/query.rb +1 -1
- 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 +251 -37
- data/lib/sequel/extensions/select_remove.rb +35 -0
- data/lib/sequel/extensions/server_block.rb +139 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -110
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +1187 -393
- data/lib/sequel/model/base.rb +578 -170
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- 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/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -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 +123 -8
- 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 +12 -2
- data/lib/sequel/plugins/many_through_many.rb +79 -28
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +139 -63
- data/lib/sequel/plugins/optimistic_locking.rb +8 -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 +29 -15
- data/lib/sequel/plugins/schema.rb +7 -2
- 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 +10 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- 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/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +526 -59
- data/lib/sequel/timezones.rb +57 -38
- 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 +142 -40
- data/spec/adapters/mysql_spec.rb +380 -234
- data/spec/adapters/oracle_spec.rb +67 -77
- data/spec/adapters/postgres_spec.rb +1050 -212
- data/spec/adapters/spec_helper.rb +8 -5
- data/spec/adapters/sqlite_spec.rb +139 -27
- data/spec/core/connection_pool_spec.rb +196 -93
- data/spec/core/database_spec.rb +879 -510
- data/spec/core/dataset_spec.rb +1415 -1086
- data/spec/core/expression_filters_spec.rb +554 -109
- data/spec/core/mock_adapter_spec.rb +449 -0
- data/spec/core/object_graph_spec.rb +86 -114
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +482 -38
- data/spec/core/spec_helper.rb +6 -48
- 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/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/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +69 -92
- data/spec/extensions/identity_map_spec.rb +131 -22
- 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 -6
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +48 -39
- data/spec/extensions/many_through_many_spec.rb +283 -250
- 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 +251 -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 +105 -0
- data/spec/extensions/pg_array_spec.rb +196 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
- data/spec/extensions/pg_hstore_spec.rb +195 -0
- data/spec/extensions/pg_inet_spec.rb +44 -0
- data/spec/extensions/pg_json_spec.rb +101 -0
- data/spec/extensions/pg_statement_cache_spec.rb +209 -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 +168 -0
- data/spec/extensions/query_spec.rb +6 -0
- 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 +429 -22
- data/spec/extensions/schema_spec.rb +25 -21
- 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 +85 -43
- 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 +22 -61
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -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 +4 -7
- 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 +30 -51
- data/spec/extensions/validation_helpers_spec.rb +16 -35
- 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 +9 -3
- data/spec/integration/dataset_test.rb +605 -91
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +454 -143
- data/spec/integration/prepared_statement_test.rb +263 -128
- data/spec/integration/schema_test.rb +309 -43
- data/spec/integration/spec_helper.rb +40 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +18 -4
- data/spec/model/association_reflection_spec.rb +201 -7
- data/spec/model/associations_spec.rb +1067 -661
- data/spec/model/base_spec.rb +329 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +677 -676
- data/spec/model/hooks_spec.rb +349 -67
- data/spec/model/model_spec.rb +240 -168
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +490 -232
- data/spec/model/spec_helper.rb +14 -71
- data/spec/model/validations_spec.rb +11 -0
- data/spec/rcov.opts +2 -0
- metadata +178 -80
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements_safe plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.instance_variable_set(:@db_schema, {:i=>{}, :name=>{}, :id=>{:primary_key=>true}})
|
|
9
|
+
@c.plugin :prepared_statements_safe
|
|
10
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
11
|
+
@db.sqls
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
specify "should load the prepared_statements plugin" do
|
|
15
|
+
@c.plugins.should include(Sequel::Plugins::PreparedStatements)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
specify "should set default values correctly" do
|
|
19
|
+
@c.prepared_statements_column_defaults.should == {:name=>nil, :i=>nil}
|
|
20
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
21
|
+
Class.new(@c).prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
specify "should set default values when creating" do
|
|
25
|
+
@c.create
|
|
26
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \(NULL, NULL\)/
|
|
27
|
+
@c.create(:name=>'foo')
|
|
28
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((NULL|'foo'), (NULL|'foo')\)/
|
|
29
|
+
@c.create(:name=>'foo', :i=>2)
|
|
30
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
specify "should use database default values" do
|
|
34
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:ruby_default=>2}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
35
|
+
c = Class.new(@c)
|
|
36
|
+
c.create
|
|
37
|
+
@db.sqls.first.should =~ /INSERT INTO people \((i|name), (i|name)\) VALUES \((2|'foo'), (2|'foo')\)/
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
specify "should not set defaults for unparseable dataset default values" do
|
|
41
|
+
@c.instance_variable_set(:@db_schema, {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}})
|
|
42
|
+
c = Class.new(@c)
|
|
43
|
+
c.create
|
|
44
|
+
@db.sqls.first.should == "INSERT INTO people (name) VALUES ('foo')"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
specify "should save all fields when updating" do
|
|
48
|
+
@p.update(:i=>3)
|
|
49
|
+
@db.sqls.first.should =~ /UPDATE people SET (name = 'foo'|i = 3), (name = 'foo'|i = 3) WHERE \(id = 1\)/
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
specify "should work with abstract classes" do
|
|
53
|
+
c = Class.new(Sequel::Model)
|
|
54
|
+
c.plugin :prepared_statements_safe
|
|
55
|
+
c1 = Class.new(c)
|
|
56
|
+
c1.meta_def(:get_db_schema){@db_schema = {:i=>{:default=>'f(x)'}, :name=>{:ruby_default=>'foo'}, :id=>{:primary_key=>true}}}
|
|
57
|
+
c1.set_dataset(:people)
|
|
58
|
+
c1.prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
59
|
+
Class.new(c1).prepared_statements_column_defaults.should == {:name=>'foo'}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.plugin :prepared_statements
|
|
9
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
10
|
+
@ds = @c.dataset
|
|
11
|
+
@db.sqls
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
specify "should correctly lookup by primary key" do
|
|
15
|
+
@c[1].should == @p
|
|
16
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
specify "should correctly delete instance" do
|
|
20
|
+
@p.destroy.should == @p
|
|
21
|
+
@db.sqls.should == ["DELETE FROM people WHERE (id = 1)"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
specify "should correctly update instance" do
|
|
25
|
+
@p.update(:name=>'bar').should == @c.load(:id=>1, :name=>'bar', :i => 2)
|
|
26
|
+
@db.sqls.should == ["UPDATE people SET name = 'bar' WHERE (id = 1)"]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
specify "should correctly create instance" do
|
|
30
|
+
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
|
31
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo')", "SELECT * FROM people WHERE (id = 1) LIMIT 1"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
specify "should correctly create instance if dataset supports insert_select" do
|
|
35
|
+
ds = @c.instance_dataset
|
|
36
|
+
def ds.supports_insert_select?
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
def @ds.supports_insert_select?
|
|
40
|
+
true
|
|
41
|
+
end
|
|
42
|
+
def @ds.insert_select(h)
|
|
43
|
+
{:id=>1, :name=>'foo', :i => 2}
|
|
44
|
+
end
|
|
45
|
+
def @ds.insert_sql(*)
|
|
46
|
+
"#{super}#{' RETURNING *' if opts.has_key?(:returning)}"
|
|
47
|
+
end
|
|
48
|
+
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
|
49
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo') RETURNING *"]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
specify "should work correctly when subclassing" do
|
|
53
|
+
c = Class.new(@c)
|
|
54
|
+
c[1].should == c.load(:id=>1, :name=>'foo', :i=>2)
|
|
55
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe " with placeholder type specifiers" do
|
|
59
|
+
before do
|
|
60
|
+
@ds.meta_def(:requires_placeholder_type_specifiers?){true}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
specify "should correctly handle without schema type" do
|
|
64
|
+
@c[1].should == @p
|
|
65
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
specify "should correctly handle with schema type" do
|
|
69
|
+
@c.db_schema[:id][:type] = :integer
|
|
70
|
+
ds = @c.send(:prepared_lookup)
|
|
71
|
+
def ds.literal_symbol_append(sql, v)
|
|
72
|
+
if @opts[:bind_vars] and match = /\A\$(.*)\z/.match(v.to_s)
|
|
73
|
+
s = match[1].split('__')[0].to_sym
|
|
74
|
+
if prepared_arg?(s)
|
|
75
|
+
literal_append(sql, prepared_arg(s))
|
|
76
|
+
else
|
|
77
|
+
sql << v.to_s
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
super
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
@c[1].should == @p
|
|
84
|
+
@db.sqls.should == ["SELECT * FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "prepared_statements_with_pk plugin" do
|
|
4
|
+
before do
|
|
5
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
|
6
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
|
7
|
+
@c.columns :id, :name, :i
|
|
8
|
+
@c.plugin :prepared_statements_with_pk
|
|
9
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
|
10
|
+
@db.sqls
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
specify "should load the prepared_statements plugin" do
|
|
14
|
+
@c.plugins.should include(Sequel::Plugins::PreparedStatements)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
specify "should correctly lookup by primary key from dataset" do
|
|
18
|
+
@c.dataset.filter(:name=>'foo')[1].should == @p
|
|
19
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
specify "should still work correctly if there are multiple conflicting variables" do
|
|
23
|
+
@c.dataset.filter(:name=>'foo').or(:name=>'bar')[1].should == @p
|
|
24
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE (((name = 'foo') OR (name = 'bar')) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
specify "should still work correctly if the primary key is used elsewhere in the query" do
|
|
28
|
+
@c.dataset.filter{id > 2}[1].should == @p
|
|
29
|
+
@c.db.sqls.should == ["SELECT * FROM people WHERE ((id > 2) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -7,12 +7,7 @@ describe "Dataset#print" do
|
|
|
7
7
|
@output = StringIO.new
|
|
8
8
|
@orig_stdout = $stdout
|
|
9
9
|
$stdout = @output
|
|
10
|
-
@dataset = Sequel
|
|
11
|
-
def @dataset.fetch_rows(sql)
|
|
12
|
-
yield({:a=>1, :b=>2})
|
|
13
|
-
yield({:a=>3, :b=>4})
|
|
14
|
-
yield({:a=>5, :b=>6})
|
|
15
|
-
end
|
|
10
|
+
@dataset = Sequel.mock(:fetch=>[{:a=>1, :b=>2}, {:a=>3, :b=>4}, {:a=>5, :b=>6}])[:items]
|
|
16
11
|
end
|
|
17
12
|
|
|
18
13
|
after do
|
|
@@ -68,6 +63,12 @@ describe "PrettyTable" do
|
|
|
68
63
|
/\n(\|x\|y\|)|(\|y\|x\|)\n/
|
|
69
64
|
end
|
|
70
65
|
|
|
66
|
+
specify "should have #string return the string without printing" do
|
|
67
|
+
Sequel::PrettyTable.string(@data1).should =~ /\n(\|x\|y\|)|(\|y\|x\|)\n/
|
|
68
|
+
@output.rewind
|
|
69
|
+
@output.read.should == ''
|
|
70
|
+
end
|
|
71
|
+
|
|
71
72
|
specify "should calculate the maximum width of each column correctly" do
|
|
72
73
|
Sequel::PrettyTable.print(@data2, [:a, :b])
|
|
73
74
|
@output.rewind
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "query_literals extension" do
|
|
4
|
+
before do
|
|
5
|
+
@ds = Sequel::Dataset.new(nil).from(:t)
|
|
6
|
+
@ds.extend(Sequel::QueryLiterals)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should not use special support if given a block" do
|
|
10
|
+
@ds.select('a, b, c'){d}.sql.should == 'SELECT \'a, b, c\', d FROM t'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should have #select use literal string if given a single string" do
|
|
14
|
+
@ds.select('a, b, c').sql.should == 'SELECT a, b, c FROM t'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should have #select use placeholder literal string if given a string and additional arguments" do
|
|
18
|
+
@ds.select('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should have #select work the standard way if initial string is a literal string already" do
|
|
22
|
+
@ds.select('a, b, ?'.lit, 1).sql.should == 'SELECT a, b, ?, 1 FROM t'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should have #select work regularly if not given a string as the first argument" do
|
|
26
|
+
@ds.select(:a, 1).sql.should == 'SELECT a, 1 FROM t'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe 'with existing selection' do
|
|
30
|
+
before do
|
|
31
|
+
@ds = @ds.select(:d)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should have #select_more use literal string if given a single string" do
|
|
35
|
+
@ds.select_more('a, b, c').sql.should == 'SELECT d, a, b, c FROM t'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should have #select_ use placeholder literal string if given a string and additional arguments" do
|
|
39
|
+
@ds.select_more('a, b, ?', 1).sql.should == 'SELECT d, a, b, 1 FROM t'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should have #select_more work the standard way if initial string is a literal string already" do
|
|
43
|
+
@ds.select_more('a, b, ?'.lit, 1).sql.should == 'SELECT d, a, b, ?, 1 FROM t'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should have #select_more work regularly if not given a string as the first argument" do
|
|
47
|
+
@ds.select_more(:a, 1).sql.should == 'SELECT d, a, 1 FROM t'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should have #select_append use literal string if given a single string" do
|
|
52
|
+
@ds.select_append('a, b, c').sql.should == 'SELECT *, a, b, c FROM t'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should have #select_append use placeholder literal string if given a string and additional arguments" do
|
|
56
|
+
@ds.select_append('a, b, ?', 1).sql.should == 'SELECT *, a, b, 1 FROM t'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should have #select_append work the standard way if initial string is a literal string already" do
|
|
60
|
+
@ds.select_append('a, b, ?'.lit, 1).sql.should == 'SELECT *, a, b, ?, 1 FROM t'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should have #select_append work regularly if not given a string as the first argument" do
|
|
64
|
+
@ds.select_append(:a, 1).sql.should == 'SELECT *, a, 1 FROM t'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should have #select_group use literal string if given a single string" do
|
|
68
|
+
@ds.select_group('a, b, c').sql.should == 'SELECT a, b, c FROM t GROUP BY a, b, c'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "should have #select_group use placeholder literal string if given a string and additional arguments" do
|
|
72
|
+
@ds.select_group('a, b, ?', 1).sql.should == 'SELECT a, b, 1 FROM t GROUP BY a, b, 1'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should have #select_group work the standard way if initial string is a literal string already" do
|
|
76
|
+
@ds.select_group('a, b, ?'.lit, 1).sql.should == 'SELECT a, b, ?, 1 FROM t GROUP BY a, b, ?, 1'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should have #select_group work regularly if not given a string as the first argument" do
|
|
80
|
+
@ds.select_group(:a, 1).sql.should == 'SELECT a, 1 FROM t GROUP BY a, 1'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should have #group use literal string if given a single string" do
|
|
84
|
+
@ds.group('a, b, c').sql.should == 'SELECT * FROM t GROUP BY a, b, c'
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "should have #group use placeholder literal string if given a string and additional arguments" do
|
|
88
|
+
@ds.group('a, b, ?', 1).sql.should == 'SELECT * FROM t GROUP BY a, b, 1'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should have #select_group work the standard way if initial string is a literal string already" do
|
|
92
|
+
@ds.group('a, b, ?'.lit, 1).sql.should == 'SELECT * FROM t GROUP BY a, b, ?, 1'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should have #select_group work regularly if not given a string as the first argument" do
|
|
96
|
+
@ds.group(:a, 1).sql.should == 'SELECT * FROM t GROUP BY a, 1'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should have #group_and_count use literal string if given a single string" do
|
|
100
|
+
@ds.group_and_count('a, b, c').sql.should == 'SELECT a, b, c, count(*) AS count FROM t GROUP BY a, b, c'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should have #group_and_count use placeholder literal string if given a string and additional arguments" do
|
|
104
|
+
@ds.group_and_count('a, b, ?', 1).sql.should == 'SELECT a, b, 1, count(*) AS count FROM t GROUP BY a, b, 1'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "should have #group_and_count work the standard way if initial string is a literal string already" do
|
|
108
|
+
@ds.group_and_count('a, b, ?'.lit, 1).sql.should == 'SELECT a, b, ?, 1, count(*) AS count FROM t GROUP BY a, b, ?, 1'
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "should have #group_and_count work regularly if not given a string as the first argument" do
|
|
112
|
+
@ds.group_and_count(:a, 1).sql.should == 'SELECT a, 1, count(*) AS count FROM t GROUP BY a, 1'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "should have #order use literal string if given a single string" do
|
|
116
|
+
@ds.order('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should have #order use placeholder literal string if given a string and additional arguments" do
|
|
120
|
+
@ds.order('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should have #order work the standard way if initial string is a literal string already" do
|
|
124
|
+
@ds.order('a, b, ?'.lit, 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "should have #order work regularly if not given a string as the first argument" do
|
|
128
|
+
@ds.order(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1'
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe 'with existing order' do
|
|
132
|
+
before do
|
|
133
|
+
@ds = @ds.order(:d)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "should have #order_more use literal string if given a single string" do
|
|
137
|
+
@ds.order_more('a, b, c').sql.should == 'SELECT * FROM t ORDER BY d, a, b, c'
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "should have #order_more use placeholder literal string if given a string and additional arguments" do
|
|
141
|
+
@ds.order_more('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, 1'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "should have #order_more work the standard way if initial string is a literal string already" do
|
|
145
|
+
@ds.order_more('a, b, ?'.lit, 1).sql.should == 'SELECT * FROM t ORDER BY d, a, b, ?, 1'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should have #order_more work regularly if not given a string as the first argument" do
|
|
149
|
+
@ds.order_more(:a, 1).sql.should == 'SELECT * FROM t ORDER BY d, a, 1'
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "should have #order_prepend use literal string if given a single string" do
|
|
153
|
+
@ds.order_prepend('a, b, c').sql.should == 'SELECT * FROM t ORDER BY a, b, c, d'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "should have #order_append use placeholder literal string if given a string and additional arguments" do
|
|
157
|
+
@ds.order_prepend('a, b, ?', 1).sql.should == 'SELECT * FROM t ORDER BY a, b, 1, d'
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "should have #order_append work the standard way if initial string is a literal string already" do
|
|
161
|
+
@ds.order_prepend('a, b, ?'.lit, 1).sql.should == 'SELECT * FROM t ORDER BY a, b, ?, 1, d'
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "should have #order_append work regularly if not given a string as the first argument" do
|
|
165
|
+
@ds.order_prepend(:a, 1).sql.should == 'SELECT * FROM t ORDER BY a, 1, d'
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
@@ -17,6 +17,12 @@ describe "Dataset#query" do
|
|
|
17
17
|
@d = Sequel::Dataset.new(nil)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
specify "should allow cloning without arguments" do
|
|
21
|
+
q = @d.query {clone}
|
|
22
|
+
q.class.should == @d.class
|
|
23
|
+
q.sql.should == "SELECT *"
|
|
24
|
+
end
|
|
25
|
+
|
|
20
26
|
specify "should support #from" do
|
|
21
27
|
q = @d.query {from :xxx}
|
|
22
28
|
q.class.should == @d.class
|
|
@@ -8,13 +8,6 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
8
8
|
columns :id, :name, :parent_id, :i, :pi
|
|
9
9
|
end
|
|
10
10
|
@ds = @c.dataset
|
|
11
|
-
class << @ds
|
|
12
|
-
attr_accessor :row_sets
|
|
13
|
-
def fetch_rows(sql)
|
|
14
|
-
@db << sql
|
|
15
|
-
row_sets.shift.each{|row| yield row}
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
11
|
@o = @c.load(:id=>2, :parent_id=>1, :name=>'AA', :i=>3, :pi=>4)
|
|
19
12
|
MODEL_DB.reset
|
|
20
13
|
end
|
|
@@ -37,6 +30,15 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
37
30
|
@o.descendants_dataset.sql.should == 'WITH t AS (SELECT * FROM nodes WHERE (parent_id = 2) UNION ALL SELECT nodes.* FROM nodes INNER JOIN t ON (t.id = nodes.parent_id)) SELECT * FROM t AS nodes'
|
|
38
31
|
end
|
|
39
32
|
|
|
33
|
+
it "should use the correct SQL for lazy associations when recursive CTEs require column aliases" do
|
|
34
|
+
@c.dataset.meta_def(:recursive_cte_requires_column_aliases?){true}
|
|
35
|
+
@c.plugin :rcte_tree
|
|
36
|
+
@o.parent_dataset.sql.should == 'SELECT * FROM nodes WHERE (nodes.id = 1) LIMIT 1'
|
|
37
|
+
@o.children_dataset.sql.should == 'SELECT * FROM nodes WHERE (nodes.parent_id = 2)'
|
|
38
|
+
@o.ancestors_dataset.sql.should == 'WITH t(id, name, parent_id, i, pi) AS (SELECT id, name, parent_id, i, pi FROM nodes WHERE (id = 1) UNION ALL SELECT nodes.id, nodes.name, nodes.parent_id, nodes.i, nodes.pi FROM nodes INNER JOIN t ON (t.parent_id = nodes.id)) SELECT * FROM t AS nodes'
|
|
39
|
+
@o.descendants_dataset.sql.should == 'WITH t(id, name, parent_id, i, pi) AS (SELECT id, name, parent_id, i, pi FROM nodes WHERE (parent_id = 2) UNION ALL SELECT nodes.id, nodes.name, nodes.parent_id, nodes.i, nodes.pi FROM nodes INNER JOIN t ON (t.id = nodes.parent_id)) SELECT * FROM t AS nodes'
|
|
40
|
+
end
|
|
41
|
+
|
|
40
42
|
it "should use the correct SQL for lazy associations when giving options" do
|
|
41
43
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :cte_name=>:cte, :order=>:name, :ancestors=>{:name=>:as}, :children=>{:name=>:cs}, :descendants=>{:name=>:ds}, :parent=>{:name=>:p}
|
|
42
44
|
@o.p_dataset.sql.should == 'SELECT * FROM nodes WHERE (nodes.i = 4) ORDER BY name LIMIT 1'
|
|
@@ -55,7 +57,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
55
57
|
|
|
56
58
|
it "should add all parent associations when lazily loading ancestors" do
|
|
57
59
|
@c.plugin :rcte_tree
|
|
58
|
-
@ds.
|
|
60
|
+
@ds._fetch = [[{:id=>1, :name=>'A', :parent_id=>3}, {:id=>4, :name=>'B', :parent_id=>nil}, {:id=>3, :name=>'?', :parent_id=>4}]]
|
|
59
61
|
@o.ancestors.should == [@c.load(:id=>1, :name=>'A', :parent_id=>3), @c.load(:id=>4, :name=>'B', :parent_id=>nil), @c.load(:id=>3, :name=>'?', :parent_id=>4)]
|
|
60
62
|
@o.associations[:parent].should == @c.load(:id=>1, :name=>'A', :parent_id=>3)
|
|
61
63
|
@o.associations[:parent].associations[:parent].should == @c.load(:id=>3, :name=>'?', :parent_id=>4)
|
|
@@ -65,7 +67,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
65
67
|
|
|
66
68
|
it "should add all parent associations when lazily loading ancestors and giving options" do
|
|
67
69
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :ancestors=>{:name=>:as}, :parent=>{:name=>:p}
|
|
68
|
-
@ds.
|
|
70
|
+
@ds._fetch = [[{:i=>4, :name=>'A', :pi=>5}, {:i=>6, :name=>'B', :pi=>nil}, {:i=>5, :name=>'?', :pi=>6}]]
|
|
69
71
|
@o.as.should == [@c.load(:i=>4, :name=>'A', :pi=>5), @c.load(:i=>6, :name=>'B', :pi=>nil), @c.load(:i=>5, :name=>'?', :pi=>6)]
|
|
70
72
|
@o.associations[:p].should == @c.load(:i=>4, :name=>'A', :pi=>5)
|
|
71
73
|
@o.associations[:p].associations[:p].should == @c.load(:i=>5, :name=>'?', :pi=>6)
|
|
@@ -75,7 +77,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
75
77
|
|
|
76
78
|
it "should add all children associations when lazily loading descendants" do
|
|
77
79
|
@c.plugin :rcte_tree
|
|
78
|
-
@ds.
|
|
80
|
+
@ds._fetch = [[{:id=>3, :name=>'??', :parent_id=>1}, {:id=>1, :name=>'A', :parent_id=>2}, {:id=>4, :name=>'B', :parent_id=>2}, {:id=>5, :name=>'?', :parent_id=>3}]]
|
|
79
81
|
@o.descendants.should == [@c.load(:id=>3, :name=>'??', :parent_id=>1), @c.load(:id=>1, :name=>'A', :parent_id=>2), @c.load(:id=>4, :name=>'B', :parent_id=>2), @c.load(:id=>5, :name=>'?', :parent_id=>3)]
|
|
80
82
|
@o.associations[:children].should == [@c.load(:id=>1, :name=>'A', :parent_id=>2), @c.load(:id=>4, :name=>'B', :parent_id=>2)]
|
|
81
83
|
@o.associations[:children].map{|c1| c1.associations[:children]}.should == [[@c.load(:id=>3, :name=>'??', :parent_id=>1)], []]
|
|
@@ -85,7 +87,7 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
85
87
|
|
|
86
88
|
it "should add all children associations when lazily loading descendants and giving options" do
|
|
87
89
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :children=>{:name=>:cs}, :descendants=>{:name=>:ds}
|
|
88
|
-
@ds.
|
|
90
|
+
@ds._fetch = [[{:i=>7, :name=>'??', :pi=>5}, {:i=>5, :name=>'A', :pi=>3}, {:i=>6, :name=>'B', :pi=>3}, {:i=>8, :name=>'?', :pi=>7}]]
|
|
89
91
|
@o.ds.should == [@c.load(:i=>7, :name=>'??', :pi=>5), @c.load(:i=>5, :name=>'A', :pi=>3), @c.load(:i=>6, :name=>'B', :pi=>3), @c.load(:i=>8, :name=>'?', :pi=>7)]
|
|
90
92
|
@o.associations[:cs].should == [@c.load(:i=>5, :name=>'A', :pi=>3), @c.load(:i=>6, :name=>'B', :pi=>3)]
|
|
91
93
|
@o.associations[:cs].map{|c1| c1.associations[:cs]}.should == [[@c.load(:i=>7, :name=>'??', :pi=>5)], []]
|
|
@@ -95,13 +97,14 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
95
97
|
|
|
96
98
|
it "should eagerly load ancestors" do
|
|
97
99
|
@c.plugin :rcte_tree
|
|
98
|
-
@ds.
|
|
100
|
+
@ds._fetch = [[{:id=>2, :parent_id=>1, :name=>'AA'}, {:id=>6, :parent_id=>2, :name=>'C'}, {:id=>7, :parent_id=>1, :name=>'D'}, {:id=>9, :parent_id=>nil, :name=>'E'}],
|
|
99
101
|
[{:id=>2, :name=>'AA', :parent_id=>1, :x_root_x=>2},
|
|
100
102
|
{:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>1}, {:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>2},
|
|
101
103
|
{:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>2}, {:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>1}]]
|
|
102
104
|
os = @ds.eager(:ancestors).all
|
|
103
|
-
MODEL_DB.sqls
|
|
104
|
-
|
|
105
|
+
sqls = MODEL_DB.sqls
|
|
106
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
105
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')]
|
|
106
109
|
os.map{|o| o.ancestors}.should == [[@c.load(:id=>1, :name=>'00', :parent_id=>8), @c.load(:id=>8, :name=>'?', :parent_id=>nil)],
|
|
107
110
|
[@c.load(:id=>2, :name=>'AA', :parent_id=>1), @c.load(:id=>1, :name=>'00', :parent_id=>8), @c.load(:id=>8, :name=>'?', :parent_id=>nil)],
|
|
@@ -111,18 +114,19 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
111
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]
|
|
112
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]
|
|
113
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]
|
|
114
|
-
MODEL_DB.
|
|
117
|
+
MODEL_DB.sqls.should == []
|
|
115
118
|
end
|
|
116
119
|
|
|
117
120
|
it "should eagerly load ancestors when giving options" do
|
|
118
121
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :key_alias=>:kal, :cte_name=>:cte, :ancestors=>{:name=>:as}, :parent=>{:name=>:p}
|
|
119
|
-
@ds.
|
|
122
|
+
@ds._fetch = [[{:i=>2, :pi=>1, :name=>'AA'}, {:i=>6, :pi=>2, :name=>'C'}, {:i=>7, :pi=>1, :name=>'D'}, {:i=>9, :pi=>nil, :name=>'E'}],
|
|
120
123
|
[{:i=>2, :name=>'AA', :pi=>1, :kal=>2},
|
|
121
124
|
{:i=>1, :name=>'00', :pi=>8, :kal=>1}, {:i=>1, :name=>'00', :pi=>8, :kal=>2},
|
|
122
125
|
{:i=>8, :name=>'?', :pi=>nil, :kal=>2}, {:i=>8, :name=>'?', :pi=>nil, :kal=>1}]]
|
|
123
126
|
os = @ds.eager(:as).all
|
|
124
|
-
MODEL_DB.sqls
|
|
125
|
-
|
|
127
|
+
sqls = MODEL_DB.sqls
|
|
128
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
126
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')]
|
|
127
131
|
os.map{|o| o.as}.should == [[@c.load(:i=>1, :name=>'00', :pi=>8), @c.load(:i=>8, :name=>'?', :pi=>nil)],
|
|
128
132
|
[@c.load(:i=>2, :name=>'AA', :pi=>1), @c.load(:i=>1, :name=>'00', :pi=>8), @c.load(:i=>8, :name=>'?', :pi=>nil)],
|
|
@@ -132,30 +136,30 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
132
136
|
os.map{|o| o.p.p if o.p}.should == [@c.load(:i=>8, :name=>'?', :pi=>nil), @c.load(:i=>1, :name=>'00', :pi=>8), @c.load(:i=>8, :name=>'?', :pi=>nil), nil]
|
|
133
137
|
os.map{|o| o.p.p.p if o.p and o.p.p}.should == [nil, @c.load(:i=>8, :name=>'?', :pi=>nil), nil, nil]
|
|
134
138
|
os.map{|o| o.p.p.p.p if o.p and o.p.p and o.p.p.p}.should == [nil, nil, nil, nil]
|
|
135
|
-
MODEL_DB.new_sqls.should == []
|
|
136
139
|
end
|
|
137
140
|
|
|
138
141
|
it "should eagerly load ancestors respecting association option :conditions" do
|
|
139
142
|
@c.plugin :rcte_tree, :conditions => {:i => 1}
|
|
140
|
-
@ds.
|
|
143
|
+
@ds._fetch = [[{:id=>2, :parent_id=>1, :name=>'AA'}, {:id=>6, :parent_id=>2, :name=>'C'}, {:id=>7, :parent_id=>1, :name=>'D'}, {:id=>9, :parent_id=>nil, :name=>'E'}],
|
|
141
144
|
[{:id=>2, :name=>'AA', :parent_id=>1, :x_root_x=>2},
|
|
142
145
|
{:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>1}, {:id=>1, :name=>'00', :parent_id=>8, :x_root_x=>2},
|
|
143
146
|
{:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>2}, {:id=>8, :name=>'?', :parent_id=>nil, :x_root_x=>1}]]
|
|
144
147
|
os = @ds.eager(:ancestors).all
|
|
145
|
-
MODEL_DB.sqls
|
|
146
|
-
|
|
147
|
-
|
|
148
|
+
sqls = MODEL_DB.sqls
|
|
149
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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\)/
|
|
148
151
|
end
|
|
149
152
|
|
|
150
153
|
it "should eagerly load descendants" do
|
|
151
154
|
@c.plugin :rcte_tree
|
|
152
|
-
@ds.
|
|
155
|
+
@ds._fetch = [[{:id=>2, :parent_id=>1, :name=>'AA'}, {:id=>6, :parent_id=>2, :name=>'C'}, {:id=>7, :parent_id=>1, :name=>'D'}],
|
|
153
156
|
[{:id=>6, :parent_id=>2, :name=>'C', :x_root_x=>2}, {:id=>9, :parent_id=>2, :name=>'E', :x_root_x=>2},
|
|
154
157
|
{:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>6}, {:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>2},
|
|
155
158
|
{:id=>4, :name=>'?', :parent_id=>7, :x_root_x=>7}, {:id=>5, :name=>'?', :parent_id=>4, :x_root_x=>7}]]
|
|
156
159
|
os = @ds.eager(:descendants).all
|
|
157
|
-
MODEL_DB.sqls
|
|
158
|
-
|
|
160
|
+
sqls = MODEL_DB.sqls
|
|
161
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
159
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')]
|
|
160
164
|
os.map{|o| o.descendants}.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)],
|
|
161
165
|
[@c.load(:id=>3, :name=>'00', :parent_id=>6)],
|
|
@@ -163,18 +167,19 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
163
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)]]
|
|
164
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)]]]
|
|
165
169
|
os.map{|o1| o1.children.map{|o2| o2.children.map{|o3| o3.children}}}.should == [[[[]], []], [[]], [[[]]]]
|
|
166
|
-
MODEL_DB.
|
|
170
|
+
MODEL_DB.sqls.should == []
|
|
167
171
|
end
|
|
168
172
|
|
|
169
173
|
it "should eagerly load descendants when giving options" do
|
|
170
174
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :key_alias=>:kal, :cte_name=>:cte, :children=>{:name=>:cs}, :descendants=>{:name=>:ds}
|
|
171
|
-
@ds.
|
|
175
|
+
@ds._fetch = [[{:i=>2, :pi=>1, :name=>'AA'}, {:i=>6, :pi=>2, :name=>'C'}, {:i=>7, :pi=>1, :name=>'D'}],
|
|
172
176
|
[{:i=>6, :pi=>2, :name=>'C', :kal=>2}, {:i=>9, :pi=>2, :name=>'E', :kal=>2},
|
|
173
177
|
{:i=>3, :name=>'00', :pi=>6, :kal=>6}, {:i=>3, :name=>'00', :pi=>6, :kal=>2},
|
|
174
178
|
{:i=>4, :name=>'?', :pi=>7, :kal=>7}, {:i=>5, :name=>'?', :pi=>4, :kal=>7}]]
|
|
175
179
|
os = @ds.eager(:ds).all
|
|
176
|
-
MODEL_DB.sqls
|
|
177
|
-
|
|
180
|
+
sqls = MODEL_DB.sqls
|
|
181
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
178
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')]
|
|
179
184
|
os.map{|o| o.ds}.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)],
|
|
180
185
|
[@c.load(:i=>3, :name=>'00', :pi=>6)],
|
|
@@ -182,18 +187,19 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
182
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)]]
|
|
183
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)]]]
|
|
184
189
|
os.map{|o1| o1.cs.map{|o2| o2.cs.map{|o3| o3.cs}}}.should == [[[[]], []], [[]], [[[]]]]
|
|
185
|
-
MODEL_DB.
|
|
190
|
+
MODEL_DB.sqls.should == []
|
|
186
191
|
end
|
|
187
192
|
|
|
188
193
|
it "should eagerly load descendants to a given level" do
|
|
189
194
|
@c.plugin :rcte_tree
|
|
190
|
-
@ds.
|
|
195
|
+
@ds._fetch = [[{:id=>2, :parent_id=>1, :name=>'AA'}, {:id=>6, :parent_id=>2, :name=>'C'}, {:id=>7, :parent_id=>1, :name=>'D'}],
|
|
191
196
|
[{:id=>6, :parent_id=>2, :name=>'C', :x_root_x=>2, :x_level_x=>0}, {:id=>9, :parent_id=>2, :name=>'E', :x_root_x=>2, :x_level_x=>0},
|
|
192
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},
|
|
193
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}]]
|
|
194
199
|
os = @ds.eager(:descendants=>2).all
|
|
195
|
-
MODEL_DB.sqls
|
|
196
|
-
|
|
200
|
+
sqls = MODEL_DB.sqls
|
|
201
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
197
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')]
|
|
198
204
|
os.map{|o| o.descendants}.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)],
|
|
199
205
|
[@c.load(:id=>3, :name=>'00', :parent_id=>6)],
|
|
@@ -201,18 +207,19 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
201
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)]]
|
|
202
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)]]]
|
|
203
209
|
os.map{|o1| o1.associations[:children].map{|o2| o2.associations[:children].map{|o3| o3.associations[:children]}}}.should == [[[[]], []], [[]], [[nil]]]
|
|
204
|
-
MODEL_DB.
|
|
210
|
+
MODEL_DB.sqls.should == []
|
|
205
211
|
end
|
|
206
212
|
|
|
207
213
|
it "should eagerly load descendants to a given level when giving options" do
|
|
208
214
|
@c.plugin :rcte_tree, :primary_key=>:i, :key=>:pi, :key_alias=>:kal, :level_alias=>:lal, :cte_name=>:cte, :children=>{:name=>:cs}, :descendants=>{:name=>:ds}
|
|
209
|
-
@ds.
|
|
215
|
+
@ds._fetch = [[{:i=>2, :pi=>1, :name=>'AA'}, {:i=>6, :pi=>2, :name=>'C'}, {:i=>7, :pi=>1, :name=>'D'}],
|
|
210
216
|
[{:i=>6, :pi=>2, :name=>'C', :kal=>2, :lal=>0}, {:i=>9, :pi=>2, :name=>'E', :kal=>2, :lal=>0},
|
|
211
217
|
{:i=>3, :name=>'00', :pi=>6, :kal=>6, :lal=>0}, {:i=>3, :name=>'00', :pi=>6, :kal=>2, :lal=>1},
|
|
212
218
|
{:i=>4, :name=>'?', :pi=>7, :kal=>7, :lal=>0}, {:i=>5, :name=>'?', :pi=>4, :kal=>7, :lal=>1}]]
|
|
213
219
|
os = @ds.eager(:ds=>2).all
|
|
214
|
-
MODEL_DB.sqls
|
|
215
|
-
|
|
220
|
+
sqls = MODEL_DB.sqls
|
|
221
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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/
|
|
216
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')]
|
|
217
224
|
os.map{|o| o.ds}.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)],
|
|
218
225
|
[@c.load(:i=>3, :name=>'00', :pi=>6)],
|
|
@@ -220,18 +227,18 @@ describe Sequel::Model, "rcte_tree" do
|
|
|
220
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)]]
|
|
221
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)]]]
|
|
222
229
|
os.map{|o1| o1.associations[:cs].map{|o2| o2.associations[:cs].map{|o3| o3.associations[:cs]}}}.should == [[[[]], []], [[]], [[nil]]]
|
|
223
|
-
MODEL_DB.
|
|
230
|
+
MODEL_DB.sqls.should == []
|
|
224
231
|
end
|
|
225
232
|
|
|
226
233
|
it "should eagerly load descendants respecting association option :conditions" do
|
|
227
234
|
@c.plugin :rcte_tree, :conditions => {:i => 1}
|
|
228
|
-
@ds.
|
|
235
|
+
@ds._fetch = [[{:id=>2, :parent_id=>1, :name=>'AA'}, {:id=>6, :parent_id=>2, :name=>'C'}, {:id=>7, :parent_id=>1, :name=>'D'}],
|
|
229
236
|
[{:id=>6, :parent_id=>2, :name=>'C', :x_root_x=>2}, {:id=>9, :parent_id=>2, :name=>'E', :x_root_x=>2},
|
|
230
237
|
{:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>6}, {:id=>3, :name=>'00', :parent_id=>6, :x_root_x=>2},
|
|
231
238
|
{:id=>4, :name=>'?', :parent_id=>7, :x_root_x=>7}, {:id=>5, :name=>'?', :parent_id=>4, :x_root_x=>7}]]
|
|
232
239
|
os = @ds.eager(:descendants).all
|
|
233
|
-
MODEL_DB.sqls
|
|
234
|
-
|
|
235
|
-
|
|
240
|
+
sqls = MODEL_DB.sqls
|
|
241
|
+
sqls.first.should == "SELECT * FROM nodes"
|
|
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\)/
|
|
236
243
|
end
|
|
237
244
|
end
|