click_house 1.3.0 → 1.3.5
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/.github/workflows/main.yml +68 -0
- data/.rubocop.yml +73 -1
- data/CHANGELOG.md +17 -0
- data/Gemfile.lock +27 -24
- data/README.md +19 -12
- data/docker-compose.yml +1 -1
- data/lib/click_house.rb +2 -10
- data/lib/click_house/config.rb +4 -2
- data/lib/click_house/connection.rb +3 -0
- data/lib/click_house/definition/column_set.rb +1 -11
- data/lib/click_house/extend.rb +1 -0
- data/lib/click_house/extend/connection_explaining.rb +15 -0
- data/lib/click_house/extend/type_definition.rb +10 -1
- data/lib/click_house/middleware/logging.rb +1 -1
- data/lib/click_house/response/result_set.rb +2 -1
- data/lib/click_house/util/statement.rb +2 -1
- data/lib/click_house/version.rb +1 -1
- metadata +4 -3
- data/.travis.yml +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd545a5ce410be500540a02ef1f46e57b9a7a2dfe2df8b5be47022ac2cd1f5b4
|
4
|
+
data.tar.gz: 19b872a4901d7543ddf7fbb23ca53ac8f6731023b74ae5af24a52aac4b054fc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ad04e10ecb7acce32f3c18225b62aad8b83ef79f46e176678bbaadf0b274e8b0cefbe72c678e7ba9d047a22d98912a4de2e89b73957b721731e3666caf3850c
|
7
|
+
data.tar.gz: 0155f69f8faf71b9fbf95a1d32f04dce4c3eb2a9b43752aac786ee29a3f0db882afd85c1e44178e366938a18053f99eead8d247267d53a49f6dffd63ac0223f5
|
@@ -0,0 +1,68 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
rspec:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
|
9
|
+
services:
|
10
|
+
clickhouse:
|
11
|
+
image: yandex/clickhouse-server:20.11.4.13
|
12
|
+
ports:
|
13
|
+
- 8123:8123
|
14
|
+
|
15
|
+
strategy:
|
16
|
+
matrix:
|
17
|
+
ruby-version: [2.7, 2.6, 2.5]
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v2
|
21
|
+
|
22
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
23
|
+
uses: ruby/setup-ruby@v1
|
24
|
+
with:
|
25
|
+
ruby-version: ${{ matrix.ruby-version }}
|
26
|
+
|
27
|
+
- name: Cache gems
|
28
|
+
uses: actions/cache@v1
|
29
|
+
with:
|
30
|
+
path: vendor/bundle
|
31
|
+
key: ${{ runner.os }}-${{ matrix.ruby-version }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
|
32
|
+
restore-keys: |
|
33
|
+
${{ runner.os }}-${{ matrix.ruby-version }}-bundler-
|
34
|
+
|
35
|
+
- name: Install gems
|
36
|
+
run: |
|
37
|
+
bundle config path vendor/bundle
|
38
|
+
bundle install --jobs 4 --retry 3
|
39
|
+
|
40
|
+
- name: Run tests
|
41
|
+
run: bundle exec rspec
|
42
|
+
|
43
|
+
rubocop:
|
44
|
+
runs-on: ubuntu-latest
|
45
|
+
|
46
|
+
steps:
|
47
|
+
- uses: actions/checkout@v2
|
48
|
+
|
49
|
+
- name: Set up Ruby 2.7
|
50
|
+
uses: ruby/setup-ruby@v1
|
51
|
+
with:
|
52
|
+
ruby-version: 2.7
|
53
|
+
|
54
|
+
- name: Cache gems
|
55
|
+
uses: actions/cache@v1
|
56
|
+
with:
|
57
|
+
path: vendor/bundle
|
58
|
+
key: ${{ runner.os }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
|
59
|
+
restore-keys: |
|
60
|
+
${{ runner.os }}-bundler-
|
61
|
+
|
62
|
+
- name: Install gems
|
63
|
+
run: |
|
64
|
+
bundle config path vendor/bundle
|
65
|
+
bundle install --jobs 4 --retry 3
|
66
|
+
|
67
|
+
- name: Run Rubocop
|
68
|
+
run: bundle exec rubocop
|
data/.rubocop.yml
CHANGED
@@ -3,13 +3,13 @@ require:
|
|
3
3
|
|
4
4
|
AllCops:
|
5
5
|
AutoCorrect: false
|
6
|
+
SuggestExtensions: false
|
6
7
|
Exclude:
|
7
8
|
- 'click_house.gemspec'
|
8
9
|
- 'bin/*'
|
9
10
|
- 'spec/**/*'
|
10
11
|
- 'vendor/**/*'
|
11
12
|
TargetRubyVersion: 2.7
|
12
|
-
|
13
13
|
Bundler/OrderedGems:
|
14
14
|
Enabled: false
|
15
15
|
|
@@ -34,6 +34,18 @@ Performance/Squeeze:
|
|
34
34
|
Enabled: true
|
35
35
|
Performance/StringInclude:
|
36
36
|
Enabled: true
|
37
|
+
Performance/Sum:
|
38
|
+
Enabled: true
|
39
|
+
Performance/ArraySemiInfiniteRangeSlice:
|
40
|
+
Enabled: true
|
41
|
+
Performance/BlockGivenWithExplicitBlock:
|
42
|
+
Enabled: true
|
43
|
+
Performance/CollectionLiteralInLoop:
|
44
|
+
Enabled: true
|
45
|
+
Performance/ConstantRegexp:
|
46
|
+
Enabled: true
|
47
|
+
Performance/MethodObjectAsBlock:
|
48
|
+
Enabled: false
|
37
49
|
|
38
50
|
# ============================== Metrics ============================
|
39
51
|
Metrics/ClassLength:
|
@@ -181,6 +193,30 @@ Style/SingleArgumentDig:
|
|
181
193
|
Enabled: true
|
182
194
|
Style/StringConcatenation:
|
183
195
|
Enabled: true
|
196
|
+
Style/ClassEqualityComparison:
|
197
|
+
Enabled: true
|
198
|
+
Style/CombinableLoops:
|
199
|
+
Enabled: true
|
200
|
+
Style/KeywordParametersOrder:
|
201
|
+
Enabled: false
|
202
|
+
Style/RedundantSelfAssignment:
|
203
|
+
Enabled: true
|
204
|
+
Style/SoleNestedConditional:
|
205
|
+
Enabled: true
|
206
|
+
Style/ArgumentsForwarding:
|
207
|
+
Enabled: true
|
208
|
+
Style/CollectionCompact:
|
209
|
+
Enabled: true
|
210
|
+
Style/DocumentDynamicEvalDefinition:
|
211
|
+
Enabled: false
|
212
|
+
Style/NegatedIfElseCondition:
|
213
|
+
Enabled: true
|
214
|
+
Style/NilLambda:
|
215
|
+
Enabled: true
|
216
|
+
Style/SwapValues:
|
217
|
+
Enabled: true
|
218
|
+
Style/RedundantArgument:
|
219
|
+
Enabled: true
|
184
220
|
|
185
221
|
# ============================== Lint ==============================
|
186
222
|
Lint/DuplicateMethods:
|
@@ -215,3 +251,39 @@ Lint/TopLevelReturnWithArgument:
|
|
215
251
|
Enabled: true
|
216
252
|
Lint/UnreachableLoop:
|
217
253
|
Enabled: true
|
254
|
+
Layout/BeginEndAlignment:
|
255
|
+
Enabled: true
|
256
|
+
Lint/ConstantDefinitionInBlock:
|
257
|
+
Enabled: true
|
258
|
+
Lint/DuplicateRequire:
|
259
|
+
Enabled: true
|
260
|
+
Lint/EmptyFile:
|
261
|
+
Enabled: true
|
262
|
+
Lint/HashCompareByIdentity:
|
263
|
+
Enabled: true
|
264
|
+
Lint/IdentityComparison:
|
265
|
+
Enabled: true
|
266
|
+
Lint/RedundantSafeNavigation:
|
267
|
+
Enabled: true
|
268
|
+
Lint/TrailingCommaInAttributeDeclaration:
|
269
|
+
Enabled: true
|
270
|
+
Lint/UselessMethodDefinition:
|
271
|
+
Enabled: true
|
272
|
+
Lint/UselessTimes:
|
273
|
+
Enabled: true
|
274
|
+
Lint/DuplicateBranch:
|
275
|
+
Enabled: true
|
276
|
+
Lint/DuplicateRegexpCharacterClassElement:
|
277
|
+
Enabled: true
|
278
|
+
Lint/EmptyBlock:
|
279
|
+
Enabled: true
|
280
|
+
Lint/EmptyClass:
|
281
|
+
Enabled: true
|
282
|
+
Lint/NoReturnInBeginEndBlocks:
|
283
|
+
Enabled: true
|
284
|
+
Lint/ToEnumArguments:
|
285
|
+
Enabled: true
|
286
|
+
Lint/UnmodifiedReduceAccumulator:
|
287
|
+
Enabled: true
|
288
|
+
Lint/UnexpectedBlockArity:
|
289
|
+
Enabled: true
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# 1.3.5
|
2
|
+
* added `ClickHouse.connexction.explain("sql")`
|
3
|
+
|
4
|
+
# 1.3.4
|
5
|
+
* added `ClickHouse.type_names(nullable: false)`
|
6
|
+
* fixed `connection#create_table` column definitions
|
7
|
+
* `ClickHouse.add_type` now handles Nullable types automatically
|
8
|
+
|
9
|
+
# 1.3.3
|
10
|
+
* fix logger typo
|
11
|
+
|
12
|
+
# 1.3.2
|
13
|
+
* fix null logger for windows users
|
14
|
+
|
15
|
+
# 1.3.1
|
16
|
+
* added request [headers](https://github.com/shlima/click_house/pull/8) support
|
17
|
+
|
1
18
|
# 1.3.0
|
2
19
|
* added support for IPv4/IPv6 types
|
3
20
|
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
click_house (1.3.
|
4
|
+
click_house (1.3.5)
|
5
5
|
faraday
|
6
6
|
faraday_middleware
|
7
7
|
|
@@ -11,49 +11,52 @@ GEM
|
|
11
11
|
ast (2.4.1)
|
12
12
|
coderay (1.1.3)
|
13
13
|
diff-lcs (1.4.4)
|
14
|
-
faraday (1.0
|
14
|
+
faraday (1.1.0)
|
15
15
|
multipart-post (>= 1.2, < 3)
|
16
|
+
ruby2_keywords
|
16
17
|
faraday_middleware (1.0.0)
|
17
18
|
faraday (~> 1.0)
|
18
19
|
method_source (1.0.0)
|
19
20
|
multipart-post (2.1.1)
|
20
|
-
parallel (1.
|
21
|
-
parser (2.7.
|
21
|
+
parallel (1.20.1)
|
22
|
+
parser (2.7.2.0)
|
22
23
|
ast (~> 2.4.1)
|
23
24
|
pry (0.13.1)
|
24
25
|
coderay (~> 1.1)
|
25
26
|
method_source (~> 1.0)
|
26
27
|
rainbow (3.0.0)
|
27
28
|
rake (13.0.1)
|
28
|
-
regexp_parser (
|
29
|
+
regexp_parser (2.0.0)
|
29
30
|
rexml (3.2.4)
|
30
|
-
rspec (3.
|
31
|
-
rspec-core (~> 3.
|
32
|
-
rspec-expectations (~> 3.
|
33
|
-
rspec-mocks (~> 3.
|
34
|
-
rspec-core (3.
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-expectations (3.
|
31
|
+
rspec (3.10.0)
|
32
|
+
rspec-core (~> 3.10.0)
|
33
|
+
rspec-expectations (~> 3.10.0)
|
34
|
+
rspec-mocks (~> 3.10.0)
|
35
|
+
rspec-core (3.10.0)
|
36
|
+
rspec-support (~> 3.10.0)
|
37
|
+
rspec-expectations (3.10.0)
|
37
38
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-mocks (3.
|
39
|
+
rspec-support (~> 3.10.0)
|
40
|
+
rspec-mocks (3.10.0)
|
40
41
|
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
-
rspec-support (~> 3.
|
42
|
-
rspec-support (3.
|
43
|
-
rubocop (
|
42
|
+
rspec-support (~> 3.10.0)
|
43
|
+
rspec-support (3.10.0)
|
44
|
+
rubocop (1.5.2)
|
44
45
|
parallel (~> 1.10)
|
45
|
-
parser (>= 2.7.1.
|
46
|
+
parser (>= 2.7.1.5)
|
46
47
|
rainbow (>= 2.2.2, < 4.0)
|
47
|
-
regexp_parser (>= 1.
|
48
|
+
regexp_parser (>= 1.8, < 3.0)
|
48
49
|
rexml
|
49
|
-
rubocop-ast (>=
|
50
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
50
51
|
ruby-progressbar (~> 1.7)
|
51
52
|
unicode-display_width (>= 1.4.0, < 2.0)
|
52
|
-
rubocop-ast (
|
53
|
-
parser (>= 2.7.1.
|
54
|
-
rubocop-performance (1.
|
55
|
-
rubocop (>= 0.
|
53
|
+
rubocop-ast (1.3.0)
|
54
|
+
parser (>= 2.7.1.5)
|
55
|
+
rubocop-performance (1.9.1)
|
56
|
+
rubocop (>= 0.90.0, < 2.0)
|
57
|
+
rubocop-ast (>= 0.4.0)
|
56
58
|
ruby-progressbar (1.10.1)
|
59
|
+
ruby2_keywords (0.0.2)
|
57
60
|
unicode-display_width (1.7.0)
|
58
61
|
|
59
62
|
PLATFORMS
|
data/README.md
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
# ClickHouse Ruby driver
|
4
4
|
|
5
|
-
|
5
|
+

|
6
6
|
[](https://codeclimate.com/github/shlima/click_house)
|
7
7
|
[](https://badge.fury.io/rb/click_house)
|
8
8
|
|
9
9
|
```bash
|
10
|
-
# Requires
|
10
|
+
# Requires Ruby >= 2.5
|
11
11
|
gem install click_house
|
12
12
|
```
|
13
13
|
|
@@ -53,6 +53,7 @@ ClickHouse.config do |config|
|
|
53
53
|
config.timeout = 60
|
54
54
|
config.open_timeout = 3
|
55
55
|
config.ssl_verify = false
|
56
|
+
config.headers = {}
|
56
57
|
|
57
58
|
# or provide connection options separately
|
58
59
|
config.scheme = 'http'
|
@@ -104,6 +105,11 @@ ClickHouse.connection.truncate_tables(['table_1', 'table_2'], if_exists: true, c
|
|
104
105
|
ClickHouse.connection.truncate_tables # will truncate all tables in database
|
105
106
|
ClickHouse.connection.rename_table('old_name', 'new_name', cluster: nil)
|
106
107
|
ClickHouse.connection.rename_table(%w[table_1 table_2], %w[new_1 new_2], cluster: nil)
|
108
|
+
|
109
|
+
ClickHouse.connection.select_all('SELECT * FROM visits')
|
110
|
+
ClickHouse.connection.select_one('SELECT * FROM visits LIMIT 1')
|
111
|
+
ClickHouse.connection.select_value('SELECT ip FROM visits LIMIT 1')
|
112
|
+
ClickHouse.connection.explain('SELECT * FROM visits CROSS JOIN visits')
|
107
113
|
```
|
108
114
|
|
109
115
|
## Queries
|
@@ -216,7 +222,8 @@ ClickHouse.connection.create_table('visits', if_not_exists: true, engine: 'Merge
|
|
216
222
|
t.Decimal :money, 5, 4
|
217
223
|
t.String :event
|
218
224
|
t.UInt32 :user_id
|
219
|
-
t.
|
225
|
+
t.IPv4 :ipv4
|
226
|
+
t.IPv6 :ipv6
|
220
227
|
end
|
221
228
|
```
|
222
229
|
|
@@ -328,11 +335,11 @@ ClickHouse.add_type('Date', DateType.new)
|
|
328
335
|
Actually `serialize` function is not used for now, but you may use it manually:
|
329
336
|
|
330
337
|
```ruby
|
331
|
-
time_type = DateTimeType.new
|
332
|
-
string_type = FixedStringType.new
|
338
|
+
time_type = ClickHouse::Type::DateTimeType.new
|
339
|
+
string_type = ClickHouse::Type::FixedStringType.new
|
333
340
|
|
334
341
|
ClickHouse.connection.insert('table', columns: %i[name time]) do |buffer|
|
335
|
-
buffer << [string_type.serialize('a' * 1000, 20),
|
342
|
+
buffer << [string_type.serialize('a' * 1000, 20), time_type.serialize(Time.current, 'Europe/Moscow')]
|
336
343
|
end
|
337
344
|
|
338
345
|
## alternatively
|
@@ -344,7 +351,8 @@ data = @records.map do |record|
|
|
344
351
|
end
|
345
352
|
```
|
346
353
|
|
347
|
-
If native type supports arguments, define type with `%s`
|
354
|
+
If native type supports arguments, define *String* type with `%s`
|
355
|
+
argument and *Numeric* type with `%d` argument:
|
348
356
|
|
349
357
|
```ruby
|
350
358
|
class DateTimeType
|
@@ -396,6 +404,10 @@ development:
|
|
396
404
|
test:
|
397
405
|
database: ecliptic_test
|
398
406
|
<<: *default
|
407
|
+
|
408
|
+
production:
|
409
|
+
<<: *default
|
410
|
+
database: ecliptic_production
|
399
411
|
```
|
400
412
|
|
401
413
|
```ruby
|
@@ -448,11 +460,6 @@ class CreateAdvertVisits < ActiveRecord::Migration[6.0]
|
|
448
460
|
t.UInt16 :account_id
|
449
461
|
t.UInt16 :user_id
|
450
462
|
t.Date :date
|
451
|
-
t.DateTime :time, 'UTC'
|
452
|
-
t.IPv4 :ipv4
|
453
|
-
t.IPv6 :ipv6
|
454
|
-
t.UInt32 :device_type_id
|
455
|
-
t.UInt32 :os_family_id
|
456
463
|
end
|
457
464
|
end
|
458
465
|
|
data/docker-compose.yml
CHANGED
data/lib/click_house.rb
CHANGED
@@ -28,41 +28,33 @@ module ClickHouse
|
|
28
28
|
|
29
29
|
%w[Date].each do |column|
|
30
30
|
add_type column, Type::DateType.new
|
31
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::DateType.new)
|
32
31
|
end
|
33
32
|
|
34
|
-
%w[String].each do |column|
|
33
|
+
%w[String FixedString(%d) UUID].each do |column|
|
35
34
|
add_type column, Type::StringType.new
|
36
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::StringType.new)
|
37
35
|
end
|
38
36
|
|
39
37
|
['DateTime(%s)'].each do |column|
|
40
38
|
add_type column, Type::DateTimeType.new
|
41
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::DateTimeType.new)
|
42
39
|
end
|
43
40
|
|
44
41
|
['DateTime64(%d, %s)'].each do |column|
|
45
42
|
add_type column, Type::DateTime64Type.new
|
46
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::DateTime64Type.new)
|
47
43
|
end
|
48
44
|
|
49
|
-
['Decimal(%
|
45
|
+
['Decimal(%d, %d)', 'Decimal32(%d)', 'Decimal64(%d)', 'Decimal128(%d)'].each do |column|
|
50
46
|
add_type column, Type::DecimalType.new
|
51
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::DecimalType.new)
|
52
47
|
end
|
53
48
|
|
54
49
|
%w[UInt8 UInt16 UInt32 UInt64 Int8 Int16 Int32 Int64].each do |column|
|
55
50
|
add_type column, Type::IntegerType.new
|
56
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::IntegerType.new)
|
57
51
|
end
|
58
52
|
|
59
53
|
%w[Float32 Float64].each do |column|
|
60
54
|
add_type column, Type::FloatType.new
|
61
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::IntegerType.new)
|
62
55
|
end
|
63
56
|
|
64
57
|
%w[IPv4 IPv6].each do |column|
|
65
58
|
add_type column, Type::IPType.new
|
66
|
-
add_type "Nullable(#{column})", Type::NullableType.new(Type::IPType.new)
|
67
59
|
end
|
68
60
|
end
|
data/lib/click_house/config.rb
CHANGED
@@ -18,7 +18,8 @@ module ClickHouse
|
|
18
18
|
password: nil,
|
19
19
|
timeout: nil,
|
20
20
|
open_timeout: nil,
|
21
|
-
ssl_verify: false
|
21
|
+
ssl_verify: false,
|
22
|
+
headers: {}
|
22
23
|
}.freeze
|
23
24
|
|
24
25
|
attr_accessor :adapter
|
@@ -33,6 +34,7 @@ module ClickHouse
|
|
33
34
|
attr_accessor :timeout
|
34
35
|
attr_accessor :open_timeout
|
35
36
|
attr_accessor :ssl_verify
|
37
|
+
attr_accessor :headers
|
36
38
|
|
37
39
|
def initialize(params = {})
|
38
40
|
assign(DEFAULTS.merge(params))
|
@@ -51,7 +53,7 @@ module ClickHouse
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def logger!
|
54
|
-
@logger || Logger.new(
|
56
|
+
@logger || Logger.new(IO::NULL)
|
55
57
|
end
|
56
58
|
|
57
59
|
def url!
|
@@ -8,9 +8,11 @@ module ClickHouse
|
|
8
8
|
include Extend::ConnectionSelective
|
9
9
|
include Extend::ConnectionInserting
|
10
10
|
include Extend::ConnectionAltering
|
11
|
+
include Extend::ConnectionExplaining
|
11
12
|
|
12
13
|
attr_reader :config
|
13
14
|
|
15
|
+
# @param [Config]
|
14
16
|
def initialize(config)
|
15
17
|
@config = config
|
16
18
|
end
|
@@ -31,6 +33,7 @@ module ClickHouse
|
|
31
33
|
@transport ||= Faraday.new(config.url!) do |conn|
|
32
34
|
conn.options.timeout = config.timeout
|
33
35
|
conn.options.open_timeout = config.open_timeout
|
36
|
+
conn.headers = config.headers
|
34
37
|
conn.ssl.verify = config.ssl_verify
|
35
38
|
conn.basic_auth(config.username, config.password) if config.auth?
|
36
39
|
conn.response Middleware::Logging, logger: config.logger!
|
@@ -3,17 +3,7 @@
|
|
3
3
|
module ClickHouse
|
4
4
|
module Definition
|
5
5
|
class ColumnSet
|
6
|
-
TYPES =
|
7
|
-
'UInt8', 'UInt16', 'UInt32', 'UInt64', 'Int8', 'Int16', 'Int32', 'Int64',
|
8
|
-
'Float32', 'Float64',
|
9
|
-
'Decimal(%d, %d)', 'Decimal32(%d)', 'Decimal64(%d)', 'Decimal128(%d)',
|
10
|
-
'String',
|
11
|
-
'FixedString(%d)',
|
12
|
-
'UUID',
|
13
|
-
'Date',
|
14
|
-
'IPv4', 'IPv6',
|
15
|
-
"DateTime('%s')", "DateTime64(%d, '%s')"
|
16
|
-
].freeze
|
6
|
+
TYPES = ClickHouse.type_names(nullable: false).map { |s| s.sub('%s', "'%s'") }.freeze
|
17
7
|
|
18
8
|
class << self
|
19
9
|
# @input "DateTime('%s')"
|
data/lib/click_house/extend.rb
CHANGED
@@ -11,5 +11,6 @@ module ClickHouse
|
|
11
11
|
autoload :ConnectionSelective, 'click_house/extend/connection_selective'
|
12
12
|
autoload :ConnectionInserting, 'click_house/extend/connection_inserting'
|
13
13
|
autoload :ConnectionAltering, 'click_house/extend/connection_altering'
|
14
|
+
autoload :ConnectionExplaining, 'click_house/extend/connection_explaining'
|
14
15
|
end
|
15
16
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ClickHouse
|
4
|
+
module Extend
|
5
|
+
module ConnectionExplaining
|
6
|
+
EXPLAIN = 'EXPLAIN'
|
7
|
+
EXPLAIN_RE = /\A(\s*#{EXPLAIN})/io.freeze
|
8
|
+
|
9
|
+
def explain(sql, io: $stdout)
|
10
|
+
res = execute("#{EXPLAIN} #{sql.gsub(EXPLAIN_RE, '')}")
|
11
|
+
io << res.body
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -3,12 +3,21 @@
|
|
3
3
|
module ClickHouse
|
4
4
|
module Extend
|
5
5
|
module TypeDefinition
|
6
|
+
NULLABLE = 'Nullable'
|
7
|
+
NULLABLE_RE = /#{NULLABLE}/i.freeze
|
8
|
+
|
6
9
|
def types
|
7
10
|
@types ||= Hash.new(Type::UndefinedType.new)
|
8
11
|
end
|
9
12
|
|
10
|
-
def add_type(type, klass)
|
13
|
+
def add_type(type, klass, nullable: true)
|
11
14
|
types[type] = klass
|
15
|
+
types["#{NULLABLE}(#{type})"] = Type::NullableType.new(klass) if nullable
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Enum<String>]
|
19
|
+
def type_names(nullable:)
|
20
|
+
nullable ? types.keys : types.keys.grep_v(NULLABLE_RE)
|
12
21
|
end
|
13
22
|
end
|
14
23
|
end
|
@@ -34,7 +34,7 @@ module ClickHouse
|
|
34
34
|
|
35
35
|
logger.info("\e[1m[35mSQL (#{Util::Pretty.measure(elapsed)})\e[0m #{query};")
|
36
36
|
logger.debug(body) if body
|
37
|
-
logger.info("\e[1m[36mRead: #{summary.fetch(:read_rows)} rows, #{summary.fetch(:read_bytes)}. Written: #{summary.fetch(:written_rows)}
|
37
|
+
logger.info("\e[1m[36mRead: #{summary.fetch(:read_rows)} rows, #{summary.fetch(:read_bytes)}. Written: #{summary.fetch(:written_rows)} rows, #{summary.fetch(:written_bytes)}\e[0m")
|
38
38
|
end
|
39
39
|
# rubocop:enable Layout/LineLength
|
40
40
|
|
@@ -8,6 +8,7 @@ module ClickHouse
|
|
8
8
|
|
9
9
|
TYPE_ARGV_DELIM = ','
|
10
10
|
NULLABLE = 'Nullable'
|
11
|
+
NULLABLE_TYPE_RE = /#{NULLABLE}\((.+)\)/i.freeze
|
11
12
|
|
12
13
|
def_delegators :to_a,
|
13
14
|
:each, :fetch, :length, :count, :size, :first, :last, :[], :to_h
|
@@ -28,7 +29,7 @@ module ClickHouse
|
|
28
29
|
# @input "Decimal(10, 5)"
|
29
30
|
# @output "Decimal(%s, %s)"
|
30
31
|
def extract_type_info(type)
|
31
|
-
type = type.gsub(
|
32
|
+
type = type.gsub(NULLABLE_TYPE_RE, '\1')
|
32
33
|
nullable = Regexp.last_match(1)
|
33
34
|
argv = []
|
34
35
|
|
@@ -4,6 +4,7 @@ module ClickHouse
|
|
4
4
|
module Util
|
5
5
|
module Statement
|
6
6
|
END_OF_STATEMENT = ';'
|
7
|
+
END_OF_STATEMENT_RE = /#{END_OF_STATEMENT}(\s+|\Z)/.freeze
|
7
8
|
|
8
9
|
module_function
|
9
10
|
|
@@ -14,7 +15,7 @@ module ClickHouse
|
|
14
15
|
def format(sql, format)
|
15
16
|
return sql if sql.match?(/FORMAT/i)
|
16
17
|
|
17
|
-
"#{sql.sub(
|
18
|
+
"#{sql.sub(END_OF_STATEMENT_RE, '')} FORMAT #{format};"
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
data/lib/click_house/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: click_house
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aliaksandr Shylau
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -129,10 +129,10 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
+
- ".github/workflows/main.yml"
|
132
133
|
- ".gitignore"
|
133
134
|
- ".rspec"
|
134
135
|
- ".rubocop.yml"
|
135
|
-
- ".travis.yml"
|
136
136
|
- CHANGELOG.md
|
137
137
|
- Gemfile
|
138
138
|
- Gemfile.lock
|
@@ -158,6 +158,7 @@ files:
|
|
158
158
|
- lib/click_house/extend/connectible.rb
|
159
159
|
- lib/click_house/extend/connection_altering.rb
|
160
160
|
- lib/click_house/extend/connection_database.rb
|
161
|
+
- lib/click_house/extend/connection_explaining.rb
|
161
162
|
- lib/click_house/extend/connection_healthy.rb
|
162
163
|
- lib/click_house/extend/connection_inserting.rb
|
163
164
|
- lib/click_house/extend/connection_selective.rb
|
data/.travis.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
|
3
|
-
rvm:
|
4
|
-
- 2.6.5
|
5
|
-
|
6
|
-
services:
|
7
|
-
- docker
|
8
|
-
|
9
|
-
before_install:
|
10
|
-
- docker pull yandex/clickhouse-server
|
11
|
-
- docker run -d -p 127.0.0.1:8123:8123 yandex/clickhouse-server
|
12
|
-
- bundle install
|
13
|
-
|
14
|
-
script:
|
15
|
-
- bundle exec rubocop
|
16
|
-
- bundle exec rspec
|