class Mkxms::Mssql::AdoptionScriptWriter::StatisticsAdoptionChecks

Attributes

stats_id[R]

Public Class Methods

new(statistics, error_sql_proc) click to toggle source
Calls superclass method
# File lib/mkxms/mssql/adoption_script_writer.rb, line 1699
def initialize(statistics, error_sql_proc)
  super()
  
  @statistics = statistics
  @error_sql_proc = error_sql_proc
  
  @stats_id = "statistics #{statistics.name} on #{statistics.qualified_relation}"
  
  dsl {
    puts "IF NOT EXISTS (%s)" do
      puts dedent %Q{
        SELECT * FROM sys.stats so
        INNER JOIN sys.objects rel ON so.object_id = rel.object_id
        INNER JOIN sys.schemas s ON rel.schema_id = s.schema_id
        WHERE s.name = #{strlit(unquoted_identifier statistics.schema)}
        AND rel.name = #{strlit(unquoted_identifier statistics.relation)}
        AND so.name = #{strlit(unquoted_identifier statistics.name)}
      }
    end
    puts "BEGIN"
    indented {
      puts error_sql "#{stats_id.capitalize} does not exist."
    }
    puts "END ELSE BEGIN"
    indented {
      # Check column sequence
      QueryCursor.new(
        dedent(%Q{
          SELECT c.name
          FROM sys.stats so
          JOIN sys.stats_columns sc
            ON so.object_id = sc.object_id
            AND so.stats_id = sc.stats_id
          JOIN sys.columns c
            ON sc.object_id = c.object_id
            AND sc.column_id = c.column_id
          JOIN sys.objects rel ON so.object_id = rel.object_id
          JOIN sys.schemas s ON rel.schema_id = s.schema_id
          WHERE s.name = #{strlit(unquoted_identifier statistics.schema)}
          AND rel.name = #{strlit(unquoted_identifier statistics.relation)}
          AND so.name = #{strlit(unquoted_identifier statistics.name)}
          ORDER BY sc.stats_column_id
        }),
        "@column_name SYSNAME",
        output_to: self
      ).expectations(
        on_extra: ->{puts error_sql "#{stats_id.capitalize} has one or more unexpected columns."},
      ) do |test|
        statistics.columns.each.with_index do |col_name, i|
          test.row(
            on_missing: ->{puts error_sql "#{stats_id.capitalize} is missing #{col_name}."},
          ) {
            puts "IF QUOTENAME(@column_name) <> #{strlit col_name}"
            puts "BEGIN".."END" do
              puts error_sql "Expected #{col_name} as column #{i + 1} of #{stats_id}."
            end
          }
        end
      end
    }
    puts "END"
  }
end

Public Instance Methods

error_sql(s) click to toggle source
# File lib/mkxms/mssql/adoption_script_writer.rb, line 1765
def error_sql(s)
  @error_sql_proc.call(s)
end