clickhouse-activerecord 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b40a04fe93423fd3469b65a66429ecb41e4c5c25440777c69617e69081e578b4
4
- data.tar.gz: 43586cb853dec4d3453a6b6938158e5f1197504678c2e1aa824b8521a6a1c628
3
+ metadata.gz: 8e47b553f60d06d69a8e1f7c70bbc495c32502f0ea75f3ede9c8ac2bafb063ee
4
+ data.tar.gz: 42ec02c29478ae577fda1f1a726d003e925b2c36faa02fd6a92797a4e05f960c
5
5
  SHA512:
6
- metadata.gz: 38073e81994dd027caf7fab5463a715eac7f15ec8373c1415d0064611118b0f2b0c391cae0db9b7670ebb8a3141c023879b3d1425c7059f4c00450579bcff64c
7
- data.tar.gz: 0ce78412004ae3590bc97877141e66f74f9de1ad0aab2cdc1af5a3369157c01e0e29fe10b4921c96487cad66fa16e50163f9c34941381357f1960cc3c7f20fbc
6
+ metadata.gz: 405f20e2c53352ae702b4b462165ccbf5306da2e72733d5c8f80588ba5392637e6b8d2c95d6d61cc9f777d0fc49e48a3578ee6db2fdb292668cb4ec0c52d0471
7
+ data.tar.gz: 8b3bebc0c3672112c26889555d1eb0b280cbc331758cbf1d5d1733273983e10178929bec76fda6793a654d1ff2c0048b44a58eca533f3ec0a2e8481e7d928314
@@ -28,13 +28,15 @@ jobs:
28
28
  rails: 7.1.3
29
29
  - ruby: 3.2
30
30
  rails: 7.2.1
31
- clickhouse: [ '22.1', '24.6' ]
31
+ - ruby: 3.2
32
+ rails: 8.0.1
33
+ clickhouse: [ '22.1', '24.9' ]
32
34
 
33
35
  steps:
34
36
  - uses: actions/checkout@v4
35
37
 
36
38
  - name: Start ClickHouse ${{ matrix.clickhouse }}
37
- uses: isbang/compose-action@v1.5.1
39
+ uses: hoverkraft-tech/compose-action@v2.1.0
38
40
  env:
39
41
  CLICKHOUSE_VERSION: ${{ matrix.clickhouse }}
40
42
  with:
@@ -72,14 +74,16 @@ jobs:
72
74
  - ruby: 3.2
73
75
  rails: 7.1.3
74
76
  - ruby: 3.2
75
- rails: 7.2.0
76
- clickhouse: [ '22.1', '24.6' ]
77
+ rails: 7.2.1
78
+ - ruby: 3.2
79
+ rails: 8.0.1
80
+ clickhouse: [ '22.1', '24.9' ]
77
81
 
78
82
  steps:
79
83
  - uses: actions/checkout@v4
80
84
 
81
85
  - name: Start ClickHouse Cluster ${{ matrix.clickhouse }}
82
- uses: isbang/compose-action@v1.5.1
86
+ uses: hoverkraft-tech/compose-action@v2.1.0
83
87
  env:
84
88
  CLICKHOUSE_VERSION: ${{ matrix.clickhouse }}
85
89
  with:
data/README.md CHANGED
@@ -184,7 +184,11 @@ Action.settings(optimize_read_in_order: 1).where(date: Date.current).limit(10)
184
184
 
185
185
  User.joins(:actions).using(:group_id)
186
186
  # Clickhouse User Load (10.3ms) SELECT users.* FROM users INNER JOIN actions USING group_id
187
- #=> #<ActiveRecord::Relation [#<Action *** >]>
187
+ #=> #<ActiveRecord::Relation [#<User *** >]>
188
+
189
+ User.window('x', order: 'date', partition: 'name', rows: 'UNBOUNDED PRECEDING').select('sum(value) OVER x')
190
+ # SELECT sum(value) OVER x FROM users WINDOW x AS (PARTITION BY name ORDER BY date ROWS UNBOUNDED PRECEDING)
191
+ #=> #<ActiveRecord::Relation [#<User *** >]>
188
192
  ```
189
193
 
190
194
 
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ['lib']
25
25
 
26
26
  spec.add_runtime_dependency 'bundler', '>= 1.13.4'
27
- spec.add_runtime_dependency 'activerecord', '~> 7.1'
27
+ spec.add_runtime_dependency 'activerecord', '>= 7.1', '< 9.0'
28
28
 
29
29
  spec.add_development_dependency 'rake', '~> 13.0'
30
30
  spec.add_development_dependency 'rspec', '~> 3.4'
@@ -178,10 +178,12 @@ module ActiveRecord
178
178
  def request(sql, format = nil, settings = {})
179
179
  formatted_sql = apply_format(sql, format)
180
180
  request_params = @connection_config || {}
181
- @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql, {
182
- 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}",
183
- 'Content-Type' => 'application/x-www-form-urlencoded',
184
- })
181
+ @lock.synchronize do
182
+ @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql, {
183
+ 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}",
184
+ 'Content-Type' => 'application/x-www-form-urlencoded',
185
+ })
186
+ end
185
187
  end
186
188
 
187
189
  def apply_format(sql, format)
@@ -300,9 +300,11 @@ module ActiveRecord
300
300
  end
301
301
 
302
302
  # @param [String] table
303
+ # @option [Boolean] single_line
303
304
  # @return [String]
304
- def show_create_table(table)
305
- do_system_execute("SHOW CREATE TABLE `#{table}`")['data'].try(:first).try(:first).gsub(/[\n\s]+/m, ' ').gsub("#{@config[:database]}.", "")
305
+ def show_create_table(table, single_line: true)
306
+ sql = do_system_execute("SHOW CREATE TABLE `#{table}`")['data'].try(:first).try(:first)
307
+ single_line ? sql.squish : sql
306
308
  end
