class SqlFingerprint::AbstractQuery

Public Class Methods

build(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 6
def build(query)
  query = query.downcase.chomp
  query = remove_comments(query)
  query = remove_quotes(query)
  query = remove_constants(query)
  query = remove_double_spaces(query)
  query = remove_newlines(query)
  query = remove_in_values(query)
  query = remove_offsets(query)
  query.strip
end

Private Class Methods

remove_comments(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 20
def remove_comments(query)
  query
    .gsub(/(?:--|#)[^'"\r\n]*(?=[\r\n]|\Z)/, ' ')
    .gsub(%r{/\*[^!].*?\*/}m, ' ')
end
remove_constants(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 38
def remove_constants(query)
  query
    .gsub(/".*?"/, '?')
    .gsub(/'.*?'/, '?')
    .gsub(/\bfalse\b|\btrue\b/, '?')
    .gsub(/[0-9+-][0-9a-f.xb+-]*/, '?')
    .gsub(/\b[0-9+-][0-9a-f.xb+-]*/, '?')
    .gsub(/\bnull\b/, '?')
end
remove_double_spaces(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 30
def remove_double_spaces(query)
  query.gsub(/\s+/, ' ')
end
remove_in_values(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 48
def remove_in_values(query)
  query.gsub(/\b(in|values?)(?:[\s,]*\([\s?,]*\))+/, '\1(?+)')
end
remove_newlines(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 26
def remove_newlines(query)
  query.gsub(/\r\n?/, ' ')
end
remove_offsets(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 52
def remove_offsets(query)
  query.gsub(/\blimit \?(?:, ?\?| offset \?)?/, 'limit ?')
end
remove_quotes(query) click to toggle source
# File lib/sql_fingerprint/abstract_query.rb, line 34
def remove_quotes(query)
  query.gsub(/\\["']/, '')
end