Class: Rgviz::MagicNamesVisitor

Inherits:
Visitor
  • Object
show all
Defined in:
lib/rgviz_rails/view_helper.rb

Instance Method Summary collapse

Constructor Details

#initialize(html_prefix, js_prefix, param_prefix) ⇒ MagicNamesVisitor

Returns a new instance of MagicNamesVisitor.



209
210
211
212
213
214
215
# File 'lib/rgviz_rails/view_helper.rb', line 209

def initialize(html_prefix, js_prefix, param_prefix)
  @html_prefix = html_prefix
  @js_prefix = js_prefix
  @param_prefix = param_prefix
  @s = ''
  @params = []
end

Instance Method Details

#append_after_source_type(type) ⇒ Object



523
524
525
526
527
528
529
530
# File 'lib/rgviz_rails/view_helper.rb', line 523

def append_after_source_type(type)
  case type
  when :number
    return
  else
    @s << "'\""
  end
end

#append_before_source_type(type) ⇒ Object



508
509
510
511
512
513
514
515
516
517
518
519
520
521
# File 'lib/rgviz_rails/view_helper.rb', line 508

def append_before_source_type(type)
  case type
  when :number
    return
  when :string
    @s << "\"'"
  when :date
    @s << "date \"'"
  when :datetime
    @s << "datetime \"'"
  when :timeofday
    @s << "timeofday \"'"
  end
end

#append_selections(node, source) ⇒ Object



532
533
534
535
536
537
538
539
540
541
# File 'lib/rgviz_rails/view_helper.rb', line 532

def append_selections(node, source)
  @s << "q += rgviz_append(s, '";
  node.left.accept self
  @s << " #{node.operator} "
  append_before_source_type source[:type]
  @s << ", "
  append_after_source_type source[:type]
  @s << "');\n"
  @uses_rgviz_append = true
end

#get_source(name, include_type = true) ⇒ Object



468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
# File 'lib/rgviz_rails/view_helper.rb', line 468

def get_source(name, include_type = true)
  if name.start_with?(@html_prefix)
    if include_type
      get_source_type :html, name[@html_prefix.length .. -1]
    else
      {:source => :html, :id => name[@html_prefix.length .. -1]}
    end
  elsif name.start_with?(@js_prefix)
    if include_type
      get_source_type :js, name[@js_prefix.length .. -1]
    else
      {:source => :js, :id => name[@js_prefix.length .. -1]}
    end
  elsif name.start_with?(@param_prefix)
    if include_type
      get_source_type :param, name[@param_prefix.length .. -1]
    else
      {:source => :param, :id => name[@param_prefix.length .. -1]}
    end
  else
    {}
  end
end

#get_source_type(source, name) ⇒ Object



492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
# File 'lib/rgviz_rails/view_helper.rb', line 492

def get_source_type(source, name)
  if name.start_with?('number_')
    {:source => source, :id => name[7 .. -1], :type => :number}
  elsif name.start_with?('string_')
    {:source => source, :id => name[7 .. -1], :type => :string}
  elsif name.start_with?('date_')
    {:source => source, :id => name[5 .. -1], :type => :date}
  elsif name.start_with?('datetime_')
    {:source => source, :id => name[9 .. -1], :type => :datetime}
  elsif name.start_with?('timeofday_')
    {:source => source, :id => name[10 .. -1], :type => :timeofday}
  else
    {:source => source, :id => name, :type => :string}
  end
end

#has_magic_name?(node) ⇒ Boolean

Returns:

  • (Boolean)


543
544
545
546
547
548
# File 'lib/rgviz_rails/view_helper.rb', line 543

def has_magic_name?(node)
  return false unless node.kind_of?(IdColumn)
  source = get_source node.name
  return false unless source[:source]
  return source
end

#paramsObject



225
226
227
# File 'lib/rgviz_rails/view_helper.rb', line 225

def params
  @params
end


461
462
463
464
465
466
# File 'lib/rgviz_rails/view_helper.rb', line 461

def print_columns(node)
  node.columns.each_with_index do |c, i|
    @s << ', ' if i > 0
    c.accept self
  end
end

#query_builderObject



217
218
219
# File 'lib/rgviz_rails/view_helper.rb', line 217

def query_builder
  @s.strip
end

#query_builder_varObject