307
309
 
308
310
  # Create a new ClickHouse database.
@@ -4,6 +4,11 @@ module Arel
4
4
  module Visitors
5
5
  class Clickhouse < ::Arel::Visitors::ToSql
6
6
 
7
+ def compile(node, collector = Arel::Collectors::SQLString.new)
8
+ @delete_or_update = false
9
+ super
10
+ end
11
+
7
12
  def aggregate(name, o, collector)
8
13
  # replacing function name for materialized view
9
14
  if o.expressions.first && o.expressions.first != '*' && !o.expressions.first.is_a?(String) && o.expressions.first.relation&.is_view
@@ -16,12 +21,11 @@ module Arel
16
21
  # https://clickhouse.com/docs/en/sql-reference/statements/delete
17
22
  # DELETE and UPDATE in ClickHouse working only without table name
18
23
  def visit_Arel_Attributes_Attribute(o, collector)
19
- if collector.value.is_a?(String)
20
- collector << quote_table_name(o.relation.table_alias || o.relation.name) << '.' unless collector.value.start_with?('DELETE FROM ') || collector.value.include?(' UPDATE ')
21
- collector << quote_column_name(o.name)
22
- else
23
- super
24
+ unless @delete_or_update
25
+ join_name = o.relation.table_alias || o.relation.name
26
+ collector << quote_table_name(join_name) << '.'
24
27
  end
28
+ collector << quote_column_name(o.name)
25
29
  end
26
30
 
27
31
  def visit_Arel_Nodes_SelectOptions(o, collector)
@@ -30,6 +34,7 @@ module Arel
30
34
  end
31
35
 
32
36
  def visit_Arel_Nodes_UpdateStatement(o, collector)
37
+ @delete_or_update = true
33
38
  o = prepare_update_statement(o)
34
39
 
35
40
  collector << 'ALTER TABLE '
@@ -40,6 +45,11 @@ module Arel
40
45
  maybe_visit o.limit, collector
41
46
  end
42
47
 
48
+ def visit_Arel_Nodes_DeleteStatement(o, collector)
49
+ @delete_or_update = true
50
+ super
51
+ end
52
+
43
53
  def visit_Arel_Nodes_Final(o, collector)
44
54
  visit o.expr, collector
45
55
  collector << ' FINAL'
@@ -64,7 +74,7 @@ module Arel
64
74
  collector
65
75
  end
66
76
 
67
- def visit_Arel_Nodes_Using o, collector
77
+ def visit_Arel_Nodes_Using(o, collector)
68
78
  collector << "USING "
69
79
  visit o.expr, collector
70
80
  collector
@@ -40,7 +40,7 @@ module ClickhouseActiverecord
40
40
  # get all tables
41
41
  tables = connection.execute("SHOW TABLES FROM #{@configuration.database} WHERE name NOT LIKE '.inner_id.%'")['data'].flatten.map do |table|
42
42
  next if %w[schema_migrations ar_internal_metadata].include?(table)
43
- connection.show_create_table(table).gsub("#{@configuration.database}.", '')
43
+ connection.show_create_table(table, single_line: false).gsub("#{@configuration.database}.", '')
44
44
  end.compact
45
45
 
46
46
  # sort view to last
@@ -1,3 +1,3 @@
1
1
  module ClickhouseActiverecord
2
- VERSION = '1.2.1'
2
+ VERSION = '1.3.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clickhouse-activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Odintsov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-18 00:00:00.000000000 Z
11
+ date: 2025-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,16 +28,22 @@ dependencies:
28
28
  name: activerecord
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '7.1'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '9.0'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '7.1'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '9.0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rake
43
49
  requirement: !ruby/object:Gem::Requirement