clickhouse-activerecord 1.0.4 → 1.0.6
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 +4 -4
- data/.docker/clickhouse/cluster/server1_config.xml +117 -0
- data/.docker/clickhouse/cluster/server2_config.xml +117 -0
- data/.docker/clickhouse/single/config.xml +54 -0
- data/.docker/clickhouse/users.xml +34 -0
- data/.docker/docker-compose.cluster.yml +52 -0
- data/.docker/docker-compose.yml +17 -0
- data/.docker/nginx/local.conf +12 -0
- data/.github/workflows/testing.yml +77 -0
- data/CHANGELOG.md +28 -0
- data/README.md +31 -2
- data/lib/active_record/connection_adapters/clickhouse/oid/uuid.rb +16 -6
- data/lib/active_record/connection_adapters/clickhouse/schema_creation.rb +26 -2
- data/lib/active_record/connection_adapters/clickhouse/schema_definitions.rb +17 -0
- data/lib/active_record/connection_adapters/clickhouse/schema_statements.rb +89 -18
- data/lib/active_record/connection_adapters/clickhouse_adapter.rb +69 -10
- data/lib/arel/visitors/clickhouse.rb +7 -0
- data/lib/clickhouse-activerecord/schema_dumper.rb +30 -2
- data/lib/clickhouse-activerecord/tasks.rb +22 -6
- data/lib/clickhouse-activerecord/version.rb +1 -1
- data/lib/clickhouse-activerecord.rb +4 -6
- data/lib/core_extensions/active_record/internal_metadata.rb +42 -34
- data/lib/core_extensions/active_record/schema_migration.rb +28 -30
- data/lib/tasks/clickhouse.rake +14 -11
- metadata +12 -4
- /data/{core_extensions → lib/core_extensions}/active_record/migration/command_recorder.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01f256bfb493f9961b3c0268d7f71009468b7b28c00deba7901d064f74b91c5c
|
4
|
+
data.tar.gz: 13b366b2264636610baa3bde60b9c82930c80b13201ac41724d37d4430fa60dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75bafd27ee374a30f8a519937591254f2f316e3bf477b6298da709652064853cc491f454950fefc1558e66b170c4773b167d1988aaa9dd38b583d79ba60b3c4d
|
7
|
+
data.tar.gz: 23709bae8fdf85dda4be2f70d41016be9e8cc10ba503ffc73dcc42e69ca0573f792f4635fa7d1b476b74e394ba1dd2f4fc6774c42d96821c13b55f798094666e
|
@@ -0,0 +1,117 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<clickhouse>
|
3
|
+
|
4
|
+
<http_port>8123</http_port>
|
5
|
+
<interserver_http_port>9009</interserver_http_port>
|
6
|
+
<interserver_http_host>clickhouse1</interserver_http_host>
|
7
|
+
|
8
|
+
<users_config>users.xml</users_config>
|
9
|
+
<default_profile>default</default_profile>
|
10
|
+
<default_database>default</default_database>
|
11
|
+
|
12
|
+
<mark_cache_size>5368709120</mark_cache_size>
|
13
|
+
|
14
|
+
<path>/var/lib/clickhouse/</path>
|
15
|
+
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
|
16
|
+
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
|
17
|
+
<access_control_path>/var/lib/clickhouse/access/</access_control_path>
|
18
|
+
<keep_alive_timeout>3</keep_alive_timeout>
|
19
|
+
|
20
|
+
<logger>
|
21
|
+
<level>debug</level>
|
22
|
+
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
|
23
|
+
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
|
24
|
+
<size>1000M</size>
|
25
|
+
<count>10</count>
|
26
|
+
<console>1</console>
|
27
|
+
</logger>
|
28
|
+
|
29
|
+
<remote_servers>
|
30
|
+
<test_cluster>
|
31
|
+
<shard>
|
32
|
+
<replica>
|
33
|
+
<host>clickhouse1</host>
|
34
|
+
<port>9000</port>
|
35
|
+
</replica>
|
36
|
+
<replica>
|
37
|
+
<host>clickhouse2</host>
|
38
|
+
<port>9000</port>
|
39
|
+
</replica>
|
40
|
+
</shard>
|
41
|
+
</test_cluster>
|
42
|
+
</remote_servers>
|
43
|
+
|
44
|
+
<keeper_server>
|
45
|
+
<tcp_port>9181</tcp_port>
|
46
|
+
<server_id>1</server_id>
|
47
|
+
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
|
48
|
+
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
|
49
|
+
|
50
|
+
<coordination_settings>
|
51
|
+
<operation_timeout_ms>10000</operation_timeout_ms>
|
52
|
+
<session_timeout_ms>30000</session_timeout_ms>
|
53
|
+
<raft_logs_level>trace</raft_logs_level>
|
54
|
+
<rotate_log_storage_interval>10000</rotate_log_storage_interval>
|
55
|
+
</coordination_settings>
|
56
|
+
|
57
|
+
<raft_configuration>
|
58
|
+
<server>
|
59
|
+
<id>1</id>
|
60
|
+
<hostname>clickhouse1</hostname>
|
61
|
+
<port>9000</port>
|
62
|
+
</server>
|
63
|
+
<server>
|
64
|
+
<id>2</id>
|
65
|
+
<hostname>clickhouse2</hostname>
|
66
|
+
<port>9000</port>
|
67
|
+
</server>
|
68
|
+
</raft_configuration>
|
69
|
+
</keeper_server>
|
70
|
+
|
71
|
+
<zookeeper>
|
72
|
+
<node>
|
73
|
+
<host>clickhouse1</host>
|
74
|
+
<port>9181</port>
|
75
|
+
</node>
|
76
|
+
<node>
|
77
|
+
<host>clickhouse2</host>
|
78
|
+
<port>9181</port>
|
79
|
+
</node>
|
80
|
+
</zookeeper>
|
81
|
+
|
82
|
+
<macros>
|
83
|
+
<cluster>test_cluster</cluster>
|
84
|
+
<replica>clickhouse1</replica>
|
85
|
+
<shard>1</shard>
|
86
|
+
</macros>
|
87
|
+
|
88
|
+
<distributed_ddl>
|
89
|
+
<path>/clickhouse/test_cluster/task_queue/ddl</path>
|
90
|
+
</distributed_ddl>
|
91
|
+
|
92
|
+
<query_log>
|
93
|
+
<database>system</database>
|
94
|
+
<table>query_log</table>
|
95
|
+
<partition_by>toYYYYMM(event_date)</partition_by>
|
96
|
+
<flush_interval_milliseconds>1000</flush_interval_milliseconds>
|
97
|
+
</query_log>
|
98
|
+
|
99
|
+
<http_options_response>
|
100
|
+
<header>
|
101
|
+
<name>Access-Control-Allow-Origin</name>
|
102
|
+
<value>*</value>
|
103
|
+
</header>
|
104
|
+
<header>
|
105
|
+
<name>Access-Control-Allow-Headers</name>
|
106
|
+
<value>accept, origin, x-requested-with, content-type, authorization</value>
|
107
|
+
</header>
|
108
|
+
<header>
|
109
|
+
<name>Access-Control-Allow-Methods</name>
|
110
|
+
<value>POST, GET, OPTIONS</value>
|
111
|
+
</header>
|
112
|
+
<header>
|
113
|
+
<name>Access-Control-Max-Age</name>
|
114
|
+
<value>86400</value>
|
115
|
+
</header>
|
116
|
+
</http_options_response>
|
117
|
+
</clickhouse>
|
@@ -0,0 +1,117 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<clickhouse>
|
3
|
+
|
4
|
+
<http_port>8123</http_port>
|
5
|
+
<interserver_http_port>9009</interserver_http_port>
|
6
|
+
<interserver_http_host>clickhouse2</interserver_http_host>
|
7
|
+
|
8
|
+
<users_config>users.xml</users_config>
|
9
|
+
<default_profile>default</default_profile>
|
10
|
+
<default_database>default</default_database>
|
11
|
+
|
12
|
+
<mark_cache_size>5368709120</mark_cache_size>
|
13
|
+
|
14
|
+
<path>/var/lib/clickhouse/</path>
|
15
|
+
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
|
16
|
+
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
|
17
|
+
<access_control_path>/var/lib/clickhouse/access/</access_control_path>
|
18
|
+
<keep_alive_timeout>3</keep_alive_timeout>
|
19
|
+
|
20
|
+
<logger>
|
21
|
+
<level>debug</level>
|
22
|
+
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
|
23
|
+
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
|
24
|
+
<size>1000M</size>
|
25
|
+
<count>10</count>
|
26
|
+
<console>1</console>
|
27
|
+
</logger>
|
28
|
+
|
29
|
+
<remote_servers>
|
30
|
+
<test_cluster>
|
31
|
+
<shard>
|
32
|
+
<replica>
|
33
|
+
<host>clickhouse1</host>
|
34
|
+
<port>9000</port>
|
35
|
+
</replica>
|
36
|
+
<replica>
|
37
|
+
<host>clickhouse2</host>
|
38
|
+
<port>9000</port>
|
39
|
+
</replica>
|
40
|
+
</shard>
|
41
|
+
</test_cluster>
|
42
|
+
</remote_servers>
|
43
|
+
|
44
|
+
<keeper_server>
|
45
|
+
<tcp_port>9181</tcp_port>
|
46
|
+
<server_id>2</server_id>
|
47
|
+
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
|
48
|
+
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
|
49
|
+
|
50
|
+
<coordination_settings>
|
51
|
+
<operation_timeout_ms>10000</operation_timeout_ms>
|
52
|
+
<session_timeout_ms>30000</session_timeout_ms>
|
53
|
+
<raft_logs_level>trace</raft_logs_level>
|
54
|
+
<rotate_log_storage_interval>10000</rotate_log_storage_interval>
|
55
|
+
</coordination_settings>
|
56
|
+
|
57
|
+
<raft_configuration>
|
58
|
+
<server>
|
59
|
+
<id>1</id>
|
60
|
+
<hostname>clickhouse1</hostname>
|
61
|
+
<port>9000</port>
|
62
|
+
</server>
|
63
|
+
<server>
|
64
|
+
<id>2</id>
|
65
|
+
<hostname>clickhouse2</hostname>
|
66
|
+
<port>9000</port>
|
67
|
+
</server>
|
68
|
+
</raft_configuration>
|
69
|
+
</keeper_server>
|
70
|
+
|
71
|
+
<zookeeper>
|
72
|
+
<node>
|
73
|
+
<host>clickhouse1</host>
|
74
|
+
<port>9181</port>
|
75
|
+
</node>
|
76
|
+
<node>
|
77
|
+
<host>clickhouse2</host>
|
78
|
+
<port>9181</port>
|
79
|
+
</node>
|
80
|
+
</zookeeper>
|
81
|
+
|
82
|
+
<macros>
|
83
|
+
<cluster>test_cluster</cluster>
|
84
|
+
<replica>clickhouse2</replica>
|
85
|
+
<shard>1</shard>
|
86
|
+
</macros>
|
87
|
+
|
88
|
+
<distributed_ddl>
|
89
|
+
<path>/clickhouse/test_cluster/task_queue/ddl</path>
|
90
|
+
</distributed_ddl>
|
91
|
+
|
92
|
+
<query_log>
|
93
|
+
<database>system</database>
|
94
|
+
<table>query_log</table>
|
95
|
+
<partition_by>toYYYYMM(event_date)</partition_by>
|
96
|
+
<flush_interval_milliseconds>1000</flush_interval_milliseconds>
|
97
|
+
</query_log>
|
98
|
+
|
99
|
+
<http_options_response>
|
100
|
+
<header>
|
101
|
+
<name>Access-Control-Allow-Origin</name>
|
102
|
+
<value>*</value>
|
103
|
+
</header>
|
104
|
+
<header>
|
105
|
+
<name>Access-Control-Allow-Headers</name>
|
106
|
+
<value>accept, origin, x-requested-with, content-type, authorization</value>
|
107
|
+
</header>
|
108
|
+
<header>
|
109
|
+
<name>Access-Control-Allow-Methods</name>
|
110
|
+
<value>POST, GET, OPTIONS</value>
|
111
|
+
</header>
|
112
|
+
<header>
|
113
|
+
<name>Access-Control-Max-Age</name>
|
114
|
+
<value>86400</value>
|
115
|
+
</header>
|
116
|
+
</http_options_response>
|
117
|
+
</clickhouse>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<clickhouse>
|
3
|
+
|
4
|
+
<http_port>8123</http_port>
|
5
|
+
<tcp_port>9000</tcp_port>
|
6
|
+
|
7
|
+
<users_config>users.xml</users_config>
|
8
|
+
<default_profile>default</default_profile>
|
9
|
+
<default_database>default</default_database>
|
10
|
+
|
11
|
+
<mark_cache_size>5368709120</mark_cache_size>
|
12
|
+
|
13
|
+
<path>/var/lib/clickhouse/</path>
|
14
|
+
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
|
15
|
+
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
|
16
|
+
<access_control_path>/var/lib/clickhouse/access/</access_control_path>
|
17
|
+
<keep_alive_timeout>3</keep_alive_timeout>
|
18
|
+
|
19
|
+
<logger>
|
20
|
+
<level>debug</level>
|
21
|
+
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
|
22
|
+
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
|
23
|
+
<size>1000M</size>
|
24
|
+
<count>10</count>
|
25
|
+
<console>1</console>
|
26
|
+
</logger>
|
27
|
+
|
28
|
+
<query_log>
|
29
|
+
<database>system</database>
|
30
|
+
<table>query_log</table>
|
31
|
+
<partition_by>toYYYYMM(event_date)</partition_by>
|
32
|
+
<flush_interval_milliseconds>1000</flush_interval_milliseconds>
|
33
|
+
</query_log>
|
34
|
+
|
35
|
+
<http_options_response>
|
36
|
+
<header>
|
37
|
+
<name>Access-Control-Allow-Origin</name>
|
38
|
+
<value>*</value>
|
39
|
+
</header>
|
40
|
+
<header>
|
41
|
+
<name>Access-Control-Allow-Headers</name>
|
42
|
+
<value>accept, origin, x-requested-with, content-type, authorization</value>
|
43
|
+
</header>
|
44
|
+
<header>
|
45
|
+
<name>Access-Control-Allow-Methods</name>
|
46
|
+
<value>POST, GET, OPTIONS</value>
|
47
|
+
</header>
|
48
|
+
<header>
|
49
|
+
<name>Access-Control-Max-Age</name>
|
50
|
+
<value>86400</value>
|
51
|
+
</header>
|
52
|
+
</http_options_response>
|
53
|
+
|
54
|
+
</clickhouse>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<clickhouse>
|
3
|
+
|
4
|
+
<profiles>
|
5
|
+
<default>
|
6
|
+
<load_balancing>random</load_balancing>
|
7
|
+
</default>
|
8
|
+
</profiles>
|
9
|
+
|
10
|
+
<users>
|
11
|
+
<default>
|
12
|
+
<password></password>
|
13
|
+
<networks>
|
14
|
+
<ip>::/0</ip>
|
15
|
+
</networks>
|
16
|
+
<profile>default</profile>
|
17
|
+
<quota>default</quota>
|
18
|
+
<access_management>1</access_management>
|
19
|
+
</default>
|
20
|
+
</users>
|
21
|
+
|
22
|
+
<quotas>
|
23
|
+
<default>
|
24
|
+
<interval>
|
25
|
+
<duration>3600</duration>
|
26
|
+
<queries>0</queries>
|
27
|
+
<errors>0</errors>
|
28
|
+
<result_rows>0</result_rows>
|
29
|
+
<read_rows>0</read_rows>
|
30
|
+
<execution_time>0</execution_time>
|
31
|
+
</interval>
|
32
|
+
</default>
|
33
|
+
</quotas>
|
34
|
+
</clickhouse>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
version: '3.5'
|
2
|
+
|
3
|
+
services:
|
4
|
+
clickhouse1:
|
5
|
+
image: 'clickhouse/clickhouse-server:${CLICKHOUSE_VERSION-23.11-alpine}'
|
6
|
+
ulimits:
|
7
|
+
nofile:
|
8
|
+
soft: 262144
|
9
|
+
hard: 262144
|
10
|
+
hostname: clickhouse1
|
11
|
+
container_name: clickhouse-activerecord-clickhouse-server-1
|
12
|
+
ports:
|
13
|
+
- '8124:8123'
|
14
|
+
- '9001:9000'
|
15
|
+
volumes:
|
16
|
+
- './clickhouse/cluster/server1_config.xml:/etc/clickhouse-server/config.xml'
|
17
|
+
- './clickhouse/users.xml:/etc/clickhouse-server/users.xml'
|
18
|
+
healthcheck:
|
19
|
+
test: bash -c "exec 6<> /dev/tcp/localhost/8123"
|
20
|
+
interval: 5s
|
21
|
+
|
22
|
+
clickhouse2:
|
23
|
+
image: 'clickhouse/clickhouse-server:${CLICKHOUSE_VERSION-23.11-alpine}'
|
24
|
+
ulimits:
|
25
|
+
nofile:
|
26
|
+
soft: 262144
|
27
|
+
hard: 262144
|
28
|
+
hostname: clickhouse2
|
29
|
+
container_name: clickhouse-activerecord-clickhouse-server-2
|
30
|
+
ports:
|
31
|
+
- '8125:8123'
|
32
|
+
volumes:
|
33
|
+
- './clickhouse/cluster/server2_config.xml:/etc/clickhouse-server/config.xml'
|
34
|
+
- './clickhouse/users.xml:/etc/clickhouse-server/users.xml'
|
35
|
+
healthcheck:
|
36
|
+
test: bash -c "exec 6<> /dev/tcp/localhost/8123"
|
37
|
+
interval: 5s
|
38
|
+
|
39
|
+
# Using Nginx as a cluster entrypoint and a round-robin load balancer for HTTP requests
|
40
|
+
nginx:
|
41
|
+
image: 'nginx:1.23.1-alpine'
|
42
|
+
hostname: nginx
|
43
|
+
ports:
|
44
|
+
- '28123:8123'
|
45
|
+
volumes:
|
46
|
+
- './nginx/local.conf:/etc/nginx/conf.d/local.conf'
|
47
|
+
container_name: clickhouse-activerecord-nginx
|
48
|
+
depends_on:
|
49
|
+
clickhouse1:
|
50
|
+
condition: service_healthy
|
51
|
+
clickhouse2:
|
52
|
+
condition: service_healthy
|
@@ -0,0 +1,17 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
services:
|
3
|
+
clickhouse:
|
4
|
+
image: 'clickhouse/clickhouse-server:${CLICKHOUSE_VERSION-23.11-alpine}'
|
5
|
+
container_name: 'clickhouse-activerecord-clickhouse-server'
|
6
|
+
ports:
|
7
|
+
- '18123:8123'
|
8
|
+
ulimits:
|
9
|
+
nofile:
|
10
|
+
soft: 262144
|
11
|
+
hard: 262144
|
12
|
+
volumes:
|
13
|
+
- './clickhouse/single/config.xml:/etc/clickhouse-server/config.xml'
|
14
|
+
- './clickhouse/users.xml:/etc/clickhouse-server/users.xml'
|
15
|
+
healthcheck:
|
16
|
+
test: bash -c "exec 6<> /dev/tcp/localhost/8123"
|
17
|
+
interval: 5s
|
@@ -0,0 +1,77 @@
|
|
1
|
+
name: Testing
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ "master" ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ "master" ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
tests_single:
|
11
|
+
name: Testing single server
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
env:
|
15
|
+
CLICKHOUSE_PORT: 18123
|
16
|
+
CLICKHOUSE_DATABASE: default
|
17
|
+
|
18
|
+
strategy:
|
19
|
+
fail-fast: true
|
20
|
+
max-parallel: 1
|
21
|
+
matrix:
|
22
|
+
ruby-version: [ '2.7', '3.0', '3.2' ]
|
23
|
+
clickhouse: [ '22.1' ]
|
24
|
+
|
25
|
+
steps:
|
26
|
+
- uses: actions/checkout@v4
|
27
|
+
|
28
|
+
- name: Start ClickHouse ${{ matrix.clickhouse }}
|
29
|
+
uses: isbang/compose-action@v1.5.1
|
30
|
+
env:
|
31
|
+
CLICKHOUSE_VERSION: ${{ matrix.clickhouse }}
|
32
|
+
with:
|
33
|
+
compose-file: '.docker/docker-compose.yml'
|
34
|
+
down-flags: '--volumes'
|
35
|
+
|
36
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
37
|
+
uses: ruby/setup-ruby@v1
|
38
|
+
with:
|
39
|
+
ruby-version: ${{ matrix.ruby-version }}
|
40
|
+
bundler-cache: true
|
41
|
+
|
42
|
+
- run: bundle exec rspec spec/single
|
43
|
+
|
44
|
+
tests_cluster:
|
45
|
+
name: Testing cluster server
|
46
|
+
runs-on: ubuntu-latest
|
47
|
+
|
48
|
+
env:
|
49
|
+
CLICKHOUSE_PORT: 28123
|
50
|
+
CLICKHOUSE_DATABASE: default
|
51
|
+
CLICKHOUSE_CLUSTER: test_cluster
|
52
|
+
|
53
|
+
strategy:
|
54
|
+
fail-fast: true
|
55
|
+
max-parallel: 1
|
56
|
+
matrix:
|
57
|
+
ruby-version: [ '2.7', '3.0', '3.2' ]
|
58
|
+
clickhouse: [ '22.1' ]
|
59
|
+
|
60
|
+
steps:
|
61
|
+
- uses: actions/checkout@v4
|
62
|
+
|
63
|
+
- name: Start ClickHouse Cluster ${{ matrix.clickhouse }}
|
64
|
+
uses: isbang/compose-action@v1.5.1
|
65
|
+
env:
|
66
|
+
CLICKHOUSE_VERSION: ${{ matrix.clickhouse }}
|
67
|
+
with:
|
68
|
+
compose-file: '.docker/docker-compose.cluster.yml'
|
69
|
+
down-flags: '--volumes'
|
70
|
+
|
71
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
72
|
+
uses: ruby/setup-ruby@v1
|
73
|
+
with:
|
74
|
+
ruby-version: ${{ matrix.ruby-version }}
|
75
|
+
bundler-cache: true
|
76
|
+
|
77
|
+
- run: bundle exec rspec spec/cluster
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
### Version 1.0.5 (Mar 14, 2024)
|
2
|
+
|
3
|
+
* GitHub workflows
|
4
|
+
* Fix injection internal and schema classes for rails 7
|
5
|
+
* Add support for binary string by [@PauloMiranda98](https://github.com/PauloMiranda98) in (#116)
|
6
|
+
|
7
|
+
### Version 1.0.4 (Feb 2, 2024)
|
8
|
+
|
9
|
+
* Use ILIKE for `model.arel_table[:column]#matches` by [@stympy](https://github.com/stympy) in (#115)
|
10
|
+
* Fixed `insert_all` for array column (#71)
|
11
|
+
* Register Bool and UUID in type map by [@lukinski](https://github.com/lukinski) in (#110)
|
12
|
+
* Refactoring `final` method
|
13
|
+
* Support update & delete for clickhouse from version 23.3 and newer (#93)
|
14
|
+
|
15
|
+
### Version 1.0.0 (Nov 29, 2023)
|
16
|
+
|
17
|
+
* Full support Rails 7.1+
|
18
|
+
* Full support primary or multiple databases
|
19
|
+
|
20
|
+
### Version 0.6.0 (Oct 19, 2023)
|
21
|
+
|
22
|
+
* Added `Bool` column type instead `Uint8` (#78). Supports ClickHouse 22+ database only
|
23
|
+
* Added `final` method (#81) (The `ar_internal_metadata` table needs to be deleted after a gem update)
|
24
|
+
* Added `settings` method (#82)
|
25
|
+
* Fixed convert aggregation type (#92)
|
26
|
+
* Fixed raise error not database exist (#91)
|
27
|
+
* Fixed internal metadata update (#84)
|
28
|
+
|
1
29
|
### Version 0.5.10 (Jun 22, 2022)
|
2
30
|
|
3
31
|
* Fixes to create_table method (#70)
|
data/README.md
CHANGED
@@ -203,7 +203,7 @@ false`. The default integer is `UInt32`
|
|
203
203
|
Example:
|
204
204
|
|
205
205
|
``` ruby
|
206
|
-
class CreateDataItems < ActiveRecord::Migration
|
206
|
+
class CreateDataItems < ActiveRecord::Migration[7.1]
|
207
207
|
def change
|
208
208
|
create_table "data_items", id: false, options: "VersionedCollapsingMergeTree(sign, version) PARTITION BY toYYYYMM(day) ORDER BY category", force: :cascade do |t|
|
209
209
|
t.date "day", null: false
|
@@ -212,9 +212,32 @@ class CreateDataItems < ActiveRecord::Migration
|
|
212
212
|
t.integer "sign", limit: 1, unsigned: false, default: -> { "CAST(1, 'Int8')" }, null: false
|
213
213
|
t.integer "version", limit: 8, default: -> { "CAST(toUnixTimestamp(now()), 'UInt64')" }, null: false
|
214
214
|
end
|
215
|
+
|
216
|
+
create_table "with_index", id: false, options: 'MergeTree PARTITION BY toYYYYMM(date) ORDER BY (date)' do |t|
|
217
|
+
t.integer :int1, null: false
|
218
|
+
t.integer :int2, null: false
|
219
|
+
t.date :date, null: false
|
220
|
+
|
221
|
+
t.index '(int1 * int2, date)', name: 'idx', type: 'minmax', granularity: 3
|
222
|
+
end
|
223
|
+
|
224
|
+
remove_index :some, 'idx'
|
225
|
+
|
226
|
+
add_index :some, 'int1 * int2', name: 'idx2', type: 'set(10)', granularity: 4
|
227
|
+
end
|
228
|
+
end
|
229
|
+
```
|
230
|
+
|
231
|
+
Create table with custom column structure:
|
232
|
+
|
233
|
+
``` ruby
|
234
|
+
class CreateDataItems < ActiveRecord::Migration
|
235
|
+
def change
|
236
|
+
create_table "data_items", id: false, options: "MergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY timestamp", force: :cascade do |t|
|
237
|
+
t.column "timestamp", "DateTime('UTC') CODEC(DoubleDelta, LZ4)"
|
238
|
+
end
|
215
239
|
end
|
216
240
|
end
|
217
|
-
|
218
241
|
```
|
219
242
|
|
220
243
|
|
@@ -246,6 +269,12 @@ After checking out the repo, run `bin/setup` to install dependencies. You can al
|
|
246
269
|
|
247
270
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
248
271
|
|
272
|
+
Testing github actions:
|
273
|
+
|
274
|
+
```bash
|
275
|
+
act
|
276
|
+
```
|
277
|
+
|
249
278
|
## Contributing
|
250
279
|
|
251
280
|
Bug reports and pull requests are welcome on GitHub at [https://github.com/pnixx/clickhouse-activerecord](https://github.com/pnixx/clickhouse-activerecord). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
@@ -6,6 +6,7 @@ module ActiveRecord
|
|
6
6
|
module OID # :nodoc:
|
7
7
|
class Uuid < Type::Value # :nodoc:
|
8
8
|
ACCEPTABLE_UUID = %r{\A(\{)?([a-fA-F0-9]{4}-?){8}(?(1)\}|)\z}
|
9
|
+
CANONICAL_UUID = %r{\A[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}\z}
|
9
10
|
|
10
11
|
alias :serialize :deserialize
|
11
12
|
|
@@ -13,23 +14,32 @@ module ActiveRecord
|
|
13
14
|
:uuid
|
14
15
|
end
|
15
16
|
|
16
|
-
def changed?(old_value, new_value,
|
17
|
+
def changed?(old_value, new_value, _new_value_before_type_cast)
|
17
18
|
old_value.class != new_value.class ||
|
18
|
-
new_value
|
19
|
+
new_value != old_value
|
19
20
|
end
|
20
21
|
|
21
22
|
def changed_in_place?(raw_old_value, new_value)
|
22
23
|
raw_old_value.class != new_value.class ||
|
23
|
-
new_value
|
24
|
+
new_value != raw_old_value
|
24
25
|
end
|
25
26
|
|
26
27
|
private
|
27
28
|
|
28
29
|
def cast_value(value)
|
29
|
-
|
30
|
-
|
30
|
+
value = value.to_s
|
31
|
+
format_uuid(value) if value.match?(ACCEPTABLE_UUID)
|
31
32
|
end
|
32
|
-
|
33
|
+
|
34
|
+
def format_uuid(uuid)
|
35
|
+
if uuid.match?(CANONICAL_UUID)
|
36
|
+
uuid
|
37
|
+
else
|
38
|
+
uuid = uuid.delete("{}-").downcase
|
39
|
+
"#{uuid[..7]}-#{uuid[8..11]}-#{uuid[12..15]}-#{uuid[16..19]}-#{uuid[20..]}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
33
43
|
end
|
34
44
|
end
|
35
45
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
begin
|
3
2
|
require "active_record/connection_adapters/deduplicable"
|
4
3
|
rescue LoadError => e
|
@@ -93,6 +92,14 @@ module ActiveRecord
|
|
93
92
|
|
94
93
|
statements = o.columns.map { |c| accept c }
|
95
94
|
statements << accept(o.primary_keys) if o.primary_keys
|
95
|
+
|
96
|
+
if supports_indexes_in_create?
|
97
|
+
indexes = o.indexes.map do |expression, options|
|
98
|
+
accept(@conn.add_index_options(o.name, expression, **options))
|
99
|
+
end
|
100
|
+
statements.concat(indexes)
|
101
|
+
end
|
102
|
+
|
96
103
|
create_sql << "(#{statements.join(', ')})" if statements.present?
|
97
104
|
# Attach options for only table or materialized view without TO section
|
98
105
|
add_table_options!(create_sql, o) if !o.view || o.view && o.materialized && !o.to
|
@@ -108,7 +115,7 @@ module ActiveRecord
|
|
108
115
|
|
109
116
|
def visit_ChangeColumnDefinition(o)
|
110
117
|
column = o.column
|
111
|
-
column.sql_type = type_to_sql(column.type, column.options)
|
118
|
+
column.sql_type = type_to_sql(column.type, **column.options)
|
112
119
|
options = column_options(column)
|
113
120
|
|
114
121
|
quoted_column_name = quote_column_name(o.name)
|
@@ -124,6 +131,23 @@ module ActiveRecord
|
|
124
131
|
change_column_sql
|
125
132
|
end
|
126
133
|
|
134
|
+
def visit_IndexDefinition(o, create = false)
|
135
|
+
sql = create ? ["ALTER TABLE #{quote_table_name(o.table)} ADD"] : []
|
136
|
+
sql << "INDEX"
|
137
|
+
sql << "IF NOT EXISTS" if o.if_not_exists
|
138
|
+
sql << "IF EXISTS" if o.if_exists
|
139
|
+
sql << "#{quote_column_name(o.name)} (#{o.expression}) TYPE #{o.type}"
|
140
|
+
sql << "GRANULARITY #{o.granularity}" if o.granularity
|
141
|
+
sql << "FIRST #{quote_column_name(o.first)}" if o.first
|
142
|
+
sql << "AFTER #{quote_column_name(o.after)}" if o.after
|
143
|
+
|
144
|
+
sql.join(' ')
|
145
|
+
end
|
146
|
+
|
147
|
+
def visit_CreateIndexDefinition(o)
|
148
|
+
visit_IndexDefinition(o.index, true)
|
149
|
+
end
|
150
|
+
|
127
151
|
def current_database
|
128
152
|
ActiveRecord::Base.connection_db_config.database
|
129
153
|
end
|