sequel_core 1.5.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +116 -0
- data/COPYING +19 -19
- data/README +83 -32
- data/Rakefile +9 -20
- data/bin/sequel +43 -112
- data/doc/cheat_sheet.rdoc +225 -0
- data/doc/dataset_filtering.rdoc +257 -0
- data/lib/sequel_core/adapters/adapter_skeleton.rb +4 -2
- data/lib/sequel_core/adapters/ado.rb +3 -1
- data/lib/sequel_core/adapters/db2.rb +4 -2
- data/lib/sequel_core/adapters/dbi.rb +127 -113
- data/lib/sequel_core/adapters/informix.rb +4 -2
- data/lib/sequel_core/adapters/jdbc.rb +5 -3
- data/lib/sequel_core/adapters/mysql.rb +112 -46
- data/lib/sequel_core/adapters/odbc.rb +5 -7
- data/lib/sequel_core/adapters/odbc_mssql.rb +12 -3
- data/lib/sequel_core/adapters/openbase.rb +3 -1
- data/lib/sequel_core/adapters/oracle.rb +11 -9
- data/lib/sequel_core/adapters/postgres.rb +261 -262
- data/lib/sequel_core/adapters/sqlite.rb +72 -22
- data/lib/sequel_core/connection_pool.rb +140 -73
- data/lib/sequel_core/core_ext.rb +201 -66
- data/lib/sequel_core/core_sql.rb +123 -153
- data/lib/sequel_core/database/schema.rb +156 -0
- data/lib/sequel_core/database.rb +321 -338
- data/lib/sequel_core/dataset/callback.rb +11 -12
- data/lib/sequel_core/dataset/convenience.rb +213 -240
- data/lib/sequel_core/dataset/pagination.rb +58 -43
- data/lib/sequel_core/dataset/parse_tree_sequelizer.rb +331 -0
- data/lib/sequel_core/dataset/query.rb +41 -0
- data/lib/sequel_core/dataset/schema.rb +15 -0
- data/lib/sequel_core/dataset/sequelizer.rb +41 -373
- data/lib/sequel_core/dataset/sql.rb +741 -632
- data/lib/sequel_core/dataset.rb +183 -168
- data/lib/sequel_core/deprecated.rb +1 -169
- data/lib/sequel_core/exceptions.rb +24 -19
- data/lib/sequel_core/migration.rb +44 -52
- data/lib/sequel_core/object_graph.rb +43 -42
- data/lib/sequel_core/pretty_table.rb +71 -76
- data/lib/sequel_core/schema/generator.rb +163 -105
- data/lib/sequel_core/schema/sql.rb +250 -93
- data/lib/sequel_core/schema.rb +2 -8
- data/lib/sequel_core/sql.rb +394 -0
- data/lib/sequel_core/worker.rb +37 -27
- data/lib/sequel_core.rb +99 -45
- data/spec/adapters/informix_spec.rb +0 -1
- data/spec/adapters/mysql_spec.rb +177 -124
- data/spec/adapters/oracle_spec.rb +0 -1
- data/spec/adapters/postgres_spec.rb +98 -58
- data/spec/adapters/sqlite_spec.rb +45 -4
- data/spec/blockless_filters_spec.rb +269 -0
- data/spec/connection_pool_spec.rb +21 -18
- data/spec/core_ext_spec.rb +169 -19
- data/spec/core_sql_spec.rb +56 -49
- data/spec/database_spec.rb +78 -17
- data/spec/dataset_spec.rb +300 -428
- data/spec/migration_spec.rb +1 -1
- data/spec/object_graph_spec.rb +5 -11
- data/spec/rcov.opts +1 -1
- data/spec/schema_generator_spec.rb +16 -4
- data/spec/schema_spec.rb +89 -10
- data/spec/sequelizer_spec.rb +56 -56
- data/spec/spec.opts +0 -5
- data/spec/spec_config.rb +7 -0
- data/spec/spec_config.rb.example +5 -5
- data/spec/spec_helper.rb +6 -0
- data/spec/worker_spec.rb +1 -1
- metadata +78 -63
data/spec/migration_spec.rb
CHANGED
data/spec/object_graph_spec.rb
CHANGED
@@ -62,21 +62,15 @@ describe Sequel::Dataset, " graphing" do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it "#graph should pass all join_conditions to join_table" do
|
65
|
-
ds = @ds1.graph(@ds2, :x
|
66
|
-
|
67
|
-
'SELECT points.id, points.x, points.y, lines.id AS lines_id, lines.x AS lines_x, lines.y AS lines_y, lines.graph_id FROM points LEFT OUTER JOIN lines ON (lines.y = points.id) AND (lines.x = points.id)'
|
68
|
-
].should(include(ds.sql))
|
65
|
+
ds = @ds1.graph(@ds2, [[:x, :id], [:y, :id]])
|
66
|
+
ds.sql.should == 'SELECT points.id, points.x, points.y, lines.id AS lines_id, lines.x AS lines_x, lines.y AS lines_y, lines.graph_id FROM points LEFT OUTER JOIN lines ON ((lines.x = points.id) AND (lines.y = points.id))'
|
69
67
|
end
|
70
68
|
|
71
69
|
it "#graph should not add columns if graph is called after set_graph_aliases" do
|
72
|
-
ds = @ds1.set_graph_aliases(:x
|
73
|
-
|
74
|
-
'SELECT lines.y, points.x FROM points'
|
75
|
-
].should(include(ds.sql))
|
70
|
+
ds = @ds1.set_graph_aliases([[:x,[:points, :x]], [:y,[:lines, :y]]])
|
71
|
+
ds.sql.should == 'SELECT points.x, lines.y FROM points'
|
76
72
|
ds = ds.graph(:lines, :x=>:id)
|
77
|
-
|
78
|
-
'SELECT lines.y, points.x FROM points LEFT OUTER JOIN lines ON (lines.x = points.id)'
|
79
|
-
].should(include(ds.sql))
|
73
|
+
ds.sql.should == 'SELECT points.x, lines.y FROM points LEFT OUTER JOIN lines ON (lines.x = points.id)'
|
80
74
|
end
|
81
75
|
|
82
76
|
it "#graph should allow graphing of multiple datasets" do
|
data/spec/rcov.opts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
2
|
|
3
3
|
describe Sequel::Schema::Generator do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@generator = Sequel::Schema::Generator.new(SchemaDummyDatabase.new) do
|
6
6
|
string :title
|
7
7
|
column :body, :text
|
@@ -11,6 +11,7 @@ describe Sequel::Schema::Generator do
|
|
11
11
|
constraint(:xxx) {:yyy == :zzz}
|
12
12
|
index :title
|
13
13
|
index [:title, :body]
|
14
|
+
foreign_key :node_id, :nodes
|
14
15
|
end
|
15
16
|
@columns, @indexes = @generator.create_info
|
16
17
|
end
|
@@ -22,7 +23,7 @@ describe Sequel::Schema::Generator do
|
|
22
23
|
end
|
23
24
|
|
24
25
|
it "counts primary key, column and constraint definitions as columns" do
|
25
|
-
@columns.size.should ==
|
26
|
+
@columns.size.should == 7
|
26
27
|
end
|
27
28
|
|
28
29
|
it "places primary key first" do
|
@@ -45,6 +46,13 @@ describe Sequel::Schema::Generator do
|
|
45
46
|
it "creates foreign key column" do
|
46
47
|
@columns[3][:name].should == :parent_id
|
47
48
|
@columns[3][:type].should == :integer
|
49
|
+
@columns[6][:name].should == :node_id
|
50
|
+
@columns[6][:type].should == :integer
|
51
|
+
end
|
52
|
+
|
53
|
+
it "uses table for foreign key columns, if specified" do
|
54
|
+
@columns[6][:table].should == :nodes
|
55
|
+
@columns[3][:table].should == nil
|
48
56
|
end
|
49
57
|
|
50
58
|
it "finds columns" do
|
@@ -72,7 +80,7 @@ describe Sequel::Schema::Generator do
|
|
72
80
|
end
|
73
81
|
|
74
82
|
describe Sequel::Schema::AlterTableGenerator do
|
75
|
-
before
|
83
|
+
before do
|
76
84
|
@generator = Sequel::Schema::AlterTableGenerator.new(SchemaDummyDatabase.new) do
|
77
85
|
add_column :aaa, :text
|
78
86
|
drop_column :bbb
|
@@ -87,6 +95,8 @@ describe Sequel::Schema::AlterTableGenerator do
|
|
87
95
|
add_index :blah, :where => {:something => true}
|
88
96
|
add_constraint :con1, ':fred > 100'
|
89
97
|
drop_constraint :con2
|
98
|
+
add_primary_key :id
|
99
|
+
add_foreign_key :node_id, :nodes
|
90
100
|
end
|
91
101
|
end
|
92
102
|
|
@@ -104,7 +114,9 @@ describe Sequel::Schema::AlterTableGenerator do
|
|
104
114
|
{:op => :add_index, :columns => [:blah], :type => :hash},
|
105
115
|
{:op => :add_index, :columns => [:blah], :where => {:something => true}},
|
106
116
|
{:op => :add_constraint, :type => :check, :name => :con1, :check => [':fred > 100']},
|
107
|
-
{:op => :drop_constraint, :name => :con2}
|
117
|
+
{:op => :drop_constraint, :name => :con2},
|
118
|
+
{:op => :add_column, :name => :id, :type => :integer, :primary_key=>true, :auto_increment=>true},
|
119
|
+
{:op => :add_column, :name => :node_id, :type => :integer, :table=>:nodes}
|
108
120
|
]
|
109
121
|
end
|
110
122
|
end
|
data/spec/schema_spec.rb
CHANGED
@@ -110,12 +110,26 @@ context "DB#create_table" do
|
|
110
110
|
@db.sqls.should == ["CREATE TABLE cats (name varchar(102))"]
|
111
111
|
end
|
112
112
|
|
113
|
-
specify "should accept foreign keys" do
|
113
|
+
specify "should accept foreign keys without options" do
|
114
|
+
@db.create_table(:cats) do
|
115
|
+
foreign_key :project_id
|
116
|
+
end
|
117
|
+
@db.sqls.should == ["CREATE TABLE cats (project_id integer)"]
|
118
|
+
end
|
119
|
+
|
120
|
+
specify "should accept foreign keys with options" do
|
114
121
|
@db.create_table(:cats) do
|
115
122
|
foreign_key :project_id, :table => :projects
|
116
123
|
end
|
117
124
|
@db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects)"]
|
118
125
|
end
|
126
|
+
|
127
|
+
specify "should accept foreign keys with separate table argument" do
|
128
|
+
@db.create_table(:cats) do
|
129
|
+
foreign_key :project_id, :projects, :default=>3
|
130
|
+
end
|
131
|
+
@db.sqls.should == ["CREATE TABLE cats (project_id integer DEFAULT 3 REFERENCES projects)"]
|
132
|
+
end
|
119
133
|
|
120
134
|
specify "should accept foreign keys with arbitrary keys" do
|
121
135
|
@db.create_table(:cats) do
|
@@ -264,14 +278,15 @@ context "DB#create_table" do
|
|
264
278
|
@db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_name_index ON cats (id, name)"]
|
265
279
|
end
|
266
280
|
|
267
|
-
|
281
|
+
pt_specify "should accept unnamed constraint definitions with blocks" do
|
268
282
|
@db.create_table(:cats) do
|
269
283
|
integer :score
|
270
284
|
check {:x > 0 && :y < 1}
|
271
285
|
end
|
272
|
-
@db.sqls.should == ["CREATE TABLE cats (score integer, CHECK ((
|
273
|
-
|
286
|
+
@db.sqls.should == ["CREATE TABLE cats (score integer, CHECK ((x > 0) AND (y < 1)))"]
|
287
|
+
end
|
274
288
|
|
289
|
+
specify "should accept unnamed constraint definitions" do
|
275
290
|
@db.create_table(:cats) do
|
276
291
|
check 'price < ?', 100
|
277
292
|
end
|
@@ -284,12 +299,13 @@ context "DB#create_table" do
|
|
284
299
|
constraint :valid_score, 'score <= 100'
|
285
300
|
end
|
286
301
|
@db.sqls.should == ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100))"]
|
287
|
-
|
302
|
+
end
|
288
303
|
|
304
|
+
pt_specify "should accept named constraint definitions with block" do
|
289
305
|
@db.create_table(:cats) do
|
290
306
|
constraint(:blah_blah) {:x > 0 && :y < 1}
|
291
307
|
end
|
292
|
-
@db.sqls.should == ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK ((
|
308
|
+
@db.sqls.should == ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1)))"]
|
293
309
|
end
|
294
310
|
end
|
295
311
|
|
@@ -320,24 +336,87 @@ context "DB#alter_table" do
|
|
320
336
|
@db = SchemaDummyDatabase.new
|
321
337
|
end
|
322
338
|
|
323
|
-
specify "should
|
339
|
+
specify "should support add_column" do
|
340
|
+
@db.alter_table(:cats) do
|
341
|
+
add_column :score, :integer
|
342
|
+
end
|
343
|
+
@db.sqls.should == ["ALTER TABLE cats ADD COLUMN score integer"]
|
344
|
+
end
|
345
|
+
|
346
|
+
specify "should support add_constraint" do
|
324
347
|
@db.alter_table(:cats) do
|
325
348
|
add_constraint :valid_score, 'score <= 100'
|
326
349
|
end
|
327
350
|
@db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT valid_score CHECK (score <= 100)"]
|
328
|
-
|
351
|
+
end
|
329
352
|
|
353
|
+
pt_specify "should support add_constraint with block" do
|
330
354
|
@db.alter_table(:cats) do
|
331
355
|
add_constraint(:blah_blah) {:x > 0 && :y < 1}
|
332
356
|
end
|
333
|
-
@db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT blah_blah CHECK ((
|
357
|
+
@db.sqls.should == ["ALTER TABLE cats ADD CONSTRAINT blah_blah CHECK ((x > 0) AND (y < 1))"]
|
334
358
|
end
|
335
359
|
|
336
|
-
specify "should
|
360
|
+
specify "should support add_foreign_key" do
|
361
|
+
@db.alter_table(:cats) do
|
362
|
+
add_foreign_key :node_id, :nodes
|
363
|
+
end
|
364
|
+
@db.sqls.should == ["ALTER TABLE cats ADD COLUMN node_id integer REFERENCES nodes"]
|
365
|
+
end
|
366
|
+
|
367
|
+
specify "should support add_index" do
|
368
|
+
@db.alter_table(:cats) do
|
369
|
+
add_index :name
|
370
|
+
end
|
371
|
+
@db.sqls.should == ["CREATE INDEX cats_name_index ON cats (name)"]
|
372
|
+
end
|
373
|
+
|
374
|
+
specify "should support add_primary_key" do
|
375
|
+
@db.alter_table(:cats) do
|
376
|
+
add_primary_key :id
|
377
|
+
end
|
378
|
+
@db.sqls.should == ["ALTER TABLE cats ADD COLUMN id integer PRIMARY KEY AUTOINCREMENT"]
|
379
|
+
end
|
380
|
+
|
381
|
+
specify "should support drop_column" do
|
382
|
+
@db.alter_table(:cats) do
|
383
|
+
drop_column :score
|
384
|
+
end
|
385
|
+
@db.sqls.should == ["ALTER TABLE cats DROP COLUMN score"]
|
386
|
+
end
|
387
|
+
|
388
|
+
specify "should support drop_constraint" do
|
337
389
|
@db.alter_table(:cats) do
|
338
390
|
drop_constraint :valid_score
|
339
391
|
end
|
340
392
|
@db.sqls.should == ["ALTER TABLE cats DROP CONSTRAINT valid_score"]
|
341
393
|
end
|
342
394
|
|
395
|
+
specify "should support drop_index" do
|
396
|
+
@db.alter_table(:cats) do
|
397
|
+
drop_index :name
|
398
|
+
end
|
399
|
+
@db.sqls.should == ["DROP INDEX cats_name_index"]
|
400
|
+
end
|
401
|
+
|
402
|
+
specify "should support rename_column" do
|
403
|
+
@db.alter_table(:cats) do
|
404
|
+
rename_column :name, :old_name
|
405
|
+
end
|
406
|
+
@db.sqls.should == ["ALTER TABLE cats RENAME COLUMN name TO old_name"]
|
407
|
+
end
|
408
|
+
|
409
|
+
specify "should support set_column_default" do
|
410
|
+
@db.alter_table(:cats) do
|
411
|
+
set_column_default :score, 3
|
412
|
+
end
|
413
|
+
@db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score SET DEFAULT 3"]
|
414
|
+
end
|
415
|
+
|
416
|
+
specify "should support set_column_type" do
|
417
|
+
@db.alter_table(:cats) do
|
418
|
+
set_column_type :score, :real
|
419
|
+
end
|
420
|
+
@db.sqls.should == ["ALTER TABLE cats ALTER COLUMN score TYPE real"]
|
421
|
+
end
|
343
422
|
end
|
data/spec/sequelizer_spec.rb
CHANGED
@@ -53,7 +53,7 @@ context "Sequelizer without Ruby2Ruby" do
|
|
53
53
|
$VERBOSE = old_verbose
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
pt_specify "should raise error only when using external expressions" do
|
57
57
|
proc {proc {:x > 1}.to_sql(@ds)}.should_not raise_error(Sequel::Error)
|
58
58
|
proc {proc {1 + 1}.to_sql(@ds)}.should raise_error(Sequel::Error)
|
59
59
|
end
|
@@ -84,7 +84,7 @@ context "Proc#to_sql" do
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
|
87
|
+
pt_specify "should support <sym> <op> <lit>" do
|
88
88
|
proc {:x > 100}.sql.should == '(x > 100)'
|
89
89
|
proc {:x < 100}.sql.should == '(x < 100)'
|
90
90
|
proc {:x >= 100}.sql.should == '(x >= 100)'
|
@@ -92,27 +92,27 @@ context "Proc#to_sql" do
|
|
92
92
|
proc {:x == 100}.sql.should == '(x = 100)'
|
93
93
|
end
|
94
94
|
|
95
|
-
|
95
|
+
pt_specify "should support number literals" do
|
96
96
|
proc {:x > 123.45}.sql.should == '(x > 123.45)'
|
97
97
|
proc {:x > -30_000}.sql.should == '(x > -30000)'
|
98
98
|
end
|
99
99
|
|
100
|
-
|
100
|
+
pt_specify "should support string literals" do
|
101
101
|
proc {:x == 'abc'}.sql.should == "(x = 'abc')"
|
102
102
|
proc {:y == "ab'cd"}.sql.should == "(y = 'ab''cd')"
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
pt_specify "should support boolean literals" do
|
106
106
|
proc {:x == false}.sql.should == "(x = 'f')"
|
107
107
|
proc {:x == true}.sql.should == "(x = 't')"
|
108
108
|
end
|
109
109
|
|
110
|
-
|
110
|
+
pt_specify "should support nil literal and nil?" do
|
111
111
|
proc {:x == nil}.sql.should == "(x IS NULL)"
|
112
112
|
proc {:x.nil?}.sql.should == "(x IS NULL)"
|
113
113
|
end
|
114
114
|
|
115
|
-
|
115
|
+
pt_specify "should support local vars or method references" do
|
116
116
|
proc {proc {:x == a}.sql}.should raise_error(NameError)
|
117
117
|
b = 123
|
118
118
|
proc {:x == b}.sql.should == "(x = 123)"
|
@@ -127,13 +127,13 @@ context "Proc#to_sql" do
|
|
127
127
|
proc {:x == y2}.sql.should == "(x = 111)"
|
128
128
|
end
|
129
129
|
|
130
|
-
|
130
|
+
pt_specify "sould support subscript access on symbols" do
|
131
131
|
proc {:x|1 > 0}.sql.should == "(x[1] > 0)"
|
132
132
|
proc {:x|2|3 > 0}.sql.should == "(x[2, 3] > 0)"
|
133
133
|
proc {:x|[4, 5] > 0}.sql.should == "(x[4, 5] > 0)"
|
134
134
|
end
|
135
135
|
|
136
|
-
|
136
|
+
pt_specify "should support constants" do
|
137
137
|
ZZZ = 444
|
138
138
|
proc {:x == ZZZ}.sql.should == "(x = 444)"
|
139
139
|
|
@@ -142,33 +142,33 @@ context "Proc#to_sql" do
|
|
142
142
|
proc {:x == CCCD::DDD}.sql.should == "(x = 'hi')"
|
143
143
|
end
|
144
144
|
|
145
|
-
|
145
|
+
pt_specify "should support instance attributes" do
|
146
146
|
@abc = 123
|
147
147
|
proc {:x == @abc}.sql.should == "(x = 123)"
|
148
148
|
end
|
149
149
|
|
150
|
-
|
150
|
+
pt_specify "should support class attributes" do
|
151
151
|
@@abc = 321
|
152
152
|
proc {:x == @@abc}.sql.should == "(x = 321)"
|
153
153
|
end
|
154
154
|
|
155
|
-
|
155
|
+
pt_specify "should support like? pattern" do
|
156
156
|
proc {:x.like? '%abc'}.sql.should == "(x LIKE '%abc')"
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
pt_specify "should support like? pattern with multiple choices" do
|
160
160
|
proc {:x.like? ['%abc', '%def', '%ghi']}.sql.should == \
|
161
161
|
"((x LIKE '%abc') OR (x LIKE '%def') OR (x LIKE '%ghi'))"
|
162
162
|
end
|
163
163
|
|
164
|
-
|
164
|
+
pt_specify "should support =~ operator" do
|
165
165
|
# stock SQL version does not know about regexps
|
166
166
|
proc {:x =~ '123'}.sql.should == "(x LIKE '123')"
|
167
167
|
|
168
168
|
proc {:x =~ /^123/}.sql.should == "(x ~ '^123')"
|
169
169
|
end
|
170
170
|
|
171
|
-
|
171
|
+
pt_specify "should support =~ operator with multiple choices" do
|
172
172
|
# stock SQL version does not know about regexps
|
173
173
|
proc {:x =~ ['123', '456', '789']}.sql.should == "((x LIKE '123') OR (x LIKE '456') OR (x LIKE '789'))"
|
174
174
|
|
@@ -177,101 +177,101 @@ context "Proc#to_sql" do
|
|
177
177
|
proc {:x =~ [/^123/, '456%', /^789/]}.sql.should == "((x ~ '^123') OR (x LIKE '456%') OR (x ~ '^789'))"
|
178
178
|
end
|
179
179
|
|
180
|
-
|
180
|
+
pt_specify "should raise on =~ operator for unsupported types" do
|
181
181
|
proc {proc {:x =~ 123}.sql}.should raise_error(Sequel::Error)
|
182
182
|
end
|
183
183
|
|
184
|
-
|
184
|
+
pt_specify "should support != operator" do
|
185
185
|
proc {:x != 100}.sql.should == "(NOT (x = 100))"
|
186
186
|
end
|
187
187
|
|
188
|
-
|
188
|
+
pt_specify "should support != operator with multiple choices" do
|
189
189
|
proc {:x != [100, 200, 300]}.sql.should == "(NOT (x IN (100, 200, 300)))"
|
190
190
|
end
|
191
191
|
|
192
|
-
|
192
|
+
pt_specify "should support !~ operator" do
|
193
193
|
proc {:x !~ '123'}.sql.should == "(NOT (x LIKE '123'))"
|
194
194
|
end
|
195
195
|
|
196
|
-
|
196
|
+
pt_specify "should support !~ operator with multiple choices" do
|
197
197
|
proc {:x !~ ['123', '456']}.sql.should == "(NOT ((x LIKE '123') OR (x LIKE '456')))"
|
198
198
|
end
|
199
199
|
|
200
|
-
|
200
|
+
pt_specify "should support ! operator" do
|
201
201
|
proc {!:x}.sql.should == "(x = 'f')"
|
202
202
|
proc {!(:x > 100)}.sql.should == "(NOT (x > 100))"
|
203
203
|
end
|
204
204
|
|
205
|
-
|
205
|
+
pt_specify "should support && operator" do
|
206
206
|
proc {1 && 2}.sql.should == "(1 AND 2)"
|
207
207
|
proc {:x > 100 && :y < 100}.sql.should == "((x > 100) AND (y < 100))"
|
208
208
|
proc {:x && :y && :z}.sql.should == "(x AND (y AND z))"
|
209
209
|
end
|
210
210
|
|
211
|
-
|
211
|
+
pt_specify "should support << operator for assignment" do
|
212
212
|
proc {:x << 1}.sql.should == "x = 1"
|
213
213
|
end
|
214
214
|
|
215
|
-
|
215
|
+
pt_specify "should concatenate separate statements using AND" do
|
216
216
|
proc {:x == 20; :y == 30}.sql.should == "((x = 20) AND (y = 30))"
|
217
217
|
proc {:x != 1; :y != 2; :z != 3}.sql.should == \
|
218
218
|
"((NOT (x = 1)) AND (NOT (y = 2)) AND (NOT (z = 3)))"
|
219
219
|
end
|
220
220
|
|
221
|
-
|
221
|
+
pt_specify "should concatenate separate statements using custom join argument" do
|
222
222
|
proc {:x << 20; :y << 30}.sql_comma_separated.should == "x = 20, y = 30"
|
223
223
|
z = 333
|
224
224
|
proc {:x << :x + 1; :y << z}.sql_comma_separated.should == "x = (x + 1), y = 333"
|
225
225
|
end
|
226
226
|
|
227
|
-
|
227
|
+
pt_specify "should support || operator" do
|
228
228
|
proc {1 || 2}.sql.should == "(1 OR 2)"
|
229
229
|
proc {:x > 100 || :y < 100}.sql.should == "((x > 100) OR (y < 100))"
|
230
230
|
proc {:x || :y || :z}.sql.should == "(x OR (y OR z))"
|
231
231
|
end
|
232
232
|
|
233
|
-
|
233
|
+
pt_specify "should support operator combinations" do
|
234
234
|
proc {(:x > 1 || :y > 2) && (:z > 3)}.sql.should == "(((x > 1) OR (y > 2)) AND (z > 3))"
|
235
235
|
proc {(1 && 2) || (3 || 4)}.sql.should == "((1 AND 2) OR (3 OR 4))"
|
236
236
|
proc {(:x != 2) || (:y == 3) || !(:z == 4)}.sql.should == \
|
237
237
|
"((NOT (x = 2)) OR ((y = 3) OR (NOT (z = 4))))"
|
238
238
|
end
|
239
239
|
|
240
|
-
|
240
|
+
pt_specify "should support late bound column references" do
|
241
241
|
def abc; :tttt; end
|
242
242
|
proc {abc > 2}.sql.should == "(tttt > 2)"
|
243
243
|
end
|
244
244
|
|
245
|
-
|
245
|
+
pt_specify "should support qualified column references" do
|
246
246
|
proc {:x__y > 3}.sql.should == "(x.y > 3)"
|
247
247
|
end
|
248
248
|
|
249
|
-
|
249
|
+
pt_specify "should support functions on columns" do
|
250
250
|
proc {:max[:x] > 100}.sql.should == "(max(x) > 100)"
|
251
251
|
proc {:count[:x] > 100}.sql.should == "(count(x) > 100)"
|
252
252
|
end
|
253
253
|
|
254
|
-
|
254
|
+
pt_specify "should support SQL functions" do
|
255
255
|
proc {:MAX[:x] > 100}.sql.should == "(MAX(x) > 100)"
|
256
256
|
|
257
257
|
proc {:MAX[:x__y] > 100}.sql.should == "(MAX(x.y) > 100)"
|
258
258
|
end
|
259
259
|
|
260
|
-
|
260
|
+
pt_specify "should support SQL functions with multiple arguments" do
|
261
261
|
proc {:sum[1, 2, 3] > 100}.sql.should == "(sum(1, 2, 3) > 100)"
|
262
262
|
|
263
263
|
proc {:x[1, DB[:y].select(:z), "a'b"] > 100}.sql.should == \
|
264
264
|
"(x(1, (SELECT z FROM y), 'a''b') > 100)"
|
265
265
|
end
|
266
266
|
|
267
|
-
|
267
|
+
pt_specify "should support SQL functions without arguments" do
|
268
268
|
proc {:abc[] > 100}.sql.should == "(abc() > 100)"
|
269
269
|
|
270
270
|
proc {:now[] - :last_stamp > 100}.sql.should == \
|
271
271
|
"((now() - last_stamp) > 100)"
|
272
272
|
end
|
273
273
|
|
274
|
-
|
274
|
+
pt_specify "should do stuff like..." do
|
275
275
|
proc {:price < 100 || :category != 'ruby'}.sql.should == \
|
276
276
|
"((price < 100) OR (NOT (category = 'ruby')))"
|
277
277
|
t = Time.now
|
@@ -281,13 +281,13 @@ context "Proc#to_sql" do
|
|
281
281
|
proc {1 < :x}.sql.should == "(1 < x)"
|
282
282
|
end
|
283
283
|
|
284
|
-
|
284
|
+
pt_specify "should complain if someone is crazy" do
|
285
285
|
proc {proc {def x; 1; end}.sql}.should raise_error(Sequel::Error::InvalidExpression)
|
286
286
|
a = 1
|
287
287
|
proc {proc {a = 1}.sql}.should raise_error(Sequel::Error::InvalidExpression)
|
288
288
|
end
|
289
289
|
|
290
|
-
|
290
|
+
pt_specify "should support comparison to Range objects" do
|
291
291
|
proc {:x == (1..10)}.sql.should == \
|
292
292
|
"(x >= 1 AND x <= 10)"
|
293
293
|
|
@@ -308,7 +308,7 @@ context "Proc#to_sql" do
|
|
308
308
|
"(stamp >= #{DS.literal(t1)} AND stamp <= #{DS.literal(t2)})"
|
309
309
|
end
|
310
310
|
|
311
|
-
|
311
|
+
pt_specify "should support comparison to sub-queries" do
|
312
312
|
@ds2 = DB[:test].select(:node_id)
|
313
313
|
|
314
314
|
proc {:id == @ds2}.sql.should == \
|
@@ -324,17 +324,17 @@ context "Proc#to_sql" do
|
|
324
324
|
"(price >= (SELECT price FROM items))"
|
325
325
|
end
|
326
326
|
|
327
|
-
|
327
|
+
pt_specify "should support comparison to arrays" do
|
328
328
|
proc {:id == [1, 3, 7, 15]}.sql.should == \
|
329
329
|
"(id IN (1, 3, 7, 15))"
|
330
330
|
end
|
331
331
|
|
332
|
-
|
332
|
+
pt_specify "should not literalize String#expr and String#lit" do
|
333
333
|
proc {'x'.lit == 1}.sql.should == "(x = 1)"
|
334
334
|
proc {'x.y'.expr == 1}.sql.should == "(x.y = 1)"
|
335
335
|
end
|
336
336
|
|
337
|
-
|
337
|
+
pt_specify "should support in/in? operator" do
|
338
338
|
proc {:x.in [3, 4, 5]}.sql.should == "(x IN (3, 4, 5))"
|
339
339
|
proc {:x.in?(3, 4, 5)}.sql.should == "(x IN (3, 4, 5))"
|
340
340
|
|
@@ -345,7 +345,7 @@ context "Proc#to_sql" do
|
|
345
345
|
proc {:x.in @ds2}.sql.should == "(x IN (SELECT node_id FROM test))"
|
346
346
|
end
|
347
347
|
|
348
|
-
|
348
|
+
pt_specify "should support nested procs" do
|
349
349
|
proc {:x > 10 || proc{:y > 20}}.sql.should == \
|
350
350
|
"((x > 10) OR (y > 20))"
|
351
351
|
|
@@ -357,7 +357,7 @@ context "Proc#to_sql" do
|
|
357
357
|
"((x > 10) OR (y > 20))"
|
358
358
|
end
|
359
359
|
|
360
|
-
|
360
|
+
pt_specify "should support unfolding of calls to #each" do
|
361
361
|
# from http://groups.google.com/group/sequel-talk/browse_thread/thread/54a660568515fbb7
|
362
362
|
periods = [:day, :week, :month, :year, :alltime]
|
363
363
|
idx = 1
|
@@ -371,7 +371,7 @@ context "Proc#to_sql" do
|
|
371
371
|
"day[1] = (day[1] + 2), week[1] = (week[1] + 2), month[1] = (month[1] + 2), year[1] = (year[1] + 2), alltime[1] = (alltime[1] + 2)"
|
372
372
|
end
|
373
373
|
|
374
|
-
|
374
|
+
pt_specify "should support unfolding of calls to Hash#each" do
|
375
375
|
periods = {:month => 3}
|
376
376
|
idx = 1
|
377
377
|
pr = proc do
|
@@ -382,14 +382,14 @@ context "Proc#to_sql" do
|
|
382
382
|
pr.sql_comma_separated.should == "month = (month + 3)"
|
383
383
|
end
|
384
384
|
|
385
|
-
|
385
|
+
pt_specify "should support local arguments" do
|
386
386
|
def t(x)
|
387
387
|
proc {x > 10}.sql
|
388
388
|
end
|
389
389
|
t(:y).should == "(y > 10)"
|
390
390
|
end
|
391
391
|
|
392
|
-
|
392
|
+
pt_specify "should support binary operators on local context" do
|
393
393
|
XXX = 1
|
394
394
|
YYY = 2
|
395
395
|
proc {XXX || YYY}.sql.should == "(1 OR 2)"
|
@@ -399,7 +399,7 @@ context "Proc#to_sql" do
|
|
399
399
|
proc {xxx && yyy}.sql.should == "(1 AND 2)"
|
400
400
|
end
|
401
401
|
|
402
|
-
|
402
|
+
pt_specify "should support arithmetics" do
|
403
403
|
zzz = 300
|
404
404
|
proc {(:x + 100) > zzz}.sql.should == "((x + 100) > 300)"
|
405
405
|
|
@@ -408,22 +408,22 @@ context "Proc#to_sql" do
|
|
408
408
|
proc {:units * :price}.sql.should == "(units * price)"
|
409
409
|
end
|
410
410
|
|
411
|
-
|
411
|
+
pt_specify "should support | operator" do
|
412
412
|
proc {(:x | 1) > 0}.sql.should == "(x[1] > 0)"
|
413
413
|
proc {10 | 1}.sql.should == 11
|
414
414
|
end
|
415
415
|
|
416
|
-
|
416
|
+
pt_specify "should support globals" do
|
417
417
|
$aaaa_zzzz = 400
|
418
418
|
proc {:x > $aaaa_zzzz}.sql.should == "(x > 400)"
|
419
419
|
end
|
420
420
|
|
421
|
-
|
421
|
+
pt_specify "should support Regexp macros" do
|
422
422
|
"abc" =~ /(ab)/
|
423
423
|
proc {:x == $1}.sql.should == "(x = 'ab')"
|
424
424
|
end
|
425
425
|
|
426
|
-
|
426
|
+
pt_specify "should evaluate expression not referring to symbols or literal strings." do
|
427
427
|
proc {:x > 2 * 3}.sql.should == "(x > 6)"
|
428
428
|
y = 3
|
429
429
|
proc {:x > y * 4}.sql.should == "(x > 12)"
|
@@ -435,14 +435,14 @@ context "Proc#to_sql" do
|
|
435
435
|
proc {:y == (1 > 2)}.sql.should == "(y = 'f')"
|
436
436
|
end
|
437
437
|
|
438
|
-
|
438
|
+
pt_specify "should support ternary operator" do
|
439
439
|
y = true
|
440
440
|
proc {:x > (y ? 1 : 2)}.sql.should == "(x > 1)"
|
441
441
|
|
442
442
|
proc {((1 > 2) ? :x : :y) > 3}.sql.should == "(y > 3)"
|
443
443
|
end
|
444
444
|
|
445
|
-
|
445
|
+
pt_specify "should support strings with embedded Ruby code in them and literalize them" do
|
446
446
|
proc {:n == "#{1+2}"}.sql.should == "(n = '3')"
|
447
447
|
|
448
448
|
y = "12'34"
|
@@ -450,14 +450,14 @@ context "Proc#to_sql" do
|
|
450
450
|
proc {:x > "#{y}"}.sql.should == "(x > '12''34')"
|
451
451
|
end
|
452
452
|
|
453
|
-
|
453
|
+
pt_specify "should support format strings and literalize the result" do
|
454
454
|
prod = 1
|
455
455
|
proc {:x == "abc%d" % prod}.sql.should == "(x = 'abc1')"
|
456
456
|
|
457
457
|
proc {:x == ("%d" % prod).lit}.sql.should == "(x = 1)"
|
458
458
|
end
|
459
459
|
|
460
|
-
|
460
|
+
pt_specify "should support conditional filters" do
|
461
461
|
@criteria = nil
|
462
462
|
proc {if @criteria; :x.like @criteria; end}.sql.should == nil
|
463
463
|
|
@@ -468,7 +468,7 @@ context "Proc#to_sql" do
|
|
468
468
|
proc {if @criteria; :x.like @criteria; else; :x.like 'ddd'; end}.sql.should == "(x LIKE 'ddd')"
|
469
469
|
end
|
470
470
|
|
471
|
-
|
471
|
+
pt_specify "should support more complex conditional filters" do
|
472
472
|
x, y = true, false
|
473
473
|
proc {
|
474
474
|
if x || y
|
@@ -502,7 +502,7 @@ context "Proc#to_sql" do
|
|
502
502
|
end
|
503
503
|
|
504
504
|
context "Proc#to_sql stock" do
|
505
|
-
|
505
|
+
pt_specify "should not support regexps" do
|
506
506
|
db = Sequel::Database.new
|
507
507
|
ds = db[:items]
|
508
508
|
|