Class: ClickHouse::SQL::Query

Inherits:
Object
  • Object
show all
Includes:
Part
Defined in:
lib/clickhouse/sql/query.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sql:, redacted_sql:, placeholders:, placeholder_types:) ⇒ ClickHouse::SQL::Query

Builds an immutable query object satisfying the client query protocol (#to_sql and #placeholders) accepted by ClickHouse::HTTPClient.

Parameters:

  • sql (String, #to_s)

    Fully rendered SQL containing typed ClickHouse placeholders.

  • redacted_sql (String, #to_s)

    Redacted SQL template containing internal bind tokens.

  • placeholders (Hash{Symbol,String=>Object})

    Placeholder values keyed by name.

  • placeholder_types (Hash{Symbol,String=>String})

    Placeholder types keyed by name.

Raises:



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/clickhouse/sql/query.rb', line 36

def initialize(sql:, redacted_sql:, placeholders:, placeholder_types:)
  raise Error, "Empty SQL query given" if ValueNormalization.blank_string?(sql)
  raise Error, "Empty redacted SQL query given" if ValueNormalization.blank_string?(redacted_sql)

  @sql = sql.to_s.dup.freeze
  @redacted_sql = redacted_sql.to_s.dup.freeze
  @placeholders = immutable_symbolized_hash(placeholders)
  @placeholder_types = immutable_symbolized_hash(placeholder_types)

  validate_nil_placeholders!
  freeze
end

Instance Attribute Details

#placeholder_typesHash{Symbol=>String} (readonly)

Returns ClickHouse placeholder types used by this query.

Returns:

  • (Hash{Symbol=>String})

    Placeholder types keyed by name.



78
79
80
# File 'lib/clickhouse/sql/query.rb', line 78

def placeholder_types
  @placeholder_types
end

#placeholdersHash{Symbol=>Object} (readonly)

Returns typed placeholder values used by this query.

Returns:

  • (Hash{Symbol=>Object})

    Placeholder values keyed by name.



73
74
75
# File 'lib/clickhouse/sql/query.rb', line 73

def placeholders
  @placeholders
end

Class Method Details

.redacted_bind_index_manager#next_bind_str

Builds a bind index manager for compiled redacted SQL templates.

Returns:

  • (#next_bind_str)

    Bind index manager that emits internal bind tokens.



24
25
26
# File 'lib/clickhouse/sql/query.rb', line 24

def self.redacted_bind_index_manager
  RedactedBindIndexManager.new
end

Instance Method Details

#to_redacted_sql(bind_index_manager = ClickHouse::SQL::BindIndexManager.new) ⇒ String

Renders the final SQL with typed placeholders replaced by bind markers.

Parameters:

Returns:

  • (String)

    Redacted SQL query text.



60
61
62
63
64
65
66
67
68
# File 'lib/clickhouse/sql/query.rb', line 60

def to_redacted_sql(bind_index_manager = ClickHouse::SQL::BindIndexManager.new)
  parts = @redacted_sql.split(REDACTED_BIND_TOKEN, -1)
  return @redacted_sql if parts.length == 1

  parts.each_with_index.with_object(+"") do |(part, index), rendered|
    rendered << part
    rendered << bind_index_manager.next_bind_str unless index == parts.length - 1
  end
end

#to_sqlString

Renders the final SQL with ClickHouse typed placeholders intact.

Returns:

  • (String)

    SQL query text.



52
53
54
# File 'lib/clickhouse/sql/query.rb', line 52

def to_sql
  @sql
end