click_house 2.1.1 → 2.1.2
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/.rubocop.yml +1 -0
- data/CHANGELOG.md +1 -0
- data/Gemfile.lock +1 -1
- data/Gemfile_faraday1.lock +1 -1
- data/Gemfile_faraday2.lock +1 -1
- data/README.md +5 -2
- data/lib/click_house/ast/statement.rb +11 -0
- data/lib/click_house/benchmark/casting.rb +45 -0
- data/lib/click_house/response/result_set.rb +5 -7
- data/lib/click_house/type/date_time64_type.rb +25 -4
- data/lib/click_house/type/date_time_type.rb +5 -3
- data/lib/click_house/type/date_type.rb +4 -2
- data/lib/click_house/type/integer_type.rb +2 -2
- data/lib/click_house/type/ip_type.rb +2 -2
- data/lib/click_house/type/low_cardinality_type.rb +5 -1
- data/lib/click_house/type/nullable_type.rb +4 -0
- data/lib/click_house/type/string_type.rb +2 -2
- data/lib/click_house/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f311abaedb0ef60cbfc25cabaae1223d266b9e5b83f677b1267c5e8b1b56048e
|
4
|
+
data.tar.gz: 58696f010c09d829038670e703126d28be343471b45fed0c07a05727d7ba0e95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35b8b80d3beca3ed584f29dd532d7a4e525dbc355d1cca5bca3d21d32f294ed6ba95b24ef01a6d4930ef195cbe9ab98ee0517a9620ffb1aa45c06353ddf557f1
|
7
|
+
data.tar.gz: 4ba73ab43c95300c19994e90b2ee7cade877490655ec07962c1dae1175968e36eb51a5711fe2ea8da49a934acacf6414d02052e9f6594914c591be8d6cac43fe
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# 2.1.1
|
2
2
|
* Fix logging with symbolized keys JSON
|
3
3
|
* Unknown formats return raw `Response::ResultSelt` like regular JSON query
|
4
|
+
* Added methods `statistics`, `summary`, `headers` and `types` to `Response::ResultSet`
|
4
5
|
|
5
6
|
# 2.1.0
|
6
7
|
* `ClickHouse.connection.insert` now returns `ClickHouse::Response::Summary` object
|
data/Gemfile.lock
CHANGED
data/Gemfile_faraday1.lock
CHANGED
data/Gemfile_faraday2.lock
CHANGED
data/README.md
CHANGED
@@ -138,12 +138,15 @@ Select all type-casted result set
|
|
138
138
|
@result = ClickHouse.connection.select_all('SELECT * FROM visits')
|
139
139
|
|
140
140
|
# all enumerable methods are delegated like #each, #map, #select etc
|
141
|
-
# results of #to_a is
|
141
|
+
# results of #to_a is TYPE CASTED
|
142
142
|
@result.to_a #=> [{"date"=>#<Date: 2000-01-01>, "id"=>1}]
|
143
143
|
|
144
|
+
# raw results (WITHOUT type casting)
|
145
|
+
# much faster if selecting a large amount of data
|
146
|
+
@result.data #=> [{"date"=>"2000-01-01", "id"=>1}, {"date"=>"2000-01-02", "id"=>2}]
|
147
|
+
|
144
148
|
# you can access raw data
|
145
149
|
@result.meta #=> [{"name"=>"date", "type"=>"Date"}, {"name"=>"id", "type"=>"UInt32"}]
|
146
|
-
@result.data #=> [{"date"=>"2000-01-01", "id"=>1}, {"date"=>"2000-01-02", "id"=>2}]
|
147
150
|
@result.statistics #=> {"elapsed"=>0.0002271, "rows_read"=>2, "bytes_read"=>12}
|
148
151
|
@result.summary #=> ClickHouse::Response::Summary
|
149
152
|
@result.headers #=> {"x-clickhouse-query-id"=>"9bf5f604-31fc-4eff-a4b5-277f2c71d199"}
|
@@ -59,6 +59,17 @@ module ClickHouse
|
|
59
59
|
@arguments ||= []
|
60
60
|
end
|
61
61
|
|
62
|
+
# @return [Array]
|
63
|
+
# cached argument values to increase the casting perfomance
|
64
|
+
def argument_values
|
65
|
+
@argument_values ||= arguments.map(&:value)
|
66
|
+
end
|
67
|
+
|
68
|
+
def argument_first!
|
69
|
+
# TODO: raise an error if multiple arguments
|
70
|
+
@argument_first ||= arguments.first
|
71
|
+
end
|
72
|
+
|
62
73
|
def placeholder
|
63
74
|
return @placeholder if defined?(@placeholder)
|
64
75
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'benchmark'
|
5
|
+
require 'pry'
|
6
|
+
require_relative '../../click_house'
|
7
|
+
|
8
|
+
|
9
|
+
ClickHouse.config.json_serializer = ClickHouse::Serializer::JsonOjSerializer
|
10
|
+
ClickHouse.config.json_parser = ClickHouse::Middleware::ParseJsonOj
|
11
|
+
ClickHouse.connection.drop_table('benchmark', if_exists: true)
|
12
|
+
ClickHouse.connection.execute <<~SQL
|
13
|
+
CREATE TABLE benchmark(
|
14
|
+
int Nullable(Int8),
|
15
|
+
date Nullable(Date),
|
16
|
+
array Array(String),
|
17
|
+
map Map(String, IPv4)
|
18
|
+
) ENGINE Memory
|
19
|
+
SQL
|
20
|
+
|
21
|
+
INPUT = Array.new(200_000, {
|
22
|
+
'int' => 21341234,
|
23
|
+
'date' => Date.new(2022, 1, 1),
|
24
|
+
'array' => ['foo'],
|
25
|
+
'map' => {'ip' => IPAddr.new('127.0.0.1')}
|
26
|
+
})
|
27
|
+
|
28
|
+
Benchmark.bm do |x|
|
29
|
+
x.report('insert: no casting') do
|
30
|
+
ClickHouse.connection.insert('benchmark', INPUT)
|
31
|
+
end
|
32
|
+
|
33
|
+
x.report('insert: with casting') do
|
34
|
+
schema = ClickHouse.connection.table_schema('benchmark')
|
35
|
+
ClickHouse.connection.insert('benchmark', schema.serialize(INPUT))
|
36
|
+
end
|
37
|
+
|
38
|
+
x.report('select: no casting') do
|
39
|
+
ClickHouse.connection.select_all('SELECT * FROM benchmark').data
|
40
|
+
end
|
41
|
+
|
42
|
+
x.report('select: with casting') do
|
43
|
+
ClickHouse.connection.select_all('SELECT * FROM benchmark').to_a
|
44
|
+
end
|
45
|
+
end
|
@@ -113,7 +113,7 @@ module ClickHouse
|
|
113
113
|
return cast_map(stmt, Hash(value)) if stmt.caster.map?
|
114
114
|
return cast_tuple(stmt, Array(value)) if stmt.caster.tuple?
|
115
115
|
|
116
|
-
stmt.caster.cast(value, *stmt.
|
116
|
+
stmt.caster.cast(value, *stmt.argument_values)
|
117
117
|
end
|
118
118
|
|
119
119
|
# @return [Hash]
|
@@ -131,8 +131,7 @@ module ClickHouse
|
|
131
131
|
# @param stmt [Ast::Statement]
|
132
132
|
def cast_container(stmt, value)
|
133
133
|
stmt.caster.cast_each(value) do |item|
|
134
|
-
|
135
|
-
cast_type(stmt.arguments.first, item)
|
134
|
+
cast_type(stmt.argument_first!, item)
|
136
135
|
end
|
137
136
|
end
|
138
137
|
|
@@ -149,14 +148,13 @@ module ClickHouse
|
|
149
148
|
return serialize_map(stmt, value) if stmt.caster.map?
|
150
149
|
return serialize_tuple(stmt, Array(value)) if stmt.caster.tuple?
|
151
150
|
|
152
|
-
stmt.caster.serialize(value, *stmt.
|
151
|
+
stmt.caster.serialize(value, *stmt.argument_values)
|
153
152
|
end
|
154
153
|
|
155
154
|
# @param stmt [Ast::Statement]
|
156
155
|
def serialize_container(stmt, value)
|
157
|
-
stmt.caster.
|
158
|
-
|
159
|
-
serialize_type(stmt.arguments.first, item)
|
156
|
+
stmt.caster.serialize_each(value) do |item|
|
157
|
+
serialize_type(stmt.argument_first!, item)
|
160
158
|
end
|
161
159
|
end
|
162
160
|
|
@@ -3,16 +3,37 @@
|
|
3
3
|
module ClickHouse
|
4
4
|
module Type
|
5
5
|
class DateTime64Type < BaseType
|
6
|
-
|
6
|
+
BASE_FORMAT = '%Y-%m-%d %H:%M:%S'
|
7
|
+
CAST_FORMAT = "#{BASE_FORMAT}.%N"
|
8
|
+
SERIALIZE_FORMATS = {
|
9
|
+
0 => BASE_FORMAT,
|
10
|
+
1 => "#{BASE_FORMAT}.%1N",
|
11
|
+
2 => "#{BASE_FORMAT}.%2N",
|
12
|
+
3 => "#{BASE_FORMAT}.%3N",
|
13
|
+
4 => "#{BASE_FORMAT}.%4N",
|
14
|
+
5 => "#{BASE_FORMAT}.%5N",
|
15
|
+
6 => "#{BASE_FORMAT}.%6N",
|
16
|
+
7 => "#{BASE_FORMAT}.%7N",
|
17
|
+
8 => "#{BASE_FORMAT}.%8N",
|
18
|
+
9 => "#{BASE_FORMAT}.%9N",
|
19
|
+
}.freeze
|
20
|
+
|
21
|
+
# Tick size (precision):
|
22
|
+
# 10-precision seconds.
|
23
|
+
# Valid range: [ 0 : 9 ].
|
24
|
+
# Typically are used - 3 (milliseconds), 6 (microseconds), 9 (nanoseconds).
|
25
|
+
def cast(value, precision = 0, tz = nil)
|
26
|
+
format = precision.zero? ? BASE_FORMAT : CAST_FORMAT
|
27
|
+
|
7
28
|
if tz
|
8
|
-
Time.find_zone(tz).
|
29
|
+
Time.find_zone(tz).strptime(value, format)
|
9
30
|
else
|
10
|
-
Time.
|
31
|
+
Time.strptime(value, format)
|
11
32
|
end
|
12
33
|
end
|
13
34
|
|
14
35
|
def serialize(value, precision = 3, _tz = nil)
|
15
|
-
value.strftime(
|
36
|
+
value.strftime(SERIALIZE_FORMATS.fetch(precision))
|
16
37
|
end
|
17
38
|
end
|
18
39
|
end
|
@@ -3,16 +3,18 @@
|
|
3
3
|
module ClickHouse
|
4
4
|
module Type
|
5
5
|
class DateTimeType < BaseType
|
6
|
+
FORMAT = '%Y-%m-%d %H:%M:%S'
|
7
|
+
|
6
8
|
def cast(value, tz = nil)
|
7
9
|
if tz
|
8
|
-
Time.find_zone(tz).
|
10
|
+
Time.find_zone(tz).strptime(value, FORMAT)
|
9
11
|
else
|
10
|
-
Time.
|
12
|
+
Time.strptime(value, FORMAT)
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
def serialize(value, *)
|
15
|
-
value.strftime(
|
17
|
+
value.strftime(FORMAT)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
@@ -3,12 +3,14 @@
|
|
3
3
|
module ClickHouse
|
4
4
|
module Type
|
5
5
|
class DateType < BaseType
|
6
|
+
FORMAT = '%Y-%m-%d'
|
7
|
+
|
6
8
|
def cast(value)
|
7
|
-
Date.
|
9
|
+
Date.strptime(value, FORMAT)
|
8
10
|
end
|
9
11
|
|
10
12
|
def serialize(value)
|
11
|
-
value.strftime(
|
13
|
+
value.strftime(FORMAT)
|
12
14
|
end
|
13
15
|
end
|
14
16
|
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: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aliaksandr Shylau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- lib/click_house/ast/parser.rb
|
176
176
|
- lib/click_house/ast/statement.rb
|
177
177
|
- lib/click_house/ast/ticker.rb
|
178
|
+
- lib/click_house/benchmark/casting.rb
|
178
179
|
- lib/click_house/benchmark/map_join.rb
|
179
180
|
- lib/click_house/config.rb
|
180
181
|
- lib/click_house/connection.rb
|