Rubernate 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rubernate/queries.rb +21 -13
- data/tests/all_tests.rb +10 -2
- data/tests/rubernate/fixtures.rb +14 -3
- data/tests/rubernate/impl/queries_mysql_test.rb +15 -0
- data/tests/rubernate/impl/queries_oracle_test.rb +16 -0
- data/tests/rubernate/impl/queries_stub.rb +72 -0
- data/tests/rubernate/queries_test.rb +174 -161
- metadata +5 -2
data/lib/rubernate/queries.rb
CHANGED
@@ -249,7 +249,8 @@ module Queries
|
|
249
249
|
|
250
250
|
# Init Param accepts table and name of param
|
251
251
|
def initialize factory, r_object, name
|
252
|
-
@factory, @r_object, @name
|
252
|
+
@factory, @r_object, @name = factory, r_object, name
|
253
|
+
@marker, @r_params = [], [self]
|
253
254
|
end
|
254
255
|
|
255
256
|
# Returns full param table name with object tables prefix
|
@@ -368,8 +369,8 @@ module Queries
|
|
368
369
|
|
369
370
|
# Returns markers used in query in valid order.
|
370
371
|
def markers
|
371
|
-
to_sql
|
372
|
-
@markers
|
372
|
+
to_sql
|
373
|
+
@markers
|
373
374
|
end
|
374
375
|
|
375
376
|
# Arranges map: values {marker=>value} to ordered array of values
|
@@ -384,12 +385,11 @@ module Queries
|
|
384
385
|
if @query.is_a? String
|
385
386
|
@sql, @markers = @factory.cache[@query]
|
386
387
|
unless @sql
|
387
|
-
@sql = eval_query
|
388
|
-
@markers = @exprs.inject([]){|result, expr| result.concat expr.markers}
|
388
|
+
@sql, @markers = eval_query
|
389
389
|
@factory.cache[@query] = [@sql, @markers]
|
390
390
|
end
|
391
391
|
else
|
392
|
-
@sql = eval_query
|
392
|
+
@sql, @markers = eval_query
|
393
393
|
end
|
394
394
|
@sql
|
395
395
|
end
|
@@ -402,7 +402,7 @@ module Queries
|
|
402
402
|
Log.debug "Translate: <<#{query}>> to sql: <<#{sql}>>"
|
403
403
|
end
|
404
404
|
|
405
|
-
# Evaluates query withing the object context.
|
405
|
+
# Evaluates query withing the object context. Returns sql, and array of markers: [sql, [m1,m2,..]]
|
406
406
|
def eval_query
|
407
407
|
if @query.is_a? Proc
|
408
408
|
instance_eval(&@query)
|
@@ -413,7 +413,7 @@ module Queries
|
|
413
413
|
sql+= "\n\twhere #{where_sql}"
|
414
414
|
sql+= "\n\torder by #{order_by_sql}" unless @order.empty?
|
415
415
|
log_debug_query sql
|
416
|
-
sql
|
416
|
+
[sql, @exprs.inject([]){|result, expr| result.concat expr.markers}]
|
417
417
|
end
|
418
418
|
|
419
419
|
# Generates where clause for each expression joined by and clause
|
@@ -429,11 +429,19 @@ module Queries
|
|
429
429
|
|
430
430
|
# Generates left outer join for each r_params used in query
|
431
431
|
def tables_sql
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
432
|
+
r_joins = {}
|
433
|
+
r_objects.each{|r_o| r_joins[r_o.to_sql] ||= []} # Collect all r_objects used in query
|
434
|
+
r_params.each{|r_p| r_joins[r_p.r_object.to_sql] << r_p.to_sql} #Join all r_params to r_objects
|
435
|
+
|
436
|
+
result = nil
|
437
|
+
for obj, params in r_joins
|
438
|
+
result = result ? result << ",\n\t\t" : ''
|
439
|
+
result << 'r_objects ' + obj
|
440
|
+
for param in params
|
441
|
+
result << " left outer join r_params #{param} on (#{obj}.object_pk = #{param}.object_pk)"
|
442
|
+
end
|
443
|
+
end
|
444
|
+
result
|
437
445
|
end
|
438
446
|
|
439
447
|
# Retruns r_params used in query. List of RParam.
|
data/tests/all_tests.rb
CHANGED
@@ -8,5 +8,13 @@ require 'rubernate/utils_test'
|
|
8
8
|
require 'rubernate/queries_test'
|
9
9
|
require 'rubernate/impl/memory_test'
|
10
10
|
require 'rubernate/callbacks_test'
|
11
|
-
|
12
|
-
|
11
|
+
|
12
|
+
if $run_oracle_tests
|
13
|
+
require 'rubernate/impl/queries_oracle_test'
|
14
|
+
require 'rubernate/impl/dbi_oracle_test'
|
15
|
+
end
|
16
|
+
|
17
|
+
if $run_mysql_tests
|
18
|
+
require 'rubernate/impl/queries_mysql_test'
|
19
|
+
require 'rubernate/impl/dbi_mysql_test'
|
20
|
+
end
|
data/tests/rubernate/fixtures.rb
CHANGED
@@ -8,16 +8,24 @@ require 'test/unit'
|
|
8
8
|
|
9
9
|
module FixtureClasses
|
10
10
|
class C0; attr :p0, false end
|
11
|
-
class C1
|
11
|
+
class C1
|
12
|
+
persistent :p1
|
13
|
+
def to_s
|
14
|
+
"#{self.class}:#{primary_key}"
|
15
|
+
end
|
16
|
+
end
|
12
17
|
class C2 < C1; persistent :p2; end
|
13
|
-
class C3 < C0
|
18
|
+
class C3 < C0
|
14
19
|
persistent :p0
|
15
20
|
def on_load
|
16
21
|
Thread.current[:on_load] = self
|
17
22
|
end
|
18
23
|
def on_save
|
19
24
|
Thread.current[:on_save] = self
|
20
|
-
end
|
25
|
+
end
|
26
|
+
def to_s
|
27
|
+
"#{self.class}:#{primary_key}"
|
28
|
+
end
|
21
29
|
end
|
22
30
|
class C4 < C2
|
23
31
|
def initialize pk = nil
|
@@ -26,5 +34,8 @@ module FixtureClasses
|
|
26
34
|
end
|
27
35
|
class Full
|
28
36
|
persistent :p_nil, :p_int, :p_float, :p_str, :p_date, :p_time, :p_array, :p_hash
|
37
|
+
def to_s
|
38
|
+
"#{self.class}:#{primary_key}"
|
39
|
+
end
|
29
40
|
end
|
30
41
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../..', __FILE__)) unless
|
2
|
+
$:.include?(File.expand_path('../../..', __FILE__))
|
3
|
+
|
4
|
+
require 'rubernate/fixtures'
|
5
|
+
require 'rubernate/impl/queries_stub'
|
6
|
+
|
7
|
+
module Rubernate
|
8
|
+
class MysqlQueriesTest < Test::Unit::TestCase
|
9
|
+
include GenericQueriesTest
|
10
|
+
def setup
|
11
|
+
init :mysql, MYSQL_DB_URL, MYSQL_DB_USER, MYSQL_DB_PWD
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
$:.unshift(File.expand_path('../../..', __FILE__)) unless
|
3
|
+
$:.include?(File.expand_path('../../..', __FILE__))
|
4
|
+
|
5
|
+
require 'rubernate/fixtures'
|
6
|
+
require 'rubernate/impl/queries_stub'
|
7
|
+
|
8
|
+
module Rubernate
|
9
|
+
class OracleQueriesTest < Test::Unit::TestCase
|
10
|
+
include GenericQueriesTest
|
11
|
+
def setup
|
12
|
+
init :oracle, ORA_DB_URL, ORA_DB_USER, ORA_DB_PWD
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../..', __FILE__)) unless
|
2
|
+
$:.include?(File.expand_path('../../..', __FILE__))
|
3
|
+
|
4
|
+
require 'config'
|
5
|
+
require 'rubernate/fixtures'
|
6
|
+
|
7
|
+
module Rubernate
|
8
|
+
module GenericQueriesTest
|
9
|
+
include Rubernate
|
10
|
+
include FixtureClasses
|
11
|
+
|
12
|
+
def init db_type, db_url, db_user, db_password
|
13
|
+
Rubernate.config db_type, db_url, db_user, db_password
|
14
|
+
Rubernate.session do |rt|
|
15
|
+
rt.dbh.do 'delete from r_params'
|
16
|
+
rt.dbh.do 'delete from r_objects'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
@runtime.dbh.disconnect if @runtime and @runtime.dbh
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_find_by_param_value
|
25
|
+
Rubernate.session do
|
26
|
+
o = C1.new.attach
|
27
|
+
# Test string value
|
28
|
+
o.p1 = 'tv1'
|
29
|
+
res = find_by_query 'Select :o; Where o.p1.str == :value', :value => 'tv1'
|
30
|
+
assert_equal [o], res
|
31
|
+
# Test int value
|
32
|
+
o.p1 = 123
|
33
|
+
res = find_by_query 'Select :o; Where o.p1.int == :value', :value => 123
|
34
|
+
assert_equal [o], res
|
35
|
+
# Test date value
|
36
|
+
date = Date.today
|
37
|
+
o.p1 = date
|
38
|
+
res = find_by_query 'Select :o; Where o.p1.date == :value', :value => date
|
39
|
+
assert_equal [o], res
|
40
|
+
# Test time value
|
41
|
+
time = Time.now
|
42
|
+
o.p1 = time
|
43
|
+
res = find_by_query 'Select :o; Where o.p1.time == :value', :value => time
|
44
|
+
assert_equal [o], res
|
45
|
+
# Test ref value
|
46
|
+
o.p1 = o
|
47
|
+
res = find_by_query 'Select :o; Where o.p1.ref == :value', :value => o
|
48
|
+
assert_equal [o], res
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_eq_two_props
|
53
|
+
Rubernate.session do
|
54
|
+
o1, o2 = C2.new.attach, C2.new.attach
|
55
|
+
o1.p1, o1.p2 = 1, 2
|
56
|
+
o2.p1, o2.p2 = 3, 3
|
57
|
+
res = find_by_query 'Select :o; Where o.p1.int == o.p2.int, o.p2.int >= 2'
|
58
|
+
assert_equal [o2], res
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_ref_on_other
|
63
|
+
Rubernate.session do
|
64
|
+
o1, o2 = C2.new.attach, C2.new.attach
|
65
|
+
o1.p1 = o2
|
66
|
+
o2.p1 = 'test'
|
67
|
+
res = find_by_query 'Select :o1, :o2; Where o1.p1.ref == o2, o2.p1.str == :v', :v => 'test'
|
68
|
+
assert_equal [o1], res
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -3,174 +3,187 @@ $:.unshift(File.expand_path('../..', __FILE__)) unless
|
|
3
3
|
|
4
4
|
require 'rubernate/fixtures'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def query *q_text, &q_block
|
15
|
-
if block_given?
|
16
|
-
@factory.query(&q_block)
|
17
|
-
else
|
18
|
-
@factory.query q_text[0]
|
6
|
+
module Rubernate
|
7
|
+
class QueryBuildTest < Test::Unit::TestCase
|
8
|
+
include Rubernate::Queries
|
9
|
+
include FixtureClasses
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@factory = Factory.new
|
19
13
|
end
|
20
|
-
end
|
21
14
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
15
|
+
def query *q_text, &q_block
|
16
|
+
if block_given?
|
17
|
+
@factory.query(&q_block)
|
18
|
+
else
|
19
|
+
@factory.query q_text[0]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def once str, substr
|
24
|
+
lidx, ridx = str.index(substr), str.rindex(substr)
|
25
|
+
lidx and lidx == ridx
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
def assert_once string, tokens
|
29
|
+
tokens = [tokens] unless tokens.is_a? Array
|
30
|
+
for token in tokens
|
31
|
+
assert once(string, token), "'#{token}' must occurse only once in \n'#{string}'"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_query_simplest
|
36
|
+
q = query 'Select :o; Where o.p1.int == 1'
|
37
|
+
sql = q.to_sql.downcase
|
38
|
+
assert_once sql, [ 'select o_.* from', 'r_objects o_', 'r_params o_p1',
|
39
|
+
'o_.object_pk = o_p1.object_pk', 'o_p1.name = \'p1\'']
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_query_join_by_int
|
43
|
+
q = query "Select :o, :p; Where(o.p1.int == p.p2.int)"
|
44
|
+
sql = q.to_sql.downcase
|
45
|
+
assert_once sql, [ 'r_objects p_', 'r_params p_p2', 'r_objects o_', 'r_params o_p1',
|
46
|
+
'o_.object_pk = o_p1.object_pk', 'p_.object_pk = p_p2.object_pk',
|
47
|
+
'o_p1.int_value = p_p2.int_value', 'o_p1.name = \'p1\'',
|
48
|
+
'p_p2.name = \'p2\'' ]
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_query_filter_by_int
|
52
|
+
q = query {Select :o; Where(o.p1.int == 1)}
|
53
|
+
sql = q.to_sql.downcase
|
54
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p1.name = \'p1\'']
|
31
55
|
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_query_simplest
|
35
|
-
q = query 'Select :o; Where o.p1.int == 1'
|
36
|
-
sql = q.to_sql.downcase
|
37
|
-
assert_once sql, [ 'select o_.* from', 'r_objects o_', 'r_params o_p1',
|
38
|
-
'o_.object_pk = o_p1.object_pk', 'o_p1.name = \'p1\'']
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_query_join_by_int
|
42
|
-
q = query "Select :o, :p; Where(o.p1.int == p.p2.int)"
|
43
|
-
sql = q.to_sql.downcase
|
44
|
-
assert_once sql, [ 'r_objects p_', 'r_params p_p2', 'r_objects o_', 'r_params o_p1',
|
45
|
-
'o_.object_pk = o_p1.object_pk', 'p_.object_pk = p_p2.object_pk',
|
46
|
-
'o_p1.int_value = p_p2.int_value', 'o_p1.name = \'p1\'',
|
47
|
-
'p_p2.name = \'p2\'' ]
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_query_filter_by_int
|
51
|
-
q = query {Select :o; Where(o.p1.int == 1)}
|
52
|
-
sql = q.to_sql.downcase
|
53
|
-
assert_once sql, ['o_p1.int_value = 1', 'o_p1.name = \'p1\'']
|
54
|
-
end
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
57
|
+
def test_query_filter_by_nil
|
58
|
+
q = query 'Select :o; Where(o.p1.int.is_nil)'
|
59
|
+
sql = q.to_sql.downcase
|
60
|
+
assert_once sql, ['o_p1.int_value is null', 'o_p1.name = \'p1\'']
|
61
|
+
q = query 'Select :o; Where(o.p1.int.is_not_nil)'
|
62
|
+
sql = q.to_sql.downcase
|
63
|
+
assert_once sql, ['o_p1.int_value is not null']
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_query_and
|
67
|
+
q = query 'Select :o; Where And(o.p1.int == 1, o.p2.int == 2)'
|
68
|
+
sql = q.to_sql.downcase
|
69
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_.object_pk = o_p2.object_pk']
|
70
|
+
end
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
def test_query_less_greater
|
73
|
+
q = query 'Select :o; Where And(o.p1.int < 1, o.p2.int > 2)'
|
74
|
+
sql = q.to_sql.downcase
|
75
|
+
assert_once sql, ['o_p1.int_value < 1', 'o_p2.int_value > 2']
|
76
|
+
end
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
78
|
+
def test_query_or
|
79
|
+
q = query 'Select :o; Where (Or o.p1.int == 1, o.p2.int == 2)'
|
80
|
+
sql = q.to_sql.downcase
|
81
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p1.int_value = 1', 'or']
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_query_and_or
|
85
|
+
q = query 'Select :o; Where Or((And o.p1.int == 1, o.p2.int == 2), (o.p1.int == 3))'
|
86
|
+
sql = q.to_sql.downcase
|
87
|
+
assert_once sql, ['o_p1.int_value = 1', 'o_p2.int_value = 2', 'o_p1.int_value = 3', 'or']
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_query_ref_equality
|
91
|
+
q = query 'Select :o, :t; Where Or(o.p1 == t, t.p2.int > 10)'
|
92
|
+
sql = q.to_sql.downcase
|
93
|
+
assert_once sql, 'o_p1.ref_value = t_.object_pk'
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_query_is_int
|
97
|
+
q = query {Select :o; Where o.p1.is_int}
|
98
|
+
sql = q.to_sql.downcase
|
99
|
+
assert_once sql, 'o_p1.flags = 1'
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_array_index
|
103
|
+
q = query {Select :o, :t; Where(o.p[3] == t)}
|
104
|
+
sql = q.to_sql.downcase
|
105
|
+
assert_once sql, ['o_.object_pk = o_p.object_pk', 'o_p.int_value = 3',
|
106
|
+
'o_p.ref_value = t_.object_pk']
|
107
|
+
end
|
107
108
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
109
|
+
def test_array_param_index
|
110
|
+
q = query {Select :o, :t; Where(o.p[:index] == t)}
|
111
|
+
sql = q.to_sql.downcase
|
112
|
+
assert_once sql, ['o_.object_pk = o_p.object_pk', 'o_p.int_value = ?',
|
113
|
+
'o_p.ref_value = t_.object_pk']
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_not_expr
|
117
|
+
q = query {Select :o; Where(Not(o.p.int == 1))}
|
118
|
+
sql = q.to_sql.downcase
|
119
|
+
assert_once sql, 'not (o_p.int_value = 1)'
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_markers
|
123
|
+
q = query {Select :o; Where(o.p1.int == :v1, o.p2 == :r2)}
|
124
|
+
sql = q.to_sql.downcase
|
125
|
+
assert_once sql, ['o_p1.int_value = ?', 'o_p2.ref_value = ?']
|
126
|
+
assert_equal [:v1, :r2], q.markers
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_no_markers
|
130
|
+
q = query {Select :o; Where(o.p1.int == 1)}
|
131
|
+
assert_equal [], q.markers
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_class_equal
|
135
|
+
q = query {Select :o; Where(o.klass == C1)}
|
136
|
+
sql = q.to_sql
|
137
|
+
assert_once sql, ['r_objects o', 'o_.object_class = \'FixtureClasses::C1\'']
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_expr_in
|
141
|
+
q = query {Select :o; Where(In(o.p1.int, [1, 2, 3]))}
|
142
|
+
sql = q.to_sql.downcase
|
143
|
+
assert_once sql, 'o_p1.int_value in (1, 2, 3)'
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_order_by
|
147
|
+
q = query {Select :o; Where o.klass == C1; OrderBy o.p1.int}
|
148
|
+
sql = q.to_sql.downcase
|
149
|
+
assert_once sql, 'order by o_p1.int_value'
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_in_subclasses
|
153
|
+
q = query 'Select :o; Where In(o.klass, FixtureClasses::C1.subclasses)'
|
154
|
+
assert_once q.to_sql, %w{o_.object_class FixtureClasses::C2 FixtureClasses::C4}
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_derived
|
158
|
+
q = query 'Select :o; Where o.derived(FixtureClasses::C1)'
|
159
|
+
q.to_sql
|
160
|
+
assert_once q.to_sql, %w{FixtureClasses::C1 FixtureClasses::C2 FixtureClasses::C4}
|
161
|
+
|
162
|
+
q = query 'Select :o; Where o.derived(FixtureClasses::C4)'
|
163
|
+
assert_once q.to_sql, %w{FixtureClasses::C4}
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_param_name
|
167
|
+
q = query {Select :o; Where o.name.str == :name}
|
168
|
+
assert_once q.to_sql, ["o_name.name = 'name'", 'o_name.str_value = ?']
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_eq_equivalence
|
172
|
+
q0 = query {Select :o; Where o.p1 == :ref}
|
173
|
+
q1 = query {Select :o; Where Eq(o.p1, :ref)}
|
174
|
+
assert_equal q0.to_sql, q1.to_sql
|
175
|
+
assert_equal q0.markers, q1.markers
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_cache
|
179
|
+
q = query 'Select :o; Where o.p1.int == 1'
|
180
|
+
sql = q.to_sql
|
181
|
+
mrk = q.markers
|
182
|
+
10.times do
|
183
|
+
q = query 'Select :o; Where o.p1.int == 1'
|
184
|
+
assert_equal sql, q.to_sql
|
185
|
+
assert_equal mrk, q.markers
|
186
|
+
end
|
187
|
+
end
|
168
188
|
end
|
169
|
-
|
170
|
-
def test_eq_equivalence
|
171
|
-
q0 = query {Select :o; Where o.p1 == :ref}
|
172
|
-
q1 = query {Select :o; Where Eq(o.p1, :ref)}
|
173
|
-
assert_equal q0.to_sql, q1.to_sql
|
174
|
-
assert_equal q0.markers, q1.markers
|
175
|
-
end
|
176
189
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: Rubernate
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-03-
|
6
|
+
version: 0.1.4
|
7
|
+
date: 2006-03-16 00:00:00 +03:00
|
8
8
|
summary: Object-oriented storage for Ruby objects based on relational database model
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -58,6 +58,9 @@ files:
|
|
58
58
|
- tests/rubernate/impl/dbi_mysql_test.rb
|
59
59
|
- tests/rubernate/impl/dbi_oracle_test.rb
|
60
60
|
- tests/rubernate/impl/memory_test.rb
|
61
|
+
- tests/rubernate/impl/queries_mysql_test.rb
|
62
|
+
- tests/rubernate/impl/queries_oracle_test.rb
|
63
|
+
- tests/rubernate/impl/queries_stub.rb
|
61
64
|
- README
|
62
65
|
test_files:
|
63
66
|
- tests/all_tests.rb
|