module Olaf::QueryDefinition

Attributes

sql_template[R]
variables[R]

Public Class Methods

included(base) click to toggle source
# File lib/olaf/query_definition.rb, line 8
def self.included(base)
  base.extend(Olaf::QueryDefinition::ClassMethods)
end
new(**variables) click to toggle source
# File lib/olaf/query_definition.rb, line 12
def initialize(**variables)
  @variables = variables
  @sql_template = nil
end

Public Instance Methods

==(other) click to toggle source
# File lib/olaf/query_definition.rb, line 49
def ==(other)
  self.class == other.class && self.variables == other.variables
end
defined_arguments() click to toggle source
# File lib/olaf/query_definition.rb, line 53
def defined_arguments
  self.class.arguments.keys
end
metadata() click to toggle source
# File lib/olaf/query_definition.rb, line 41
def metadata
  {
    query_class: self.class.name,
    arguments: variables,
    sql_template: sql_template,
  }
end
missing_arguments() click to toggle source
# File lib/olaf/query_definition.rb, line 57
def missing_arguments
  defined_arguments - @variables.keys
end
prepare() click to toggle source

Loads the SQL template and validate all the arguments are defined AND present. The instance will be ready to be executed.

@return QueryDefinition instance

@raises Snowflake::UndefinedArgumentsError
@raises Snowflake::MissingArgumentsError
# File lib/olaf/query_definition.rb, line 25
def prepare
  @sql_template ||= File.read(self.class.template)

  raise UndefinedArgumentsError, self if undefined_arguments.any?
  raise MissingArgumentsError, self if missing_arguments.any?
  raise UnknownArgumentsError, self if unknown_arguments.any?

  literal_arguments = self.class.arguments.select { |_k, v| v[:literal] }.keys

  variables.slice(*literal_arguments).each do |placeholder, literal_value|
    @sql_template.gsub!(":#{placeholder}", literal_value)
  end

  self
end
undefined_arguments() click to toggle source

Every placeholder MUST be declared as an `argument` of the query.

# File lib/olaf/query_definition.rb, line 62
def undefined_arguments
  placeholders - defined_arguments
end
unknown_arguments() click to toggle source

Every `argument` declared in the query MUST have a placeholder in the SQL file.

# File lib/olaf/query_definition.rb, line 67
def unknown_arguments
  defined_arguments - placeholders
end

Private Instance Methods

placeholders() click to toggle source

Find placeholders in the SQL file.

# File lib/olaf/query_definition.rb, line 74
def placeholders
  @placeholders ||= @sql_template.scan(/[^:]:(\w+)/).flatten.map(&:to_sym).uniq
end