rgviz-rails 0.8 → 0.9
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/lib/rgviz_rails/adapters/mysql_adapter.rb +62 -0
- data/lib/rgviz_rails/adapters/sqlite_adapter.rb +60 -0
- data/lib/rgviz_rails/executor.rb +32 -16
- data/lib/rgviz_rails.rb +2 -0
- data/spec/rgviz/executor_spec.rb +36 -0
- data/spec/spec_helper.rb +1 -0
- metadata +6 -4
@@ -0,0 +1,62 @@
|
|
1
|
+
module Rgviz
|
2
|
+
class MySqlAdapter
|
3
|
+
def accept_scalar_function_column(node, visitor)
|
4
|
+
case node.function
|
5
|
+
when ScalarFunctionColumn::Year
|
6
|
+
visitor << "year("
|
7
|
+
node.arguments[0].accept visitor
|
8
|
+
visitor << ")"
|
9
|
+
when ScalarFunctionColumn::Month
|
10
|
+
visitor << "month("
|
11
|
+
node.arguments[0].accept visitor
|
12
|
+
visitor << ")"
|
13
|
+
when ScalarFunctionColumn::Day
|
14
|
+
visitor << "day("
|
15
|
+
node.arguments[0].accept visitor
|
16
|
+
visitor << ")"
|
17
|
+
when ScalarFunctionColumn::Hour
|
18
|
+
visitor << "hour("
|
19
|
+
node.arguments[0].accept visitor
|
20
|
+
visitor << ")"
|
21
|
+
when ScalarFunctionColumn::Minute
|
22
|
+
visitor << "minute("
|
23
|
+
node.arguments[0].accept visitor
|
24
|
+
visitor << ")"
|
25
|
+
when ScalarFunctionColumn::Second
|
26
|
+
visitor << "second("
|
27
|
+
node.arguments[0].accept visitor
|
28
|
+
visitor << ")"
|
29
|
+
when ScalarFunctionColumn::Millisecond
|
30
|
+
raise NotSupported.new "The millisecond function is not supported"
|
31
|
+
when ScalarFunctionColumn::Quarter
|
32
|
+
visitor << "quarter("
|
33
|
+
node.arguments[0].accept visitor
|
34
|
+
visitor << ")"
|
35
|
+
when ScalarFunctionColumn::DayOfWeek
|
36
|
+
visitor << "dayofweek("
|
37
|
+
node.arguments[0].accept visitor
|
38
|
+
visitor << ")"
|
39
|
+
when ScalarFunctionColumn::Now
|
40
|
+
visitor << "now()"
|
41
|
+
when ScalarFunctionColumn::DateDiff
|
42
|
+
visitor << "datediff("
|
43
|
+
node.arguments[0].accept visitor
|
44
|
+
visitor << ","
|
45
|
+
node.arguments[1].accept visitor
|
46
|
+
visitor << ")"
|
47
|
+
when ScalarFunctionColumn::ToDate
|
48
|
+
visitor << "date_format("
|
49
|
+
node.arguments[0].accept visitor
|
50
|
+
visitor << ", '%Y-%m-%d')"
|
51
|
+
when ScalarFunctionColumn::Upper
|
52
|
+
visitor << "upper("
|
53
|
+
node.arguments[0].accept visitor
|
54
|
+
visitor << ")"
|
55
|
+
when ScalarFunctionColumn::Lower
|
56
|
+
visitor << "lower("
|
57
|
+
node.arguments[0].accept visitor
|
58
|
+
visitor << ")"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Rgviz
|
2
|
+
class SqliteAdapter
|
3
|
+
def accept_scalar_function_column(node, visitor)
|
4
|
+
case node.function
|
5
|
+
when ScalarFunctionColumn::Year
|
6
|
+
visitor << "strftime('%Y', "
|
7
|
+
node.arguments[0].accept visitor
|
8
|
+
visitor << ")"
|
9
|
+
when ScalarFunctionColumn::Month
|
10
|
+
visitor << "strftime('%m', "
|
11
|
+
node.arguments[0].accept visitor
|
12
|
+
visitor << ")"
|
13
|
+
when ScalarFunctionColumn::Day
|
14
|
+
visitor << "strftime('%d', "
|
15
|
+
node.arguments[0].accept visitor
|
16
|
+
visitor << ")"
|
17
|
+
when ScalarFunctionColumn::Hour
|
18
|
+
visitor << "strftime('%H', "
|
19
|
+
node.arguments[0].accept visitor
|
20
|
+
visitor << ")"
|
21
|
+
when ScalarFunctionColumn::Minute
|
22
|
+
visitor << "strftime('%M', "
|
23
|
+
node.arguments[0].accept visitor
|
24
|
+
visitor << ")"
|
25
|
+
when ScalarFunctionColumn::Second
|
26
|
+
visitor << "strftime('%S', "
|
27
|
+
node.arguments[0].accept visitor
|
28
|
+
visitor << ")"
|
29
|
+
when ScalarFunctionColumn::Millisecond
|
30
|
+
raise NotSupported.new "The millisecond function is not supported"
|
31
|
+
when ScalarFunctionColumn::Quarter
|
32
|
+
raise NotSupported.new "The quarter function is not supported"
|
33
|
+
when ScalarFunctionColumn::DayOfWeek
|
34
|
+
visitor << "1 + strftime('%w', "
|
35
|
+
node.arguments[0].accept visitor
|
36
|
+
visitor << ")"
|
37
|
+
when ScalarFunctionColumn::Now
|
38
|
+
visitor << "strftime('%Y-%m-%d %H:%M:%S')"
|
39
|
+
when ScalarFunctionColumn::DateDiff
|
40
|
+
visitor << "julianday("
|
41
|
+
node.arguments[0].accept visitor
|
42
|
+
visitor << ") - julianday("
|
43
|
+
node.arguments[1].accept visitor
|
44
|
+
visitor << ")"
|
45
|
+
when ScalarFunctionColumn::ToDate
|
46
|
+
visitor << "strftime('%Y-%m-%d', "
|
47
|
+
node.arguments[0].accept visitor
|
48
|
+
visitor << ")"
|
49
|
+
when ScalarFunctionColumn::Upper
|
50
|
+
visitor << "upper("
|
51
|
+
node.arguments[0].accept visitor
|
52
|
+
visitor << ")"
|
53
|
+
when ScalarFunctionColumn::Lower
|
54
|
+
visitor << "lower("
|
55
|
+
node.arguments[0].accept visitor
|
56
|
+
visitor << ")"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/rgviz_rails/executor.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
module Rgviz
|
2
2
|
class Executor
|
3
3
|
attr_reader :model_class
|
4
|
+
attr_reader :adapter
|
4
5
|
|
5
6
|
def initialize(model_class, query)
|
6
7
|
@model_class = model_class
|
7
8
|
@query = query
|
8
9
|
@joins = {}
|
10
|
+
case ActiveRecord::Base.connection.adapter_name.downcase
|
11
|
+
when 'sqlite'
|
12
|
+
@adapter = SqliteAdapter.new
|
13
|
+
when 'mysql'
|
14
|
+
@adapter = MySqlAdapter.new
|
15
|
+
end
|
9
16
|
end
|
10
17
|
|
11
18
|
def execute(options = {})
|
@@ -184,7 +191,11 @@ module Rgviz
|
|
184
191
|
@executor = executor
|
185
192
|
end
|
186
193
|
|
187
|
-
def
|
194
|
+
def <<(string)
|
195
|
+
@string += string
|
196
|
+
end
|
197
|
+
|
198
|
+
def visit_id_column(node)
|
188
199
|
klass, rails_col, joins = Rgviz::find_rails_col @executor.model_class, node.name
|
189
200
|
raise "Unknown column '#{node.name}'" unless rails_col
|
190
201
|
@string += ActiveRecord::Base.connection.quote_column_name(klass.table_name)
|
@@ -194,42 +205,44 @@ module Rgviz
|
|
194
205
|
@executor.add_joins joins
|
195
206
|
end
|
196
207
|
|
197
|
-
def
|
208
|
+
def visit_number_column(node)
|
198
209
|
@string += node.value.to_s
|
199
210
|
end
|
200
211
|
|
201
|
-
def
|
212
|
+
def visit_string_column(node)
|
202
213
|
@string += escaped_string(node.value)
|
203
214
|
end
|
204
215
|
|
205
|
-
def
|
216
|
+
def visit_boolean_column(node)
|
206
217
|
@string += node.value ? '1' : '0'
|
207
218
|
end
|
208
219
|
|
209
|
-
def
|
220
|
+
def visit_date_column(node)
|
210
221
|
@string += escaped_string(node.value.to_s)
|
211
222
|
end
|
212
223
|
|
213
|
-
def
|
224
|
+
def visit_date_time_column(node)
|
214
225
|
@string += escaped_string(node.value.strftime "%Y-%m-%d %H:%M:%S")
|
215
226
|
end
|
216
227
|
|
217
|
-
def
|
228
|
+
def visit_time_of_day_column(node)
|
218
229
|
@string += escaped_string(node.value.strftime "%H:%M:%S")
|
219
230
|
end
|
220
231
|
|
221
|
-
def
|
232
|
+
def visit_scalar_function_column(node)
|
222
233
|
case node.function
|
223
234
|
when ScalarFunctionColumn::Sum, ScalarFunctionColumn::Difference,
|
224
235
|
ScalarFunctionColumn::Product, ScalarFunctionColumn::Quotient
|
225
236
|
node.arguments[0].accept self
|
226
237
|
@string += node.function.to_s
|
227
238
|
node.arguments[1].accept self
|
239
|
+
else
|
240
|
+
@string += @executor.adapter.accept_scalar_function_column(node, self)
|
228
241
|
end
|
229
242
|
false
|
230
243
|
end
|
231
244
|
|
232
|
-
def
|
245
|
+
def visit_aggregate_column(node)
|
233
246
|
@string += node.function.to_s
|
234
247
|
@string += '('
|
235
248
|
node.argument.accept self
|
@@ -237,15 +250,15 @@ module Rgviz
|
|
237
250
|
false
|
238
251
|
end
|
239
252
|
|
240
|
-
def
|
253
|
+
def visit_label(node)
|
241
254
|
false
|
242
255
|
end
|
243
256
|
|
244
|
-
def
|
257
|
+
def visit_format(node)
|
245
258
|
false
|
246
259
|
end
|
247
260
|
|
248
|
-
def
|
261
|
+
def visit_option(node)
|
249
262
|
false
|
250
263
|
end
|
251
264
|
|
@@ -256,14 +269,14 @@ module Rgviz
|
|
256
269
|
end
|
257
270
|
|
258
271
|
class WhereVisitor < ColumnVisitor
|
259
|
-
def
|
272
|
+
def visit_binary_expression(node)
|
260
273
|
node.left.accept self
|
261
274
|
@string += " #{node.operator} "
|
262
275
|
node.right.accept self
|
263
276
|
false
|
264
277
|
end
|
265
278
|
|
266
|
-
def
|
279
|
+
def visit_unary_expression(node)
|
267
280
|
case node.operator
|
268
281
|
when UnaryExpression::Not
|
269
282
|
@string += 'not ('
|
@@ -281,7 +294,7 @@ module Rgviz
|
|
281
294
|
end
|
282
295
|
|
283
296
|
class OrderVisitor < ColumnVisitor
|
284
|
-
def
|
297
|
+
def visit_order_by(node)
|
285
298
|
i = 0
|
286
299
|
node.sorts.each do |sort|
|
287
300
|
@string += ',' if i > 0
|
@@ -290,7 +303,7 @@ module Rgviz
|
|
290
303
|
false
|
291
304
|
end
|
292
305
|
|
293
|
-
def
|
306
|
+
def visit_sort(node)
|
294
307
|
node.column.accept self
|
295
308
|
@string += node.order == Sort::Asc ? ' asc' : ' desc'
|
296
309
|
false
|
@@ -316,4 +329,7 @@ module Rgviz
|
|
316
329
|
joins << assoc
|
317
330
|
end
|
318
331
|
end
|
332
|
+
|
333
|
+
class NotSupported < ::Exception
|
334
|
+
end
|
319
335
|
end
|
data/lib/rgviz_rails.rb
CHANGED
data/spec/rgviz/executor_spec.rb
CHANGED
@@ -230,4 +230,40 @@ describe Executor do
|
|
230
230
|
table.rows[0].c[0].v.should == 2
|
231
231
|
end
|
232
232
|
|
233
|
+
[['year', 2006], ['month', 5], ['day', 2],
|
234
|
+
['hour', 3], ['minute', 4], ['second', 9],
|
235
|
+
['quarter', 2], ['dayOfWeek', 3]].each do |str, val|
|
236
|
+
it_processes_single_select_column "#{str}(created_at)", 'c0', :number, val do
|
237
|
+
Person.make :created_at => Time.parse('2006-05-02 3:04:09')
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it_processes_single_select_column "dateDiff(date '2008-03-13', date '2008-03-10')", 'c0', :number, 3 do
|
242
|
+
Person.make
|
243
|
+
end
|
244
|
+
|
245
|
+
it_processes_single_select_column "now()", 'c0', :datetime, Time.now.utc.strftime("%Y-%m-%d %H:%M:%S") do
|
246
|
+
Person.make :created_at => Time.parse('2006-05-02 3:04:09')
|
247
|
+
end
|
248
|
+
|
249
|
+
it_processes_single_select_column "toDate('2008-03-13')", 'c0', :date, Date.parse('2008-03-13').to_s do
|
250
|
+
Person.make
|
251
|
+
end
|
252
|
+
|
253
|
+
it_processes_single_select_column "toDate(created_at)", 'c0', :date, Date.parse('2008-03-13').to_s do
|
254
|
+
Person.make :created_at => Time.parse('2008-03-13 3:04:09')
|
255
|
+
end
|
256
|
+
|
257
|
+
it_processes_single_select_column "toDate(1234567890000)", 'c0', :date, Date.parse('2009-02-13').to_s do
|
258
|
+
Person.make
|
259
|
+
end
|
260
|
+
|
261
|
+
it_processes_single_select_column "upper(name)", 'c0', :string, 'FOO' do
|
262
|
+
Person.make :name => 'foo'
|
263
|
+
end
|
264
|
+
|
265
|
+
it_processes_single_select_column "lower(name)", 'c0', :string, 'foo' do
|
266
|
+
Person.make :name => 'FOO'
|
267
|
+
end
|
268
|
+
|
233
269
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,6 +7,7 @@ require 'logger'
|
|
7
7
|
require 'active_record'
|
8
8
|
|
9
9
|
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
10
|
+
#ActiveRecord::Base.establish_connection(:adapter => 'mysql', :database => 'rgviz_rails', :username => 'root', :password => 'root')
|
10
11
|
|
11
12
|
ActiveRecord::Schema.define do
|
12
13
|
create_table "cities", :force => true do |t|
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgviz-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 9
|
9
|
+
version: "0.9"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ary Borenszweig
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-17 00:00:00 +07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -29,6 +29,8 @@ extra_rdoc_files:
|
|
29
29
|
files:
|
30
30
|
- lib/rgviz_rails.rb
|
31
31
|
- lib/rgviz_rails/executor.rb
|
32
|
+
- lib/rgviz_rails/adapters/mysql_adapter.rb
|
33
|
+
- lib/rgviz_rails/adapters/sqlite_adapter.rb
|
32
34
|
- rails/init.rb
|
33
35
|
- spec/blueprints.rb
|
34
36
|
- spec/spec.opts
|