sequel_core 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +74 -0
- data/COPYING +1 -0
- data/README +17 -6
- data/Rakefile +16 -21
- data/lib/sequel_core.rb +18 -28
- data/lib/sequel_core/adapters/ado.rb +3 -15
- data/lib/sequel_core/adapters/dbi.rb +1 -14
- data/lib/sequel_core/adapters/informix.rb +3 -3
- data/lib/sequel_core/adapters/jdbc.rb +2 -2
- data/lib/sequel_core/adapters/mysql.rb +39 -59
- data/lib/sequel_core/adapters/odbc.rb +18 -38
- data/lib/sequel_core/adapters/openbase.rb +1 -17
- data/lib/sequel_core/adapters/oracle.rb +1 -19
- data/lib/sequel_core/adapters/postgres.rb +20 -60
- data/lib/sequel_core/adapters/sqlite.rb +4 -8
- data/lib/sequel_core/connection_pool.rb +150 -0
- data/lib/sequel_core/core_ext.rb +41 -0
- data/lib/sequel_core/core_sql.rb +35 -38
- data/lib/sequel_core/database.rb +20 -17
- data/lib/sequel_core/dataset.rb +49 -80
- data/lib/sequel_core/dataset/callback.rb +11 -13
- data/lib/sequel_core/dataset/convenience.rb +18 -136
- data/lib/sequel_core/dataset/pagination.rb +81 -0
- data/lib/sequel_core/dataset/sequelizer.rb +5 -4
- data/lib/sequel_core/dataset/sql.rb +43 -33
- data/lib/sequel_core/deprecated.rb +200 -0
- data/lib/sequel_core/exceptions.rb +0 -14
- data/lib/sequel_core/object_graph.rb +199 -0
- data/lib/sequel_core/pretty_table.rb +27 -24
- data/lib/sequel_core/schema/generator.rb +16 -4
- data/lib/sequel_core/schema/sql.rb +5 -3
- data/lib/sequel_core/worker.rb +1 -1
- data/spec/adapters/informix_spec.rb +1 -47
- data/spec/adapters/mysql_spec.rb +85 -54
- data/spec/adapters/oracle_spec.rb +1 -57
- data/spec/adapters/postgres_spec.rb +66 -49
- data/spec/adapters/sqlite_spec.rb +4 -29
- data/spec/connection_pool_spec.rb +358 -0
- data/spec/core_sql_spec.rb +24 -19
- data/spec/database_spec.rb +13 -9
- data/spec/dataset_spec.rb +59 -78
- data/spec/object_graph_spec.rb +202 -0
- data/spec/pretty_table_spec.rb +1 -9
- data/spec/schema_generator_spec.rb +7 -1
- data/spec/schema_spec.rb +27 -0
- data/spec/sequelizer_spec.rb +2 -2
- data/spec/spec_helper.rb +4 -2
- metadata +16 -57
- data/lib/sequel_core/array_keys.rb +0 -322
- data/lib/sequel_core/model.rb +0 -8
- data/spec/array_keys_spec.rb +0 -682
@@ -59,12 +59,15 @@ module Sequel
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def full_text_index(columns, opts = {})
|
62
|
-
columns
|
63
|
-
@indexes << {:columns => columns, :full_text => true}.merge(opts)
|
62
|
+
index(columns, opts.merge(:type => :full_text))
|
64
63
|
end
|
65
64
|
|
65
|
+
def spatial_index(columns, opts = {})
|
66
|
+
index(columns, opts.merge(:type => :spatial))
|
67
|
+
end
|
68
|
+
|
66
69
|
def unique(columns, opts = {})
|
67
|
-
index(columns,
|
70
|
+
index(columns, opts.merge(:unique => true))
|
68
71
|
end
|
69
72
|
|
70
73
|
def create_info
|
@@ -136,7 +139,16 @@ module Sequel
|
|
136
139
|
@operations << { \
|
137
140
|
:op => :add_index, \
|
138
141
|
:columns => columns, \
|
139
|
-
:
|
142
|
+
:type => :full_text \
|
143
|
+
}.merge(opts)
|
144
|
+
end
|
145
|
+
|
146
|
+
def add_spatial_index(columns, opts = {})
|
147
|
+
columns = [columns] unless columns.is_a?(Array)
|
148
|
+
@operations << { \
|
149
|
+
:op => :add_index, \
|
150
|
+
:columns => columns, \
|
151
|
+
:type => :spatial \
|
140
152
|
}.merge(opts)
|
141
153
|
end
|
142
154
|
|
@@ -51,7 +51,7 @@ module Sequel
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def expression_list(*args, &block)
|
54
|
-
schema_utility_dataset.expression_list
|
54
|
+
schema_utility_dataset.send(:expression_list, *args, &block)
|
55
55
|
end
|
56
56
|
|
57
57
|
def column_definition_sql(column)
|
@@ -96,8 +96,10 @@ module Sequel
|
|
96
96
|
|
97
97
|
def index_definition_sql(table_name, index)
|
98
98
|
index_name = index[:name] || default_index_name(table_name, index[:columns])
|
99
|
-
if index[:
|
100
|
-
raise Error, "
|
99
|
+
if index[:type]
|
100
|
+
raise Error, "Index types are not supported for this database"
|
101
|
+
elsif index[:where]
|
102
|
+
raise Error, "Partial indexes are not supported for this database"
|
101
103
|
elsif index[:unique]
|
102
104
|
"CREATE UNIQUE INDEX #{index_name} ON #{table_name} (#{literal(index[:columns])})"
|
103
105
|
else
|
data/lib/sequel_core/worker.rb
CHANGED
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
|
|
2
2
|
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
3
3
|
|
4
4
|
unless defined?(INFORMIX_DB)
|
5
|
-
INFORMIX_DB = Sequel('informix://localhost/mydb')
|
5
|
+
INFORMIX_DB = Sequel.connect('informix://localhost/mydb')
|
6
6
|
end
|
7
7
|
|
8
8
|
if INFORMIX_DB.table_exists?(:test)
|
@@ -95,49 +95,3 @@ context "A Informix dataset" do
|
|
95
95
|
@d.order(:value).last.should == {:name => 'def', :value => 789}
|
96
96
|
end
|
97
97
|
end
|
98
|
-
|
99
|
-
context "A Informix dataset in array tuples mode" do
|
100
|
-
setup do
|
101
|
-
@d = INFORMIX_DB[:test]
|
102
|
-
@d.delete # remove all records
|
103
|
-
Sequel.use_array_tuples
|
104
|
-
end
|
105
|
-
|
106
|
-
teardown do
|
107
|
-
Sequel.use_hash_tuples
|
108
|
-
end
|
109
|
-
|
110
|
-
specify "should return the correct records" do
|
111
|
-
@d.to_a.should == []
|
112
|
-
@d << {:name => 'abc', :value => 123}
|
113
|
-
@d << {:name => 'abc', :value => 456}
|
114
|
-
@d << {:name => 'def', :value => 789}
|
115
|
-
|
116
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
117
|
-
['abc', 123],
|
118
|
-
['abc', 456],
|
119
|
-
['def', 789]
|
120
|
-
]
|
121
|
-
end
|
122
|
-
|
123
|
-
specify "should work correctly with transforms" do
|
124
|
-
@d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
|
125
|
-
|
126
|
-
@d.to_a.should == []
|
127
|
-
@d << {:name => 'abc', :value => 123}
|
128
|
-
@d << {:name => 'abc', :value => 456}
|
129
|
-
@d << {:name => 'def', :value => 789}
|
130
|
-
|
131
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
132
|
-
['abc', '123'],
|
133
|
-
['abc', '456'],
|
134
|
-
['def', '789']
|
135
|
-
]
|
136
|
-
|
137
|
-
a = @d.order(:value).first
|
138
|
-
a.values.should == ['abc', '123']
|
139
|
-
a.keys.should == [:name, :value]
|
140
|
-
a[:name].should == 'abc'
|
141
|
-
a[:value].should == '123'
|
142
|
-
end
|
143
|
-
end
|
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -3,8 +3,8 @@ require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
|
3
3
|
require 'logger'
|
4
4
|
|
5
5
|
unless defined?(MYSQL_DB)
|
6
|
-
MYSQL_URL = 'mysql://root@localhost/sandbox' unless defined? MYSQL_URL
|
7
|
-
MYSQL_DB = Sequel(MYSQL_URL)
|
6
|
+
MYSQL_URL = (ENV['SEQUEL_MY_SPEC_DB']||'mysql://root@localhost/sandbox') unless defined? MYSQL_URL
|
7
|
+
MYSQL_DB = Sequel.connect(MYSQL_URL)
|
8
8
|
end
|
9
9
|
unless defined?(MYSQL_SOCKET_FILE)
|
10
10
|
MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
|
@@ -114,16 +114,16 @@ context "A MySQL dataset" do
|
|
114
114
|
@d.select('COUNT(*)'.lit).sql.should == \
|
115
115
|
'SELECT COUNT(*) FROM items'
|
116
116
|
|
117
|
-
@d.select(:value
|
117
|
+
@d.select(:max[:value]).sql.should == \
|
118
118
|
'SELECT max(`value`) FROM items'
|
119
119
|
|
120
120
|
@d.select(:NOW[]).sql.should == \
|
121
121
|
'SELECT NOW() FROM items'
|
122
122
|
|
123
|
-
@d.select(:items__value
|
123
|
+
@d.select(:max[:items__value]).sql.should == \
|
124
124
|
'SELECT max(items.`value`) FROM items'
|
125
125
|
|
126
|
-
@d.order(:name.
|
126
|
+
@d.order(:name.desc).sql.should == \
|
127
127
|
'SELECT * FROM items ORDER BY `name` DESC'
|
128
128
|
|
129
129
|
@d.select('items.name AS item_name'.lit).sql.should == \
|
@@ -155,13 +155,13 @@ context "A MySQL dataset" do
|
|
155
155
|
@d.reverse_order(:name).sql.should == \
|
156
156
|
'SELECT * FROM items ORDER BY `name` DESC'
|
157
157
|
|
158
|
-
@d.reverse_order(:name.
|
158
|
+
@d.reverse_order(:name.desc).sql.should == \
|
159
159
|
'SELECT * FROM items ORDER BY `name`'
|
160
160
|
|
161
|
-
@d.reverse_order(:name, :test.
|
161
|
+
@d.reverse_order(:name, :test.desc).sql.should == \
|
162
162
|
'SELECT * FROM items ORDER BY `name` DESC, `test`'
|
163
163
|
|
164
|
-
@d.reverse_order(:name.
|
164
|
+
@d.reverse_order(:name.desc, :test).sql.should == \
|
165
165
|
'SELECT * FROM items ORDER BY `name`, `test` DESC'
|
166
166
|
end
|
167
167
|
|
@@ -198,52 +198,6 @@ context "A MySQL dataset" do
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
-
context "A MySQL dataset in array tuples mode" do
|
202
|
-
setup do
|
203
|
-
@d = MYSQL_DB[:items]
|
204
|
-
@d.delete # remove all records
|
205
|
-
Sequel.use_array_tuples
|
206
|
-
end
|
207
|
-
|
208
|
-
teardown do
|
209
|
-
Sequel.use_hash_tuples
|
210
|
-
end
|
211
|
-
|
212
|
-
specify "should return the correct records" do
|
213
|
-
@d.to_a.should == []
|
214
|
-
@d << {:name => 'abc', :value => 123}
|
215
|
-
@d << {:name => 'abc', :value => 456}
|
216
|
-
@d << {:name => 'def', :value => 789}
|
217
|
-
|
218
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
219
|
-
['abc', 123],
|
220
|
-
['abc', 456],
|
221
|
-
['def', 789]
|
222
|
-
]
|
223
|
-
end
|
224
|
-
|
225
|
-
specify "should work correctly with transforms" do
|
226
|
-
@d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
|
227
|
-
|
228
|
-
@d.to_a.should == []
|
229
|
-
@d << {:name => 'abc', :value => 123}
|
230
|
-
@d << {:name => 'abc', :value => 456}
|
231
|
-
@d << {:name => 'def', :value => 789}
|
232
|
-
|
233
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
234
|
-
['abc', '123'],
|
235
|
-
['abc', '456'],
|
236
|
-
['def', '789']
|
237
|
-
]
|
238
|
-
|
239
|
-
a = @d.order(:value).first
|
240
|
-
a.values.should == ['abc', '123']
|
241
|
-
a.keys.should == [:name, :value]
|
242
|
-
a[:name].should == 'abc'
|
243
|
-
a[:value].should == '123'
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
201
|
context "MySQL datasets" do
|
248
202
|
setup do
|
249
203
|
@d = MYSQL_DB[:orders]
|
@@ -513,6 +467,39 @@ context "A MySQL database" do
|
|
513
467
|
MYSQL_DB[:posts].full_text_search(:title, '+ruby -rails', :boolean => true).sql.should ==
|
514
468
|
"SELECT * FROM posts WHERE (MATCH (`title`) AGAINST ('+ruby -rails' IN BOOLEAN MODE))"
|
515
469
|
end
|
470
|
+
|
471
|
+
specify "should support spatial indexes" do
|
472
|
+
g = Sequel::Schema::Generator.new(MYSQL_DB) do
|
473
|
+
point :geom
|
474
|
+
spatial_index [:geom]
|
475
|
+
end
|
476
|
+
MYSQL_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
477
|
+
"CREATE TABLE posts (`geom` point)",
|
478
|
+
"CREATE SPATIAL INDEX posts_geom_index ON posts (`geom`)"
|
479
|
+
]
|
480
|
+
end
|
481
|
+
|
482
|
+
specify "should support indexes with index type" do
|
483
|
+
g = Sequel::Schema::Generator.new(MYSQL_DB) do
|
484
|
+
text :title
|
485
|
+
index :title, :type => :hash
|
486
|
+
end
|
487
|
+
MYSQL_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
488
|
+
"CREATE TABLE posts (`title` text)",
|
489
|
+
"CREATE INDEX posts_title_index ON posts (`title`) USING hash"
|
490
|
+
]
|
491
|
+
end
|
492
|
+
|
493
|
+
specify "should support unique indexes with index type" do
|
494
|
+
g = Sequel::Schema::Generator.new(MYSQL_DB) do
|
495
|
+
text :title
|
496
|
+
index :title, :type => :hash, :unique => true
|
497
|
+
end
|
498
|
+
MYSQL_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
499
|
+
"CREATE TABLE posts (`title` text)",
|
500
|
+
"CREATE UNIQUE INDEX posts_title_index ON posts (`title`) USING hash"
|
501
|
+
]
|
502
|
+
end
|
516
503
|
end
|
517
504
|
|
518
505
|
class Sequel::MySQL::Database
|
@@ -548,6 +535,50 @@ class Sequel::MySQL::Database
|
|
548
535
|
end
|
549
536
|
end
|
550
537
|
|
538
|
+
context "MySQL::Dataset#insert" do
|
539
|
+
setup do
|
540
|
+
@d = MYSQL_DB[:items]
|
541
|
+
@d.delete # remove all records
|
542
|
+
MYSQL_DB.sqls.clear
|
543
|
+
end
|
544
|
+
|
545
|
+
specify "should insert record with default values when no arguments given" do
|
546
|
+
@d.insert
|
547
|
+
|
548
|
+
MYSQL_DB.sqls.should == [
|
549
|
+
"INSERT INTO items () VALUES ()"
|
550
|
+
]
|
551
|
+
|
552
|
+
@d.all.should == [
|
553
|
+
{:name => nil, :value => nil}
|
554
|
+
]
|
555
|
+
end
|
556
|
+
|
557
|
+
specify "should insert record with default values when empty hash given" do
|
558
|
+
@d.insert {}
|
559
|
+
|
560
|
+
MYSQL_DB.sqls.should == [
|
561
|
+
"INSERT INTO items () VALUES ()"
|
562
|
+
]
|
563
|
+
|
564
|
+
@d.all.should == [
|
565
|
+
{:name => nil, :value => nil}
|
566
|
+
]
|
567
|
+
end
|
568
|
+
|
569
|
+
specify "should insert record with default values when empty array given" do
|
570
|
+
@d.insert []
|
571
|
+
|
572
|
+
MYSQL_DB.sqls.should == [
|
573
|
+
"INSERT INTO items () VALUES ()"
|
574
|
+
]
|
575
|
+
|
576
|
+
@d.all.should == [
|
577
|
+
{:name => nil, :value => nil}
|
578
|
+
]
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
551
582
|
context "MySQL::Dataset#multi_insert" do
|
552
583
|
setup do
|
553
584
|
@d = MYSQL_DB[:items]
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
|
|
2
2
|
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
3
3
|
|
4
4
|
unless defined?(ORACLE_DB)
|
5
|
-
ORACLE_DB = Sequel('oracle://hr:hr@localhost/XE')
|
5
|
+
ORACLE_DB = Sequel.connect('oracle://hr:hr@localhost/XE')
|
6
6
|
end
|
7
7
|
|
8
8
|
if ORACLE_DB.table_exists?(:items)
|
@@ -221,59 +221,3 @@ context "Joined Oracle dataset" do
|
|
221
221
|
]
|
222
222
|
end
|
223
223
|
end
|
224
|
-
|
225
|
-
|
226
|
-
context "An Oracle dataset in array tuples mode" do
|
227
|
-
setup do
|
228
|
-
@d = ORACLE_DB[:items]
|
229
|
-
@d.delete # remove all records
|
230
|
-
Sequel.use_array_tuples
|
231
|
-
end
|
232
|
-
|
233
|
-
teardown do
|
234
|
-
Sequel.use_hash_tuples
|
235
|
-
end
|
236
|
-
|
237
|
-
specify "should return the correct records" do
|
238
|
-
@d.to_a.should == []
|
239
|
-
@d << {:name => 'abc', :value => 123}
|
240
|
-
@d << {:name => 'abc', :value => 456}
|
241
|
-
@d << {:name => 'def', :value => 789}
|
242
|
-
|
243
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
244
|
-
['abc', 123],
|
245
|
-
['abc', 456],
|
246
|
-
['def', 789]
|
247
|
-
]
|
248
|
-
|
249
|
-
@d.order(:value).select(:name, :value).limit(1).to_a.should == [
|
250
|
-
['abc',123]
|
251
|
-
]
|
252
|
-
|
253
|
-
@d.order(:value).select(:name, :value).limit(2,1).to_a.should == [
|
254
|
-
['abc',456],
|
255
|
-
['def',789]
|
256
|
-
]
|
257
|
-
end
|
258
|
-
|
259
|
-
specify "should work correctly with transforms" do
|
260
|
-
@d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
|
261
|
-
|
262
|
-
@d.to_a.should == []
|
263
|
-
@d << {:name => 'abc', :value => 123}
|
264
|
-
@d << {:name => 'abc', :value => 456}
|
265
|
-
@d << {:name => 'def', :value => 789}
|
266
|
-
|
267
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
268
|
-
['abc', '123'],
|
269
|
-
['abc', '456'],
|
270
|
-
['def', '789']
|
271
|
-
]
|
272
|
-
|
273
|
-
a = @d.order(:value).first
|
274
|
-
a.values.should == ['abc', '123']
|
275
|
-
a.keys.should == [:name, :value]
|
276
|
-
a[:name].should == 'abc'
|
277
|
-
a[:value].should == '123'
|
278
|
-
end
|
279
|
-
end
|
@@ -2,11 +2,12 @@ require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
|
|
2
2
|
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
3
3
|
|
4
4
|
unless defined?(POSTGRES_DB)
|
5
|
-
POSTGRES_DB = Sequel(ENV['SEQUEL_PG_SPEC_DB']||'postgres://postgres:postgres@localhost:5432/reality_spec')
|
5
|
+
POSTGRES_DB = Sequel.connect(ENV['SEQUEL_PG_SPEC_DB']||'postgres://postgres:postgres@localhost:5432/reality_spec')
|
6
6
|
end
|
7
7
|
|
8
8
|
POSTGRES_DB.drop_table(:test) if POSTGRES_DB.table_exists?(:test)
|
9
9
|
POSTGRES_DB.drop_table(:test2) if POSTGRES_DB.table_exists?(:test2)
|
10
|
+
POSTGRES_DB.drop_table(:test3) if POSTGRES_DB.table_exists?(:test3)
|
10
11
|
|
11
12
|
POSTGRES_DB.create_table :test do
|
12
13
|
text :name
|
@@ -16,6 +17,10 @@ POSTGRES_DB.create_table :test2 do
|
|
16
17
|
text :name
|
17
18
|
integer :value
|
18
19
|
end
|
20
|
+
POSTGRES_DB.create_table :test3 do
|
21
|
+
integer :value
|
22
|
+
timestamp :time
|
23
|
+
end
|
19
24
|
|
20
25
|
context "A PostgreSQL database" do
|
21
26
|
setup do
|
@@ -95,16 +100,16 @@ context "A PostgreSQL dataset" do
|
|
95
100
|
@d.select('COUNT(*)'.lit).sql.should == \
|
96
101
|
'SELECT COUNT(*) FROM test'
|
97
102
|
|
98
|
-
@d.select(:value
|
103
|
+
@d.select(:max[:value]).sql.should == \
|
99
104
|
'SELECT max("value") FROM test'
|
100
105
|
|
101
106
|
@d.select(:NOW[]).sql.should == \
|
102
107
|
'SELECT NOW() FROM test'
|
103
108
|
|
104
|
-
@d.select(:items__value
|
109
|
+
@d.select(:max[:items__value]).sql.should == \
|
105
110
|
'SELECT max(items."value") FROM test'
|
106
111
|
|
107
|
-
@d.order(:name.
|
112
|
+
@d.order(:name.desc).sql.should == \
|
108
113
|
'SELECT * FROM test ORDER BY "name" DESC'
|
109
114
|
|
110
115
|
@d.select('test.name AS item_name'.lit).sql.should == \
|
@@ -136,13 +141,13 @@ context "A PostgreSQL dataset" do
|
|
136
141
|
@d.reverse_order(:name).sql.should == \
|
137
142
|
'SELECT * FROM test ORDER BY "name" DESC'
|
138
143
|
|
139
|
-
@d.reverse_order(:name.
|
144
|
+
@d.reverse_order(:name.desc).sql.should == \
|
140
145
|
'SELECT * FROM test ORDER BY "name"'
|
141
146
|
|
142
|
-
@d.reverse_order(:name, :test.
|
147
|
+
@d.reverse_order(:name, :test.desc).sql.should == \
|
143
148
|
'SELECT * FROM test ORDER BY "name" DESC, "test"'
|
144
149
|
|
145
|
-
@d.reverse_order(:name.
|
150
|
+
@d.reverse_order(:name.desc, :test).sql.should == \
|
146
151
|
'SELECT * FROM test ORDER BY "name", "test" DESC'
|
147
152
|
end
|
148
153
|
|
@@ -167,49 +172,17 @@ context "A PostgreSQL dataset" do
|
|
167
172
|
end
|
168
173
|
end
|
169
174
|
|
170
|
-
context "A PostgreSQL
|
175
|
+
context "A PostgreSQL dataaset with a timestamp field" do
|
171
176
|
setup do
|
172
|
-
@d = POSTGRES_DB[:
|
173
|
-
@d.delete
|
174
|
-
Sequel.use_array_tuples
|
175
|
-
end
|
176
|
-
|
177
|
-
teardown do
|
178
|
-
Sequel.use_hash_tuples
|
179
|
-
end
|
180
|
-
|
181
|
-
specify "should return the correct records" do
|
182
|
-
@d.to_a.should == []
|
183
|
-
@d << {:name => 'abc', :value => 123}
|
184
|
-
@d << {:name => 'abc', :value => 456}
|
185
|
-
@d << {:name => 'def', :value => 789}
|
186
|
-
|
187
|
-
@d.order(:value).select(:name, :value).to_a.should == [
|
188
|
-
['abc', 123],
|
189
|
-
['abc', 456],
|
190
|
-
['def', 789]
|
191
|
-
]
|
177
|
+
@d = POSTGRES_DB[:test3]
|
178
|
+
@d.delete
|
192
179
|
end
|
193
|
-
|
194
|
-
specify "should work correctly with transforms" do
|
195
|
-
@d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
|
196
|
-
|
197
|
-
@d.to_a.should == []
|
198
|
-
@d << {:name => 'abc', :value => 123}
|
199
|
-
@d << {:name => 'abc', :value => 456}
|
200
|
-
@d << {:name => 'def', :value => 789}
|
201
180
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
]
|
207
|
-
|
208
|
-
a = @d.order(:value).first
|
209
|
-
a.values.should == ['abc', '123']
|
210
|
-
a.keys.should == [:name, :value]
|
211
|
-
a[:name].should == 'abc'
|
212
|
-
a[:value].should == '123'
|
181
|
+
specify "should store milliseconds in time fields" do
|
182
|
+
t = Time.now
|
183
|
+
@d << {:value=>1, :time=>t}
|
184
|
+
@d[:value =>'1'][:time].should == t
|
185
|
+
@d[:value=>'1'][:time].usec.should == t.usec
|
213
186
|
end
|
214
187
|
end
|
215
188
|
|
@@ -266,7 +239,7 @@ context "A PostgreSQL database" do
|
|
266
239
|
end
|
267
240
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
268
241
|
"CREATE TABLE posts (\"title\" text, \"body\" text)",
|
269
|
-
"CREATE INDEX posts_title_body_index ON posts USING gin(to_tsvector(\"title\" || \"body\"))"
|
242
|
+
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(\"title\" || \"body\"))"
|
270
243
|
]
|
271
244
|
end
|
272
245
|
|
@@ -278,7 +251,7 @@ context "A PostgreSQL database" do
|
|
278
251
|
end
|
279
252
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
280
253
|
"CREATE TABLE posts (\"title\" text, \"body\" text)",
|
281
|
-
"CREATE INDEX posts_title_body_index ON posts USING gin(to_tsvector('french', \"title\" || \"body\"))"
|
254
|
+
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', \"title\" || \"body\"))"
|
282
255
|
]
|
283
256
|
end
|
284
257
|
|
@@ -292,6 +265,50 @@ context "A PostgreSQL database" do
|
|
292
265
|
POSTGRES_DB[:posts].full_text_search(:title, 'ruby', :language => 'french').sql.should ==
|
293
266
|
"SELECT * FROM posts WHERE (to_tsvector('french', \"title\") @@ to_tsquery('french', 'ruby'))"
|
294
267
|
end
|
268
|
+
|
269
|
+
specify "should support spatial indexes" do
|
270
|
+
g = Sequel::Schema::Generator.new(POSTGRES_DB) do
|
271
|
+
geometry :geom
|
272
|
+
spatial_index [:geom]
|
273
|
+
end
|
274
|
+
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
275
|
+
"CREATE TABLE posts (\"geom\" geometry)",
|
276
|
+
"CREATE INDEX posts_geom_index ON posts USING gist (\"geom\")"
|
277
|
+
]
|
278
|
+
end
|
279
|
+
|
280
|
+
specify "should support indexes with index type" do
|
281
|
+
g = Sequel::Schema::Generator.new(POSTGRES_DB) do
|
282
|
+
varchar :title, :size => 5
|
283
|
+
index :title, :type => 'hash'
|
284
|
+
end
|
285
|
+
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
286
|
+
"CREATE TABLE posts (\"title\" varchar(5))",
|
287
|
+
"CREATE INDEX posts_title_index ON posts USING hash (\"title\")"
|
288
|
+
]
|
289
|
+
end
|
290
|
+
|
291
|
+
specify "should support unique indexes with index type" do
|
292
|
+
g = Sequel::Schema::Generator.new(POSTGRES_DB) do
|
293
|
+
varchar :title, :size => 5
|
294
|
+
index :title, :type => 'hash', :unique => true
|
295
|
+
end
|
296
|
+
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
297
|
+
"CREATE TABLE posts (\"title\" varchar(5))",
|
298
|
+
"CREATE UNIQUE INDEX posts_title_index ON posts USING hash (\"title\")"
|
299
|
+
]
|
300
|
+
end
|
301
|
+
|
302
|
+
specify "should support partial indexes" do
|
303
|
+
g = Sequel::Schema::Generator.new(POSTGRES_DB) do
|
304
|
+
varchar :title, :size => 5
|
305
|
+
index :title, :where => {:something => 5}
|
306
|
+
end
|
307
|
+
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
308
|
+
"CREATE TABLE posts (\"title\" varchar(5))",
|
309
|
+
"CREATE INDEX posts_title_index ON posts (\"title\") WHERE (\"something\" = 5)"
|
310
|
+
]
|
311
|
+
end
|
295
312
|
end
|
296
313
|
|
297
314
|
context "Postgres::Dataset#multi_insert_sql / #import" do
|