class Arel::Visitors::Dot

Public Class Methods

new() click to toggle source
Calls superclass method Arel::Visitors::Visitor.new
# File lib/arel/visitors/dot.rb, line 17
def initialize
  super()
  @nodes      = []
  @edges      = []
  @node_stack = []
  @edge_stack = []
  @seen       = {}
end

Public Instance Methods

accept(object, collector) click to toggle source
# File lib/arel/visitors/dot.rb, line 26
def accept object, collector
  visit object
  collector << to_dot
end

Private Instance Methods

edge(name) { || ... } click to toggle source
# File lib/arel/visitors/dot.rb, line 240
def edge name
  edge = Edge.new(name, @node_stack.last)
  @edge_stack.push edge
  @edges << edge
  yield
  @edge_stack.pop
end
extract(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 111
def extract o
  visit_edge o, "expressions"
  visit_edge o, "alias"
end
Also aliased as: visit_Arel_Nodes_Extract
function(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 100
def function o
  visit_edge o, "expressions"
  visit_edge o, "distinct"
  visit_edge o, "alias"
end
named_window(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 92
def named_window o
  visit_edge o, "partitions"
  visit_edge o, "orders"
  visit_edge o, "framing"
  visit_edge o, "name"
end
Also aliased as: visit_Arel_Nodes_NamedWindow
nary(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 165
def nary o
  o.children.each_with_index do |x,i|
    edge(i) { visit x }
  end
end
Also aliased as: visit_Arel_Nodes_And
quote(string) click to toggle source
# File lib/arel/visitors/dot.rb, line 258
def quote string
  string.to_s.gsub('"', '\"')
end
to_dot() click to toggle source
# File lib/arel/visitors/dot.rb, line 262
def to_dot
  "digraph \"Arel\" {\nnode [width=0.375,height=0.25,shape=record];\n" +
    @nodes.map { |node|
      label = "<f0>#{node.name}"

      node.fields.each_with_index do |field, i|
        label << "|<f#{i + 1}>#{quote field}"
      end

      "#{node.id} [label=\"#{label}\"];"
    }.join("\n") + "\n" + @edges.map { |edge|
      "#{edge.from.id} -> #{edge.to.id} [label=\"#{edge.name}\"];"
    }.join("\n") + "\n}"
end
visit(o) click to toggle source
Calls superclass method Arel::Visitors::Visitor#visit
# File lib/arel/visitors/dot.rb, line 226
def visit o
  if node = @seen[o.object_id]
    @edge_stack.last.to = node
    return
  end

  node = Node.new(o.class.name, o.object_id)
  @seen[node.id] = node
  @nodes << node
  with_node node do
    super
  end
end
visit_Arel_Attribute(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 154
def visit_Arel_Attribute o
  visit_edge o, "relation"
  visit_edge o, "name"
end
visit_Arel_Attributes_Attribute(o)
visit_Arel_Attributes_Boolean(o)
visit_Arel_Attributes_Float(o)
visit_Arel_Attributes_Integer(o)
visit_Arel_Attributes_String(o)
visit_Arel_Attributes_Time(o)
visit_Arel_Nodes_And(o)
Alias for: nary
visit_Arel_Nodes_As(o)
Alias for: binary
visit_Arel_Nodes_Assignment(o)
Alias for: binary
visit_Arel_Nodes_Avg(o)
Alias for: function
visit_Arel_Nodes_Between(o)
Alias for: binary
visit_Arel_Nodes_BindParam(o)
Alias for: visit_String
visit_Arel_Nodes_Count(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 42
def visit_Arel_Nodes_Count o
  visit_edge o, "expressions"
  visit_edge o, "distinct"
end
visit_Arel_Nodes_DeleteStatement(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 63
def visit_Arel_Nodes_DeleteStatement o
  visit_edge o, "relation"
  visit_edge o, "wheres"
end
visit_Arel_Nodes_DoesNotMatch(o)
Alias for: binary
visit_Arel_Nodes_Equality(o)
Alias for: binary
visit_Arel_Nodes_Exists(o)
Alias for: function
visit_Arel_Nodes_Extract(o)
Alias for: extract
visit_Arel_Nodes_Following(o)
Alias for: unary
visit_Arel_Nodes_FullOuterJoin(o)
visit_Arel_Nodes_GreaterThan(o)
Alias for: binary
visit_Arel_Nodes_GreaterThanOrEqual(o)
Alias for: binary
visit_Arel_Nodes_Group(o)
Alias for: unary
visit_Arel_Nodes_Grouping(o)
Alias for: unary
visit_Arel_Nodes_Having(o)
Alias for: unary
visit_Arel_Nodes_In(o)
Alias for: binary
visit_Arel_Nodes_InnerJoin(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 55
def visit_Arel_Nodes_InnerJoin o
  visit_edge o, "left"
  visit_edge o, "right"
end
visit_Arel_Nodes_InsertStatement(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 124
def visit_Arel_Nodes_InsertStatement o
  visit_edge o, "relation"
  visit_edge o, "columns"
  visit_edge o, "values"
end
visit_Arel_Nodes_JoinSource(o)
Alias for: binary
visit_Arel_Nodes_LessThan(o)
Alias for: binary
visit_Arel_Nodes_LessThanOrEqual(o)
Alias for: binary
visit_Arel_Nodes_Limit(o)
Alias for: unary
visit_Arel_Nodes_Matches(o)
Alias for: binary
visit_Arel_Nodes_Max(o)
Alias for: function
visit_Arel_Nodes_Min(o)
Alias for: function
visit_Arel_Nodes_NamedFunction(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 117
def visit_Arel_Nodes_NamedFunction o
  visit_edge o, "name"
  visit_edge o, "expressions"
  visit_edge o, "distinct"
  visit_edge o, "alias"
end
visit_Arel_Nodes_NamedWindow(o)
Alias for: named_window
visit_Arel_Nodes_Not(o)
Alias for: unary
visit_Arel_Nodes_NotEqual(o)
Alias for: binary
visit_Arel_Nodes_NotIn(o)
Alias for: binary
visit_Arel_Nodes_Offset(o)
Alias for: unary
visit_Arel_Nodes_On(o)
Alias for: unary
visit_Arel_Nodes_Or(o)
Alias for: binary
visit_Arel_Nodes_Ordering(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 33
def visit_Arel_Nodes_Ordering o
  visit_edge o, "expr"
end
visit_Arel_Nodes_OuterJoin(o)
visit_Arel_Nodes_Over(o)
Alias for: binary
visit_Arel_Nodes_Preceding(o)
Alias for: unary
visit_Arel_Nodes_Range(o)
Alias for: unary
visit_Arel_Nodes_RightOuterJoin(o)
visit_Arel_Nodes_Rows(o)
Alias for: unary
visit_Arel_Nodes_SelectCore(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 130
def visit_Arel_Nodes_SelectCore o
  visit_edge o, "source"
  visit_edge o, "projections"
  visit_edge o, "wheres"
  visit_edge o,  "windows"
end
visit_Arel_Nodes_SelectStatement(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 137
def visit_Arel_Nodes_SelectStatement o
  visit_edge o, "cores"
  visit_edge o, "limit"
  visit_edge o, "orders"
  visit_edge o, "offset"
end
visit_Arel_Nodes_SqlLiteral(o)
Alias for: visit_String
visit_Arel_Nodes_StringJoin(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 51
def visit_Arel_Nodes_StringJoin o
  visit_edge o, "left"
end
visit_Arel_Nodes_Sum(o)
Alias for: function
visit_Arel_Nodes_TableAlias(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 37
def visit_Arel_Nodes_TableAlias o
  visit_edge o, "name"
  visit_edge o, "relation"
end
visit_Arel_Nodes_Top(o)
Alias for: unary
visit_Arel_Nodes_UnqualifiedColumn(o)
Alias for: unary
visit_Arel_Nodes_UpdateStatement(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 144
def visit_Arel_Nodes_UpdateStatement o
  visit_edge o, "relation"
  visit_edge o, "wheres"
  visit_edge o, "values"
end
visit_Arel_Nodes_Values(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 47
def visit_Arel_Nodes_Values o
  visit_edge o, "expressions"
end
visit_Arel_Nodes_Window(o)
Alias for: window
visit_Arel_Table(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 150
def visit_Arel_Table o
  visit_edge o, "name"
end
visit_Array(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 215
def visit_Array o
  o.each_with_index do |x,i|
    edge(i) { visit x }
  end
end
Also aliased as: visit_Set
visit_BigDecimal(o)
Alias for: visit_String
visit_Date(o)
Alias for: visit_String
visit_DateTime(o)
Alias for: visit_String
visit_FalseClass(o)
Alias for: visit_String
visit_Fixnum(o)
Alias for: visit_String
visit_Float(o)
Alias for: visit_String
visit_Hash(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 209
def visit_Hash o
  o.each_with_index do |pair, i|
    edge("pair_#{i}")   { visit pair }
  end
end
visit_NilClass(o)
Alias for: visit_String
visit_Set(o)
Alias for: visit_Array
visit_String(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 193
def visit_String o
  @node_stack.last.fields << o
end
visit_Symbol(o)
Alias for: visit_String
visit_Time(o)
Alias for: visit_String
visit_TrueClass(o)
Alias for: visit_String
visit_edge(o, method) click to toggle source
# File lib/arel/visitors/dot.rb, line 222
def visit_edge o, method
  edge(method) { visit o.send(method) }
end
window(o) click to toggle source
# File lib/arel/visitors/dot.rb, line 85
def window o
  visit_edge o, "partitions"
  visit_edge o, "orders"
  visit_edge o, "framing"
end
Also aliased as: visit_Arel_Nodes_Window
with_node(node) { || ... } click to toggle source
# File lib/arel/visitors/dot.rb, line 248
def with_node node
  if edge = @edge_stack.last
    edge.to = node
  end

  @node_stack.push node
  yield
  @node_stack.pop
end