Module: Rgviz

Defined in:
lib/rgviz_rails/tqx.rb,
lib/rgviz_rails/init.rb,
lib/rgviz_rails/executor.rb,
lib/rgviz_rails/js_renderer.rb,
lib/rgviz_rails/view_helper.rb,
lib/rgviz_rails/adapters/mysql_adapter.rb,
lib/rgviz_rails/adapters/sqlite_adapter.rb,
lib/rgviz_rails/adapters/postgresql_adapter.rb

Defined Under Namespace

Modules: JsRenderer, Tqx, ViewHelper Classes: ColumnVisitor, Executor, MagicNamesVisitor, MySqlAdapter, NotSupported, OrderVisitor, PostgreSqlAdapter, SqliteAdapter, WhereVisitor

Class Method Summary collapse

Class Method Details

._define_rgviz_classObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rgviz_rails/init.rb', line 6

def self._define_rgviz_class
  ::ActionController::Base.module_eval do
    def render_with_rgviz(*args, &block)
      if args.length == 1 && args[0].kind_of?(Hash)
        hash = args.first
        case hash[:rgviz]
        when nil then render_without_rgviz *args, &block
        else
          model = hash[:rgviz]
          conditions = hash[:conditions]
          extensions = hash[:extensions]
          query = params[:tq] || 'select *'
          tqx = params[:tqx] || ''

          tqx = Rgviz::Tqx.parse(tqx)

          begin
            if model.is_a? Class and model < ActiveRecord::Base
              executor = Rgviz::Executor.new model
            elsif model.respond_to? :execute
              executor = model
            else
              raise "The argument to render :rgviz => ... must extend from ActiveRecord::Base or respond to execute"
            end
            options = {}
            options[:conditions] = conditions if conditions
            options[:extensions] = extensions if extensions
            table = executor.execute query, options

            yield table if block_given?

            case tqx['out']
            when 'json'
              render_without_rgviz :text => Rgviz::JsRenderer.render(table, tqx)
            when 'html'
              render_without_rgviz :text => Rgviz::HtmlRenderer.render(table)
            when 'csv'
              csv_output = Rgviz::CsvRenderer.render(table)
              if tqx['outFileName']
                send_data csv_output, :filename => tqx['outFileName'], :type => 'text/csv'
              else
                render_without_rgviz :text => csv_output
              end
            else
              render_without_rgviz :text => Rgviz::JsRenderer.render_error('not_supported', "Unsupported output type: #{out}", tqx)
            end
          rescue ParseException => e
            case tqx['out']
            when 'json'
              render_without_rgviz :text => Rgviz::JsRenderer.render_error('invalid_query', e.message, tqx)
            when 'html'
              render_without_rgviz :text => "<b>Error:</b> #{e.message}"
            when 'csv'
              render_without_rgviz :text => "Error: #{e.message}"
            else
              render_without_rgviz :text => "<b>Unsupported output type:</b> #{out}"
            end
          end
        end
      else
        render_without_rgviz *args, &block
      end
    end
    alias_method_chain :render, :rgviz
  end
end

.find_rails_col(klass, name) ⇒ Object



576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
# File 'lib/rgviz_rails/executor.rb', line 576

def self.find_rails_col(klass, name)
  joins = []

  while true
    col = klass.send(:columns).select{|x| x.name == name}.first
    return [klass, col, joins] if col

    idx = name.index '_'
    return nil if not idx

    before = name[0 ... idx]
    name = name[idx + 1 .. -1]

    assoc = klass.send :reflect_on_association, before.to_sym
    raise "Unknown association #{before}" unless assoc
    klass = assoc.klass
    joins << assoc
  end
end