Module: ActiveRecord::ConnectionAdapters::Clickhouse::SchemaStatements

Included in:
ActiveRecord::ConnectionAdapters::ClickhouseAdapter
Defined in:
lib/active_record/connection_adapters/clickhouse/schema_statements.rb

Instance Method Summary collapse

Instance Method Details

#assume_migrated_upto_version(version, migrations_paths = nil) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 79

def assume_migrated_upto_version(version, migrations_paths = nil)
  version = version.to_i
  sm_table = quote_table_name(schema_migration.table_name)

  migrated = migration_context.get_all_versions
  versions = migration_context.migrations.map(&:version)

  unless migrated.include?(version)
    exec_insert "INSERT INTO #{sm_table} (version) VALUES (#{quote(version.to_s)})", nil, nil
  end

  inserting = (versions - migrated).select { |v| v < version }
  if inserting.any?
    if (duplicate = inserting.detect { |v| inserting.count(v) > 1 })
      raise "Duplicate migration #{duplicate}. Please renumber your migrations to resolve the conflict."
    end
    do_execute(insert_versions_sql(inserting), nil, settings: {max_partitions_per_insert_block: [100, inserting.size].max})
  end
end

#data_sourcesObject



57
58
59
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 57

def data_sources
  tables
end

#do_execute(sql, name = nil, format: 'JSONCompact', settings: {}) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 69

def do_execute(sql, name = nil, format: 'JSONCompact', settings: {})
  log(sql, "#{adapter_name} #{name}") do
    formatted_sql = apply_format(sql, format)
    request_params = @config || {}
    res = @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql, 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}")

    process_response(res)
  end
end

#do_system_execute(sql, name = nil) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 61

def do_system_execute(sql, name = nil)
  log_with_debug(sql, "#{adapter_name} #{name}") do
    res = @connection.post("/?#{@config.to_param}", "#{sql} FORMAT JSONCompact", 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}")

    process_response(res)
  end
end

#exec_delete(_sql, _name = nil, _binds = []) ⇒ Object

Raises:

  • (ActiveRecord::ActiveRecordError)


37
38
39
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 37

def exec_delete(_sql, _name = nil, _binds = [])
  raise ActiveRecord::ActiveRecordError, 'Clickhouse delete is not supported'
end

#exec_insert(sql, name, _binds, _pk = nil, _sequence_name = nil) ⇒ Object



13
14
15
16
17
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 13

def exec_insert(sql, name, _binds, _pk = nil, _sequence_name = nil)
  new_sql = sql.dup.sub(/ (DEFAULT )?VALUES/, " VALUES")
  do_execute(new_sql, name, format: nil)
  true
end

#exec_insert_all(sql, name) ⇒ Object



28
29
30
31
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 28

def exec_insert_all(sql, name)
  do_execute(sql, name, format: nil)
  true
end

#exec_query(sql, name = nil, binds = [], prepare: false) ⇒ Object



19
20
21
22
23
24
25
26
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 19

def exec_query(sql, name = nil, binds = [], prepare: false)
  result = do_execute(sql, name)
  ActiveRecord::Result.new(result['meta'].map { |m| m['name'] }, result['data'], result['meta'].map { |m| [m['name'], type_map.lookup(m['type'])] }.to_h)
rescue ActiveRecord::ActiveRecordError => e
  raise e
rescue StandardError => e
  raise ActiveRecord::ActiveRecordError, "Response: #{e.message}"
end

#exec_update(_sql, _name = nil, _binds = []) ⇒ Object

Raises:

  • (ActiveRecord::ActiveRecordError)


33
34
35
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 33

def exec_update(_sql, _name = nil, _binds = [])
  raise ActiveRecord::ActiveRecordError, 'Clickhouse update is not supported'
end

#execute(sql, name = nil, settings: {}) ⇒ Object



9
10
11
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 9

def execute(sql, name = nil, settings: {})
  do_execute(sql, name, settings: settings)
end

#indexes(table_name, name = nil) ⇒ Object

Not indexes on clickhouse



53
54
55
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 53

def indexes(table_name, name = nil)
  []
end

#table_options(table) ⇒ Object



47
48
49
50
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 47

def table_options(table)
  sql = show_create_table(table)
  { options: sql.gsub(/^(?:.*?)(?:ENGINE = (.*?))?( AS SELECT .*?)?$/, '\\1').presence, as: sql.match(/^CREATE (?:.*?) AS (SELECT .*?)$/).try(:[], 1) }.compact
end

#tables(name = nil) ⇒ Object



41
42
43
44
45
# File 'lib/active_record/connection_adapters/clickhouse/schema_statements.rb', line 41

def tables(name = nil)
  result = do_system_execute("SHOW TABLES WHERE name NOT LIKE '.inner_id.%'", name)
  return [] if result.nil?
  result['data'].flatten
end