221
222
223
# File 'lib/rgviz_rails/view_helper.rb', line 221

def query_builder_var
  'q'
end

#uses_rgviz_append?Boolean

Returns:

  • (Boolean)


233
234
235
# File 'lib/rgviz_rails/view_helper.rb', line 233

def uses_rgviz_append?
  @uses_rgviz_append
end

#uses_rgviz_get_value?Boolean

Returns:

  • (Boolean)


229
230
231
# File 'lib/rgviz_rails/view_helper.rb', line 229

def uses_rgviz_get_value?
  @uses_rgviz_get_value
end

#visit_aggregate_column(node) ⇒ Object



454
455
456
457
458
459
# File 'lib/rgviz_rails/view_helper.rb', line 454

def visit_aggregate_column(node)
  @s << "#{node.function}("
  node.argument.accept self
  @s << ")"
  false
end

#visit_binary_expression(node) ⇒ Object



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
# File 'lib/rgviz_rails/view_helper.rb', line 346

def visit_binary_expression(node)
  if node.operator == BinaryExpression::Eq
    source = has_magic_name?(node.right)
    if source
      @s << "';\n"
      case source[:source]
      when :html
        @s << "var s = rgviz_get_value('#{source[:id]}');\n"
        append_selections node, source

        @uses_rgviz_get_value = true
      when :js
        @s << "var s = #{source[:id]}();\n"
        @s << "if (typeof(s) != 'object') s = [s];\n"
        append_selections node, source
      when :param
        @s << "var s = param_#{source[:id]};\n"
        @s << "if (typeof(s) != 'object') s = [s];\n"
        append_selections node, source
        @params << source[:id].to_i unless @params.include?(source[:id])
      end
      @s << "q += '"
      return false
    end
  end
  node.left.accept self
  @s << " #{node.operator} "
  node.right.accept self
  false
end

#visit_boolean_column(node) ⇒ Object



420
421
422
# File 'lib/rgviz_rails/view_helper.rb', line 420

def visit_boolean_column(node)
  @s << node.value.to_s
end

#visit_date_column(node) ⇒ Object



424
425
426
# File 'lib/rgviz_rails/view_helper.rb', line 424

def visit_date_column(node)
  @s << "date \"#{node.value.to_s}\""
end

#visit_date_time_column(node) ⇒ Object



428
429
430
# File 'lib/rgviz_rails/view_helper.rb', line 428

def visit_date_time_column(node)
  @s << "date \"#{node.value.strftime('%Y-%m-%d %H:%M:%S')}\""
end

#visit_format(node) ⇒ Object



325
326
327
328
329
330
331
332
333
334
# File 'lib/rgviz_rails/view_helper.rb', line 325

def visit_format(node)
  node.column.accept self
  @s << ' '
  if node.pattern.include?("'")
    @s << "\"#{node.pattern}\""
  else
    @s << "\\'#{node.pattern}\\'"
  end
  false
end

#visit_group_by(node) ⇒ Object



287
288
289
290
291
292
# File 'lib/rgviz_rails/view_helper.rb', line 287

def visit_group_by(node)
  @s << "group by "
  print_columns node
  @s << " "
  false
end

#visit_id_column(node) ⇒ Object



388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
# File 'lib/rgviz_rails/view_helper.rb', line 388

def visit_id_column(node)
  source = get_source node.name
  case source[:source]
  when nil
    @s << "`#{node.name}`"
  when :html
    append_before_source_type source[:type]
    @s << " + rgviz_get_value('#{source[:id]}') + "
    append_after_source_type source[:type]

    @uses_rgviz_get_value = true
  when :js
    append_before_source_type source[:type]
    @s << " + #{source[:id]}() + "
    append_after_source_type source[:type]
  when :param
    append_before_source_type source[:type]
    @s << " + param_#{source[:id]} + "
    append_after_source_type source[:type]
    @params << source[:id].to_i unless @params.include?(source[:id])
  end
end

#visit_label(node) ⇒ Object



313
314
315
316
317
318
319
320
321
322
323
# File 'lib/rgviz_rails/view_helper.rb', line 313

def visit_label(node)
  node.column.accept self
  @s << ' '
  if node.label.include?("'")
    val = node.label.gsub("'", "\\'")
    @s << "\"#{val}\""
  else
    @s << "\\'#{node.label}\\'"
  end
  false
