Sha256: a4b454ae510c5e7779df51a69834246718f5ccc99c36c7444b2992c18f68e7dc

Contents?: true

Size: 1.2 KB

Versions: 2

Compression:

Stored size: 1.2 KB

Contents

module Dexter
  class Query
    attr_reader :statement, :fingerprint, :plans
    attr_writer :tables
    attr_accessor :missing_tables, :new_cost, :total_time, :calls, :indexes, :suggest_index, :pass1_indexes, :pass2_indexes

    def initialize(statement, fingerprint = nil)
      @statement = statement
      unless fingerprint
        fingerprint = PgQuery.fingerprint(statement) rescue "unknown"
      end
      @fingerprint = fingerprint
      @plans = []
    end

    def tables
      @tables ||= begin
        parse ? parse.tables : []
      rescue => e
        # possible pg_query bug
        $stderr.puts "Error extracting tables. Please report to https://github.com/ankane/dexter/issues"
        $stderr.puts "#{e.class.name}: #{e.message}"
        $stderr.puts statement
        []
      end
    end

    def tree
      parse.tree
    end

    def explainable?
      plans.any?
    end

    def costs
      plans.map { |plan| plan["Total Cost"] }
    end

    def initial_cost
      costs[0]
    end

    def high_cost?
      initial_cost && initial_cost >= 100
    end

    private

    def parse
      unless defined?(@parse)
        @parse = PgQuery.parse(statement) rescue nil
      end
      @parse
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pgdexter-0.3.1 lib/dexter/query.rb
pgdexter-0.3.0 lib/dexter/query.rb