sequel 4.41.0 → 4.42.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 +98 -0
- data/README.rdoc +23 -10
- data/doc/active_record.rdoc +4 -4
- data/doc/advanced_associations.rdoc +2 -2
- data/doc/association_basics.rdoc +5 -2
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/migration.rdoc +19 -1
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/release_notes/4.42.0.txt +221 -0
- data/doc/testing.rdoc +3 -1
- data/lib/sequel/adapters/ado/access.rb +0 -1
- data/lib/sequel/adapters/ado/mssql.rb +0 -1
- data/lib/sequel/adapters/do/mysql.rb +0 -1
- data/lib/sequel/adapters/do/postgres.rb +0 -1
- data/lib/sequel/adapters/do/sqlite3.rb +0 -1
- data/lib/sequel/adapters/ibmdb.rb +21 -25
- data/lib/sequel/adapters/jdbc.rb +8 -16
- data/lib/sequel/adapters/jdbc/as400.rb +0 -1
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
- data/lib/sequel/adapters/jdbc/db2.rb +0 -1
- data/lib/sequel/adapters/jdbc/derby.rb +0 -1
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
- data/lib/sequel/adapters/jdbc/h2.rb +0 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
- data/lib/sequel/adapters/mock.rb +54 -12
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +11 -17
- data/lib/sequel/adapters/odbc/mssql.rb +0 -1
- data/lib/sequel/adapters/oracle.rb +8 -20
- data/lib/sequel/adapters/postgres.rb +11 -29
- data/lib/sequel/adapters/shared/access.rb +5 -12
- data/lib/sequel/adapters/shared/cubrid.rb +4 -13
- data/lib/sequel/adapters/shared/db2.rb +4 -2
- data/lib/sequel/adapters/shared/firebird.rb +2 -4
- data/lib/sequel/adapters/shared/informix.rb +4 -2
- data/lib/sequel/adapters/shared/mssql.rb +3 -5
- data/lib/sequel/adapters/shared/mysql.rb +4 -14
- data/lib/sequel/adapters/shared/oracle.rb +1 -3
- data/lib/sequel/adapters/shared/postgres.rb +16 -38
- data/lib/sequel/adapters/shared/progress.rb +0 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
- data/lib/sequel/adapters/shared/sqlite.rb +20 -16
- data/lib/sequel/adapters/sqlite.rb +8 -20
- data/lib/sequel/adapters/swift/mysql.rb +0 -1
- data/lib/sequel/adapters/swift/postgres.rb +0 -1
- data/lib/sequel/adapters/swift/sqlite.rb +0 -1
- data/lib/sequel/adapters/tinytds.rb +4 -12
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
- data/lib/sequel/ast_transformer.rb +2 -2
- data/lib/sequel/database/dataset.rb +1 -1
- data/lib/sequel/database/dataset_defaults.rb +0 -66
- data/lib/sequel/database/features.rb +6 -0
- data/lib/sequel/database/misc.rb +31 -17
- data/lib/sequel/database/query.rb +7 -4
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset.rb +8 -8
- data/lib/sequel/dataset/actions.rb +140 -46
- data/lib/sequel/dataset/features.rb +1 -5
- data/lib/sequel/dataset/graph.rb +7 -8
- data/lib/sequel/dataset/misc.rb +127 -56
- data/lib/sequel/dataset/mutation.rb +9 -20
- data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
- data/lib/sequel/dataset/prepared_statements.rb +102 -46
- data/lib/sequel/dataset/query.rb +155 -72
- data/lib/sequel/dataset/sql.rb +26 -9
- data/lib/sequel/extensions/columns_introspection.rb +3 -1
- data/lib/sequel/extensions/core_extensions.rb +5 -5
- data/lib/sequel/extensions/core_refinements.rb +5 -5
- data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
- data/lib/sequel/extensions/freeze_datasets.rb +69 -0
- data/lib/sequel/extensions/identifier_mangling.rb +196 -0
- data/lib/sequel/extensions/looser_typecasting.rb +11 -7
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +5 -2
- data/lib/sequel/extensions/pagination.rb +42 -23
- data/lib/sequel/extensions/pg_enum.rb +3 -3
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
- data/lib/sequel/model/associations.rb +25 -8
- data/lib/sequel/model/base.rb +88 -29
- data/lib/sequel/model/dataset_module.rb +37 -0
- data/lib/sequel/plugins/association_pks.rb +4 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/constraint_validations.rb +1 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +8 -8
- data/lib/sequel/plugins/eager_each.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +4 -4
- data/lib/sequel/plugins/prepared_statements.rb +2 -4
- data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +13 -13
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -2
- data/lib/sequel/sql.rb +69 -36
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +10 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +4 -5
- data/spec/adapters/mysql_spec.rb +9 -9
- data/spec/adapters/postgres_spec.rb +67 -68
- data/spec/adapters/spec_helper.rb +6 -1
- data/spec/adapters/sqlite_spec.rb +29 -15
- data/spec/core/connection_pool_spec.rb +14 -14
- data/spec/core/database_spec.rb +38 -180
- data/spec/core/dataset_mutation_spec.rb +253 -0
- data/spec/core/dataset_spec.rb +394 -537
- data/spec/core/expression_filters_spec.rb +34 -32
- data/spec/core/mock_adapter_spec.rb +27 -35
- data/spec/core/placeholder_literalizer_spec.rb +2 -4
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +1 -2
- data/spec/core_extensions_spec.rb +22 -29
- data/spec/extensions/active_model_spec.rb +6 -6
- data/spec/extensions/association_dependencies_spec.rb +2 -2
- data/spec/extensions/blacklist_security_spec.rb +3 -3
- data/spec/extensions/boolean_readers_spec.rb +12 -12
- data/spec/extensions/caching_spec.rb +13 -10
- data/spec/extensions/class_table_inheritance_spec.rb +38 -43
- data/spec/extensions/column_conflicts_spec.rb +1 -3
- data/spec/extensions/columns_introspection_spec.rb +2 -3
- data/spec/extensions/composition_spec.rb +5 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
- data/spec/extensions/constraint_validations_spec.rb +14 -8
- data/spec/extensions/core_refinements_spec.rb +22 -29
- data/spec/extensions/csv_serializer_spec.rb +7 -6
- data/spec/extensions/date_arithmetic_spec.rb +15 -15
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +1 -1
- data/spec/extensions/dirty_spec.rb +19 -10
- data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
- data/spec/extensions/eager_each_spec.rb +12 -16
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +4 -3
- data/spec/extensions/force_encoding_spec.rb +12 -12
- data/spec/extensions/freeze_datasets_spec.rb +31 -0
- data/spec/extensions/graph_each_spec.rb +6 -18
- data/spec/extensions/hook_class_methods_spec.rb +7 -7
- data/spec/extensions/identifier_mangling_spec.rb +307 -0
- data/spec/extensions/instance_filters_spec.rb +5 -6
- data/spec/extensions/instance_hooks_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +12 -15
- data/spec/extensions/lazy_attributes_spec.rb +4 -4
- data/spec/extensions/list_spec.rb +19 -21
- data/spec/extensions/many_through_many_spec.rb +108 -163
- data/spec/extensions/meta_def_spec.rb +7 -2
- data/spec/extensions/migration_spec.rb +10 -12
- data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
- data/spec/extensions/named_timezones_spec.rb +4 -3
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +17 -12
- data/spec/extensions/optimistic_locking_spec.rb +4 -5
- data/spec/extensions/pagination_spec.rb +8 -10
- data/spec/extensions/pg_array_associations_spec.rb +28 -27
- data/spec/extensions/pg_array_ops_spec.rb +2 -1
- data/spec/extensions/pg_array_spec.rb +6 -2
- data/spec/extensions/pg_enum_spec.rb +5 -3
- data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
- data/spec/extensions/pg_hstore_spec.rb +7 -6
- data/spec/extensions/pg_inet_ops_spec.rb +2 -1
- data/spec/extensions/pg_inet_spec.rb +2 -1
- data/spec/extensions/pg_interval_spec.rb +2 -1
- data/spec/extensions/pg_json_ops_spec.rb +2 -1
- data/spec/extensions/pg_json_spec.rb +6 -3
- data/spec/extensions/pg_loose_count_spec.rb +1 -0
- data/spec/extensions/pg_range_ops_spec.rb +3 -1
- data/spec/extensions/pg_range_spec.rb +9 -5
- data/spec/extensions/pg_row_ops_spec.rb +2 -1
- data/spec/extensions/pg_row_plugin_spec.rb +4 -6
- data/spec/extensions/pg_row_spec.rb +5 -3
- data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
- data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +12 -11
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +8 -5
- data/spec/extensions/rcte_tree_spec.rb +39 -39
- data/spec/extensions/round_timestamps_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +1 -2
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
- data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
- data/spec/extensions/serialization_spec.rb +15 -13
- data/spec/extensions/set_overrides_spec.rb +14 -8
- data/spec/extensions/sharding_spec.rb +9 -18
- data/spec/extensions/shared_caching_spec.rb +3 -4
- data/spec/extensions/single_table_inheritance_spec.rb +11 -11
- data/spec/extensions/skip_create_refresh_spec.rb +2 -1
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/extensions/split_values_spec.rb +2 -2
- data/spec/extensions/sql_comments_spec.rb +6 -0
- data/spec/extensions/static_cache_spec.rb +7 -9
- data/spec/extensions/string_agg_spec.rb +30 -29
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
- data/spec/extensions/thread_local_timezones_spec.rb +2 -2
- data/spec/extensions/timestamps_spec.rb +28 -3
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/tree_spec.rb +33 -29
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -0
- data/spec/extensions/update_primary_key_spec.rb +11 -7
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +0 -1
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +10 -10
- data/spec/extensions/validation_helpers_spec.rb +10 -10
- data/spec/extensions/xml_serializer_spec.rb +7 -3
- data/spec/integration/associations_test.rb +31 -31
- data/spec/integration/dataset_test.rb +17 -19
- data/spec/integration/eager_loader_test.rb +24 -24
- data/spec/integration/model_test.rb +6 -6
- data/spec/integration/plugin_test.rb +43 -43
- data/spec/integration/prepared_statement_test.rb +6 -6
- data/spec/integration/schema_test.rb +63 -52
- data/spec/integration/spec_helper.rb +6 -1
- data/spec/integration/transaction_test.rb +13 -13
- data/spec/model/association_reflection_spec.rb +17 -17
- data/spec/model/associations_spec.rb +101 -96
- data/spec/model/base_spec.rb +175 -49
- data/spec/model/class_dataset_methods_spec.rb +5 -9
- data/spec/model/dataset_methods_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +209 -235
- data/spec/model/hooks_spec.rb +15 -15
- data/spec/model/model_spec.rb +28 -21
- data/spec/model/plugins_spec.rb +4 -5
- data/spec/model/record_spec.rb +59 -57
- data/spec/model/spec_helper.rb +1 -1
- data/spec/model/validations_spec.rb +6 -6
- data/spec/spec_config.rb +1 -1
- metadata +10 -2
|
@@ -4,11 +4,12 @@ describe "Sequel::Plugins::SkipCreateRefresh" do
|
|
|
4
4
|
it "should skip the refresh after saving a new object" do
|
|
5
5
|
c = Class.new(Sequel::Model(:a))
|
|
6
6
|
c.columns :id, :x
|
|
7
|
+
c.dataset = c.dataset.with_autoid(2)
|
|
7
8
|
c.db.reset
|
|
8
|
-
c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
|
|
9
9
|
c.create(:x=>1)
|
|
10
10
|
c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
|
|
11
11
|
|
|
12
|
+
c.dataset = c.dataset.with_autoid(2)
|
|
12
13
|
c.plugin :skip_create_refresh
|
|
13
14
|
c.db.reset
|
|
14
15
|
c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
|
|
@@ -45,7 +45,7 @@ class << Sequel::Model
|
|
|
45
45
|
def columns(*cols)
|
|
46
46
|
return super if cols.empty?
|
|
47
47
|
define_method(:columns){cols}
|
|
48
|
-
@dataset.
|
|
48
|
+
@dataset.send(:columns=, cols) if @dataset
|
|
49
49
|
def_column_accessor(*cols)
|
|
50
50
|
@columns = cols
|
|
51
51
|
@db_schema = {}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
3
|
describe "Sequel::Plugins::SplitValues" do
|
|
4
|
-
it "
|
|
4
|
+
it "stores non-columns in a separate hash" do
|
|
5
5
|
c = Class.new(Sequel::Model(:a))
|
|
6
6
|
c.columns :id, :x
|
|
7
7
|
c.plugin :split_values
|
|
8
|
-
c.dataset
|
|
8
|
+
c.dataset = c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
|
|
9
9
|
o = c.first
|
|
10
10
|
c.db.reset
|
|
11
11
|
|
|
@@ -24,4 +24,10 @@ describe "sql_comments extension" do
|
|
|
24
24
|
ds = @ds.comment("Some\nComment\r\n Here")
|
|
25
25
|
ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
it "should handle frozen SQL strings" do
|
|
29
|
+
@ds = Sequel.mock[:t].with_extend{def select_sql; super.freeze; end}.extension(:sql_comments)
|
|
30
|
+
ds = @ds.comment("Some\nComment\r\n Here")
|
|
31
|
+
ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
|
|
32
|
+
end
|
|
27
33
|
end
|
|
@@ -25,10 +25,10 @@ describe "Sequel::Plugins::StaticCache" do
|
|
|
25
25
|
it "should make .[] method with primary key use the cache" do
|
|
26
26
|
@c[1].must_equal @c1
|
|
27
27
|
@c[2].must_equal @c2
|
|
28
|
-
@c[3].
|
|
29
|
-
@c[[1, 2]].
|
|
30
|
-
@c[nil].
|
|
31
|
-
@c[].
|
|
28
|
+
@c[3].must_be_nil
|
|
29
|
+
@c[[1, 2]].must_be_nil
|
|
30
|
+
@c[nil].must_be_nil
|
|
31
|
+
@c[].must_be_nil
|
|
32
32
|
@db.sqls.must_equal []
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -41,7 +41,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
|
41
41
|
it "should support cache_get_pk" do
|
|
42
42
|
@c.cache_get_pk(1).must_equal @c1
|
|
43
43
|
@c.cache_get_pk(2).must_equal @c2
|
|
44
|
-
@c.cache_get_pk(3).
|
|
44
|
+
@c.cache_get_pk(3).must_be_nil
|
|
45
45
|
@db.sqls.must_equal []
|
|
46
46
|
end
|
|
47
47
|
|
|
@@ -171,9 +171,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
it "set_dataset should work correctly" do
|
|
174
|
-
ds = @c.dataset.from(:t2)
|
|
175
|
-
ds.instance_variable_set(:@columns, [:id])
|
|
176
|
-
ds._fetch = {:id=>3}
|
|
174
|
+
ds = @c.dataset.from(:t2).columns(:id).with_fetch(:id=>3)
|
|
177
175
|
@c.dataset = ds
|
|
178
176
|
@c.all.must_equal [@c.load(:id=>3)]
|
|
179
177
|
@c.to_hash.must_equal(3=>@c.load(:id=>3))
|
|
@@ -341,7 +339,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
|
341
339
|
@db.autoid = 3
|
|
342
340
|
@db.fetch = [[{:id=>1}, {:id=>2}, {:id=>3}], [{:id=>3}]]
|
|
343
341
|
o.save
|
|
344
|
-
@c[3].
|
|
342
|
+
@c[3].must_be_nil
|
|
345
343
|
end
|
|
346
344
|
|
|
347
345
|
it "should not automatically update the cache when updating model objects" do
|
|
@@ -30,39 +30,40 @@ describe "string_agg extension" do
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
it "should correctly literalize on Postgres" do
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
|
|
34
|
+
ds.literal(@sa1).must_equal "string_agg(c, ',')"
|
|
35
|
+
ds.literal(@sa2).must_equal "string_agg(c, '-')"
|
|
36
|
+
ds.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
|
|
37
|
+
ds.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "should correctly literalize on SQLAnywhere" do
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
ds = dbf.call(:sqlanywhere).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
|
42
|
+
ds.literal(@sa1).must_equal "list(c, ',')"
|
|
43
|
+
ds.literal(@sa2).must_equal "list(c, '-')"
|
|
44
|
+
ds.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
|
|
45
|
+
ds.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "should correctly literalize on MySQL, H2, HSQLDB, CUBRID" do
|
|
49
49
|
[:mysql, :h2, :hsqldb, :cubrid].each do |type|
|
|
50
50
|
db = dbf.call(type)
|
|
51
51
|
db.meta_def(:database_type){type}
|
|
52
|
-
db.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
ds = db.dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
|
53
|
+
ds.literal(@sa1).upcase.must_equal "GROUP_CONCAT(C SEPARATOR ',')"
|
|
54
|
+
ds.literal(@sa2).upcase.must_equal "GROUP_CONCAT(C SEPARATOR '-')"
|
|
55
|
+
ds.literal(@sa3).upcase.must_equal "GROUP_CONCAT(C ORDER BY O SEPARATOR '-')"
|
|
56
|
+
ds.literal(@sa4).upcase.must_equal "GROUP_CONCAT(DISTINCT C ORDER BY O SEPARATOR ',')"
|
|
56
57
|
end
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
it "should correctly literalize on Oracle and DB2" do
|
|
60
61
|
[:oracle, :db2].each do |type|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
proc{
|
|
62
|
+
ds = dbf.call(type).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
|
63
|
+
ds.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
|
|
64
|
+
ds.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
|
|
65
|
+
ds.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
|
|
66
|
+
proc{ds.literal(@sa4)}.must_raise Sequel::Error
|
|
66
67
|
end
|
|
67
68
|
end
|
|
68
69
|
|
|
@@ -72,18 +73,18 @@ describe "string_agg extension" do
|
|
|
72
73
|
|
|
73
74
|
it "should handle order without arguments" do
|
|
74
75
|
db = dbf.call(:postgres)
|
|
75
|
-
db.literal(@sa1.order).must_equal "string_agg(c, ',')"
|
|
76
|
+
db.dataset.with_quote_identifiers(false).literal(@sa1.order).must_equal "string_agg(c, ',')"
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
it "should handle operations on object" do
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
|
|
81
|
+
ds.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
|
|
82
|
+
ds.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
|
|
83
|
+
ds.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
|
|
84
|
+
ds.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
|
|
85
|
+
ds.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
|
|
86
|
+
ds.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
|
|
87
|
+
ds.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
|
|
88
|
+
ds.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
|
|
88
89
|
end
|
|
89
90
|
end
|
|
@@ -21,7 +21,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
|
21
21
|
columns :id, :parent_id
|
|
22
22
|
many_to_one :parent, :class=>self
|
|
23
23
|
one_to_many :children, :class=>self, :key=>:parent_id
|
|
24
|
-
dataset.
|
|
24
|
+
set_dataset dataset.with_fetch(proc do |sql|
|
|
25
25
|
if sql !~ /WHERE/
|
|
26
26
|
[{:id=>1, :parent_id=>101}, {:id=>2, :parent_id=>102}, {:id=>101, :parent_id=>nil}, {:id=>102, :parent_id=>nil}]
|
|
27
27
|
elsif sql =~ /WHERE.*\bid = (\d+)/
|
|
@@ -31,7 +31,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
|
31
31
|
elsif sql =~ /WHERE.*\bparent_id IN \(([\d, ]*)\)/
|
|
32
32
|
$1.split(', ').map{|x| {:id=>x.to_i - 100, :parent_id=>x.to_i} if x.to_i > 100}.compact
|
|
33
33
|
end
|
|
34
|
-
end
|
|
34
|
+
end)
|
|
35
35
|
end
|
|
36
36
|
@c = ::TacticalEagerLoadingModel
|
|
37
37
|
@ds = TacticalEagerLoadingModel.dataset
|
|
@@ -63,7 +63,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
|
63
63
|
it "association getter methods should not eagerly load the association if the association is cached" do
|
|
64
64
|
ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
|
|
65
65
|
sql_match(/\ASELECT \* FROM t WHERE \(t\.id IN \(10[12], 10[12]\)\)\z/)
|
|
66
|
-
|
|
66
|
+
@c.dataset = @c.dataset.with_extend{def eager_load(*) raise end}
|
|
67
67
|
ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
|
|
68
68
|
end
|
|
69
69
|
|
|
@@ -113,8 +113,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
|
113
113
|
it "should handle case where an association is valid on an instance, but not on all instances" do
|
|
114
114
|
c = Class.new(@c)
|
|
115
115
|
c.many_to_one :parent2, :class=>@c, :key=>:parent_id
|
|
116
|
-
@c.dataset.
|
|
117
|
-
@c.all{|x| x.parent2 if x.is_a?(c)}
|
|
116
|
+
@c.dataset.with_row_proc(proc{|r| (r[:parent_id] == 101 ? c : @c).call(r)}).all{|x| x.parent2 if x.is_a?(c)}
|
|
118
117
|
sql_match('SELECT * FROM t', 'SELECT * FROM t WHERE id = 101')
|
|
119
118
|
end
|
|
120
119
|
|
|
@@ -22,7 +22,7 @@ describe "Sequel thread_local_timezones extension" do
|
|
|
22
22
|
Sequel.thread_database_timezone = :utc
|
|
23
23
|
Sequel.database_timezone.must_equal :utc
|
|
24
24
|
Sequel.thread_typecast_timezone = nil
|
|
25
|
-
Sequel.typecast_timezone.
|
|
25
|
+
Sequel.typecast_timezone.must_be_nil
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
it "should fallback to default timezone if no thread_local timezone" do
|
|
@@ -37,7 +37,7 @@ describe "Sequel thread_local_timezones extension" do
|
|
|
37
37
|
Sequel.thread_typecast_timezone = nil
|
|
38
38
|
Sequel.typecast_timezone.must_equal :utc
|
|
39
39
|
Sequel.thread_typecast_timezone = :nil
|
|
40
|
-
Sequel.typecast_timezone.
|
|
40
|
+
Sequel.typecast_timezone.must_be_nil
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it "should be thread safe" do
|
|
@@ -16,7 +16,6 @@ describe "Sequel::Plugins::Timestamps" do
|
|
|
16
16
|
def _save_refresh(*) end
|
|
17
17
|
db.reset
|
|
18
18
|
end
|
|
19
|
-
@c.dataset.autoid = nil
|
|
20
19
|
end
|
|
21
20
|
after do
|
|
22
21
|
Sequel.datetime_class = Time
|
|
@@ -71,7 +70,7 @@ describe "Sequel::Plugins::Timestamps" do
|
|
|
71
70
|
end
|
|
72
71
|
|
|
73
72
|
it "should not update the update timestamp on creation" do
|
|
74
|
-
@c.create.updated_at.
|
|
73
|
+
@c.create.updated_at.must_be_nil
|
|
75
74
|
end
|
|
76
75
|
|
|
77
76
|
it "should use the same value for the creation and update timestamps when creating if the :update_on_create option is given" do
|
|
@@ -133,6 +132,32 @@ describe "Sequel::Plugins::Timestamps" do
|
|
|
133
132
|
o.created_at.must_equal '2009-08-01'
|
|
134
133
|
end
|
|
135
134
|
|
|
135
|
+
it "should set update timestamp to same timestamp as create timestamp when setting creating timestamp" do
|
|
136
|
+
i = 1
|
|
137
|
+
(class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
|
|
138
|
+
@c.plugin :timestamps, :update_on_create=>true
|
|
139
|
+
o = @c.create
|
|
140
|
+
sqls = @c.db.sqls
|
|
141
|
+
sqls.length.must_equal 1
|
|
142
|
+
["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-02', '2009-08-02')",
|
|
143
|
+
"INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-02')"].must_include sqls.first
|
|
144
|
+
o.created_at.must_equal '2009-08-02'
|
|
145
|
+
o.updated_at.must_equal '2009-08-02'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should set update timestamp when using not overriding create timestamp" do
|
|
149
|
+
i = 1
|
|
150
|
+
(class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
|
|
151
|
+
@c.plugin :timestamps, :update_on_create=>true
|
|
152
|
+
o = @c.create(:created_at=>'2009-08-10')
|
|
153
|
+
sqls = @c.db.sqls
|
|
154
|
+
sqls.length.must_equal 1
|
|
155
|
+
["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-10', '2009-08-02')",
|
|
156
|
+
"INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-10')"].must_include sqls.first
|
|
157
|
+
o.created_at.must_equal '2009-08-10'
|
|
158
|
+
o.updated_at.must_equal '2009-08-02'
|
|
159
|
+
end
|
|
160
|
+
|
|
136
161
|
it "should have create_timestamp_field give the create timestamp field" do
|
|
137
162
|
@c.create_timestamp_field.must_equal :created_at
|
|
138
163
|
@c.plugin :timestamps, :create=>:c
|
|
@@ -161,7 +186,7 @@ describe "Sequel::Plugins::Timestamps" do
|
|
|
161
186
|
c = Class.new(@c)
|
|
162
187
|
o = c.create
|
|
163
188
|
o.created_at.must_equal '2009-08-01'
|
|
164
|
-
o.updated_at.
|
|
189
|
+
o.updated_at.must_be_nil
|
|
165
190
|
o = c.load(:id=>1).save
|
|
166
191
|
o.updated_at.must_equal '2009-08-01'
|
|
167
192
|
c.db.sqls.must_equal ["INSERT INTO t (created_at) VALUES ('2009-08-01')", "UPDATE t SET updated_at = '2009-08-01' WHERE (id = 1)"]
|
|
@@ -25,8 +25,7 @@ END
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
it "should handle WITH" do
|
|
28
|
-
|
|
29
|
-
a = dot(@ds.with(:a, @ds))
|
|
28
|
+
a = dot(@ds.with_extend{def supports_cte?(*) true end}.with(:a, @ds))
|
|
30
29
|
a[0..3].must_equal ["1 -> 2 [label=\"with\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Hash\"];"]
|
|
31
30
|
[["3 -> 4 [label=\"dataset\"];", "4 [label=\"Dataset\"];", "3 -> 5 [label=\"name\"];", "5 [label=\":a\"];"],
|
|
32
31
|
["3 -> 4 [label=\"name\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"dataset\"];", "5 [label=\"Dataset\"];"]].must_include(a[4..-1])
|
|
@@ -48,7 +48,7 @@ describe Sequel::Model, "tree plugin" do
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
it "should have tree_order give the order of the association" do
|
|
51
|
-
@c.tree_order.
|
|
51
|
+
@c.tree_order.must_be_nil
|
|
52
52
|
klass(:order=>:name).tree_order.must_equal :name
|
|
53
53
|
klass(:order=>[:parent_id, :name]).tree_order.must_equal [:parent_id, :name]
|
|
54
54
|
end
|
|
@@ -60,7 +60,7 @@ describe Sequel::Model, "tree plugin" do
|
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
it "should have roots return an array of the tree's roots" do
|
|
63
|
-
@
|
|
63
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
64
64
|
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :name=>'r')]
|
|
65
65
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (parent_id IS NULL)"]
|
|
66
66
|
end
|
|
@@ -70,14 +70,14 @@ describe Sequel::Model, "tree plugin" do
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
it "should have ancestors return the ancestors of the current node" do
|
|
73
|
-
@
|
|
73
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
|
74
74
|
@o.ancestors.must_equal [@c.load(:id=>1, :parent_id=>5, :name=>'r'), @c.load(:id=>5, :parent_id=>nil, :name=>'r2')]
|
|
75
75
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
76
76
|
"SELECT * FROM nodes WHERE id = 5"]
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
it "should have descendants return the descendants of the current node" do
|
|
80
|
-
@
|
|
80
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :parent_id=>2, :name=>'r'}, {:id=>4, :parent_id=>2, :name=>'r2'}], [{:id=>5, :parent_id=>4, :name=>'r3'}], []])
|
|
81
81
|
@o.descendants.must_equal [@c.load(:id=>3, :parent_id=>2, :name=>'r'), @c.load(:id=>4, :parent_id=>2, :name=>'r2'), @c.load(:id=>5, :parent_id=>4, :name=>'r3')]
|
|
82
82
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.parent_id = 2)",
|
|
83
83
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 3)",
|
|
@@ -86,7 +86,7 @@ describe Sequel::Model, "tree plugin" do
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
it "should have root return the root of the current node" do
|
|
89
|
-
@
|
|
89
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
|
90
90
|
@o.root.must_equal @c.load(:id=>5, :parent_id=>nil, :name=>'r2')
|
|
91
91
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
92
92
|
"SELECT * FROM nodes WHERE id = 5"]
|
|
@@ -102,14 +102,14 @@ describe Sequel::Model, "tree plugin" do
|
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
it "should have self_and_siblings return the children of the current node's parent" do
|
|
105
|
-
@
|
|
105
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
|
106
106
|
@o.self_and_siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2'), @o]
|
|
107
107
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
108
108
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
it "should have siblings return the children of the current node's parent, except for the current node" do
|
|
112
|
-
@
|
|
112
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
|
113
113
|
@o.siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2')]
|
|
114
114
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
|
115
115
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
|
@@ -121,23 +121,23 @@ describe Sequel::Model, "tree plugin" do
|
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
it "should have root class method return the root" do
|
|
124
|
-
@c.dataset
|
|
124
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
125
125
|
@c.root.must_equal @c.load(:id=>1, :parent_id=>nil, :name=>'r')
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
it "prevents creating a second root" do
|
|
129
|
-
@c.dataset
|
|
129
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
130
130
|
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
it "errors when promoting an existing record to a second root" do
|
|
134
|
-
@c.dataset
|
|
134
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
135
135
|
n = @c.load(:id => 2, :parent_id => 1)
|
|
136
136
|
lambda { n.update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
it "allows updating existing root" do
|
|
140
|
-
@c.dataset
|
|
140
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
|
141
141
|
@c.root.update(:name => 'fdsa')
|
|
142
142
|
end
|
|
143
143
|
end
|
|
@@ -152,6 +152,10 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
152
152
|
columns :id, :id2, :name, :parent_id, :parent_id2, :i, :pi
|
|
153
153
|
set_primary_key [:id, :id2]
|
|
154
154
|
plugin :tree, opts.merge(:key=>[:parent_id, :parent_id2])
|
|
155
|
+
def self.set_dataset(ds)
|
|
156
|
+
super
|
|
157
|
+
set_primary_key [:id, :id2]
|
|
158
|
+
end
|
|
155
159
|
end
|
|
156
160
|
c
|
|
157
161
|
end
|
|
@@ -174,7 +178,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
174
178
|
end
|
|
175
179
|
|
|
176
180
|
it "should have roots return an array of the tree's roots" do
|
|
177
|
-
@
|
|
181
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
178
182
|
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r')]
|
|
179
183
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((parent_id IS NULL) OR (parent_id2 IS NULL))"]
|
|
180
184
|
end
|
|
@@ -184,7 +188,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
184
188
|
end
|
|
185
189
|
|
|
186
190
|
it "should have ancestors return the ancestors of the current node" do
|
|
187
|
-
@
|
|
191
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
|
188
192
|
@o.ancestors.must_equal [@c.load(:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'), @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')]
|
|
189
193
|
sqls = @db.sqls
|
|
190
194
|
sqls.length.must_equal 2
|
|
@@ -193,7 +197,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
193
197
|
end
|
|
194
198
|
|
|
195
199
|
it "should have descendants return the descendants of the current node" do
|
|
196
|
-
@
|
|
200
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'}, {:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'}], [{:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3'}], []])
|
|
197
201
|
@o.descendants.must_equal [@c.load(:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'), @c.load(:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'), @c.load(:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3')]
|
|
198
202
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((nodes.parent_id = 2) AND (nodes.parent_id2 = 5))",
|
|
199
203
|
"SELECT * FROM nodes WHERE ((nodes.parent_id = 3) AND (nodes.parent_id2 = 7))",
|
|
@@ -202,7 +206,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
202
206
|
end
|
|
203
207
|
|
|
204
208
|
it "should have root return the root of the current node" do
|
|
205
|
-
@
|
|
209
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
|
206
210
|
@o.root.must_equal @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')
|
|
207
211
|
sqls = @db.sqls
|
|
208
212
|
sqls.length.must_equal 2
|
|
@@ -222,7 +226,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
222
226
|
end
|
|
223
227
|
|
|
224
228
|
it "should have self_and_siblings return the children of the current node's parent" do
|
|
225
|
-
@
|
|
229
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
|
226
230
|
@o.self_and_siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'), @o]
|
|
227
231
|
sqls = @db.sqls
|
|
228
232
|
sqls.length.must_equal 2
|
|
@@ -231,7 +235,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
231
235
|
end
|
|
232
236
|
|
|
233
237
|
it "should have siblings return the children of the current node's parent, except for the current node" do
|
|
234
|
-
@
|
|
238
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
|
235
239
|
@o.siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2')]
|
|
236
240
|
sqls = @db.sqls
|
|
237
241
|
sqls.length.must_equal 2
|
|
@@ -245,30 +249,30 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
|
245
249
|
end
|
|
246
250
|
|
|
247
251
|
it "prevents creating a second root" do
|
|
248
|
-
@c.dataset
|
|
252
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
249
253
|
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
250
|
-
@c.dataset
|
|
254
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
|
251
255
|
lambda { @c.create(:parent_id2=>1) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
252
|
-
@c.dataset
|
|
256
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
|
253
257
|
lambda { @c.create(:parent_id=>2) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
254
258
|
end
|
|
255
259
|
|
|
256
260
|
it "errors when promoting an existing record to a second root" do
|
|
257
|
-
@c.dataset
|
|
261
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
|
258
262
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil, :parent_id2=>nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
259
|
-
@c.dataset
|
|
263
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
|
260
264
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
261
|
-
@c.dataset
|
|
265
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
|
262
266
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id2 => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
|
263
267
|
end
|
|
264
268
|
|
|
265
269
|
it "allows updating existing root" do
|
|
266
|
-
@c.dataset
|
|
267
|
-
|
|
268
|
-
@c.dataset
|
|
269
|
-
|
|
270
|
-
@c.dataset
|
|
271
|
-
|
|
270
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r')
|
|
271
|
+
@c.root.update(:name => 'fdsa')
|
|
272
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r')
|
|
273
|
+
@c.root.update(:name => 'fdsa')
|
|
274
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r')
|
|
275
|
+
@c.root.update(:name => 'fdsa')
|
|
272
276
|
end
|
|
273
277
|
end
|
|
274
278
|
end
|