From ccdce4d6ceb8340fa5329ea116d284da3c8a54ed Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Mon, 28 Nov 2022 13:05:44 +0100 Subject: [PATCH 1/5] Update to ActiveRecord 7 and crate_ruby 0.2 --- .gitignore | 2 + activerecord-crate-adapter.gemspec | 2 +- history.txt | 2 + .../crate/schema_statements.rb | 2 +- .../connection_adapters/crate_adapter.rb | 42 ++++++++++++------- lib/arel/arel_crate.rb | 2 +- lib/arel/visitors/crate.rb | 2 - .../crate/table_definition_spec.rb | 2 +- spec/models/post_spec.rb | 2 +- 9 files changed, 35 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 5225b55..0055568 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ tmp crate_test_server* *.log log/* +crate-*.tar.gz +parts/ diff --git a/activerecord-crate-adapter.gemspec b/activerecord-crate-adapter.gemspec index c232adf..d9ab0ef 100644 --- a/activerecord-crate-adapter.gemspec +++ b/activerecord-crate-adapter.gemspec @@ -48,7 +48,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency "rake" spec.add_development_dependency "rspec", "~> 2.14" - spec.add_dependency('activerecord', '~> 4.1.0') + spec.add_dependency('activerecord', '~> 7') spec.add_dependency('arel', '>= 5.0.0') spec.add_dependency('crate_ruby', '~> 0.2.0') end diff --git a/history.txt b/history.txt index ba8704c..707b1fb 100644 --- a/history.txt +++ b/history.txt @@ -2,6 +2,8 @@ === unreleased + * Updated to ActiveRecord 7 and crate_ruby 0.2 + === 0.0.4 * Updated crate version to 0.45.7 diff --git a/lib/active_record/connection_adapters/crate/schema_statements.rb b/lib/active_record/connection_adapters/crate/schema_statements.rb index cb73f33..052b7cd 100644 --- a/lib/active_record/connection_adapters/crate/schema_statements.rb +++ b/lib/active_record/connection_adapters/crate/schema_statements.rb @@ -22,7 +22,7 @@ module ActiveRecord module ConnectionAdapters module Crate - class SchemaCreation < AbstractAdapter::SchemaCreation + class SchemaCreation < ActiveRecord::SchemaMigration private diff --git a/lib/active_record/connection_adapters/crate_adapter.rb b/lib/active_record/connection_adapters/crate_adapter.rb index 6eccd7c..946cda2 100644 --- a/lib/active_record/connection_adapters/crate_adapter.rb +++ b/lib/active_record/connection_adapters/crate_adapter.rb @@ -23,7 +23,7 @@ require 'active_record/base' require 'active_record/base' require 'arel/arel_crate' -require 'arel/visitors/bind_visitor' +require 'arel/visitors/visitor' require 'active_support/dependencies/autoload' require 'active_support/callbacks' require 'active_support/core_ext/string' @@ -45,7 +45,7 @@ module ActiveRecord class Base def self.crate_connection(config) #:nodoc: config = config.symbolize_keys - ConnectionAdapters::CrateAdapter.new(nil, logger, nil, config) + ConnectionAdapters::CrateAdapter.new(nil, logger, config) end end @@ -60,9 +60,10 @@ class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition ADAPTER_NAME = 'Crate'.freeze - def schema_creation # :nodoc: - Crate::SchemaCreation.new self - end + # TODO: Croaks with `NotImplementedError`. + # def schema_creation # :nodoc: + # Crate::SchemaCreation.new self + # end NATIVE_DATABASE_TYPES = { boolean: {name: "boolean"}, @@ -77,13 +78,13 @@ def schema_creation # :nodoc: } class BindSubstitution < Arel::Visitors::Crate # :nodoc: - include Arel::Visitors::BindVisitor + include Arel::Visitors end - def initialize(connection, logger, pool, config) + def initialize(connection, logger, config) @port = config[:port] @host = config[:host] - super(connection, logger, pool) + super(connection, logger, config) @schema_cache = SchemaCache.new self @visitor = Arel::Visitors::Crate.new self @quoted_column_names = {} @@ -127,10 +128,19 @@ def supports_migrations? def connect @connection = CrateRuby::Client.new(["#{@host}:#{@port}"]) + + # Monkeypatch to make the client instance provide `supports_datetime_with_precision`. + # FIXME: Implement within `CrateRuby::Client`. + def @connection.supports_datetime_with_precision? + # TODO: Should it be `true` instead? + return false + end + end def columns(table_name) #:nodoc: cols = @connection.table_structure(table_name).map do |field| + # TODO: Review. What if the table structure changes again? name = dotted_name(field[12]) CrateColumn.new(name, nil, field[4], nil) end @@ -172,10 +182,10 @@ class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition # +SecureRandom.uuid+ method and a +before_save+ callback, for instance. def primary_key(name, type = :primary_key, options = {}) options[:primary_key] = true - column name, "STRING PRIMARY KEY", options + column name, "STRING PRIMARY KEY" end - def column(name, type = nil, options = {}) + def column(name, type = nil, **options) super column = self[name] column.array = options[:array] @@ -189,19 +199,19 @@ def object(name, options = {}) schema = options.delete(:object_schema) type = "#{type} as (#{object_schema_to_string(schema)})" if schema - column name, type, options.merge(object: true) + column name, type, **options.merge(object: true) end def array(name, options = {}) array_type = options.delete(:array_type) raise "Array columns must specify an :array_type (e.g. array_type: :string)" unless array_type.present? - column name, "array(#{array_type})", options.merge(array: true) + column name, "array(#{array_type})", **options.merge(array: true) end private - def create_column_definition(name, type) - ColumnDefinition.new name, type + def create_column_definition(name, type, options) + ColumnDefinition.new(name, type, options) end def object_schema_to_string(s) @@ -220,8 +230,8 @@ def object_schema_to_string(s) end - def create_table_definition(name, temporary, options, as = nil) - TableDefinition.new native_database_types, name, temporary, options, as + def create_table_definition(name) + TableDefinition.new @connection, name end def native_database_types diff --git a/lib/arel/arel_crate.rb b/lib/arel/arel_crate.rb index dce1858..e7eeb22 100644 --- a/lib/arel/arel_crate.rb +++ b/lib/arel/arel_crate.rb @@ -21,4 +21,4 @@ require 'arel' require 'arel/visitors/crate' -require 'arel/visitors/bind_visitor' +require 'arel/visitors/visitor' diff --git a/lib/arel/visitors/crate.rb b/lib/arel/visitors/crate.rb index a21d20c..918bc4d 100644 --- a/lib/arel/visitors/crate.rb +++ b/lib/arel/visitors/crate.rb @@ -37,5 +37,3 @@ class ToSql < Arel::Visitors::Visitor end end end - -Arel::Visitors::VISITORS['crate'] = Arel::Visitors::Crate \ No newline at end of file diff --git a/spec/activerecord/connection_adapters/crate/table_definition_spec.rb b/spec/activerecord/connection_adapters/crate/table_definition_spec.rb index 4e579b9..fb6fb18 100644 --- a/spec/activerecord/connection_adapters/crate/table_definition_spec.rb +++ b/spec/activerecord/connection_adapters/crate/table_definition_spec.rb @@ -26,7 +26,7 @@ describe '#object_schema_to_string' do - let(:td) { ActiveRecord::ConnectionAdapters::CrateAdapter::TableDefinition.new(nil, nil, nil, nil) } + let(:td) { ActiveRecord::ConnectionAdapters::CrateAdapter::TableDefinition.new(nil, nil) } it 'should simply set the key and values' do s = {street: :string, city: :string} diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index 3aec54c..8032e18 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -116,7 +116,7 @@ describe 'sql input sanitization' do before do - @post = Post.create!(params) + @post = Post.create!(**params) end after do From 699c489c17104e2a0c66f2d1c3a1070eb7afce48 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Mon, 28 Nov 2022 15:38:49 +0100 Subject: [PATCH 2/5] Improve `supports_datetime_with_precision` workaround --- .../connection_adapters/crate_adapter.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/active_record/connection_adapters/crate_adapter.rb b/lib/active_record/connection_adapters/crate_adapter.rb index 946cda2..5701908 100644 --- a/lib/active_record/connection_adapters/crate_adapter.rb +++ b/lib/active_record/connection_adapters/crate_adapter.rb @@ -21,7 +21,6 @@ require 'active_record' require 'active_record/base' -require 'active_record/base' require 'arel/arel_crate' require 'arel/visitors/visitor' require 'active_support/dependencies/autoload' @@ -126,14 +125,18 @@ def supports_migrations? true end + def supports_datetime_with_precision? + true + end + def connect @connection = CrateRuby::Client.new(["#{@host}:#{@port}"]) # Monkeypatch to make the client instance provide `supports_datetime_with_precision`. - # FIXME: Implement within `CrateRuby::Client`. + # FIXME: Implement within `CrateRuby::Client`? + @adapter_supports_datetime_with_precision = supports_datetime_with_precision? def @connection.supports_datetime_with_precision? - # TODO: Should it be `true` instead? - return false + return @adapter_supports_datetime_with_precision end end From fad25e02bf48bbcfcdfec9aaf01ef92602551f63 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Tue, 29 Nov 2022 14:07:35 +0100 Subject: [PATCH 3/5] Downgrade to ActiveRecord 6 to retain compatibility with Ruby 2.6 --- activerecord-crate-adapter.gemspec | 2 +- history.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/activerecord-crate-adapter.gemspec b/activerecord-crate-adapter.gemspec index d9ab0ef..8bae5e0 100644 --- a/activerecord-crate-adapter.gemspec +++ b/activerecord-crate-adapter.gemspec @@ -48,7 +48,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency "rake" spec.add_development_dependency "rspec", "~> 2.14" - spec.add_dependency('activerecord', '~> 7') + spec.add_dependency('activerecord', '~> 6') spec.add_dependency('arel', '>= 5.0.0') spec.add_dependency('crate_ruby', '~> 0.2.0') end diff --git a/history.txt b/history.txt index 707b1fb..c27aa21 100644 --- a/history.txt +++ b/history.txt @@ -2,7 +2,7 @@ === unreleased - * Updated to ActiveRecord 7 and crate_ruby 0.2 + * Updated to ActiveRecord 6 and crate_ruby 0.2 === 0.0.4 From 49b316ab188b3b1cf1fb530a8d3eee5de785612a Mon Sep 17 00:00:00 2001 From: Niklas Schmidtmer Date: Tue, 29 Nov 2022 14:58:48 +0100 Subject: [PATCH 4/5] Add missing methods in SchemaStatements --- .../connection_adapters/crate/schema_statements.rb | 13 +++++++++++-- .../connection_adapters/crate_adapter.rb | 7 +++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/active_record/connection_adapters/crate/schema_statements.rb b/lib/active_record/connection_adapters/crate/schema_statements.rb index 052b7cd..f93155b 100644 --- a/lib/active_record/connection_adapters/crate/schema_statements.rb +++ b/lib/active_record/connection_adapters/crate/schema_statements.rb @@ -22,8 +22,7 @@ module ActiveRecord module ConnectionAdapters module Crate - class SchemaCreation < ActiveRecord::SchemaMigration - + class SchemaCreation < ActiveRecord::ConnectionAdapters::SchemaCreation private def add_column_options!(sql, options) @@ -36,6 +35,16 @@ def add_column_options!(sql, options) end module SchemaStatements + def data_source_sql(name = nil, type: nil) + # TODO implement + nil + end + + def quoted_scope(name = nil, type: nil) + # TODO implement + nil + end + def primary_key(table_name) res = @connection.execute("select constraint_name from information_schema.table_constraints where table_name = '#{quote_table_name(table_name)}' and constraint_type = 'PRIMARY_KEY'") diff --git a/lib/active_record/connection_adapters/crate_adapter.rb b/lib/active_record/connection_adapters/crate_adapter.rb index 5701908..993832f 100644 --- a/lib/active_record/connection_adapters/crate_adapter.rb +++ b/lib/active_record/connection_adapters/crate_adapter.rb @@ -59,10 +59,9 @@ class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition ADAPTER_NAME = 'Crate'.freeze - # TODO: Croaks with `NotImplementedError`. - # def schema_creation # :nodoc: - # Crate::SchemaCreation.new self - # end + def schema_creation # :nodoc: + Crate::SchemaCreation.new self + end NATIVE_DATABASE_TYPES = { boolean: {name: "boolean"}, From 72ed60a0294a29883f1d77c9116a7b928277523f Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Tue, 29 Nov 2022 15:39:06 +0100 Subject: [PATCH 5/5] Tests: Use `bundle exec rspec --backtrace` --- .github/workflows/tests.yml | 2 +- DEVELOP.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6052386..c353959 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -59,4 +59,4 @@ jobs: bundle install - name: Run tests - run: bundle exec rspec + run: bundle exec rspec --backtrace diff --git a/DEVELOP.md b/DEVELOP.md index 07a45e7..5004592 100644 --- a/DEVELOP.md +++ b/DEVELOP.md @@ -10,7 +10,7 @@ docker run --rm -it --publish=44200:4200 crate:5.1.1 \ Install project and invoke test suite. ```shell bundle install -bundle exec rspec +bundle exec rspec --backtrace ```