class Delfos::Neo4j::Informer

Public Instance Methods

args_query(args) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 92
def args_query(args)
  query_text = args.argument_classes.map do |k|
    name = query_variable(k)
    "MERGE (cs) - [:ARG] -> (#{name})"
  end

  query_text.join("\n")
end
assign_query_variables(args, call_site, called_code) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 71
def assign_query_variables(args, call_site, called_code)
  klasses = [call_site.klass, called_code.klass] + args.argument_classes

  klasses.uniq.each do |k|
    query_variables.assign(k, "k")
  end
end
log(args, call_site, called_code) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 11
def log(args, call_site, called_code)
  query = query_for(args, call_site, called_code)
  params = params_for(args, call_site, called_code)

  Neo4j.execute(query, params)
end
method_node(id) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 79
      def method_node(id)
        <<-NODE
          (#{id}:Method
            {
              type: {#{id}_type},
              name: {#{id}_name},
              file: {#{id}_file},
              line_number: {#{id}_line_number}
            }
          )
        NODE
      end
params_for(args, call_site, called_code) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 18
def params_for(args, call_site, called_code)
  assign_query_variables(args, call_site, called_code)

  params = query_variables.each_with_object({}) do |(klass, name), object|
    object[name] = klass.to_s
  end

  params["m1_type"]        = call_site.method_type
  params["m1_name"]        = call_site.method_name
  params["m1_file"]        = call_site.method_definition_file
  params["m1_line_number"] = call_site.method_definition_line

  params["cs_file"]        = call_site.file
  params["cs_line_number"] = call_site.line_number

  params["m2_type"]        = called_code.method_type
  params["m2_name"]        = called_code.method_name
  params["m2_file"]        = called_code.method_definition_file
  params["m2_line_number"] = called_code.method_definition_line

  params
end
query_for(args, call_site, called_code) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 41
      def query_for(args, call_site, called_code)
        assign_query_variables(args, call_site, called_code)

        klasses_query = query_variables.map do |_klass, name|
          "MERGE (#{name}:Class {name: {#{name}}})"
        end.join("\n")

        <<-QUERY
          #{klasses_query}

          MERGE (#{query_variable(call_site.klass)}) - [:OWNS] ->
            #{method_node("m1")}

          MERGE (m1) - [:CONTAINS] ->
            (cs:CallSite
              {
                file: {cs_file},
                line_number: {cs_line_number}
              }
            )

          MERGE (#{query_variable(called_code.klass)}) - [:OWNS] ->
            #{method_node("m2")}

          MERGE (cs) - [:CALLS] -> (m2)

          #{args_query args}
        QUERY
      end
query_variable(k) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 101
def query_variable(k)
  query_variables[k.to_s]
end
query_variables() click to toggle source
# File lib/delfos/neo4j/informer.rb, line 105
def query_variables
  @query_variables ||= QueryVariables.new
end
save_call_stack(call_sites, execution_number) click to toggle source
# File lib/delfos/neo4j/informer.rb, line 6
def save_call_stack(call_sites, execution_number)
  q = Neo4j::CallStackQuery.new(call_sites, execution_number)
  Neo4j.execute(q.query, q.params)
end