binary(o)
click to toggle source
def binary o
visit_edge o, "left"
visit_edge o, "right"
end
Also aliased as:
visit_Arel_Nodes_As,
visit_Arel_Nodes_Assignment,
visit_Arel_Nodes_Between,
visit_Arel_Nodes_DoesNotMatch,
visit_Arel_Nodes_Equality,
visit_Arel_Nodes_GreaterThan,
visit_Arel_Nodes_GreaterThanOrEqual,
visit_Arel_Nodes_In,
visit_Arel_Nodes_JoinSource,
visit_Arel_Nodes_LessThan,
visit_Arel_Nodes_LessThanOrEqual,
visit_Arel_Nodes_Matches,
visit_Arel_Nodes_NotEqual,
visit_Arel_Nodes_NotIn,
visit_Arel_Nodes_Or,
visit_Arel_Nodes_Over
edge(name) { || ... }
click to toggle source
def edge name
edge = Edge.new(name, @node_stack.last)
@edge_stack.push edge
@edges << edge
yield
@edge_stack.pop
end
function(o)
click to toggle source
def function o
visit_edge o, "expressions"
visit_edge o, "distinct"
visit_edge o, "alias"
end
named_window(o)
click to toggle source
def named_window o
visit_edge o, "partitions"
visit_edge o, "orders"
visit_edge o, "framing"
visit_edge o, "name"
end
nary(o)
click to toggle source
def nary o
o.children.each_with_index do |x,i|
edge(i) { visit x }
end
end
quote(string)
click to toggle source
def quote string
string.to_s.gsub('"', '\"')
end
to_dot()
click to toggle source
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
unary(o)
click to toggle source
def unary o
visit_edge o, "expr"
end
Also aliased as:
visit_Arel_Nodes_Group,
visit_Arel_Nodes_Grouping,
visit_Arel_Nodes_Having,
visit_Arel_Nodes_Limit,
visit_Arel_Nodes_Not,
visit_Arel_Nodes_Offset,
visit_Arel_Nodes_On,
visit_Arel_Nodes_Top,
visit_Arel_Nodes_UnqualifiedColumn,
visit_Arel_Nodes_Preceding,
visit_Arel_Nodes_Following,
visit_Arel_Nodes_Rows,
visit_Arel_Nodes_Range
visit(o)
click to toggle source
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
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_Assignment(o)
visit_Arel_Nodes_Between(o)
visit_Arel_Nodes_BindParam(o)
visit_Arel_Nodes_Count(o)
click to toggle source
def visit_Arel_Nodes_Count o
visit_edge o, "expressions"
visit_edge o, "distinct"
end
visit_Arel_Nodes_DeleteStatement(o)
click to toggle source
def visit_Arel_Nodes_DeleteStatement o
visit_edge o, "relation"
visit_edge o, "wheres"
end
visit_Arel_Nodes_DoesNotMatch(o)
visit_Arel_Nodes_Equality(o)
visit_Arel_Nodes_Exists(o)
visit_Arel_Nodes_Following(o)
visit_Arel_Nodes_FullOuterJoin(o)
visit_Arel_Nodes_GreaterThan(o)
visit_Arel_Nodes_GreaterThanOrEqual(o)
visit_Arel_Nodes_Group(o)
visit_Arel_Nodes_Grouping(o)
visit_Arel_Nodes_Having(o)
visit_Arel_Nodes_InnerJoin(o)
click to toggle source
def visit_Arel_Nodes_InnerJoin o
visit_edge o, "left"
visit_edge o, "right"
end
visit_Arel_Nodes_InsertStatement(o)
click to toggle source
def visit_Arel_Nodes_InsertStatement o
visit_edge o, "relation"
visit_edge o, "columns"
visit_edge o, "values"
end
visit_Arel_Nodes_JoinSource(o)
visit_Arel_Nodes_LessThan(o)
visit_Arel_Nodes_LessThanOrEqual(o)
visit_Arel_Nodes_Limit(o)
visit_Arel_Nodes_Matches(o)
visit_Arel_Nodes_NamedFunction(o)
click to toggle source
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)
visit_Arel_Nodes_NotEqual(o)
visit_Arel_Nodes_NotIn(o)
visit_Arel_Nodes_Offset(o)
visit_Arel_Nodes_Ordering(o)
click to toggle source
def visit_Arel_Nodes_Ordering o
visit_edge o, "expr"
end
visit_Arel_Nodes_OuterJoin(o)
visit_Arel_Nodes_Preceding(o)
visit_Arel_Nodes_Range(o)
visit_Arel_Nodes_RightOuterJoin(o)
visit_Arel_Nodes_SelectCore(o)
click to toggle source
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
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)
visit_Arel_Nodes_StringJoin(o)
click to toggle source
def visit_Arel_Nodes_StringJoin o
visit_edge o, "left"
end
visit_Arel_Nodes_TableAlias(o)
click to toggle source
def visit_Arel_Nodes_TableAlias o
visit_edge o, "name"
visit_edge o, "relation"
end
visit_Arel_Nodes_UnqualifiedColumn(o)
visit_Arel_Nodes_UpdateStatement(o)
click to toggle source
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
def visit_Arel_Nodes_Values o
visit_edge o, "expressions"
end
visit_Arel_Nodes_Window(o)
visit_Arel_Table(o)
click to toggle source
def visit_Arel_Table o
visit_edge o, "name"
end
visit_Array(o)
click to toggle source
def visit_Array o
o.each_with_index do |x,i|
edge(i) { visit x }
end
end
visit_Hash(o)
click to toggle source
def visit_Hash o
o.each_with_index do |pair, i|
edge("pair_#{i}") { visit pair }
end
end
visit_String(o)
click to toggle source
def visit_String o
@node_stack.last.fields << o
end
Also aliased as:
visit_Time,
visit_Date,
visit_DateTime,
visit_NilClass,
visit_TrueClass,
visit_FalseClass,
visit_Arel_Nodes_BindParam,
visit_Fixnum,
visit_BigDecimal,
visit_Float,
visit_Symbol,
visit_Arel_Nodes_SqlLiteral
visit_edge(o, method)
click to toggle source
def visit_edge o, method
edge(method) { visit o.send(method) }
end
window(o)
click to toggle source
def window o
visit_edge o, "partitions"
visit_edge o, "orders"
visit_edge o, "framing"
end
with_node(node) { || ... }
click to toggle source
def with_node node
if edge = @edge_stack.last
edge.to = node
end
@node_stack.push node
yield
@node_stack.pop
end