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