Sha256: 07d1af4acffaa39cfd13db77f05d77d7665af1eaa17d5682f591c621b007649e

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

# typed: strict
# frozen_string_literal: true

require "erb"
require "tmpdir"

module WtActiverecordIndexSpy
  # This class aggregates all queries that were considered not using index.
  # Since it's not possible to be sure for every query, it separates the result
  # in certains and uncertains.
  class Aggregator
    extend T::Sig

    Results = T.type_alias { T::Hash[String, Item] }

    sig {returns(Results)}
    attr_reader :results

    class Item < T::Struct
      prop :identifier, String
      prop :query, String
      prop :origin, String
      prop :certainity_level, Symbol
    end

    sig {void}
    def initialize
      @results = T.let({}, Results)
    end

    sig {void}
    def reset
      @results = {}
      nil
    end

    sig {params(item: Item).returns(Item)}
    def add(item)
      @results[item.query] = item
    end

    sig {returns(T::Array[Item])}
    def certain_results
      @results.map do |_query, item|
        item if item.certainity_level == :certain
      end.compact
    end

    sig {returns(T::Array[Item])}
    def uncertain_results
      @results.map do |_query, item|
        item if item.certainity_level == :uncertain
      end.compact
    end

    sig do
      params(
        file: T.nilable(T.any(File, Tempfile)),
        stdout: IO
      )
      .void
      .checked(:compiled)
    end
    def export_html_results(file=nil, stdout: $stdout)
      file ||= default_html_output_file
      content = ERB.new(File.read(File.join(File.dirname(__FILE__), "./results.html.erb")), 0, "-")
                   .result_with_hash(certain_results: certain_results, uncertain_results: uncertain_results)

      file.write(content)
      file.close
      stdout.puts "Report exported to #{file.path}"
    end

    private

    sig {returns(File)}
    def default_html_output_file
      File.new(
        File.join(Dir.tmpdir, "wt_activerecord_index_spy-results.html"),
        "w"
      )
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wt_activerecord_index_spy-0.5.0 lib/wt_activerecord_index_spy/aggregator.rb