Skip to content

Commit

Permalink
support activerecord 7.2
Browse files Browse the repository at this point in the history
  • Loading branch information
PNixx committed Aug 16, 2024
1 parent 536bf86 commit 2608819
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 49 deletions.
36 changes: 28 additions & 8 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,16 @@ jobs:
fail-fast: true
max-parallel: 1
matrix:
ruby-version: [ '2.7', '3.0', '3.2' ]
clickhouse: [ '22.1' ]
version:
- ruby: 2.7
rails: 7.1.3
- ruby: 3.0
rails: 7.1.3
- ruby: 3.2
rails: 7.1.3
- ruby: 3.2
rails: 7.2.0
clickhouse: [ '22.1', '24.6' ]

steps:
- uses: actions/checkout@v4
Expand All @@ -33,10 +41,12 @@ jobs:
compose-file: '.docker/docker-compose.yml'
down-flags: '--volumes'

- name: Set up Ruby ${{ matrix.ruby-version }}
- run: echo 'gem "activerecord", "~> ${{ matrix.version.rails }}"' >> Gemfile

- name: Set up Ruby ${{ matrix.version.ruby }}
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
ruby-version: ${{ matrix.version.ruby }}
bundler-cache: true

- run: bundle exec rspec spec/single
Expand All @@ -54,8 +64,16 @@ jobs:
fail-fast: true
max-parallel: 1
matrix:
ruby-version: [ '2.7', '3.0', '3.2' ]
clickhouse: [ '22.1' ]
version:
- ruby: 2.7
rails: 7.1.3
- ruby: 3.0
rails: 7.1.3
- ruby: 3.2
rails: 7.1.3
- ruby: 3.2
rails: 7.2.0
clickhouse: [ '22.1', '24.6' ]

steps:
- uses: actions/checkout@v4
Expand All @@ -68,10 +86,12 @@ jobs:
compose-file: '.docker/docker-compose.cluster.yml'
down-flags: '--volumes'

- name: Set up Ruby ${{ matrix.ruby-version }}
- run: echo 'gem "activerecord", "~> ${{ matrix.version.rails }}"' >> Gemfile

- name: Set up Ruby ${{ matrix.version.ruby }}
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
ruby-version: ${{ matrix.version.ruby }}
bundler-cache: true

- run: bundle exec rspec spec/cluster
19 changes: 19 additions & 0 deletions lib/active_record/connection_adapters/clickhouse/quoting.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module ActiveRecord
module ConnectionAdapters
module Clickhouse
module Quoting
extend ActiveSupport::Concern

module ClassMethods # :nodoc:
def quote_column_name(name)
name
end

