Class: ClickHouse::Client::Query

Inherits:
QueryLike show all
Defined in:
lib/click_house/client/query.rb

Constant Summary collapse

SUBQUERY_PLACEHOLDER_REGEX =

example: var:Subquery, special “internal” type for subqueries

/{\w+:Subquery}/
PLACEHOLDER_REGEX =

example: var:UInt8 or var:Array(UInt8)

/{\w+:(\w|[()])+}/
PLACEHOLDER_NAME_REGEX =

example: var:UInt8 => var

/{(\w+):/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw_query:, placeholders: {}) ⇒ Query

Returns a new instance of Query.

Raises:



16
17
18
19
20
21
# File 'lib/click_house/client/query.rb', line 16

def initialize(raw_query:, placeholders: {})
  raise QueryError, 'Empty query string given' if raw_query.blank?

  @raw_query = raw_query
  @placeholders = placeholders || {}
end

Class Method Details

.build(query) ⇒ Object



10
11
12
13
14
# File 'lib/click_house/client/query.rb', line 10

def self.build(query)
  return query if query.is_a?(ClickHouse::Client::QueryLike)

  new(raw_query: query)
end

Instance Method Details

#prepared_placeholdersObject

List of placeholders to be sent to ClickHouse for replacement. If there are subqueries, merge their placeholders as well.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/click_house/client/query.rb', line 25

def prepared_placeholders
  all_placeholders = placeholders.select { |_, v| !v.is_a?(QueryLike) }
  all_placeholders.transform_values! { |v| prepared_placeholder_value(v) }

  placeholders.each_value do |value|
    next unless value.is_a?(QueryLike)

    all_placeholders.merge!(value.prepared_placeholders) do |key, a, b|
      raise QueryError, "mismatching values for the '#{key}' placeholder: #{a} vs #{b}"
    end
  end

  all_placeholders
end

#to_redacted_sql(bind_index_manager = BindIndexManager.new) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/click_house/client/query.rb', line 54

def to_redacted_sql(bind_index_manager = BindIndexManager.new)
  raw_query.gsub(PLACEHOLDER_REGEX) do |placeholder_in_query|
    value = placeholder_value(placeholder_in_query)

    if value.is_a?(QueryLike)
      value.to_redacted_sql(bind_index_manager)
    else
      bind_index_manager.next_bind_str
    end
  end
end

#to_sqlObject

Placeholder replacement is handled by ClickHouse, only subquery placeholders will be replaced.



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/click_house/client/query.rb', line 42

def to_sql
  raw_query.gsub(SUBQUERY_PLACEHOLDER_REGEX) do |placeholder_in_query|
    value = placeholder_value(placeholder_in_query)

    if value.is_a?(QueryLike)
      value.to_sql
    else
      placeholder_in_query
    end
  end
end