module Motor::Queries::RenderSqlTemplate

Constants

SECTION_OPEN_REGEXP
VARIABLE_REGEXP

Public Instance Methods

build_section_close_regexp(variable_name) click to toggle source
# File lib/motor/queries/render_sql_template.rb, line 56
def build_section_close_regexp(variable_name)
  %r{{{[#^/]s*#{Regexp.escape(variable_name)}\s*}}}m
end
call(sql, variables) click to toggle source
# File lib/motor/queries/render_sql_template.rb, line 11
def call(sql, variables)
  result = render_sections(sql, variables)

  interpolate_variables(result, variables)
end
interpolate_variables(sql, variables) click to toggle source
# File lib/motor/queries/render_sql_template.rb, line 17
def interpolate_variables(sql, variables)
  selected_variables = []

  rendered =
    sql.gsub(VARIABLE_REGEXP) do
      variable_name = Regexp.last_match[1]

      index = selected_variables.index { |name, _| name == variable_name }
      variable_values = variables[variable_name]

      if variable_values.is_a?(Array)
        first_variable_index = selected_variables.size + 1

        variable_values.each { |value| selected_variables << [variable_name, value] } unless index

        (first_variable_index..selected_variables.size).map { |i| "$#{i}" }.join(', ')
      else
        selected_variables << [variable_name, variables[variable_name]] unless index

        "$#{selected_variables.size}"
      end
    end

  [rendered, selected_variables]
end
render_sections(sql, variables) click to toggle source
# File lib/motor/queries/render_sql_template.rb, line 43
def render_sections(sql, variables)
  sql.sub(SECTION_OPEN_REGEXP) do |e|
    variable_name = Regexp.last_match[2]
    is_negative = Regexp.last_match[1] == '^'

    _, content, rest = e.split(build_section_close_regexp(variable_name), 3)

    is_present = variables[variable_name].present?

    render_sections(is_present ^ is_negative ? content + rest.to_s : rest, variables)
  end
end