def quote_table_name(name)
name
end
end
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,16 @@ def exec_insert(sql, name, _binds, _pk = nil, _sequence_name = nil, returning: n
true
end

def internal_exec_query(sql, name = nil, binds = [], prepare: false, async: false)
def internal_exec_query(sql, name = nil, binds = [], prepare: false, async: false, allow_retry: 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)
columns = result['meta'].map { |m| m['name'] }
types = {}
result['meta'].each_with_index do |m, i|
# need use column name and index after commit in 7.2:
# https://github.com/rails/rails/commit/24dbf7637b1d5cd6eb3d7100b8d0f6872c3fee3c
types[m['name']] = types[i] = type_map.lookup(m['type'])
end
ActiveRecord::Result.new(columns, result['data'], types)
rescue ActiveRecord::ActiveRecordError => e
raise e
rescue StandardError => e
Expand Down
59 changes: 32 additions & 27 deletions lib/active_record/connection_adapters/clickhouse_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
require 'active_record/connection_adapters/clickhouse/oid/big_integer'
require 'active_record/connection_adapters/clickhouse/oid/map'
require 'active_record/connection_adapters/clickhouse/oid/uuid'
require 'active_record/connection_adapters/clickhouse/quoting'
require 'active_record/connection_adapters/clickhouse/schema_definitions'
require 'active_record/connection_adapters/clickhouse/schema_creation'
require 'active_record/connection_adapters/clickhouse/schema_statements'
Expand All @@ -23,30 +24,11 @@ class << self
def clickhouse_connection(config)
config = config.symbolize_keys

if config[:connection]
connection = {
connection: config[:connection]
}
else
port = config[:port] || 8123
connection = {
host: config[:host] || 'localhost',
port: port,
ssl: config[:ssl].present? ? config[:ssl] : port == 443,
sslca: config[:sslca],
read_timeout: config[:read_timeout],
write_timeout: config[:write_timeout],
keep_alive_timeout: config[:keep_alive_timeout]
}
end

if config.key?(:database)
database = config[:database]
else
unless config.key?(:database)
raise ArgumentError, 'No database specified. Missing argument: database.'
end

ConnectionAdapters::ClickhouseAdapter.new(logger, connection, config)
ConnectionAdapters::ClickhouseAdapter.new(config)
end
end
end
Expand Down Expand Up @@ -83,6 +65,11 @@ def _delete_record(constraints)
end

module ConnectionAdapters

if ActiveRecord::version >= Gem::Version.new('7.2')
register "clickhouse", "ActiveRecord::ConnectionAdapters::ClickhouseAdapter", "active_record/connection_adapters/clickhouse_adapter"
end

class ClickhouseColumn < Column
private
def deduplicated
Expand All @@ -91,6 +78,8 @@ def deduplicated
end

class ClickhouseAdapter < AbstractAdapter
include Clickhouse::Quoting

ADAPTER_NAME = 'Clickhouse'.freeze
NATIVE_DATABASE_TYPES = {
string: { name: 'String' },
Expand Down Expand Up @@ -125,12 +114,28 @@ class ClickhouseAdapter < AbstractAdapter
include Clickhouse::SchemaStatements

# Initializes and connects a Clickhouse adapter.
def initialize(logger, connection_parameters, config)
super(nil, logger)
@connection_parameters = connection_parameters
@connection_config = { user: config[:username], password: config[:password], database: config[:database] }.compact
@debug = config[:debug] || false
@config = config
def initialize(config_or_deprecated_connection, deprecated_logger = nil, deprecated_connection_options = nil, deprecated_config = nil)
super
if @config[:connection]
connection = {
connection: @config[:connection]
}
else
port = @config[:port] || 8123
connection = {
host: @config[:host] || 'localhost',
port: port,
ssl: @config[:ssl].present? ? @config[:ssl] : port == 443,
sslca: @config[:sslca],
read_timeout: @config[:read_timeout],
write_timeout: @config[:write_timeout],
keep_alive_timeout: @config[:keep_alive_timeout]
}
end
@connection_parameters = connection

@connection_config = { user: @config[:username], password: @config[:password], database: @config[:database] }.compact
@debug = @config[:debug] || false

@prepared_statements = false

Expand Down
2 changes: 1 addition & 1 deletion lib/clickhouse-activerecord/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module ClickhouseActiverecord
VERSION = '1.0.13'
VERSION = '1.1.0'
end
8 changes: 8 additions & 0 deletions lib/core_extensions/active_record/internal_metadata.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ def select_entry(key)

connection.select_one(sm, "#{self.class} Load")
end

def connection
if ::ActiveRecord::version >= Gem::Version.new('7.2')
@pool.connection
else
super
end
end
end
end
end
11 changes: 6 additions & 5 deletions lib/core_extensions/active_record/relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def settings(**opts)

# @param [Hash] opts
def settings!(**opts)
assert_mutability!
check_command('SETTINGS')
@values[:settings] = (@values[:settings] || {}).merge opts
self
Expand All @@ -43,7 +42,6 @@ def final
end

def final!
assert_mutability!
check_command('FINAL')
@values[:final] = true
self
Expand All @@ -62,7 +60,6 @@ def using(*opts)

# @param [Array] opts
def using!(*opts)
assert_mutability!
@values[:using] = opts
self
end
Expand All @@ -73,8 +70,12 @@ def check_command(cmd)
raise ::ActiveRecord::ActiveRecordError, cmd + ' is a ClickHouse specific query clause' unless connection.is_a?(::ActiveRecord::ConnectionAdapters::ClickhouseAdapter)
end

def build_arel(aliases = nil)
arel = super
def build_arel(connection_or_aliases = nil, aliases = nil)
if ::ActiveRecord::version >= Gem::Version.new('7.2')
arel = super
else
arel = super(connection_or_aliases)
end

arel.final! if @values[:final].present?
arel.settings(@values[:settings]) if @values[:settings].present?
Expand Down
8 changes: 8 additions & 0 deletions lib/core_extensions/active_record/schema_migration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ def versions

connection.select_values(sm, "#{self.class} Load")
end

def connection
if ::ActiveRecord::version >= Gem::Version.new('7.2')
@pool.connection
else
super
end
end
end
end
end
6 changes: 3 additions & 3 deletions spec/single/migration_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
end
let(:directory) { raise 'NotImplemented' }
let(:migrations_dir) { File.join(FIXTURES_PATH, 'migrations', directory) }
let(:migration_context) { ActiveRecord::MigrationContext.new(migrations_dir, model.connection.schema_migration, model.connection.internal_metadata) }
let(:migration_context) { ActiveRecord::MigrationContext.new(migrations_dir) }

connection_config = ActiveRecord::Base.connection_db_config.configuration_hash

Expand Down Expand Up @@ -312,11 +312,11 @@
describe 'drop table sync' do
it 'drops table' do
migrations_dir = File.join(FIXTURES_PATH, 'migrations', 'dsl_drop_table_sync')
quietly { ActiveRecord::MigrationContext.new(migrations_dir, model.connection.schema_migration).up(1) }
quietly { ActiveRecord::MigrationContext.new(migrations_dir).up(1) }

expect(ActiveRecord::Base.connection.tables).to include('some')

quietly { ActiveRecord::MigrationContext.new(migrations_dir, model.connection.schema_migration).up(2) }
quietly { ActiveRecord::MigrationContext.new(migrations_dir).up(2) }

expect(ActiveRecord::Base.connection.tables).not_to include('some')
end
Expand Down
6 changes: 3 additions & 3 deletions spec/single/model_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class ModelPk < ActiveRecord::Base

before do
migrations_dir = File.join(FIXTURES_PATH, 'migrations', 'add_sample_data')
quietly { ActiveRecord::MigrationContext.new(migrations_dir, Model.connection.schema_migration).up }
quietly { ActiveRecord::MigrationContext.new(migrations_dir).up }
end

describe '#do_execute' do
Expand Down Expand Up @@ -277,7 +277,7 @@ class ModelPk < ActiveRecord::Base

before do
migrations_dir = File.join(FIXTURES_PATH, 'migrations', 'add_array_datetime')
quietly { ActiveRecord::MigrationContext.new(migrations_dir, model.connection.schema_migration).up }
quietly { ActiveRecord::MigrationContext.new(migrations_dir).up }
end

describe '#create' do
Expand Down Expand Up @@ -333,7 +333,7 @@ class ModelPk < ActiveRecord::Base

before do
migrations_dir = File.join(FIXTURES_PATH, 'migrations', 'add_map_datetime')
quietly { ActiveRecord::MigrationContext.new(migrations_dir, model.connection.schema_migration).up }
quietly { ActiveRecord::MigrationContext.new(migrations_dir).up }
end

describe '#create' do
Expand Down

0 comments on commit 2608819

Please sign in to comment.