sequel 2.12.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +62 -0
- data/README.rdoc +3 -3
- data/Rakefile +7 -0
- data/doc/advanced_associations.rdoc +44 -0
- data/doc/release_notes/3.0.0.txt +221 -0
- data/lib/sequel/adapters/amalgalite.rb +208 -0
- data/lib/sequel/adapters/db2.rb +3 -0
- data/lib/sequel/adapters/dbi.rb +9 -0
- data/lib/sequel/adapters/do.rb +0 -4
- data/lib/sequel/adapters/firebird.rb +16 -18
- data/lib/sequel/adapters/informix.rb +5 -3
- data/lib/sequel/adapters/jdbc.rb +24 -20
- data/lib/sequel/adapters/jdbc/h2.rb +15 -4
- data/lib/sequel/adapters/mysql.rb +4 -8
- data/lib/sequel/adapters/odbc.rb +0 -4
- data/lib/sequel/adapters/oracle.rb +0 -4
- data/lib/sequel/adapters/shared/mssql.rb +16 -5
- data/lib/sequel/adapters/shared/mysql.rb +87 -86
- data/lib/sequel/adapters/shared/oracle.rb +92 -3
- data/lib/sequel/adapters/shared/postgres.rb +85 -29
- data/lib/sequel/adapters/shared/progress.rb +8 -3
- data/lib/sequel/adapters/shared/sqlite.rb +53 -23
- data/lib/sequel/adapters/sqlite.rb +4 -7
- data/lib/sequel/adapters/utils/unsupported.rb +3 -3
- data/lib/sequel/connection_pool.rb +18 -25
- data/lib/sequel/core.rb +2 -21
- data/lib/sequel/database.rb +60 -44
- data/lib/sequel/database/schema_generator.rb +26 -31
- data/lib/sequel/database/schema_methods.rb +8 -3
- data/lib/sequel/database/schema_sql.rb +114 -28
- data/lib/sequel/dataset.rb +14 -41
- data/lib/sequel/dataset/convenience.rb +31 -54
- data/lib/sequel/dataset/graph.rb +7 -13
- data/lib/sequel/dataset/sql.rb +43 -54
- data/lib/sequel/extensions/inflector.rb +0 -5
- data/lib/sequel/extensions/schema_dumper.rb +238 -0
- data/lib/sequel/metaprogramming.rb +0 -20
- data/lib/sequel/model.rb +1 -2
- data/lib/sequel/model/base.rb +18 -16
- data/lib/sequel/model/inflections.rb +6 -9
- data/lib/sequel/plugins/caching.rb +0 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/sql.rb +2 -0
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/firebird_spec.rb +35 -8
- data/spec/adapters/mysql_spec.rb +173 -266
- data/spec/adapters/oracle_spec.rb +13 -0
- data/spec/adapters/postgres_spec.rb +127 -227
- data/spec/adapters/sqlite_spec.rb +13 -171
- data/spec/core/connection_pool_spec.rb +15 -4
- data/spec/core/core_sql_spec.rb +14 -170
- data/spec/core/database_spec.rb +50 -132
- data/spec/core/dataset_spec.rb +47 -930
- data/spec/core/expression_filters_spec.rb +12 -0
- data/spec/core/schema_generator_spec.rb +37 -45
- data/spec/core/schema_spec.rb +26 -16
- data/spec/core/spec_helper.rb +0 -25
- data/spec/extensions/inflector_spec.rb +0 -3
- data/spec/extensions/schema_dumper_spec.rb +292 -0
- data/spec/extensions/serialization_spec.rb +9 -0
- data/spec/extensions/single_table_inheritance_spec.rb +6 -1
- data/spec/extensions/spec_helper.rb +1 -3
- data/spec/extensions/validation_helpers_spec.rb +4 -4
- data/spec/integration/database_test.rb +18 -0
- data/spec/integration/dataset_test.rb +112 -1
- data/spec/integration/eager_loader_test.rb +70 -9
- data/spec/integration/prepared_statement_test.rb +2 -2
- data/spec/integration/schema_test.rb +76 -27
- data/spec/integration/spec_helper.rb +0 -14
- data/spec/integration/transaction_test.rb +27 -0
- data/spec/model/associations_spec.rb +0 -36
- data/spec/model/base_spec.rb +18 -123
- data/spec/model/hooks_spec.rb +2 -235
- data/spec/model/inflector_spec.rb +15 -115
- data/spec/model/model_spec.rb +0 -120
- data/spec/model/plugins_spec.rb +0 -70
- data/spec/model/record_spec.rb +35 -93
- data/spec/model/spec_helper.rb +0 -27
- data/spec/model/validations_spec.rb +0 -931
- metadata +9 -14
- data/lib/sequel/deprecated.rb +0 -593
- data/lib/sequel/deprecated_migration.rb +0 -91
- data/lib/sequel/model/deprecated.rb +0 -204
- data/lib/sequel/model/deprecated_hooks.rb +0 -103
- data/lib/sequel/model/deprecated_inflector.rb +0 -335
- data/lib/sequel/model/deprecated_validations.rb +0 -388
- data/spec/core/core_ext_spec.rb +0 -156
- data/spec/core/migration_spec.rb +0 -263
- data/spec/core/pretty_table_spec.rb +0 -58
- data/spec/model/caching_spec.rb +0 -217
- data/spec/model/schema_spec.rb +0 -92
data/spec/core/database_spec.rb
CHANGED
@@ -56,27 +56,6 @@ context "A new Database" do
|
|
56
56
|
db.send(:identifier_output_method_default).should == :downcase
|
57
57
|
end
|
58
58
|
|
59
|
-
deprec_specify "should respect the :upcase_identifiers option" do
|
60
|
-
Sequel.upcase_identifiers = false
|
61
|
-
db = Sequel::Database.new(:upcase_identifiers=>false)
|
62
|
-
db.upcase_identifiers?.should == false
|
63
|
-
db.upcase_identifiers = true
|
64
|
-
db.upcase_identifiers?.should == true
|
65
|
-
db = Sequel::Database.new(:upcase_identifiers=>true)
|
66
|
-
db.upcase_identifiers?.should == true
|
67
|
-
db.upcase_identifiers = false
|
68
|
-
db.upcase_identifiers?.should == false
|
69
|
-
Sequel.upcase_identifiers = true
|
70
|
-
db = Sequel::Database.new(:upcase_identifiers=>false)
|
71
|
-
db.upcase_identifiers?.should == false
|
72
|
-
db.upcase_identifiers = true
|
73
|
-
db.upcase_identifiers?.should == true
|
74
|
-
db = Sequel::Database.new(:upcase_identifiers=>true)
|
75
|
-
db.upcase_identifiers?.should == true
|
76
|
-
db.upcase_identifiers = false
|
77
|
-
db.upcase_identifiers?.should == false
|
78
|
-
end
|
79
|
-
|
80
59
|
specify "should respect the :identifier_input_method option" do
|
81
60
|
Sequel.identifier_input_method = nil
|
82
61
|
Sequel::Database.identifier_input_method.should == ""
|
@@ -134,17 +113,6 @@ context "A new Database" do
|
|
134
113
|
Sequel::Database.new({}).quote_identifiers?.should == false
|
135
114
|
end
|
136
115
|
|
137
|
-
deprec_specify "should use the default Sequel.upcase_identifiers value" do
|
138
|
-
Sequel.upcase_identifiers = true
|
139
|
-
Sequel::Database.new({}).upcase_identifiers?.should == true
|
140
|
-
Sequel.upcase_identifiers = false
|
141
|
-
Sequel::Database.new({}).upcase_identifiers?.should == false
|
142
|
-
Sequel::Database.upcase_identifiers = true
|
143
|
-
Sequel::Database.new({}).upcase_identifiers?.should == true
|
144
|
-
Sequel::Database.upcase_identifiers = false
|
145
|
-
Sequel::Database.new({}).upcase_identifiers?.should == false
|
146
|
-
end
|
147
|
-
|
148
116
|
specify "should use the default Sequel.identifier_input_method value" do
|
149
117
|
Sequel.identifier_input_method = :downcase
|
150
118
|
Sequel::Database.new({}).identifier_input_method.should == :downcase
|
@@ -316,28 +284,6 @@ context "Database#<<" do
|
|
316
284
|
(@db << "DELETE FROM items").should == "DELETE FROM items"
|
317
285
|
end
|
318
286
|
|
319
|
-
deprec_specify "should accept an array and convert it to SQL" do
|
320
|
-
a = %[
|
321
|
-
--
|
322
|
-
CREATE TABLE items (a integer, /*b integer*/
|
323
|
-
b text, c integer);
|
324
|
-
DROP TABLE old_items;
|
325
|
-
].split($/)
|
326
|
-
(@db << a).should ==
|
327
|
-
"CREATE TABLE items (a integer, b text, c integer); DROP TABLE old_items;"
|
328
|
-
end
|
329
|
-
|
330
|
-
deprec_specify "should remove comments and whitespace from arrays" do
|
331
|
-
s = %[
|
332
|
-
--
|
333
|
-
CREATE TABLE items (a integer, /*b integer*/
|
334
|
-
b text, c integer); \r\n
|
335
|
-
DROP TABLE old_items;
|
336
|
-
].split($/)
|
337
|
-
(@db << s).should ==
|
338
|
-
"CREATE TABLE items (a integer, b text, c integer); DROP TABLE old_items;"
|
339
|
-
end
|
340
|
-
|
341
287
|
specify "should not remove comments and whitespace from strings" do
|
342
288
|
s = "INSERT INTO items VALUES ('---abc')"
|
343
289
|
(@db << s).should == s
|
@@ -423,6 +369,19 @@ context "Database#create_table" do
|
|
423
369
|
'CREATE UNIQUE INDEX test_name_index ON test (name)'
|
424
370
|
]
|
425
371
|
end
|
372
|
+
|
373
|
+
specify "should create a temporary table" do
|
374
|
+
@db.create_table :test_tmp, :temp => true do
|
375
|
+
primary_key :id, :integer, :null => false
|
376
|
+
column :name, :text
|
377
|
+
index :name, :unique => true
|
378
|
+
end
|
379
|
+
|
380
|
+
@db.sqls.should == [
|
381
|
+
'CREATE TEMPORARY TABLE test_tmp (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, name text)',
|
382
|
+
'CREATE UNIQUE INDEX test_tmp_name_index ON test_tmp (name)'
|
383
|
+
]
|
384
|
+
end
|
426
385
|
end
|
427
386
|
|
428
387
|
context "Database#alter_table" do
|
@@ -695,6 +654,10 @@ context "A Database adapter with a scheme" do
|
|
695
654
|
Sequel::ADAPTER_MAP[:ccc].should == CCC
|
696
655
|
end
|
697
656
|
|
657
|
+
specify "should give the database_type as the adapter scheme by default" do
|
658
|
+
CCC.new.database_type.should == :ccc
|
659
|
+
end
|
660
|
+
|
698
661
|
specify "should be instantiated when its scheme is specified" do
|
699
662
|
c = Sequel::Database.connect('ccc://localhost/db')
|
700
663
|
c.should be_a_kind_of(CCC)
|
@@ -733,13 +696,6 @@ context "A Database adapter with a scheme" do
|
|
733
696
|
CCC::DISCONNECTS.should == [z, y, x]
|
734
697
|
end
|
735
698
|
|
736
|
-
deprec_specify "should be accessible through Sequel.open" do
|
737
|
-
c = Sequel.open 'ccc://localhost/db'
|
738
|
-
c.should be_a_kind_of(CCC)
|
739
|
-
c.opts[:host].should == 'localhost'
|
740
|
-
c.opts[:database].should == 'db'
|
741
|
-
end
|
742
|
-
|
743
699
|
specify "should be accessible through Sequel.<adapter>" do
|
744
700
|
Sequel.send(:def_adapter_method, :ccc)
|
745
701
|
|
@@ -863,25 +819,6 @@ context "A database" do
|
|
863
819
|
Sequel::Database.single_threaded = false
|
864
820
|
end
|
865
821
|
|
866
|
-
deprec_specify "should have a multi_threaded? method" do
|
867
|
-
db = Sequel::Database.new(:single_threaded => true)
|
868
|
-
db.should_not be_multi_threaded
|
869
|
-
|
870
|
-
db = Sequel::Database.new(:max_options => 1)
|
871
|
-
db.should be_multi_threaded
|
872
|
-
|
873
|
-
db = Sequel::Database.new
|
874
|
-
db.should be_multi_threaded
|
875
|
-
|
876
|
-
Sequel::Database.single_threaded = true
|
877
|
-
|
878
|
-
db = Sequel::Database.new
|
879
|
-
db.should_not be_multi_threaded
|
880
|
-
|
881
|
-
db = Sequel::Database.new(:max_options => 4)
|
882
|
-
db.should_not be_multi_threaded
|
883
|
-
end
|
884
|
-
|
885
822
|
specify "should have single_threaded? respond to true if in single threaded mode" do
|
886
823
|
db = Sequel::Database.new(:single_threaded => true)
|
887
824
|
db.should be_single_threaded
|
@@ -901,20 +838,6 @@ context "A database" do
|
|
901
838
|
db.should be_single_threaded
|
902
839
|
end
|
903
840
|
|
904
|
-
deprec_specify "should have a logger method" do
|
905
|
-
db = Sequel::Database.new
|
906
|
-
s = "I'm a logger"
|
907
|
-
db.logger = s
|
908
|
-
db.logger.should == s
|
909
|
-
db.logger = nil
|
910
|
-
db.logger.should == nil
|
911
|
-
db.loggers = []
|
912
|
-
db.logger.should == nil
|
913
|
-
t = "I'm also a logger"
|
914
|
-
db.loggers = [s, t]
|
915
|
-
db.logger.should == s
|
916
|
-
end
|
917
|
-
|
918
841
|
specify "should be able to set loggers via the logger= and loggers= methods" do
|
919
842
|
db = Sequel::Database.new
|
920
843
|
s = "I'm a logger"
|
@@ -934,18 +857,6 @@ context "A database" do
|
|
934
857
|
end
|
935
858
|
end
|
936
859
|
|
937
|
-
context "Database#dataset" do
|
938
|
-
before do
|
939
|
-
@db = Sequel::Database.new
|
940
|
-
end
|
941
|
-
|
942
|
-
deprec_specify "should delegate to Dataset#query if block is provided" do
|
943
|
-
@d = @db.query {select :x; from :y}
|
944
|
-
@d.should be_a_kind_of(Sequel::Dataset)
|
945
|
-
@d.sql.should == "SELECT x FROM y"
|
946
|
-
end
|
947
|
-
end
|
948
|
-
|
949
860
|
context "Database#fetch" do
|
950
861
|
before do
|
951
862
|
@db = Sequel::Database.new
|
@@ -1084,32 +995,6 @@ context "Database#alter_table_sql" do
|
|
1084
995
|
end
|
1085
996
|
end
|
1086
997
|
|
1087
|
-
context "Database.connect" do
|
1088
|
-
EEE_YAML = "development:\r\n adapter: eee\r\n username: mau\r\n password: tau\r\n host: alfonso\r\n database: mydb\r\n"
|
1089
|
-
|
1090
|
-
before do
|
1091
|
-
class EEE < Sequel::Database
|
1092
|
-
set_adapter_scheme :eee
|
1093
|
-
end
|
1094
|
-
|
1095
|
-
@fn = File.join(File.dirname(__FILE__), 'eee.yaml')
|
1096
|
-
File.open(@fn, 'wb') {|f| f << EEE_YAML}
|
1097
|
-
end
|
1098
|
-
|
1099
|
-
after do
|
1100
|
-
File.delete(@fn)
|
1101
|
-
end
|
1102
|
-
|
1103
|
-
specify "should accept hashes loaded from YAML files" do
|
1104
|
-
db = Sequel.connect(YAML.load_file(@fn)['development'])
|
1105
|
-
db.class.should == EEE
|
1106
|
-
db.opts[:database].should == 'mydb'
|
1107
|
-
db.opts[:user].should == 'mau'
|
1108
|
-
db.opts[:password].should == 'tau'
|
1109
|
-
db.opts[:host].should == 'alfonso'
|
1110
|
-
end
|
1111
|
-
end
|
1112
|
-
|
1113
998
|
context "Database#inspect" do
|
1114
999
|
before do
|
1115
1000
|
@db = DummyDatabase.new
|
@@ -1222,3 +1107,36 @@ context "Database#typecast_value" do
|
|
1222
1107
|
proc{@db.typecast_value(:datetime, 4)}.should raise_error(Sequel::InvalidValue)
|
1223
1108
|
end
|
1224
1109
|
end
|
1110
|
+
|
1111
|
+
context "Database#blank_object?" do
|
1112
|
+
specify "should return whether the object is considered blank" do
|
1113
|
+
db = Sequel::Database.new
|
1114
|
+
c = lambda{|meth, value| Class.new{define_method(meth){value}}.new}
|
1115
|
+
|
1116
|
+
db.send(:blank_object?, "").should == true
|
1117
|
+
db.send(:blank_object?, " ").should == true
|
1118
|
+
db.send(:blank_object?, nil).should == true
|
1119
|
+
db.send(:blank_object?, false).should == true
|
1120
|
+
db.send(:blank_object?, []).should == true
|
1121
|
+
db.send(:blank_object?, {}).should == true
|
1122
|
+
db.send(:blank_object?, c[:empty?, true]).should == true
|
1123
|
+
db.send(:blank_object?, c[:blank?, true]).should == true
|
1124
|
+
|
1125
|
+
db.send(:blank_object?, " a ").should == false
|
1126
|
+
db.send(:blank_object?, 1).should == false
|
1127
|
+
db.send(:blank_object?, 1.0).should == false
|
1128
|
+
db.send(:blank_object?, true).should == false
|
1129
|
+
db.send(:blank_object?, [1]).should == false
|
1130
|
+
db.send(:blank_object?, {1.0=>2.0}).should == false
|
1131
|
+
db.send(:blank_object?, c[:empty?, false]).should == false
|
1132
|
+
db.send(:blank_object?, c[:blank?, false]).should == false
|
1133
|
+
end
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
context "Database#schema_autoincrementing_primary_key?" do
|
1137
|
+
specify "should whether the parsed schema row indicates a primary key" do
|
1138
|
+
m = Sequel::Database.new.method(:schema_autoincrementing_primary_key?)
|
1139
|
+
m.call(:primary_key=>true).should == true
|
1140
|
+
m.call(:primary_key=>false).should == false
|
1141
|
+
end
|
1142
|
+
end
|
data/spec/core/dataset_spec.rb
CHANGED
@@ -74,20 +74,6 @@ context "Dataset" do
|
|
74
74
|
@dataset.literal(:a).should == 'a'
|
75
75
|
end
|
76
76
|
|
77
|
-
deprec_specify "should have upcase_identifiers= method which changes literalization of identifiers" do
|
78
|
-
@dataset.upcase_identifiers = true
|
79
|
-
@dataset.literal(:a).should == 'A'
|
80
|
-
@dataset.upcase_identifiers = false
|
81
|
-
@dataset.literal(:a).should == 'a'
|
82
|
-
end
|
83
|
-
|
84
|
-
deprec_specify "should have upcase_identifiers? method which returns whether identifiers are currently upcased" do
|
85
|
-
@dataset.upcase_identifiers = true
|
86
|
-
@dataset.upcase_identifiers?.should == true
|
87
|
-
@dataset.upcase_identifiers = false
|
88
|
-
@dataset.upcase_identifiers?.should == false
|
89
|
-
end
|
90
|
-
|
91
77
|
specify "should have identifier_input_method= method which changes literalization of identifiers" do
|
92
78
|
@dataset.identifier_input_method = :upcase
|
93
79
|
@dataset.literal(:a).should == 'A'
|
@@ -431,6 +417,15 @@ context "Dataset#where" do
|
|
431
417
|
"SELECT * FROM test WHERE 'f'"
|
432
418
|
end
|
433
419
|
|
420
|
+
specify "should allow the use of multiple arguments" do
|
421
|
+
@dataset.filter(:a, :b).sql.should ==
|
422
|
+
'SELECT * FROM test WHERE (a AND b)'
|
423
|
+
@dataset.filter(:a, :b=>1).sql.should ==
|
424
|
+
'SELECT * FROM test WHERE (a AND (b = 1))'
|
425
|
+
@dataset.filter(:a, :c.sql_number > 3, :b=>1).sql.should ==
|
426
|
+
'SELECT * FROM test WHERE (a AND (c > 3) AND (b = 1))'
|
427
|
+
end
|
428
|
+
|
434
429
|
specify "should allow the use of blocks and arguments simultaneously" do
|
435
430
|
@dataset.filter(:zz.sql_number < 3){:yy.sql_number > 3}.sql.should ==
|
436
431
|
'SELECT * FROM test WHERE ((zz < 3) AND (yy > 3))'
|
@@ -548,15 +543,15 @@ context "Dataset#exclude" do
|
|
548
543
|
@dataset = Sequel::Dataset.new(nil).from(:test)
|
549
544
|
end
|
550
545
|
|
551
|
-
specify "should correctly
|
546
|
+
specify "should correctly negate the expression when one condition is given" do
|
552
547
|
@dataset.exclude(:region=>'Asia').select_sql.should ==
|
553
548
|
"SELECT * FROM test WHERE (region != 'Asia')"
|
554
549
|
end
|
555
550
|
|
556
551
|
specify "should take multiple conditions as a hash and express the logic correctly in SQL" do
|
557
552
|
@dataset.exclude(:region => 'Asia', :name => 'Japan').select_sql.
|
558
|
-
should match(Regexp.union(/WHERE \(\(region != 'Asia'\)
|
559
|
-
/WHERE \(\(name != 'Japan'\)
|
553
|
+
should match(Regexp.union(/WHERE \(\(region != 'Asia'\) OR \(name != 'Japan'\)\)/,
|
554
|
+
/WHERE \(\(name != 'Japan'\) OR \(region != 'Asia'\)\)/))
|
560
555
|
end
|
561
556
|
|
562
557
|
specify "should parenthesize a single string condition correctly" do
|
@@ -582,6 +577,8 @@ context "Dataset#exclude" do
|
|
582
577
|
specify "should allow the use of blocks and arguments simultaneously" do
|
583
578
|
@dataset.exclude(:id => (7..11)){:id.sql_number < 6}.sql.should ==
|
584
579
|
'SELECT * FROM test WHERE (((id < 7) OR (id > 11)) OR (id >= 6))'
|
580
|
+
@dataset.exclude([:id, 1], [:x, 3]){:id.sql_number < 6}.sql.should ==
|
581
|
+
'SELECT * FROM test WHERE (((id != 1) OR (x != 3)) OR (id >= 6))'
|
585
582
|
end
|
586
583
|
end
|
587
584
|
|
@@ -653,7 +650,7 @@ context "a grouped dataset" do
|
|
653
650
|
specify "should format the right statement for counting (as a subquery)" do
|
654
651
|
db = MockDatabase.new
|
655
652
|
db[:test].select(:name).group(:name).count
|
656
|
-
db.sqls.should == ["SELECT COUNT(*) FROM (SELECT name FROM test GROUP BY name) AS t1 LIMIT 1"]
|
653
|
+
db.sqls.should == ["SELECT COUNT(*) AS count FROM (SELECT name FROM test GROUP BY name) AS t1 LIMIT 1"]
|
657
654
|
end
|
658
655
|
end
|
659
656
|
|
@@ -822,8 +819,8 @@ context "Dataset#from" do
|
|
822
819
|
"SELECT * FROM (SELECT * FROM a) AS t1"
|
823
820
|
end
|
824
821
|
|
825
|
-
specify "should
|
826
|
-
|
822
|
+
specify "should remove all FROM tables if called with no arguments" do
|
823
|
+
@dataset.from.sql.should == 'SELECT *'
|
827
824
|
end
|
828
825
|
|
829
826
|
specify "should accept sql functions" do
|
@@ -1252,10 +1249,6 @@ context "Dataset#distinct" do
|
|
1252
1249
|
@dataset.distinct.sql.should == 'SELECT DISTINCT name FROM test'
|
1253
1250
|
end
|
1254
1251
|
|
1255
|
-
deprec_specify "should be aliased by Dataset#uniq" do
|
1256
|
-
@dataset.uniq.sql.should == 'SELECT DISTINCT name FROM test'
|
1257
|
-
end
|
1258
|
-
|
1259
1252
|
specify "should accept an expression list" do
|
1260
1253
|
@dataset.distinct(:a, :b).sql.should == 'SELECT DISTINCT ON (a, b) name FROM test'
|
1261
1254
|
@dataset.distinct(:stamp.cast(:integer), :node_id=>nil).sql.should == 'SELECT DISTINCT ON (CAST(stamp AS integer), (node_id IS NULL)) name FROM test'
|
@@ -1263,7 +1256,7 @@ context "Dataset#distinct" do
|
|
1263
1256
|
|
1264
1257
|
specify "should do a subselect for count" do
|
1265
1258
|
@dataset.distinct.count
|
1266
|
-
@db.sqls.should == ['SELECT COUNT(*) FROM (SELECT DISTINCT name FROM test) AS t1 LIMIT 1']
|
1259
|
+
@db.sqls.should == ['SELECT COUNT(*) AS count FROM (SELECT DISTINCT name FROM test) AS t1 LIMIT 1']
|
1267
1260
|
end
|
1268
1261
|
end
|
1269
1262
|
|
@@ -1285,49 +1278,45 @@ context "Dataset#count" do
|
|
1285
1278
|
|
1286
1279
|
specify "should format SQL properly" do
|
1287
1280
|
@dataset.count.should == 1
|
1288
|
-
@c.sql.should == 'SELECT COUNT(*) FROM test LIMIT 1'
|
1289
|
-
end
|
1290
|
-
|
1291
|
-
deprec_specify "should be aliased by #size" do
|
1292
|
-
@dataset.size.should == 1
|
1281
|
+
@c.sql.should == 'SELECT COUNT(*) AS count FROM test LIMIT 1'
|
1293
1282
|
end
|
1294
1283
|
|
1295
1284
|
specify "should include the where clause if it's there" do
|
1296
1285
|
@dataset.filter(:abc.sql_number < 30).count.should == 1
|
1297
|
-
@c.sql.should == 'SELECT COUNT(*) FROM test WHERE (abc < 30) LIMIT 1'
|
1286
|
+
@c.sql.should == 'SELECT COUNT(*) AS count FROM test WHERE (abc < 30) LIMIT 1'
|
1298
1287
|
end
|
1299
1288
|
|
1300
1289
|
specify "should count properly for datasets with fixed sql" do
|
1301
1290
|
@dataset.opts[:sql] = "select abc from xyz"
|
1302
1291
|
@dataset.count.should == 1
|
1303
|
-
@c.sql.should == "SELECT COUNT(*) FROM (select abc from xyz) AS t1 LIMIT 1"
|
1292
|
+
@c.sql.should == "SELECT COUNT(*) AS count FROM (select abc from xyz) AS t1 LIMIT 1"
|
1304
1293
|
end
|
1305
1294
|
|
1306
1295
|
specify "should count properly when using UNION, INTERSECT, or EXCEPT" do
|
1307
1296
|
@dataset.union(@dataset).count.should == 1
|
1308
|
-
@c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 1"
|
1297
|
+
@c.sql.should == "SELECT COUNT(*) AS count FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 1"
|
1309
1298
|
@dataset.intersect(@dataset).count.should == 1
|
1310
|
-
@c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test INTERSECT SELECT * FROM test) AS t1 LIMIT 1"
|
1299
|
+
@c.sql.should == "SELECT COUNT(*) AS count FROM (SELECT * FROM test INTERSECT SELECT * FROM test) AS t1 LIMIT 1"
|
1311
1300
|
@dataset.except(@dataset).count.should == 1
|
1312
|
-
@c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test EXCEPT SELECT * FROM test) AS t1 LIMIT 1"
|
1301
|
+
@c.sql.should == "SELECT COUNT(*) AS count FROM (SELECT * FROM test EXCEPT SELECT * FROM test) AS t1 LIMIT 1"
|
1313
1302
|
end
|
1314
1303
|
|
1315
1304
|
specify "should return limit if count is greater than it" do
|
1316
1305
|
@dataset.limit(5).count.should == 1
|
1317
|
-
@c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test LIMIT 5) AS t1 LIMIT 1"
|
1306
|
+
@c.sql.should == "SELECT COUNT(*) AS count FROM (SELECT * FROM test LIMIT 5) AS t1 LIMIT 1"
|
1318
1307
|
end
|
1319
1308
|
|
1320
1309
|
it "should work on a graphed_dataset" do
|
1321
1310
|
@dataset.should_receive(:columns).twice.and_return([:a])
|
1322
1311
|
@dataset.graph(@dataset, [:a], :table_alias=>:test2).count.should == 1
|
1323
|
-
@c.sql.should == 'SELECT COUNT(*) FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1'
|
1312
|
+
@c.sql.should == 'SELECT COUNT(*) AS count FROM test LEFT OUTER JOIN test AS test2 USING (a) LIMIT 1'
|
1324
1313
|
end
|
1325
1314
|
|
1326
1315
|
specify "should not cache the columns value" do
|
1327
1316
|
ds = @dataset.from(:blah)
|
1328
1317
|
ds.columns.should == [:a]
|
1329
1318
|
ds.count.should == 1
|
1330
|
-
@c.sql.should == 'SELECT COUNT(*) FROM blah LIMIT 1'
|
1319
|
+
@c.sql.should == 'SELECT COUNT(*) AS count FROM blah LIMIT 1'
|
1331
1320
|
ds.columns.should == [:a]
|
1332
1321
|
end
|
1333
1322
|
end
|
@@ -1357,11 +1346,6 @@ context "Dataset#group_and_count" do
|
|
1357
1346
|
@ds.group_and_count(:a, :b).sql.should ==
|
1358
1347
|
"SELECT a, b, count(*) AS count FROM test GROUP BY a, b ORDER BY count"
|
1359
1348
|
end
|
1360
|
-
|
1361
|
-
deprec_specify "should work within query block" do
|
1362
|
-
@ds.query{group_and_count(:a, :b)}.sql.should ==
|
1363
|
-
"SELECT a, b, count(*) AS count FROM test GROUP BY a, b ORDER BY count"
|
1364
|
-
end
|
1365
1349
|
end
|
1366
1350
|
|
1367
1351
|
context "Dataset#empty?" do
|
@@ -1961,14 +1945,6 @@ context "Dataset#single_record" do
|
|
1961
1945
|
@d.single_record.should == 'SELECT * FROM test LIMIT 1'
|
1962
1946
|
end
|
1963
1947
|
|
1964
|
-
deprec_specify "should pass opts to each" do
|
1965
|
-
@d.single_record(:order => [:name]).should == 'SELECT * FROM test ORDER BY name LIMIT 1'
|
1966
|
-
end
|
1967
|
-
|
1968
|
-
deprec_specify "should override the limit if passed as an option" do
|
1969
|
-
@d.single_record(:limit => 3).should == 'SELECT * FROM test LIMIT 1'
|
1970
|
-
end
|
1971
|
-
|
1972
1948
|
specify "should return nil if no record is present" do
|
1973
1949
|
@e.single_record.should be_nil
|
1974
1950
|
end
|
@@ -1993,10 +1969,6 @@ context "Dataset#single_value" do
|
|
1993
1969
|
@d.single_value.should == 'SELECT * FROM test LIMIT 1'
|
1994
1970
|
end
|
1995
1971
|
|
1996
|
-
deprec_specify "should pass opts to each" do
|
1997
|
-
@d.single_value(:from => [:blah]).should == 'SELECT * FROM blah LIMIT 1'
|
1998
|
-
end
|
1999
|
-
|
2000
1972
|
specify "should return nil if no records" do
|
2001
1973
|
@e.single_value.should be_nil
|
2002
1974
|
end
|
@@ -2071,251 +2043,6 @@ context "Dataset#set_row_proc" do
|
|
2071
2043
|
end
|
2072
2044
|
end
|
2073
2045
|
|
2074
|
-
context "Dataset#set_model" do
|
2075
|
-
before do
|
2076
|
-
@c = Class.new(Sequel::Dataset) do
|
2077
|
-
def fetch_rows(sql, &block)
|
2078
|
-
# yield a hash with kind as the 1 bit of a number
|
2079
|
-
(1..10).each {|i| block.call({:kind => i[0]})}
|
2080
|
-
end
|
2081
|
-
end
|
2082
|
-
@dataset = @c.new(nil).from(:items)
|
2083
|
-
@m = Class.new do
|
2084
|
-
attr_accessor :c, :args
|
2085
|
-
def initialize(c, *args); @c = c; @args = args; end
|
2086
|
-
def ==(o); (@c == o.c) && (@args = o.args); end
|
2087
|
-
end
|
2088
|
-
end
|
2089
|
-
|
2090
|
-
deprec_specify "should clear the models hash and restore the stock #each if nil is specified" do
|
2091
|
-
@dataset.set_model(@m)
|
2092
|
-
@dataset.set_model(nil)
|
2093
|
-
@dataset.first.should == {:kind => 1}
|
2094
|
-
@dataset.model_classes.should be_nil
|
2095
|
-
end
|
2096
|
-
|
2097
|
-
deprec_specify "should clear the models hash and restore the stock #each if nothing is specified" do
|
2098
|
-
@dataset.set_model(@m)
|
2099
|
-
@dataset.set_model(nil)
|
2100
|
-
@dataset.first.should == {:kind => 1}
|
2101
|
-
@dataset.model_classes.should be_nil
|
2102
|
-
end
|
2103
|
-
|
2104
|
-
deprec_specify "should alter #each to provide model instances" do
|
2105
|
-
@dataset.first.should == {:kind => 1}
|
2106
|
-
@dataset.set_model(@m)
|
2107
|
-
@dataset.first.should == @m.new({:kind => 1})
|
2108
|
-
end
|
2109
|
-
|
2110
|
-
deprec_specify "should set opts[:naked] to nil" do
|
2111
|
-
@dataset.opts[:naked] = true
|
2112
|
-
@dataset.set_model(@m)
|
2113
|
-
@dataset.opts[:naked].should be_nil
|
2114
|
-
end
|
2115
|
-
|
2116
|
-
deprec_specify "should send additional arguments to the models' initialize method" do
|
2117
|
-
@dataset.set_model(@m, 7, 6, 5)
|
2118
|
-
@dataset.first.should == @m.new({:kind => 1}, 7, 6, 5)
|
2119
|
-
end
|
2120
|
-
|
2121
|
-
deprec_specify "should provide support for polymorphic model instantiation" do
|
2122
|
-
@m1 = Class.new(@m)
|
2123
|
-
@m2 = Class.new(@m)
|
2124
|
-
@dataset.set_model(:kind, 0 => @m1, 1 => @m2)
|
2125
|
-
@dataset.opts[:polymorphic_key].should == :kind
|
2126
|
-
all = @dataset.all
|
2127
|
-
all[0].class.should == @m2
|
2128
|
-
all[1].class.should == @m1
|
2129
|
-
all[2].class.should == @m2
|
2130
|
-
all[3].class.should == @m1
|
2131
|
-
#...
|
2132
|
-
|
2133
|
-
# denude model
|
2134
|
-
@dataset.set_model(nil)
|
2135
|
-
@dataset.first.should == {:kind => 1}
|
2136
|
-
end
|
2137
|
-
|
2138
|
-
deprec_specify "should send additional arguments for polymorphic models as well" do
|
2139
|
-
@m1 = Class.new(@m)
|
2140
|
-
@m2 = Class.new(@m)
|
2141
|
-
@dataset.set_model(:kind, {0 => @m1, 1 => @m2}, :hey => :wow)
|
2142
|
-
all = @dataset.all
|
2143
|
-
all[0].class.should == @m2; all[0].args.should == [{:hey => :wow}]
|
2144
|
-
all[1].class.should == @m1; all[1].args.should == [{:hey => :wow}]
|
2145
|
-
all[2].class.should == @m2; all[2].args.should == [{:hey => :wow}]
|
2146
|
-
all[3].class.should == @m1; all[3].args.should == [{:hey => :wow}]
|
2147
|
-
end
|
2148
|
-
|
2149
|
-
deprec_specify "should raise for invalid parameters" do
|
2150
|
-
proc {@dataset.set_model('kind')}.should raise_error(ArgumentError)
|
2151
|
-
proc {@dataset.set_model(0)}.should raise_error(ArgumentError)
|
2152
|
-
proc {@dataset.set_model(:kind)}.should raise_error(ArgumentError) # no hash given
|
2153
|
-
end
|
2154
|
-
end
|
2155
|
-
|
2156
|
-
context "Dataset#model_classes" do
|
2157
|
-
before do
|
2158
|
-
@c = Class.new(Sequel::Dataset) do
|
2159
|
-
# # We don't need that for now
|
2160
|
-
# def fetch_rows(sql, &block)
|
2161
|
-
# (1..10).each(&block)
|
2162
|
-
# end
|
2163
|
-
end
|
2164
|
-
@dataset = @c.new(nil).from(:items)
|
2165
|
-
@m = Class.new do
|
2166
|
-
attr_accessor :c
|
2167
|
-
def initialize(c); @c = c; end
|
2168
|
-
def ==(o); @c == o.c; end
|
2169
|
-
end
|
2170
|
-
end
|
2171
|
-
|
2172
|
-
deprec_specify "should return nil for a naked dataset" do
|
2173
|
-
@dataset.model_classes.should == nil
|
2174
|
-
end
|
2175
|
-
|
2176
|
-
deprec_specify "should return a {nil => model_class} hash for a model dataset" do
|
2177
|
-
@dataset.set_model(@m)
|
2178
|
-
@dataset.model_classes.should == {nil => @m}
|
2179
|
-
end
|
2180
|
-
|
2181
|
-
deprec_specify "should return the polymorphic hash for a polymorphic model dataset" do
|
2182
|
-
@m1 = Class.new(@m)
|
2183
|
-
@m2 = Class.new(@m)
|
2184
|
-
@dataset.set_model(:key, 0 => @m1, 1 => @m2)
|
2185
|
-
@dataset.model_classes.should == {0 => @m1, 1 => @m2}
|
2186
|
-
end
|
2187
|
-
end
|
2188
|
-
|
2189
|
-
context "Dataset#polymorphic_key" do
|
2190
|
-
before do
|
2191
|
-
@c = Class.new(Sequel::Dataset) do
|
2192
|
-
# # We don't need this for now
|
2193
|
-
# def fetch_rows(sql, &block)
|
2194
|
-
# (1..10).each(&block)
|
2195
|
-
# end
|
2196
|
-
end
|
2197
|
-
@dataset = @c.new(nil).from(:items)
|
2198
|
-
@m = Class.new do
|
2199
|
-
attr_accessor :c
|
2200
|
-
def initialize(c); @c = c; end
|
2201
|
-
def ==(o); @c == o.c; end
|
2202
|
-
end
|
2203
|
-
end
|
2204
|
-
|
2205
|
-
deprec_specify "should return nil for a naked dataset" do
|
2206
|
-
@dataset.polymorphic_key.should be_nil
|
2207
|
-
end
|
2208
|
-
|
2209
|
-
deprec_specify "should return the polymorphic key" do
|
2210
|
-
@dataset.set_model(:id, nil => @m)
|
2211
|
-
@dataset.polymorphic_key.should == :id
|
2212
|
-
end
|
2213
|
-
end
|
2214
|
-
|
2215
|
-
context "A model dataset" do
|
2216
|
-
before do
|
2217
|
-
@c = Class.new(Sequel::Dataset) do
|
2218
|
-
def fetch_rows(sql, &block)
|
2219
|
-
(1..10).each(&block)
|
2220
|
-
end
|
2221
|
-
end
|
2222
|
-
@dataset = @c.new(nil).from(:items)
|
2223
|
-
@m = Class.new do
|
2224
|
-
attr_accessor :c
|
2225
|
-
def initialize(c); @c = c; end
|
2226
|
-
def ==(o); @c == o.c; end
|
2227
|
-
end
|
2228
|
-
@dataset.row_proc = Proc.new{|r| @m.new(r)}
|
2229
|
-
end
|
2230
|
-
|
2231
|
-
deprec_specify "should supply naked records if the naked option is specified" do
|
2232
|
-
@dataset.each {|r| r.class.should == @m}
|
2233
|
-
@dataset.naked.each(:naked => true) {|r| r.class.should == Fixnum}
|
2234
|
-
end
|
2235
|
-
end
|
2236
|
-
|
2237
|
-
context "A polymorphic model dataset" do
|
2238
|
-
before do
|
2239
|
-
@c = Class.new(Sequel::Dataset) do
|
2240
|
-
def fetch_rows(sql, &block)
|
2241
|
-
(1..10).each {|i| block.call(:bit => i[0])}
|
2242
|
-
end
|
2243
|
-
end
|
2244
|
-
@dataset = @c.new(nil).from(:items)
|
2245
|
-
@m = Class.new do
|
2246
|
-
attr_accessor :c
|
2247
|
-
def initialize(c); @c = c; end
|
2248
|
-
def ==(o); @c == o.c; end
|
2249
|
-
end
|
2250
|
-
end
|
2251
|
-
|
2252
|
-
deprec_specify "should use a nil key in the polymorphic hash to specify the default model class" do
|
2253
|
-
@m2 = Class.new(@m)
|
2254
|
-
@dataset.set_model(:bit, nil => @m, 1 => @m2)
|
2255
|
-
all = @dataset.all
|
2256
|
-
all[0].class.should == @m2
|
2257
|
-
all[1].class.should == @m
|
2258
|
-
all[2].class.should == @m2
|
2259
|
-
all[3].class.should == @m
|
2260
|
-
#...
|
2261
|
-
end
|
2262
|
-
|
2263
|
-
deprec_specify "should raise Sequel::Error if no suitable class is found in the polymorphic hash" do
|
2264
|
-
@m2 = Class.new(@m)
|
2265
|
-
@dataset.set_model(:bit, 1 => @m2)
|
2266
|
-
proc {@dataset.all}.should raise_error(Sequel::Error)
|
2267
|
-
end
|
2268
|
-
|
2269
|
-
deprec_specify "should supply naked records if the naked option is specified" do
|
2270
|
-
@dataset.set_model(:bit, nil => @m)
|
2271
|
-
@dataset.each(:naked => true) {|r| r.class.should == Hash}
|
2272
|
-
end
|
2273
|
-
end
|
2274
|
-
|
2275
|
-
context "A dataset with associated model class(es)" do
|
2276
|
-
before do
|
2277
|
-
@c = Class.new(Sequel::Dataset) do
|
2278
|
-
def fetch_rows(sql, &block)
|
2279
|
-
block.call({:x => 1, :y => 2})
|
2280
|
-
end
|
2281
|
-
end
|
2282
|
-
@dataset = @c.new(nil).from(:items)
|
2283
|
-
@m1 = Class.new do
|
2284
|
-
attr_accessor :v
|
2285
|
-
def initialize(v); @v = v; end
|
2286
|
-
end
|
2287
|
-
@m2 = Class.new do
|
2288
|
-
attr_accessor :v, :vv
|
2289
|
-
def initialize(v = nil); @v = v; end
|
2290
|
-
def self.load(v); o = new(nil); o.vv = v; o; end
|
2291
|
-
end
|
2292
|
-
@m3 = Class.new(@m2)
|
2293
|
-
end
|
2294
|
-
|
2295
|
-
deprec_specify "should instantiate an instance by passing the record hash as argument" do
|
2296
|
-
@dataset.set_model(@m1)
|
2297
|
-
o = @dataset.first
|
2298
|
-
o.class.should == @m1
|
2299
|
-
o.v.should == {:x => 1, :y => 2}
|
2300
|
-
end
|
2301
|
-
|
2302
|
-
deprec_specify "should use the .load constructor if available" do
|
2303
|
-
@dataset.set_model(@m2)
|
2304
|
-
o = @dataset.first
|
2305
|
-
o.class.should == @m2
|
2306
|
-
o.v.should == nil
|
2307
|
-
o.vv.should == {:x => 1, :y => 2}
|
2308
|
-
end
|
2309
|
-
|
2310
|
-
deprec_specify "should use the .load constructor also for polymorphic datasets" do
|
2311
|
-
@dataset.set_model(:y, 1 => @m2, 2 => @m3)
|
2312
|
-
o = @dataset.first
|
2313
|
-
o.class.should == @m3
|
2314
|
-
o.v.should == nil
|
2315
|
-
o.vv.should == {:x => 1, :y => 2}
|
2316
|
-
end
|
2317
|
-
end
|
2318
|
-
|
2319
2046
|
context "Dataset#<<" do
|
2320
2047
|
before do
|
2321
2048
|
@d = Sequel::Dataset.new(nil)
|
@@ -2329,104 +2056,6 @@ context "Dataset#<<" do
|
|
2329
2056
|
end
|
2330
2057
|
end
|
2331
2058
|
|
2332
|
-
context "A paginated dataset" do
|
2333
|
-
before do
|
2334
|
-
@d = Sequel::Dataset.new(nil)
|
2335
|
-
@d.meta_def(:count) {153}
|
2336
|
-
|
2337
|
-
deprec{@paginated = @d.paginate(1, 20)}
|
2338
|
-
end
|
2339
|
-
|
2340
|
-
deprec_specify "should raise an error if the dataset already has a limit" do
|
2341
|
-
proc{@d.limit(10).paginate(1,10)}.should raise_error(Sequel::Error)
|
2342
|
-
proc{@paginated.paginate(2,20)}.should raise_error(Sequel::Error)
|
2343
|
-
end
|
2344
|
-
|
2345
|
-
deprec_specify "should set the limit and offset options correctly" do
|
2346
|
-
@paginated.opts[:limit].should == 20
|
2347
|
-
@paginated.opts[:offset].should == 0
|
2348
|
-
end
|
2349
|
-
|
2350
|
-
deprec_specify "should set the page count correctly" do
|
2351
|
-
@paginated.page_count.should == 8
|
2352
|
-
@d.paginate(1, 50).page_count.should == 4
|
2353
|
-
end
|
2354
|
-
|
2355
|
-
deprec_specify "should set the current page number correctly" do
|
2356
|
-
@paginated.current_page.should == 1
|
2357
|
-
@d.paginate(3, 50).current_page.should == 3
|
2358
|
-
end
|
2359
|
-
|
2360
|
-
deprec_specify "should return the next page number or nil if we're on the last" do
|
2361
|
-
@paginated.next_page.should == 2
|
2362
|
-
@d.paginate(4, 50).next_page.should be_nil
|
2363
|
-
end
|
2364
|
-
|
2365
|
-
deprec_specify "should return the previous page number or nil if we're on the last" do
|
2366
|
-
@paginated.prev_page.should be_nil
|
2367
|
-
@d.paginate(4, 50).prev_page.should == 3
|
2368
|
-
end
|
2369
|
-
|
2370
|
-
deprec_specify "should return the page range" do
|
2371
|
-
@paginated.page_range.should == (1..8)
|
2372
|
-
@d.paginate(4, 50).page_range.should == (1..4)
|
2373
|
-
end
|
2374
|
-
|
2375
|
-
deprec_specify "should return the record range for the current page" do
|
2376
|
-
@paginated.current_page_record_range.should == (1..20)
|
2377
|
-
@d.paginate(4, 50).current_page_record_range.should == (151..153)
|
2378
|
-
@d.paginate(5, 50).current_page_record_range.should == (0..0)
|
2379
|
-
end
|
2380
|
-
|
2381
|
-
deprec_specify "should return the record count for the current page" do
|
2382
|
-
@paginated.current_page_record_count.should == 20
|
2383
|
-
@d.paginate(3, 50).current_page_record_count.should == 50
|
2384
|
-
@d.paginate(4, 50).current_page_record_count.should == 3
|
2385
|
-
@d.paginate(5, 50).current_page_record_count.should == 0
|
2386
|
-
end
|
2387
|
-
|
2388
|
-
deprec_specify "should know if current page is last page" do
|
2389
|
-
@paginated.last_page?.should be_false
|
2390
|
-
@d.paginate(2, 20).last_page?.should be_false
|
2391
|
-
@d.paginate(5, 30).last_page?.should be_false
|
2392
|
-
@d.paginate(6, 30).last_page?.should be_true
|
2393
|
-
end
|
2394
|
-
|
2395
|
-
deprec_specify "should know if current page is first page" do
|
2396
|
-
@paginated.first_page?.should be_true
|
2397
|
-
@d.paginate(1, 20).first_page?.should be_true
|
2398
|
-
@d.paginate(2, 20).first_page?.should be_false
|
2399
|
-
end
|
2400
|
-
|
2401
|
-
deprec_specify "should work with fixed sql" do
|
2402
|
-
ds = @d.clone(:sql => 'select * from blah')
|
2403
|
-
ds.meta_def(:count) {150}
|
2404
|
-
ds.paginate(2, 50).sql.should == 'SELECT * FROM (select * from blah) AS t1 LIMIT 50 OFFSET 50'
|
2405
|
-
end
|
2406
|
-
end
|
2407
|
-
|
2408
|
-
context "Dataset#each_page" do
|
2409
|
-
before do
|
2410
|
-
@d = Sequel::Dataset.new(nil).from(:items)
|
2411
|
-
@d.meta_def(:count) {153}
|
2412
|
-
end
|
2413
|
-
|
2414
|
-
deprec_specify "should raise an error if the dataset already has a limit" do
|
2415
|
-
proc{@d.limit(10).each_page(10){}}.should raise_error(Sequel::Error)
|
2416
|
-
end
|
2417
|
-
|
2418
|
-
deprec_specify "should iterate over each page in the resultset as a paginated dataset" do
|
2419
|
-
a = []
|
2420
|
-
@d.each_page(50) {|p| a << p}
|
2421
|
-
a.map {|p| p.sql}.should == [
|
2422
|
-
'SELECT * FROM items LIMIT 50 OFFSET 0',
|
2423
|
-
'SELECT * FROM items LIMIT 50 OFFSET 50',
|
2424
|
-
'SELECT * FROM items LIMIT 50 OFFSET 100',
|
2425
|
-
'SELECT * FROM items LIMIT 50 OFFSET 150',
|
2426
|
-
]
|
2427
|
-
end
|
2428
|
-
end
|
2429
|
-
|
2430
2059
|
context "Dataset#columns" do
|
2431
2060
|
before do
|
2432
2061
|
@dataset = DummyDataset.new(nil).from(:items)
|
@@ -2469,39 +2098,9 @@ context "Dataset#columns!" do
|
|
2469
2098
|
end
|
2470
2099
|
end
|
2471
2100
|
|
2472
|
-
require 'stringio'
|
2473
|
-
|
2474
|
-
context "Dataset#print" do
|
2475
|
-
before do
|
2476
|
-
@output = StringIO.new
|
2477
|
-
@orig_stdout = $stdout
|
2478
|
-
$stdout = @output
|
2479
|
-
@dataset = DummyDataset.new(nil).from(:items)
|
2480
|
-
end
|
2481
|
-
|
2482
|
-
after do
|
2483
|
-
$stdout = @orig_stdout
|
2484
|
-
end
|
2485
|
-
|
2486
|
-
deprec_specify "should print out a table with the values" do
|
2487
|
-
@dataset.print(:a, :b)
|
2488
|
-
@output.rewind
|
2489
|
-
@output.read.should == \
|
2490
|
-
"+-+-+\n|a|b|\n+-+-+\n|1|2|\n|3|4|\n|5|6|\n+-+-+\n"
|
2491
|
-
end
|
2492
|
-
|
2493
|
-
deprec_specify "should default to the dataset's columns" do
|
2494
|
-
@dataset.meta_def(:columns) {[:a, :b]}
|
2495
|
-
@dataset.print
|
2496
|
-
@output.rewind
|
2497
|
-
@output.read.should == \
|
2498
|
-
"+-+-+\n|a|b|\n+-+-+\n|1|2|\n|3|4|\n|5|6|\n+-+-+\n"
|
2499
|
-
end
|
2500
|
-
end
|
2501
|
-
|
2502
2101
|
context "Dataset#import" do
|
2503
2102
|
before do
|
2504
|
-
@dbc = Class.new do
|
2103
|
+
@dbc = Class.new(Sequel::Database) do
|
2505
2104
|
attr_reader :sqls
|
2506
2105
|
|
2507
2106
|
def execute(sql, opts={})
|
@@ -2524,76 +2123,6 @@ context "Dataset#import" do
|
|
2524
2123
|
@list = [{:name => 'abc'}, {:name => 'def'}, {:name => 'ghi'}]
|
2525
2124
|
end
|
2526
2125
|
|
2527
|
-
deprec_specify "should issue multiple inserts inside a transaction" do
|
2528
|
-
@ds.import(@list)
|
2529
|
-
@db.sqls.should == [
|
2530
|
-
'BEGIN',
|
2531
|
-
"INSERT INTO items (name) VALUES ('abc')",
|
2532
|
-
"INSERT INTO items (name) VALUES ('def')",
|
2533
|
-
"INSERT INTO items (name) VALUES ('ghi')",
|
2534
|
-
'COMMIT'
|
2535
|
-
]
|
2536
|
-
end
|
2537
|
-
|
2538
|
-
deprec_specify "should handle different formats for tables" do
|
2539
|
-
@ds = @ds.from(:sch__tab)
|
2540
|
-
@ds.import(@list)
|
2541
|
-
@db.sqls.should == [
|
2542
|
-
'BEGIN',
|
2543
|
-
"INSERT INTO sch.tab (name) VALUES ('abc')",
|
2544
|
-
"INSERT INTO sch.tab (name) VALUES ('def')",
|
2545
|
-
"INSERT INTO sch.tab (name) VALUES ('ghi')",
|
2546
|
-
'COMMIT'
|
2547
|
-
]
|
2548
|
-
@db.sqls.clear
|
2549
|
-
|
2550
|
-
@ds = @ds.from(:tab.qualify(:sch))
|
2551
|
-
@ds.import(@list)
|
2552
|
-
@db.sqls.should == [
|
2553
|
-
'BEGIN',
|
2554
|
-
"INSERT INTO sch.tab (name) VALUES ('abc')",
|
2555
|
-
"INSERT INTO sch.tab (name) VALUES ('def')",
|
2556
|
-
"INSERT INTO sch.tab (name) VALUES ('ghi')",
|
2557
|
-
'COMMIT'
|
2558
|
-
]
|
2559
|
-
@db.sqls.clear
|
2560
|
-
@ds = @ds.from(:sch__tab.identifier)
|
2561
|
-
@ds.import(@list)
|
2562
|
-
@db.sqls.should == [
|
2563
|
-
'BEGIN',
|
2564
|
-
"INSERT INTO sch__tab (name) VALUES ('abc')",
|
2565
|
-
"INSERT INTO sch__tab (name) VALUES ('def')",
|
2566
|
-
"INSERT INTO sch__tab (name) VALUES ('ghi')",
|
2567
|
-
'COMMIT'
|
2568
|
-
]
|
2569
|
-
end
|
2570
|
-
|
2571
|
-
deprec_specify "should accept the :commit_every option for committing every x records" do
|
2572
|
-
@ds.import(@list, :commit_every => 2)
|
2573
|
-
@db.sqls.should == [
|
2574
|
-
'BEGIN',
|
2575
|
-
"INSERT INTO items (name) VALUES ('abc')",
|
2576
|
-
"INSERT INTO items (name) VALUES ('def')",
|
2577
|
-
'COMMIT',
|
2578
|
-
'BEGIN',
|
2579
|
-
"INSERT INTO items (name) VALUES ('ghi')",
|
2580
|
-
'COMMIT'
|
2581
|
-
]
|
2582
|
-
end
|
2583
|
-
|
2584
|
-
deprec_specify "should accept the :slice option for committing every x records" do
|
2585
|
-
@ds.import(@list, :slice => 2)
|
2586
|
-
@db.sqls.should == [
|
2587
|
-
'BEGIN',
|
2588
|
-
"INSERT INTO items (name) VALUES ('abc')",
|
2589
|
-
"INSERT INTO items (name) VALUES ('def')",
|
2590
|
-
'COMMIT',
|
2591
|
-
'BEGIN',
|
2592
|
-
"INSERT INTO items (name) VALUES ('ghi')",
|
2593
|
-
'COMMIT'
|
2594
|
-
]
|
2595
|
-
end
|
2596
|
-
|
2597
2126
|
specify "should accept string keys as column names" do
|
2598
2127
|
@ds.import(['x', 'y'], [[1, 2], [3, 4]])
|
2599
2128
|
@db.sqls.should == [
|
@@ -2625,6 +2154,16 @@ context "Dataset#import" do
|
|
2625
2154
|
]
|
2626
2155
|
end
|
2627
2156
|
|
2157
|
+
specify "should accept a columns array and a values array with :commit_every option" do
|
2158
|
+
@ds.import([:x, :y], [[1, 2], [3, 4], [5, 6]], :commit_every => 3)
|
2159
|
+
@db.sqls.should == [
|
2160
|
+
'BEGIN',
|
2161
|
+
"INSERT INTO items (x, y) VALUES (1, 2)",
|
2162
|
+
"INSERT INTO items (x, y) VALUES (3, 4)",
|
2163
|
+
"INSERT INTO items (x, y) VALUES (5, 6)",
|
2164
|
+
'COMMIT',
|
2165
|
+
]
|
2166
|
+
end
|
2628
2167
|
specify "should accept a columns array and a values array with slice option" do
|
2629
2168
|
@ds.import([:x, :y], [[1, 2], [3, 4], [5, 6]], :slice => 2)
|
2630
2169
|
@db.sqls.should == [
|
@@ -2637,23 +2176,6 @@ context "Dataset#import" do
|
|
2637
2176
|
'COMMIT'
|
2638
2177
|
]
|
2639
2178
|
end
|
2640
|
-
|
2641
|
-
deprec_specify "should not do anything if no columns or values are given" do
|
2642
|
-
@ds.import
|
2643
|
-
@db.sqls.should be_nil
|
2644
|
-
|
2645
|
-
@ds.import([])
|
2646
|
-
@db.sqls.should be_nil
|
2647
|
-
|
2648
|
-
@ds.import([], [])
|
2649
|
-
@db.sqls.should be_nil
|
2650
|
-
|
2651
|
-
@ds.import([{}, {}])
|
2652
|
-
@db.sqls.should be_nil
|
2653
|
-
|
2654
|
-
@ds.import([:a, :b], [])
|
2655
|
-
@db.sqls.should be_nil
|
2656
|
-
end
|
2657
2179
|
end
|
2658
2180
|
|
2659
2181
|
context "Dataset#multi_insert" do
|
@@ -2726,10 +2248,12 @@ context "Dataset#multi_insert" do
|
|
2726
2248
|
end
|
2727
2249
|
|
2728
2250
|
specify "should accept the :commit_every option for committing every x records" do
|
2729
|
-
@ds.multi_insert(@list, :commit_every =>
|
2251
|
+
@ds.multi_insert(@list, :commit_every => 1)
|
2730
2252
|
@db.sqls.should == [
|
2731
2253
|
'BEGIN',
|
2732
2254
|
"INSERT INTO items (name) VALUES ('abc')",
|
2255
|
+
'COMMIT',
|
2256
|
+
'BEGIN',
|
2733
2257
|
"INSERT INTO items (name) VALUES ('def')",
|
2734
2258
|
'COMMIT',
|
2735
2259
|
'BEGIN',
|
@@ -2761,118 +2285,12 @@ context "Dataset#multi_insert" do
|
|
2761
2285
|
]
|
2762
2286
|
end
|
2763
2287
|
|
2764
|
-
|
2765
|
-
@ds.multi_insert([
|
2766
|
-
@db.sqls.should == [
|
2767
|
-
'BEGIN',
|
2768
|
-
"INSERT INTO items (x, y) VALUES (1, 2)",
|
2769
|
-
"INSERT INTO items (x, y) VALUES (3, 4)",
|
2770
|
-
'COMMIT'
|
2771
|
-
]
|
2772
|
-
end
|
2773
|
-
|
2774
|
-
deprec_specify "should accept a columns array and a dataset" do
|
2775
|
-
@ds2 = Sequel::Dataset.new(@db).from(:cats).filter(:purr => true).select(:a, :b)
|
2776
|
-
|
2777
|
-
@ds.multi_insert([:x, :y], @ds2)
|
2778
|
-
@db.sqls.should == [
|
2779
|
-
'BEGIN',
|
2780
|
-
"INSERT INTO items (x, y) VALUES (SELECT a, b FROM cats WHERE (purr IS TRUE))",
|
2781
|
-
'COMMIT'
|
2782
|
-
]
|
2783
|
-
end
|
2784
|
-
|
2785
|
-
deprec_specify "should accept a columns array and a values array with slice option" do
|
2786
|
-
@ds.multi_insert([:x, :y], [[1, 2], [3, 4], [5, 6]], :slice => 2)
|
2787
|
-
@db.sqls.should == [
|
2788
|
-
'BEGIN',
|
2789
|
-
"INSERT INTO items (x, y) VALUES (1, 2)",
|
2790
|
-
"INSERT INTO items (x, y) VALUES (3, 4)",
|
2791
|
-
'COMMIT',
|
2792
|
-
'BEGIN',
|
2793
|
-
"INSERT INTO items (x, y) VALUES (5, 6)",
|
2794
|
-
'COMMIT'
|
2795
|
-
]
|
2796
|
-
end
|
2797
|
-
|
2798
|
-
deprec_specify "should not do anything if no hashes are provided" do
|
2799
|
-
@ds.multi_insert
|
2288
|
+
specify "should not do anything if no hashes are provided" do
|
2289
|
+
@ds.multi_insert([])
|
2800
2290
|
@db.sqls.should be_nil
|
2801
2291
|
end
|
2802
2292
|
end
|
2803
2293
|
|
2804
|
-
context "Dataset#query" do
|
2805
|
-
before do
|
2806
|
-
@d = Sequel::Dataset.new(nil)
|
2807
|
-
end
|
2808
|
-
|
2809
|
-
deprec_specify "should support #from" do
|
2810
|
-
q = @d.query {from :xxx}
|
2811
|
-
q.class.should == @d.class
|
2812
|
-
q.sql.should == "SELECT * FROM xxx"
|
2813
|
-
end
|
2814
|
-
|
2815
|
-
deprec_specify "should support #select" do
|
2816
|
-
q = @d.query do
|
2817
|
-
select :a, :b___mongo
|
2818
|
-
from :yyy
|
2819
|
-
end
|
2820
|
-
q.class.should == @d.class
|
2821
|
-
q.sql.should == "SELECT a, b AS mongo FROM yyy"
|
2822
|
-
end
|
2823
|
-
|
2824
|
-
deprec_specify "should support #where" do
|
2825
|
-
q = @d.query do
|
2826
|
-
from :zzz
|
2827
|
-
where(:x + 2 > :y + 3)
|
2828
|
-
end
|
2829
|
-
q.class.should == @d.class
|
2830
|
-
q.sql.should == "SELECT * FROM zzz WHERE ((x + 2) > (y + 3))"
|
2831
|
-
|
2832
|
-
q = @d.from(:zzz).query do
|
2833
|
-
where((:x.sql_number > 1) & (:y.sql_number > 2))
|
2834
|
-
end
|
2835
|
-
q.class.should == @d.class
|
2836
|
-
q.sql.should == "SELECT * FROM zzz WHERE ((x > 1) AND (y > 2))"
|
2837
|
-
|
2838
|
-
q = @d.from(:zzz).query do
|
2839
|
-
where :x => 33
|
2840
|
-
end
|
2841
|
-
q.class.should == @d.class
|
2842
|
-
q.sql.should == "SELECT * FROM zzz WHERE (x = 33)"
|
2843
|
-
end
|
2844
|
-
|
2845
|
-
deprec_specify "should support #group_by and #having" do
|
2846
|
-
q = @d.query do
|
2847
|
-
from :abc
|
2848
|
-
group_by :id
|
2849
|
-
having(:x.sql_number >= 2)
|
2850
|
-
end
|
2851
|
-
q.class.should == @d.class
|
2852
|
-
q.sql.should == "SELECT * FROM abc GROUP BY id HAVING (x >= 2)"
|
2853
|
-
end
|
2854
|
-
|
2855
|
-
deprec_specify "should support #order, #order_by" do
|
2856
|
-
q = @d.query do
|
2857
|
-
from :xyz
|
2858
|
-
order_by :stamp
|
2859
|
-
end
|
2860
|
-
q.class.should == @d.class
|
2861
|
-
q.sql.should == "SELECT * FROM xyz ORDER BY stamp"
|
2862
|
-
end
|
2863
|
-
|
2864
|
-
deprec_specify "should raise on non-chainable method calls" do
|
2865
|
-
proc {@d.query {first_source}}.should raise_error(Sequel::Error)
|
2866
|
-
end
|
2867
|
-
|
2868
|
-
deprec_specify "should raise on each, insert, update, delete" do
|
2869
|
-
proc {@d.query {each}}.should raise_error(Sequel::Error)
|
2870
|
-
proc {@d.query {insert(:x => 1)}}.should raise_error(Sequel::Error)
|
2871
|
-
proc {@d.query {update(:x => 1)}}.should raise_error(Sequel::Error)
|
2872
|
-
proc {@d.query {delete}}.should raise_error(Sequel::Error)
|
2873
|
-
end
|
2874
|
-
end
|
2875
|
-
|
2876
2294
|
context "Dataset" do
|
2877
2295
|
before do
|
2878
2296
|
@d = Sequel::Dataset.new(nil).from(:x)
|
@@ -2920,191 +2338,6 @@ context "Dataset" do
|
|
2920
2338
|
end
|
2921
2339
|
end
|
2922
2340
|
|
2923
|
-
context "Dataset#transform" do
|
2924
|
-
before do
|
2925
|
-
@c = Class.new(Sequel::Dataset) do
|
2926
|
-
attr_accessor :raw
|
2927
|
-
attr_accessor :sql
|
2928
|
-
|
2929
|
-
def fetch_rows(sql, &block)
|
2930
|
-
block[@raw]
|
2931
|
-
end
|
2932
|
-
|
2933
|
-
def insert(v)
|
2934
|
-
@sql = insert_sql(v)
|
2935
|
-
end
|
2936
|
-
|
2937
|
-
def update(v)
|
2938
|
-
@sql = update_sql(v)
|
2939
|
-
end
|
2940
|
-
end
|
2941
|
-
|
2942
|
-
@ds = @c.new(nil).from(:items)
|
2943
|
-
deprec do
|
2944
|
-
@ds.transform(:x => [
|
2945
|
-
proc {|v| Marshal.load(v)},
|
2946
|
-
proc {|v| Marshal.dump(v)}
|
2947
|
-
])
|
2948
|
-
end
|
2949
|
-
end
|
2950
|
-
|
2951
|
-
deprec_specify "should change the dataset to transform values loaded from the database" do
|
2952
|
-
@ds.raw = {:x => Marshal.dump([1, 2, 3]), :y => 'hello'}
|
2953
|
-
@ds.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
2954
|
-
@ds.raw = {:x => Marshal.dump([1, 2, 3]), :y => 'hello'}
|
2955
|
-
@ds.all.should == [{:x => [1, 2, 3], :y => 'hello'}]
|
2956
|
-
end
|
2957
|
-
|
2958
|
-
deprec_specify "should change the dataset to transform values saved to the database" do
|
2959
|
-
@ds.insert(:x => :toast)
|
2960
|
-
@ds.sql.should == "INSERT INTO items (x) VALUES ('#{Marshal.dump(:toast)}')"
|
2961
|
-
|
2962
|
-
@ds.insert(:y => 'butter')
|
2963
|
-
@ds.sql.should == "INSERT INTO items (y) VALUES ('butter')"
|
2964
|
-
|
2965
|
-
@ds.update(:x => ['dream'])
|
2966
|
-
@ds.sql.should == "UPDATE items SET x = '#{Marshal.dump(['dream'])}'"
|
2967
|
-
end
|
2968
|
-
|
2969
|
-
deprec_specify "should be transferred to cloned datasets" do
|
2970
|
-
@ds2 = @ds.filter(:a => 1)
|
2971
|
-
|
2972
|
-
@ds2.raw = {:x => Marshal.dump([1, 2, 3]), :y => 'hello'}
|
2973
|
-
@ds2.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
2974
|
-
|
2975
|
-
@ds2.insert(:x => :toast)
|
2976
|
-
@ds2.sql.should == "INSERT INTO items (x) VALUES ('#{Marshal.dump(:toast)}')"
|
2977
|
-
end
|
2978
|
-
|
2979
|
-
deprec_specify "should work correctly together with set_row_proc" do
|
2980
|
-
@ds.row_proc = proc{|r| r[:z] = r[:x] * 2; r}
|
2981
|
-
@ds.raw = {:x => Marshal.dump("wow"), :y => 'hello'}
|
2982
|
-
@ds.first.should == {:x => "wow", :y => 'hello', :z => "wowwow"}
|
2983
|
-
|
2984
|
-
f = nil
|
2985
|
-
@ds.raw = {:x => Marshal.dump("wow"), :y => 'hello'}
|
2986
|
-
@ds.naked.each{|r| f = r}
|
2987
|
-
f.should == {:x => "wow", :y => 'hello'}
|
2988
|
-
end
|
2989
|
-
|
2990
|
-
deprec_specify "should leave the supplied values intact" do
|
2991
|
-
h = {:x => :toast}
|
2992
|
-
@ds.insert(h)
|
2993
|
-
h.should == {:x => :toast}
|
2994
|
-
end
|
2995
|
-
end
|
2996
|
-
|
2997
|
-
context "Dataset#transform" do
|
2998
|
-
before do
|
2999
|
-
@c = Class.new(Sequel::Dataset) do
|
3000
|
-
attr_accessor :raw
|
3001
|
-
attr_accessor :sql
|
3002
|
-
|
3003
|
-
def fetch_rows(sql, &block)
|
3004
|
-
block[@raw]
|
3005
|
-
end
|
3006
|
-
|
3007
|
-
def insert(v)
|
3008
|
-
@sql = insert_sql(v)
|
3009
|
-
end
|
3010
|
-
|
3011
|
-
def update(v)
|
3012
|
-
@sql = update_sql(v)
|
3013
|
-
end
|
3014
|
-
end
|
3015
|
-
|
3016
|
-
@ds = @c.new(nil).from(:items)
|
3017
|
-
end
|
3018
|
-
|
3019
|
-
deprec_specify "should raise Sequel::Error for invalid transformations" do
|
3020
|
-
proc {@ds.transform(:x => 'mau')}.should raise_error(Sequel::Error::InvalidTransform)
|
3021
|
-
proc {@ds.transform(:x => :mau)}.should raise_error(Sequel::Error::InvalidTransform)
|
3022
|
-
proc {@ds.transform(:x => [])}.should raise_error(Sequel::Error::InvalidTransform)
|
3023
|
-
proc {@ds.transform(:x => ['mau'])}.should raise_error(Sequel::Error::InvalidTransform)
|
3024
|
-
proc {@ds.transform(:x => [proc {|v|}, proc {|v|}])}.should_not raise_error(Sequel::Error::InvalidTransform)
|
3025
|
-
end
|
3026
|
-
|
3027
|
-
deprec_specify "should support stock YAML transformation" do
|
3028
|
-
@ds.transform(:x => :yaml)
|
3029
|
-
|
3030
|
-
@ds.raw = {:x => [1, 2, 3].to_yaml, :y => 'hello'}
|
3031
|
-
@ds.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
3032
|
-
|
3033
|
-
@ds.insert(:x => :toast)
|
3034
|
-
@ds.sql.should == "INSERT INTO items (x) VALUES ('#{:toast.to_yaml}')"
|
3035
|
-
@ds.insert(:y => 'butter')
|
3036
|
-
@ds.sql.should == "INSERT INTO items (y) VALUES ('butter')"
|
3037
|
-
@ds.update(:x => ['dream'])
|
3038
|
-
@ds.sql.should == "UPDATE items SET x = '#{['dream'].to_yaml}'"
|
3039
|
-
|
3040
|
-
@ds2 = @ds.filter(:a => 1)
|
3041
|
-
@ds2.raw = {:x => [1, 2, 3].to_yaml, :y => 'hello'}
|
3042
|
-
@ds2.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
3043
|
-
@ds2.insert(:x => :toast)
|
3044
|
-
@ds2.sql.should == "INSERT INTO items (x) VALUES ('#{:toast.to_yaml}')"
|
3045
|
-
|
3046
|
-
@ds.row_proc = proc{|r| r[:z] = r[:x] * 2; r}
|
3047
|
-
@ds.raw = {:x => "wow".to_yaml, :y => 'hello'}
|
3048
|
-
@ds.first.should == {:x => "wow", :y => 'hello', :z => "wowwow"}
|
3049
|
-
f = nil
|
3050
|
-
@ds.raw = {:x => "wow".to_yaml, :y => 'hello'}
|
3051
|
-
@ds.naked.each{|r| f = r}
|
3052
|
-
f.should == {:x => "wow", :y => 'hello'}
|
3053
|
-
end
|
3054
|
-
|
3055
|
-
deprec_specify "should support stock Marshal transformation with Base64 encoding" do
|
3056
|
-
@ds.transform(:x => :marshal)
|
3057
|
-
|
3058
|
-
@ds.raw = {:x => [Marshal.dump([1, 2, 3])].pack('m'), :y => 'hello'}
|
3059
|
-
@ds.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
3060
|
-
|
3061
|
-
@ds.insert(:x => :toast)
|
3062
|
-
@ds.sql.should == "INSERT INTO items (x) VALUES ('#{[Marshal.dump(:toast)].pack('m')}')"
|
3063
|
-
@ds.insert(:y => 'butter')
|
3064
|
-
@ds.sql.should == "INSERT INTO items (y) VALUES ('butter')"
|
3065
|
-
@ds.update(:x => ['dream'])
|
3066
|
-
@ds.sql.should == "UPDATE items SET x = '#{[Marshal.dump(['dream'])].pack('m')}'"
|
3067
|
-
|
3068
|
-
@ds2 = @ds.filter(:a => 1)
|
3069
|
-
@ds2.raw = {:x => [Marshal.dump([1, 2, 3])].pack('m'), :y => 'hello'}
|
3070
|
-
@ds2.first.should == {:x => [1, 2, 3], :y => 'hello'}
|
3071
|
-
@ds2.insert(:x => :toast)
|
3072
|
-
@ds2.sql.should == "INSERT INTO items (x) VALUES ('#{[Marshal.dump(:toast)].pack('m')}')"
|
3073
|
-
|
3074
|
-
@ds.row_proc = proc{|r| r[:z] = r[:x] * 2; r}
|
3075
|
-
@ds.raw = {:x => [Marshal.dump("wow")].pack('m'), :y => 'hello'}
|
3076
|
-
@ds.first.should == {:x => "wow", :y => 'hello', :z => "wowwow"}
|
3077
|
-
f = nil
|
3078
|
-
@ds.raw = {:x => [Marshal.dump("wow")].pack('m'), :y => 'hello'}
|
3079
|
-
@ds.naked.each{|r| f = r}
|
3080
|
-
f.should == {:x => "wow", :y => 'hello'}
|
3081
|
-
end
|
3082
|
-
|
3083
|
-
deprec_specify "should support loading of Marshalled values without Base64 encoding" do
|
3084
|
-
@ds.transform(:x => :marshal)
|
3085
|
-
|
3086
|
-
@ds.raw = {:x => Marshal.dump([1,2,3]), :y => nil}
|
3087
|
-
@ds.first.should == {:x => [1,2,3], :y => nil}
|
3088
|
-
end
|
3089
|
-
|
3090
|
-
deprec_specify "should return self" do
|
3091
|
-
@ds.transform(:x => :marshal).should be(@ds)
|
3092
|
-
end
|
3093
|
-
end
|
3094
|
-
|
3095
|
-
context "A dataset with a transform" do
|
3096
|
-
before do
|
3097
|
-
@ds = Sequel::Dataset.new(nil).from(:items)
|
3098
|
-
deprec{@ds.transform(:x => :marshal)}
|
3099
|
-
end
|
3100
|
-
|
3101
|
-
deprec_specify "should automatically transform hash filters" do
|
3102
|
-
@ds.filter(:y => 2).sql.should == 'SELECT * FROM items WHERE (y = 2)'
|
3103
|
-
|
3104
|
-
@ds.filter(:x => 2).sql.should == "SELECT * FROM items WHERE (x = '#{[Marshal.dump(2)].pack('m')}')"
|
3105
|
-
end
|
3106
|
-
end
|
3107
|
-
|
3108
2341
|
context "Dataset#to_csv" do
|
3109
2342
|
before do
|
3110
2343
|
@c = Class.new(Sequel::Dataset) do
|
@@ -3137,48 +2370,6 @@ context "Dataset#to_csv" do
|
|
3137
2370
|
end
|
3138
2371
|
end
|
3139
2372
|
|
3140
|
-
context "Dataset#create_view" do
|
3141
|
-
before do
|
3142
|
-
@dbc = Class.new(Sequel::Database) do
|
3143
|
-
attr_reader :sqls
|
3144
|
-
|
3145
|
-
def execute(sql, opts={})
|
3146
|
-
@sqls ||= []
|
3147
|
-
@sqls << sql
|
3148
|
-
end
|
3149
|
-
end
|
3150
|
-
@db = @dbc.new
|
3151
|
-
|
3152
|
-
@ds = @db[:items].order(:abc).filter(:category => 'ruby')
|
3153
|
-
end
|
3154
|
-
|
3155
|
-
deprec_specify "should create a view with the dataset's sql" do
|
3156
|
-
@ds.create_view(:xyz)
|
3157
|
-
@db.sqls.should == ["CREATE VIEW xyz AS #{@ds.sql}"]
|
3158
|
-
end
|
3159
|
-
end
|
3160
|
-
|
3161
|
-
context "Dataset#create_or_replace_view" do
|
3162
|
-
before do
|
3163
|
-
@dbc = Class.new(Sequel::Database) do
|
3164
|
-
attr_reader :sqls
|
3165
|
-
|
3166
|
-
def execute(sql, opts={})
|
3167
|
-
@sqls ||= []
|
3168
|
-
@sqls << sql
|
3169
|
-
end
|
3170
|
-
end
|
3171
|
-
@db = @dbc.new
|
3172
|
-
|
3173
|
-
@ds = @db[:items].order(:abc).filter(:category => 'ruby')
|
3174
|
-
end
|
3175
|
-
|
3176
|
-
deprec_specify "should create a view with the dataset's sql" do
|
3177
|
-
@ds.create_or_replace_view(:xyz)
|
3178
|
-
@db.sqls.should == ["CREATE OR REPLACE VIEW xyz AS #{@ds.sql}"]
|
3179
|
-
end
|
3180
|
-
end
|
3181
|
-
|
3182
2373
|
context "Dataset#update_sql" do
|
3183
2374
|
before do
|
3184
2375
|
@ds = Sequel::Dataset.new(nil).from(:items)
|
@@ -3296,14 +2487,6 @@ context "Dataset#all" do
|
|
3296
2487
|
]
|
3297
2488
|
end
|
3298
2489
|
|
3299
|
-
deprec_specify "should accept options and pass them to #each" do
|
3300
|
-
@dataset.all(:limit => 33).should == [
|
3301
|
-
{:x => 1, :y => 2},
|
3302
|
-
{:x => 3, :y => 4},
|
3303
|
-
"SELECT * FROM items LIMIT 33"
|
3304
|
-
]
|
3305
|
-
end
|
3306
|
-
|
3307
2490
|
specify "should iterate over the array if a block is given" do
|
3308
2491
|
a = []
|
3309
2492
|
|
@@ -3354,30 +2537,6 @@ context "Dataset#grep" do
|
|
3354
2537
|
end
|
3355
2538
|
end
|
3356
2539
|
|
3357
|
-
context "Sequel.use_parse_tree" do
|
3358
|
-
deprec_specify "be false" do
|
3359
|
-
Sequel.use_parse_tree.should == false
|
3360
|
-
end
|
3361
|
-
end
|
3362
|
-
|
3363
|
-
context "Sequel.use_parse_tree=" do
|
3364
|
-
deprec_specify "raise an error if true" do
|
3365
|
-
proc{Sequel.use_parse_tree = true}.should raise_error(Sequel::Error)
|
3366
|
-
end
|
3367
|
-
|
3368
|
-
deprec_specify "do nothing if false" do
|
3369
|
-
proc{Sequel.use_parse_tree = false}.should_not raise_error
|
3370
|
-
end
|
3371
|
-
end
|
3372
|
-
|
3373
|
-
context "Dataset.dataset_classes" do
|
3374
|
-
deprec_specify "should be an array of dataset subclasses" do
|
3375
|
-
ds_class = Class.new(Sequel::Dataset)
|
3376
|
-
Sequel::Dataset.dataset_classes.should be_a_kind_of(Array)
|
3377
|
-
Sequel::Dataset.dataset_classes.should include(ds_class)
|
3378
|
-
end
|
3379
|
-
end
|
3380
|
-
|
3381
2540
|
context "Dataset default #fetch_rows, #insert, #update, and #delete, #execute" do
|
3382
2541
|
before do
|
3383
2542
|
@db = Sequel::Database.new
|
@@ -3412,10 +2571,9 @@ end
|
|
3412
2571
|
context "Dataset prepared statements and bound variables " do
|
3413
2572
|
before do
|
3414
2573
|
@db = Sequel::Database.new
|
3415
|
-
@db.
|
3416
|
-
@db.sqls = []
|
2574
|
+
@db.meta_def(:sqls){@sqls||=[]}
|
3417
2575
|
def @db.execute(sql, opts={})
|
3418
|
-
|
2576
|
+
sqls << sql
|
3419
2577
|
end
|
3420
2578
|
def @db.dataset
|
3421
2579
|
ds = super()
|
@@ -3500,10 +2658,9 @@ end
|
|
3500
2658
|
context Sequel::Dataset::UnnumberedArgumentMapper do
|
3501
2659
|
before do
|
3502
2660
|
@db = Sequel::Database.new
|
3503
|
-
@db.
|
3504
|
-
@db.sqls = []
|
2661
|
+
@db.meta_def(:sqls){@sqls||=[]}
|
3505
2662
|
def @db.execute(sql, opts={})
|
3506
|
-
|
2663
|
+
sqls << [sql, *opts[:arguments]]
|
3507
2664
|
end
|
3508
2665
|
@ds = @db[:items].filter(:num=>:$n)
|
3509
2666
|
def @ds.fetch_rows(sql, &block)
|
@@ -3591,43 +2748,3 @@ context "Sequel::Dataset #set_overrides" do
|
|
3591
2748
|
@ds.set_overrides(:x=>2).update_sql.should == "UPDATE items SET x = 1"
|
3592
2749
|
end
|
3593
2750
|
end
|
3594
|
-
|
3595
|
-
context "Sequel::Dataset#each" do
|
3596
|
-
before do
|
3597
|
-
@ds = Sequel::Dataset.new(nil).from(:items)
|
3598
|
-
def @ds.fetch_rows(sql)
|
3599
|
-
@columns = /count/i.match(sql) ? [:count] : [:a]
|
3600
|
-
yield({@columns.first=>sql})
|
3601
|
-
end
|
3602
|
-
end
|
3603
|
-
|
3604
|
-
deprec_specify "should not set the columns if passing an option that modifies them" do
|
3605
|
-
@ds.each(:select=>[:count]){}
|
3606
|
-
@ds.columns.should == [:a]
|
3607
|
-
@ds.each(:from=>[:count]){}
|
3608
|
-
@ds.columns.should == [:a]
|
3609
|
-
@ds.each(:join=>[Sequel::SQL::JoinClause.new(:natural, :count)]){}
|
3610
|
-
@ds.columns.should == [:a]
|
3611
|
-
@ds.each(:sql=>'SELECT COUNT'){}
|
3612
|
-
@ds.columns.should == [:a]
|
3613
|
-
end
|
3614
|
-
|
3615
|
-
deprec_specify "should have the correct columns inside the block regardless" do
|
3616
|
-
@ds.each(:select=>[:count]) do |x|
|
3617
|
-
x[:count].should == 'SELECT count FROM items'
|
3618
|
-
@ds.columns.should == [:count]
|
3619
|
-
end
|
3620
|
-
@ds.each(:from=>[:count]) do |x|
|
3621
|
-
x[:count].should == 'SELECT * FROM count'
|
3622
|
-
@ds.columns.should == [:count]
|
3623
|
-
end
|
3624
|
-
@ds.each(:join=>[Sequel::SQL::JoinClause.new(:natural, :count)]) do |x|
|
3625
|
-
x[:count].should == 'SELECT * FROM items NATURAL JOIN count'
|
3626
|
-
@ds.columns.should == [:count]
|
3627
|
-
end
|
3628
|
-
@ds.each(:sql=>'SELECT COUNT') do |x|
|
3629
|
-
x[:count].should == 'SELECT COUNT'
|
3630
|
-
@ds.columns.should == [:count]
|
3631
|
-
end
|
3632
|
-
end
|
3633
|
-
end
|