class Flows::Plugin::Profiler::Report::Tree::CalculatedNode

@api private

Constants

MICROSECONDS_IN_MILLISECOND

Attributes

children[R]

Public Class Methods

new(node) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 12
def initialize(node)
  @node = node
  @children = node.children
                  .map { |child| self.class.new(child) }
                  .sort_by(&:total_ms)
                  .reverse
end

Public Instance Methods

avg_ms() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 32
def avg_ms
  @avg_ms ||= total_ms / count
end
avg_self_ms() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 52
def avg_self_ms
  @avg_self_ms ||= total_self_ms / count
end
children_ms() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 36
def children_ms
  @children_ms ||= children.map(&:total_ms).sort.sum
end
count() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 24
def count
  @count ||= @node.executions.count
end
group_by_subject() click to toggle source

:reek: DuplicateMethodCall :reek: NestedIterators

# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 76
def group_by_subject
  @group_by_subject ||= (
    [children.group_by(&:subject)] + children.map(&:group_by_subject)
  ).each_with_object({}) do |group, result|
    group.each do |subject, nodes|
      result[subject] ||= []
      result[subject] += nodes
    end
  end
end
subject() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 20
def subject
  @node.subject
end
to_h(root_node = self) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 56
def to_h(root_node = self) # rubocop:disable Metrics/MethodLength
  @to_h ||= {
    subject: subject,
    count: count,
    total_ms: total_ms,
    total_percentage: total_percentage(root_node),
    total_self_ms: total_self_ms,
    total_self_percentage: total_self_percentage(root_node),
    avg_ms: avg_ms,
    avg_self_ms: avg_self_ms,
    nested: children.map { |node| node.to_h(root_node) }
  }
end
to_s(root_node = self) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 70
def to_s(root_node = self)
  @to_s ||= (base_text_list(root_node) + childeren_text_list(root_node)).join("\n")
end
total_ms() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 28
def total_ms
  @total_ms ||= @node.executions.sort.sum / MICROSECONDS_IN_MILLISECOND
end
total_percentage(root_node = self) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 48
def total_percentage(root_node = self)
  @total_percentage ||= total_ms / root_node.children_ms * 100.0
end
total_self_ms() click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 40
def total_self_ms
  @total_self_ms ||= total_ms - children_ms
end
total_self_percentage(root_node = self) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 44
def total_self_percentage(root_node = self)
  @total_self_percentage ||= total_self_ms / root_node.children_ms * 100.0
end

Private Instance Methods

base_text_list(root_node) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 89
def base_text_list(root_node) # rubocop:disable Metrics/MethodLength
  [
    '',
    "- #{subject} -",
    "called:                      #{count} time(s)",
    "total execution time:        #{total_ms.truncate(2)}ms",
    "total percentage:            #{total_percentage(root_node).truncate(2)}%",
    "total self execution time:   #{total_self_ms.truncate(2)}ms",
    "total self percentage:       #{total_self_percentage(root_node).truncate(2)}%",
    "average execution time:      #{avg_ms.truncate(2)}ms",
    "average self execution time: #{avg_self_ms.truncate(2)}ms"
  ]
end
childeren_text_list(root_node) click to toggle source
# File lib/flows/plugin/profiler/report/tree/calculated_node.rb, line 103
def childeren_text_list(root_node)
  return [] if @children.empty?

  children.map { |node| node.to_s(root_node) }
          .join("\n")
          .split("\n")
          .map { |str| "|    #{str}" }
end