end

#visit_logical_expression(node) ⇒ Object



336
337
338
339
340
341
342
343
344
# File 'lib/rgviz_rails/view_helper.rb', line 336

def visit_logical_expression(node)
  @s += "("
  node.operands.each_with_index do |operand, i|
    @s += " #{node.operator} " if i > 0
    operand.accept self
  end
  @s += ")"
  false
end

#visit_number_column(node) ⇒ Object



411
412
413
# File 'lib/rgviz_rails/view_helper.rb', line 411

def visit_number_column(node)
  @s << node.value.to_s
end

#visit_order_by(node) ⇒ Object



301
302
303
304
305
306
307
308
309
310
311
# File 'lib/rgviz_rails/view_helper.rb', line 301

def visit_order_by(node)
  @s << "order by "
  node.sorts.each_with_index do |s, i|
    @s << ', ' if i > 0
    s.column.accept self
    @s << ' '
    @s << s.order.to_s
  end
  @s << " "
  false
end

#visit_pivot(node) ⇒ Object



294
295
296
297
298
299
# File 'lib/rgviz_rails/view_helper.rb', line 294

def visit_pivot(node)
  @s << "pivot "
  print_columns node
  @s << " "
  false
end

#visit_query(node) ⇒ Object



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/rgviz_rails/view_helper.rb', line 237

def visit_query(node)
  @s << "var q = '"
  if node.select && node.select.columns && node.select.columns.length > 0
    node.select.accept self
  else
    @s << 'select * '
  end
  node.where.accept self if node.where
  node.group_by.accept self if node.group_by
  node.pivot.accept self if node.pivot
  node.order_by.accept self if node.order_by
  @s << "limit #{node.limit} " if node.limit
  @s << "offset #{node.offset} " if node.offset
  if node.labels
    @s << "label "
    node.labels.each_with_index do |l, i|
      @s << ', ' if i > 0
      l.accept self
    end
  end
  if node.formats
    @s << "format "
    node.formats.each_with_index do |f, i|
      @s << ', ' if i > 0
      f.accept self
    end
  end
  if node.options
    @s << "options "
    @s << "no_values " if node.options.no_values
    @s << "no_format " if node.options.no_format
  end
  @s << "';\n"
  false
end

#visit_scalar_function_column(node) ⇒ Object



436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
# File 'lib/rgviz_rails/view_helper.rb', line 436

def visit_scalar_function_column(node)
  case node.function
  when ScalarFunctionColumn::Sum, ScalarFunctionColumn::Difference,
       ScalarFunctionColumn::Product, ScalarFunctionColumn::Quotient
    node.arguments[0].accept node
    @s << " #{node.function} "
    node.arguments[1].accept node
  else
    @s << "#{node.function}("
    node.arguments.each_with_index do |a, i|
      @s << ', ' if i > 0
      a.accept self
    end
    @s << ")"
  end
  false
end

#visit_select(node) ⇒ Object



273
274
275
276
277
278
# File 'lib/rgviz_rails/view_helper.rb', line 273

def visit_select(node)
  @s << "select ";
  print_columns node
  @s << " "
  false
end

#visit_string_column(node) ⇒ Object



415
416
417
418
# File 'lib/rgviz_rails/view_helper.rb', line 415

def visit_string_column(node)
  value = node.value.gsub('"', '\"')
  @s << "\"#{value}\""
end

#visit_time_of_day_column(node) ⇒ Object



432
433
434
# File 'lib/rgviz_rails/view_helper.rb', line 432

def visit_time_of_day_column(node)
  @s << "date \"#{node.value.strftime('%H:%M:%S')}\""
end

#visit_unary_expression(node) ⇒ Object



377
378
379
380
381
382
383
384
385
386
# File 'lib/rgviz_rails/view_helper.rb', line 377

def visit_unary_expression(node)
  if node.operator == UnaryExpression::Not
    @s << "not "
    node.operand.accept self
  else
    node.operand.accept self
    @s << " #{node.operator}"
  end
  false
end

#visit_where(node) ⇒ Object



280
281
282
283
284
285
# File 'lib/rgviz_rails/view_helper.rb', line 280

def visit_where(node)
  @s << "where "
  node.expression.accept self
  @s << " "
  false
end