class QueryHelper::SqlManipulator

Attributes

sql[RW]

Public Class Methods

new( sql:, where_clauses: nil, having_clauses: nil, order_by_clauses: nil, include_limit_clause: false, additional_select_clauses: [] ) click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 8
def initialize(
  sql:,
  where_clauses: nil,
  having_clauses: nil,
  order_by_clauses: nil,
  include_limit_clause: false,
  additional_select_clauses: []
)
  @parser = SqlParser.new(sql)
  @sql = @parser.sql.dup
  @where_clauses = where_clauses
  @having_clauses = having_clauses
  @order_by_clauses = order_by_clauses
  @include_limit_clause = include_limit_clause
  @additional_select_clauses = additional_select_clauses
end

Public Instance Methods

build() click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 25
def build
  insert_having_clauses()
  insert_where_clauses()
  insert_select_clauses()
  insert_order_by_and_limit_clause()
  @sql.squish
end

Private Instance Methods

insert_having_clauses() click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 49
def insert_having_clauses
  return unless @having_clauses.length > 0
  begin_string = @parser.having_included? ? "and" : "having"
  filter_string = @having_clauses.join(" and ")
  @sql.insert(@parser.insert_having_index, " #{begin_string} #{filter_string} ")
end
insert_order_by_and_limit_clause() click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 56
def insert_order_by_and_limit_clause
  @sql.slice!(@parser.limit_clause) if @parser.limit_included? # remove existing limit clause
  @sql.slice!(@parser.order_by_clause) if @parser.order_by_included? && @order_by_clauses.length > 0 # remove existing order by clause
  @sql += " order by #{@order_by_clauses.join(", ")} " if @order_by_clauses.length > 0
  @sql += " limit :limit offset :offset " if @include_limit_clause
end
insert_select_clauses() click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 35
def insert_select_clauses
  total_count_clause = "count(*) over () as _query_full_count"
  @additional_select_clauses << total_count_clause if @include_limit_clause
  @sql.insert(@parser.insert_select_index, " , #{@additional_select_clauses.join(", ")} ") if @additional_select_clauses.length > 0
end
insert_where_clauses() click to toggle source
# File lib/query_helper/sql_manipulator.rb, line 41
def insert_where_clauses
  return unless @where_clauses.length > 0
  begin_string = @parser.where_included? ? "and" : "where"
  filter_string = @where_clauses.join(" and ")
  "  #{begin_string} #{filter_string}  "
  @sql.insert(@parser.insert_where_index, " #{begin_string} #{filter_string} ")
end