Sha256: fae5bffa3139f7998528bc03fc97c0a7b73fa71c56cee10ea51595a2bcc8a1bb

Contents?: true

Size: 1.38 KB

Versions: 30

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true

module Motor
  module Queries
    module RenderSqlTemplate
      SECTION_OPEN_REGEXP = /{{([#^])\s*(\w+)}}.*\z/m.freeze
      VARIABLE_REGEXP = /{{\s*(\w+)\s*}}/m.freeze

      module_function

      def call(sql, variables)
        result = render_sections(sql, variables)

        interpolate_variables(result, variables)
      end

      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 }
            selected_variables << [variable_name, variables[variable_name]] unless index

            "$#{selected_variables.size}"
          end

        [rendered, selected_variables]
      end

      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

      def build_section_close_regexp(variable_name)
        %r{{{[#^/]s*#{Regexp.escape(variable_name)}\s*}}}m
      end
    end
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
motor-admin-0.1.60 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.58 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.57 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.56 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.55 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.54 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.53 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.52 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.51 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.50 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.49 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.48 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.47 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.46 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.44 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.43 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.42 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.41 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.40 lib/motor/queries/render_sql_template.rb
motor-admin-0.1.39 lib/motor/queries/render_sql_template.rb