Class: Delfos::Neo4j::Informer

Inherits:
Object
  • Object
show all
Defined in:
lib/delfos/neo4j/informer.rb

Defined Under Namespace

Classes: QueryVariables

Instance Method Summary collapse

Instance Method Details

#args_query(args) ⇒ Object



92
93
94
95
96
97
98
99
# 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) ⇒ Object



71
72
73
74
75
76
77
# 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) ⇒ Object



11
12
13
14
15
16
# 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) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
# 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) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 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) ⇒ Object



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
# 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) ⇒ Object



101
102
103
# File 'lib/delfos/neo4j/informer.rb', line 101

def query_variable(k)
  query_variables[k.to_s]
end

#query_variablesObject



105
106
107
# File 'lib/delfos/neo4j/informer.rb', line 105

def query_variables
  @query_variables ||= QueryVariables.new
end

#save_call_stack(call_sites, execution_number) ⇒ Object



6
7
8
9
# 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