Welcome to mirror list, hosted at ThFree Co, Russian Federation.

schema_migration.rb « migration_support « click_house « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e82debbad0de2c7ef4ead00d990277c4219854e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# frozen_string_literal: true

module ClickHouse
  module MigrationSupport
    class SchemaMigration
      class_attribute :table_name_prefix, instance_writer: false, default: ''
      class_attribute :table_name_suffix, instance_writer: false, default: ''
      class_attribute :schema_migrations_table_name, instance_accessor: false, default: 'schema_migrations'

      class << self
        TABLE_EXISTS_QUERY = <<~SQL.squish
          SELECT 1 FROM system.tables
          WHERE name = {table_name: String} AND database = {database_name: String}
        SQL

        def primary_key
          'version'
        end

        def table_name
          "#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
        end

        def table_exists?(database, configuration = ClickHouse::Migration.client_configuration)
          database_name = configuration.databases[database]&.database
          return false unless database_name

          placeholders = { table_name: table_name, database_name: database_name }
          query = ClickHouse::Client::Query.new(raw_query: TABLE_EXISTS_QUERY, placeholders: placeholders)

          ClickHouse::Client.select(query, database, configuration).any?
        end

        def create_table(database, configuration = ClickHouse::Migration.client_configuration)
          return if table_exists?(database, configuration)

          query = <<~SQL
            CREATE TABLE #{table_name} (
              version LowCardinality(String),
              active UInt8 NOT NULL DEFAULT 1,
              applied_at DateTime64(6, 'UTC') NOT NULL DEFAULT now64()
            )
            ENGINE = ReplacingMergeTree(applied_at)
            PRIMARY KEY(version)
            ORDER BY (version)
          SQL

          ClickHouse::Client.execute(query, database, configuration)
        end

        def all_versions(database)
          query = <<~SQL
            SELECT version FROM #{table_name} FINAL
            WHERE active = 1
            ORDER BY (version)
          SQL

          ClickHouse::Client.select(query, database, ClickHouse::Migration.client_configuration).pluck('version')
        end

        def create!(database, **args)
          insert_sql = <<~SQL
            INSERT INTO #{table_name} (#{args.keys.join(',')}) VALUES (#{args.values.join(',')})
          SQL

          ClickHouse::Client.execute(insert_sql, database, ClickHouse::Migration.client_configuration)
        end
      end
    end
  end
end