clickhouse-activerecord 0.1.9 → 0.2.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 +4 -4
- data/README.md +8 -24
- data/clickhouse-activerecord.gemspec +3 -4
- data/lib/active_record/connection_adapters/clickhouse_adapter.rb +15 -34
- data/lib/clickhouse-activerecord.rb +1 -4
- data/lib/{clickhouse-activerecord → clickhouse}/railtie.rb +1 -1
- data/lib/tasks/clickhouse.rake +1 -1
- metadata +17 -34
- data/CHANGELOG.md +0 -13
- data/lib/clickhouse-activerecord/arel/visitors/to_sql.rb +0 -20
- data/lib/clickhouse-activerecord/schema_dumper.rb +0 -10
- data/lib/clickhouse-activerecord/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a454d1e7bc652ae74ce866ebceab0a6df2d1a0f
|
4
|
+
data.tar.gz: 70ccff7d8651cf35ff7dbd274773b42e9a5054a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0bac0b7265c1cc259163d423564e151b87eaf37f8d5aee1b1241d4319eb722e8374fa9888285d1db2cee35eae4d4cc85883f0a795ea9d2a3dcf3cd0b614d3db
|
7
|
+
data.tar.gz: 922a4a22e3bd3f3bd22e5f68ffbc0151becf125ca6e15b515e8eda2fe3bdf4c62bd6b3fb5b9800529789e1947e0c4a7a32de70fd0f73ac2f99c86350a11f0566
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Clickhouse::Activerecord
|
2
2
|
|
3
|
-
A Ruby database ActiveRecord driver for ClickHouse.
|
3
|
+
A Ruby database ActiveRecord driver for ClickHouse. Support Rails >= 5.0.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -39,14 +39,6 @@ class Action < ActiveRecord::Base
|
|
39
39
|
end
|
40
40
|
```
|
41
41
|
|
42
|
-
For materialized view model add:
|
43
|
-
```ruby
|
44
|
-
class ActionView < ActiveRecord::Base
|
45
|
-
establish_connection "#{Rails.env}_clickhouse".to_sym
|
46
|
-
self.is_view = true
|
47
|
-
end
|
48
|
-
```
|
49
|
-
|
50
42
|
Or global connection, but schema dump don't works:
|
51
43
|
|
52
44
|
```yml
|
@@ -62,31 +54,23 @@ Schema dump:
|
|
62
54
|
|
63
55
|
$ rake clickhouse:schema:dump
|
64
56
|
|
65
|
-
We use schema for emulate development or tests environment on PostgreSQL adapter.
|
66
|
-
|
67
57
|
### Insert and select data
|
68
58
|
|
69
59
|
```ruby
|
70
60
|
Action.where(url: 'http://example.com', date: Date.current).where.not(name: nil).order(created_at: :desc).limit(10)
|
71
|
-
|
72
|
-
#=> #<ActiveRecord::Relation [#<Action *** >]>
|
61
|
+
=> #<ActiveRecord::Relation [#<Action *** >]>
|
73
62
|
|
74
63
|
Action.create(url: 'http://example.com', date: Date.yesterday)
|
75
|
-
|
76
|
-
#=> true
|
77
|
-
|
78
|
-
ActionView.maximum(:date)
|
79
|
-
# Clickhouse (10.3ms) SELECT maxMerge(actions.date) FROM actions
|
80
|
-
#=> 'Wed, 29 Nov 2017'
|
64
|
+
=> true
|
81
65
|
```
|
82
66
|
|
83
|
-
|
67
|
+
NOTE: Creating tables in developing.
|
68
|
+
|
69
|
+
## Development
|
84
70
|
|
85
|
-
|
71
|
+
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
86
72
|
|
87
|
-
|
88
|
-
* ETH address: `0x7eec67c120828334d0e802ce46fc4895f2b386c4`
|
89
|
-
* XMR address: `42gP71qLB5M43RuDnrQ3vSJFFxis9Kw9VMURhpx9NLQRRwNvaZRjm2TFojAMC8Fk1BQhZNKyWhoyJSn5Ak9kppgZPjE17Zh`
|
73
|
+
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).
|
90
74
|
|
91
75
|
## Contributing
|
92
76
|
|
@@ -2,11 +2,10 @@
|
|
2
2
|
|
3
3
|
lib = File.expand_path('../lib', __FILE__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require File.expand_path('../lib/clickhouse-activerecord/version', __FILE__)
|
6
5
|
|
7
6
|
Gem::Specification.new do |spec|
|
8
7
|
spec.name = 'clickhouse-activerecord'
|
9
|
-
spec.version =
|
8
|
+
spec.version = '0.2.0'
|
10
9
|
spec.authors = ['Sergey Odintsov']
|
11
10
|
spec.email = ['nixx.dj@gmail.com']
|
12
11
|
|
@@ -22,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
22
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
22
|
spec.require_paths = ['lib']
|
24
23
|
|
25
|
-
spec.
|
26
|
-
spec.
|
24
|
+
spec.add_dependency "bundler", ">= 1.13.4"
|
25
|
+
spec.add_dependency 'rails', '>= 5.0'
|
27
26
|
|
28
27
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
29
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'clickhouse-activerecord/arel/visitors/to_sql'
|
2
1
|
require 'active_record/connection_adapters/abstract_adapter'
|
3
2
|
require 'active_record/connection_adapters/clickhouse/oid/date'
|
4
3
|
require 'active_record/connection_adapters/clickhouse/oid/date_time'
|
@@ -24,28 +23,9 @@ module ActiveRecord
|
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
|
-
module ModelSchema
|
28
|
-
|
29
|
-
module ClassMethods
|
30
|
-
def is_view
|
31
|
-
@is_view || false
|
32
|
-
end
|
33
|
-
|
34
|
-
# @param [Boolean] value
|
35
|
-
def is_view=(value)
|
36
|
-
@is_view = value
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
26
|
module ConnectionAdapters
|
43
27
|
|
44
28
|
class ClickhouseColumn < Column
|
45
|
-
def initialize(name, default, cast_type, sql_type = nil, null = true)
|
46
|
-
super(name, default, cast_type, sql_type, null)
|
47
|
-
@default_function = 'now'
|
48
|
-
end
|
49
29
|
|
50
30
|
private
|
51
31
|
|
@@ -105,7 +85,7 @@ module ActiveRecord
|
|
105
85
|
@connection_parameters = connection_parameters
|
106
86
|
@config = config
|
107
87
|
|
108
|
-
@
|
88
|
+
@prepared_statements = false
|
109
89
|
|
110
90
|
connect
|
111
91
|
end
|
@@ -122,10 +102,6 @@ module ActiveRecord
|
|
122
102
|
case sql_type
|
123
103
|
when 'Nullable(String)'
|
124
104
|
255
|
125
|
-
when /Nullable\(U?Int(8|16)\)/
|
126
|
-
4
|
127
|
-
when /Nullable\(U?Int(32|64)\)/
|
128
|
-
8
|
129
105
|
else
|
130
106
|
super
|
131
107
|
end
|
@@ -138,18 +114,18 @@ module ActiveRecord
|
|
138
114
|
register_class_with_limit m, 'Uint8', Type::UnsignedInteger
|
139
115
|
register_class_with_limit m, 'Date', Clickhouse::OID::Date
|
140
116
|
register_class_with_limit m, 'DateTime', Clickhouse::OID::DateTime
|
141
|
-
m.alias_type 'UInt16', '
|
117
|
+
m.alias_type 'UInt16', 'uint8'
|
142
118
|
m.alias_type 'UInt32', 'uint8'
|
143
119
|
m.register_type 'UInt64', Clickhouse::OID::BigInteger.new
|
144
|
-
m.alias_type 'Int8', '
|
145
|
-
m.alias_type 'Int16', '
|
120
|
+
m.alias_type 'Int8', 'int8'
|
121
|
+
m.alias_type 'Int16', 'int8'
|
146
122
|
m.alias_type 'Int32', 'int8'
|
147
123
|
m.alias_type 'Int64', 'UInt64'
|
148
124
|
end
|
149
125
|
|
150
126
|
# Queries the database and returns the results in an Array-like object
|
151
127
|
def query(sql, _name = nil)
|
152
|
-
res = @connection.
|
128
|
+
res = @connection.get("/?#{@config.merge(query: "#{sql} FORMAT JSONCompact").to_param}")
|
153
129
|
raise ActiveRecord::ActiveRecordError, "Response code: #{res.code}:\n#{res.body}" unless res.code.to_i == 200
|
154
130
|
JSON.parse res.body
|
155
131
|
end
|
@@ -160,7 +136,7 @@ module ActiveRecord
|
|
160
136
|
end
|
161
137
|
end
|
162
138
|
|
163
|
-
def exec_query(sql, name = nil,
|
139
|
+
def exec_query(sql, name = nil, binds = [], prepare: false)
|
164
140
|
result = execute(sql, name)
|
165
141
|
ActiveRecord::Result.new(result['meta'].map { |m| m['name'] }, result['data'])
|
166
142
|
end
|
@@ -190,10 +166,10 @@ module ActiveRecord
|
|
190
166
|
query('SHOW TABLES', name)['data'].flatten
|
191
167
|
end
|
192
168
|
|
193
|
-
def
|
194
|
-
|
195
|
-
|
196
|
-
|
169
|
+
def new_column_from_field(table_name, field) # :nondoc:
|
170
|
+
sql_type = field[1]
|
171
|
+
type_metadata = fetch_type_metadata(sql_type)
|
172
|
+
ClickhouseColumn.new(field[0], field[3].present? ? field[3] : nil, type_metadata, field[1].include?('Nullable'), table_name, nil)
|
197
173
|
end
|
198
174
|
|
199
175
|
def indexes(_table_name, _name = nil) #:nodoc:
|
@@ -207,6 +183,10 @@ module ActiveRecord
|
|
207
183
|
false
|
208
184
|
end
|
209
185
|
|
186
|
+
def data_sources
|
187
|
+
tables
|
188
|
+
end
|
189
|
+
|
210
190
|
protected
|
211
191
|
|
212
192
|
def table_structure(table_name)
|
@@ -214,6 +194,7 @@ module ActiveRecord
|
|
214
194
|
raise(ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'") if data.empty?
|
215
195
|
data
|
216
196
|
end
|
197
|
+
alias column_definitions table_structure
|
217
198
|
|
218
199
|
def last_inserted_id(result)
|
219
200
|
result
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'active_record/connection_adapters/clickhouse_adapter'
|
2
2
|
|
3
|
-
if defined?(Rails::Railtie)
|
4
|
-
require 'clickhouse-activerecord/railtie'
|
5
|
-
require 'clickhouse-activerecord/schema_dumper'
|
6
|
-
end
|
3
|
+
require 'clickhouse/railtie' if defined?(Rails::Railtie)
|
7
4
|
|
8
5
|
module ClickhouseActiverecord
|
9
6
|
|
data/lib/tasks/clickhouse.rake
CHANGED
@@ -14,7 +14,7 @@ namespace :clickhouse do
|
|
14
14
|
filename = "#{Rails.root}/db/clickhouse_schema.rb"
|
15
15
|
File.open(filename, 'w:utf-8') do |file|
|
16
16
|
ActiveRecord::Base.establish_connection(:"#{Rails.env}_clickhouse")
|
17
|
-
|
17
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
metadata
CHANGED
@@ -1,81 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clickhouse-activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.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:
|
11
|
+
date: 2017-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.13'
|
20
|
-
- - ">="
|
17
|
+
- - '>='
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 1.13.4
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.13'
|
30
|
-
- - ">="
|
24
|
+
- - '>='
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: 1.13.4
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rails
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- -
|
31
|
+
- - '>='
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
- - "<"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '5'
|
33
|
+
version: '5.0'
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
46
37
|
requirements:
|
47
|
-
- -
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: 4.1.8
|
50
|
-
- - "<"
|
38
|
+
- - '>='
|
51
39
|
- !ruby/object:Gem::Version
|
52
|
-
version: '5'
|
40
|
+
version: '5.0'
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: bundler
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
56
44
|
requirements:
|
57
|
-
- -
|
45
|
+
- - ~>
|
58
46
|
- !ruby/object:Gem::Version
|
59
47
|
version: '1.15'
|
60
48
|
type: :development
|
61
49
|
prerelease: false
|
62
50
|
version_requirements: !ruby/object:Gem::Requirement
|
63
51
|
requirements:
|
64
|
-
- -
|
52
|
+
- - ~>
|
65
53
|
- !ruby/object:Gem::Version
|
66
54
|
version: '1.15'
|
67
55
|
- !ruby/object:Gem::Dependency
|
68
56
|
name: rake
|
69
57
|
requirement: !ruby/object:Gem::Requirement
|
70
58
|
requirements:
|
71
|
-
- -
|
59
|
+
- - ~>
|
72
60
|
- !ruby/object:Gem::Version
|
73
61
|
version: '10.0'
|
74
62
|
type: :development
|
75
63
|
prerelease: false
|
76
64
|
version_requirements: !ruby/object:Gem::Requirement
|
77
65
|
requirements:
|
78
|
-
- -
|
66
|
+
- - ~>
|
79
67
|
- !ruby/object:Gem::Version
|
80
68
|
version: '10.0'
|
81
69
|
description: ActiveRecord adapter for ClickHouse
|
@@ -85,8 +73,7 @@ executables: []
|
|
85
73
|
extensions: []
|
86
74
|
extra_rdoc_files: []
|
87
75
|
files:
|
88
|
-
-
|
89
|
-
- CHANGELOG.md
|
76
|
+
- .gitignore
|
90
77
|
- CODE_OF_CONDUCT.md
|
91
78
|
- Gemfile
|
92
79
|
- LICENSE.txt
|
@@ -100,10 +87,7 @@ files:
|
|
100
87
|
- lib/active_record/connection_adapters/clickhouse/oid/date_time.rb
|
101
88
|
- lib/active_record/connection_adapters/clickhouse_adapter.rb
|
102
89
|
- lib/clickhouse-activerecord.rb
|
103
|
-
- lib/clickhouse
|
104
|
-
- lib/clickhouse-activerecord/railtie.rb
|
105
|
-
- lib/clickhouse-activerecord/schema_dumper.rb
|
106
|
-
- lib/clickhouse-activerecord/version.rb
|
90
|
+
- lib/clickhouse/railtie.rb
|
107
91
|
- lib/tasks/clickhouse.rake
|
108
92
|
homepage: https://github.com/pnixx/clickhouse-activerecord
|
109
93
|
licenses:
|
@@ -115,19 +99,18 @@ require_paths:
|
|
115
99
|
- lib
|
116
100
|
required_ruby_version: !ruby/object:Gem::Requirement
|
117
101
|
requirements:
|
118
|
-
- -
|
102
|
+
- - '>='
|
119
103
|
- !ruby/object:Gem::Version
|
120
104
|
version: '0'
|
121
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
106
|
requirements:
|
123
|
-
- -
|
107
|
+
- - '>='
|
124
108
|
- !ruby/object:Gem::Version
|
125
109
|
version: '0'
|
126
110
|
requirements: []
|
127
111
|
rubyforge_project:
|
128
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.0.14.1
|
129
113
|
signing_key:
|
130
114
|
specification_version: 4
|
131
115
|
summary: ClickHouse ActiveRecord
|
132
116
|
test_files: []
|
133
|
-
has_rdoc:
|
data/CHANGELOG.md
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
### Version 0.1.4 (Nov 29, 2017)
|
2
|
-
|
3
|
-
* Support materialized view
|
4
|
-
* Aggregated functions for view
|
5
|
-
* Schema dumper with SQL create table
|
6
|
-
|
7
|
-
### Version 0.1.2 (Sep 27, 2017)
|
8
|
-
|
9
|
-
* Fix Big Int type
|
10
|
-
|
11
|
-
### Version 0.1.0 (Aug 31, 2017)
|
12
|
-
|
13
|
-
* Initial release
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'arel/visitors/to_sql'
|
2
|
-
|
3
|
-
module ClickhouseActiverecord
|
4
|
-
module Arel
|
5
|
-
module Visitors
|
6
|
-
class ToSql < ::Arel::Visitors::ToSql
|
7
|
-
|
8
|
-
def aggregate(name, o, collector)
|
9
|
-
# replacing function name for materialized view
|
10
|
-
if o.expressions.first && o.expressions.first != '*' && !o.expressions.first.is_a?(String) && o.expressions.first.relation && o.expressions.first.relation.engine && o.expressions.first.relation.engine.is_view
|
11
|
-
super("#{name.downcase}Merge", o, collector)
|
12
|
-
else
|
13
|
-
super
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
class ClickhouseActiverecord::SchemaDumper < ActiveRecord::SchemaDumper
|
2
|
-
|
3
|
-
def table(table, stream)
|
4
|
-
|
5
|
-
stream.puts " # TABLE: #{table}"
|
6
|
-
stream.puts " # SQL: #{@connection.query("SHOW CREATE TABLE #{table.gsub(/^\.inner\./, '')}")['data'].try(:first).try(:first)}"
|
7
|
-
super(table.gsub(/^\.inner\./, ''), stream)
|
8
|
-
|
9
|
-
end
|
10
|
-
end
|