clickhouse-rails 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7f0fc0991b11eab9bacb6ae43c87f5cbefefe1bdb35144fdb599753017e884a
4
- data.tar.gz: df7b20d8b908a66ee5622025a3f3407a5902d502eb9f56b25869732571403a75
3
+ metadata.gz: fb4718899c50eee5d790b88331caa67e07cdc38eac66ea865aeee62401db37b0
4
+ data.tar.gz: 15b86279df212a677bccf8437d1e4e52715fb0e515b3b8fcaaf8a5cad3bcd9d0
5
5
  SHA512:
6
- metadata.gz: 1bcfb1c9b9ca2a208ad148cdf0ace5b951d26bd09d79d2c7b92ab2570493c90da886cfac9d5b8568d16373f23c1cc50d0af536e0e2bcb7e906e1a7331fb777f8
7
- data.tar.gz: e230acf543be8220bfbd0ce150e1831f65a9e59bb9d13efb1d1feab48f0f3a590fbf80b21d7f33213d6abebd4f5c2cee4476c73fb7c7fb0535791336b8dba936
6
+ metadata.gz: 887ed3d0538f74d8ea648445d04fcb1d941ee2009a8baf5ad05ff3c4783c9dd2f63b08d4f96b8a41578c8d0016e1799df2bfb5a3d7252ff1788fb0b86a5aebf1
7
+ data.tar.gz: 2d2dc371a8fa84e164505913a6151dd479d82918ec8b54f4b7b042cee8432e0993d3371109097b65008de0694bcce10a9d28099caf22eb0d531e0984d4823927
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- clickhouse-rails (0.1.0)
4
+ clickhouse-rails (0.1.1)
5
5
  clickhouse
6
6
  railties
7
7
 
data/README.md CHANGED
@@ -22,13 +22,15 @@ $ rails g clickhouse:install
22
22
 
23
23
  4. Change clickhouse.yml at `config/clickhouse.yml` path
24
24
 
25
- 5. Create migrations
25
+ ## Usage
26
+
27
+ 1. Create migrations
26
28
  ```bash
27
29
  $ rails g clickhouse:migration add_tmp_table
28
30
  create db/clickhouse/migrate/002_add_tmp_table.rb
29
31
  ```
30
32
 
31
- 6. Edit file like this:
33
+ 2. Edit file like this:
32
34
  ```ruby
33
35
  # db/clickhouse/migrate/002_add_tmp_table.rb
34
36
  class AddTmpTable < Clickhouse::Rails::Migrations::Base
@@ -43,6 +45,19 @@ class AddTmpTable < Clickhouse::Rails::Migrations::Base
43
45
  end
44
46
  ```
45
47
 
48
+ 3. Run migrations
49
+ ```bash
50
+ $ rake clickhouse:db:migrate
51
+ ```
52
+
53
+ You can create class of clickhouse table:
54
+ ```
55
+ # app/models/custom_table.rb
56
+ class CustomTable
57
+ include Clickhouse::Table
58
+ end
59
+ ```
60
+
46
61
  ## TODO:
47
62
 
48
63
  1. Rollback migrations
@@ -1,2 +1,3 @@
1
1
  require 'clickhouse'
2
+ require 'clickhouse/table'
2
3
  require 'clickhouse/rails'
@@ -68,30 +68,32 @@ module Clickhouse
68
68
  def fetch_column(column, type)
69
69
  return if @table_info.find { |c_info| c_info.first == column.to_s }
70
70
 
71
- type = type.to_s
72
- .gsub(/(^.|_\w)/) do
71
+ type = type.to_s.gsub(/(^.|_\w)/) do
73
72
  Regexp.last_match(1).upcase
74
73
  end
75
- .gsub('Uint', 'UInt')
76
- .delete('_')
74
+ type = type.gsub('Uint', 'UInt').delete('_')
77
75
 
78
76
  connection.execute("ALTER TABLE #{@table_name} ADD COLUMN #{column} #{type}")
79
77
  end
80
78
 
81
79
  def run_migration(migration)
82
- puts "# >========== #{migration.name} ==========="
80
+ logger.info "# >========== #{migration.name} ==========="
83
81
  migration.up
84
82
  migration.add_version
85
83
  rescue Clickhouse::QueryError => e
86
- puts "# Error #{e.class}:"
87
- puts "# #{e.message}"
84
+ logger.info "# Error #{e.class}:"
85
+ logger.info "# #{e.message}"
88
86
  ensure
89
- puts "# <========== #{migration.name} ===========\n\n"
87
+ logger.info "# <========== #{migration.name} ===========\n\n"
90
88
  end
91
89
 
92
90
  def connection
93
91
  Clickhouse.connection
94
92
  end
93
+
94
+ def logger
95
+ ::Rails.logger
96
+ end
95
97
  end
96
98
  end
97
99
  end
@@ -1,5 +1,5 @@
1
1
  module Clickhouse
2
2
  module Rails
3
- VERSION = '0.1.1'.freeze
3
+ VERSION = '0.1.2'.freeze
4
4
  end
5
5
  end
@@ -0,0 +1,66 @@
1
+ module Clickhouse
2
+ module Table
3
+ class WrongTypeRowError < StandardError; end
4
+
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def table_name
11
+ @table_name ||= to_s.tableize
12
+ end
13
+
14
+ def insert_rows(rows)
15
+ connection.insert_rows(table_name) do |table_rows|
16
+ rows.each do |row|
17
+ next if row.nil?
18
+
19
+ complete_row = prepare_row(block_given? ? yield(row) : row)
20
+
21
+ table_rows << complete_row
22
+ end
23
+
24
+ table_rows
25
+ end
26
+ end
27
+
28
+ def table_columns
29
+ @table_columns ||=
30
+ connection.select_rows(
31
+ select: 'name, type',
32
+ from: 'system.columns',
33
+ where: "table = '#{table_name}'"
34
+ ).to_h
35
+ end
36
+
37
+ def rows(attributes = {})
38
+ connection.select_rows(attributes.merge(from: table_name))
39
+ end
40
+
41
+ def empty_row
42
+ @empty_row ||= table_columns.map do |k, v|
43
+ value =
44
+ case v
45
+ when /UInt/ then 0
46
+ when /Float/ then 0.0
47
+ else
48
+ ''
49
+ end
50
+
51
+ [k, value]
52
+ end.to_h
53
+ end
54
+
55
+ def prepare_row(row)
56
+ return empty_row.merge(row.stringify_keys) if row.is_a?(Hash)
57
+
58
+ raise WrongTypeRowError, "#{row.inspect} has wrong type"
59
+ end
60
+
61
+ def connection
62
+ ::Clickhouse.connection
63
+ end
64
+ end
65
+ end
66
+ end
data/spec/rails_helper.rb CHANGED
@@ -5,7 +5,6 @@ SimpleCov.start
5
5
 
6
6
  require 'codecov'
7
7
  SimpleCov.formatter = SimpleCov::Formatter::Codecov
8
-
9
8
  require 'rails'
10
9
  require 'action_view/railtie'
11
10
  require 'action_controller/railtie'
@@ -16,3 +15,6 @@ require 'ammeter/init'
16
15
  require_relative '../lib/clickhouse-rails'
17
16
  require_relative 'support/generators'
18
17
  require_relative 'support/init'
18
+ require_relative 'support/migration'
19
+
20
+ Rails.logger = Logger.new('/dev/null')
@@ -0,0 +1,4 @@
1
+ def with_table(table_name, &block)
2
+ Clickhouse::Rails::Migrations::Base.soft_drop_table(table_name)
3
+ Clickhouse::Rails::Migrations::Base.create_table(table_name, &block)
4
+ end
@@ -0,0 +1,57 @@
1
+ require_relative 'rails_helper'
2
+
3
+ class CustomTable
4
+ include Clickhouse::Table
5
+ end
6
+
7
+ describe Clickhouse::Table do
8
+ before do
9
+ with_table 'custom_tables' do |t|
10
+ t.string 'field'
11
+
12
+ t.engine 'File(TabSeparated)'
13
+ end
14
+ end
15
+
16
+ describe '#table_columns' do
17
+ subject(:method) { CustomTable.table_columns }
18
+
19
+ it 'returns all info' do
20
+ is_expected.to eq('field' => 'String')
21
+ end
22
+ end
23
+
24
+ describe '#insert_rows' do
25
+ let(:inserted_rows) { CustomTable.rows.to_a }
26
+
27
+ context 'when row is a hash' do
28
+ let(:rows) { [{ 'field' => 'a' }, { 'field' => 2 }] }
29
+
30
+ it 'adds two rows' do
31
+ CustomTable.insert_rows(rows)
32
+
33
+ expect(inserted_rows).to eq([['a'], ['2']])
34
+ end
35
+ end
36
+
37
+ context 'when row is an array' do
38
+ # TODO: implement array logic
39
+ let(:rows) { [['a'], ['2']] }
40
+
41
+ it 'raises an error' do
42
+ expect { CustomTable.insert_rows(rows) }
43
+ .to raise_error(Clickhouse::Table::WrongTypeRowError)
44
+ end
45
+ end
46
+
47
+ context 'when row has empty attributes' do
48
+ let(:rows) { [{}] }
49
+
50
+ it 'adds empty row' do
51
+ CustomTable.insert_rows(rows)
52
+
53
+ expect(inserted_rows).to eq([['']])
54
+ end
55
+ end
56
+ end
57
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clickhouse-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vsevolod Avramov
@@ -103,6 +103,7 @@ files:
103
103
  - lib/clickhouse/rails/config.rb
104
104
  - lib/clickhouse/rails/migrations/base.rb
105
105
  - lib/clickhouse/rails/version.rb
106
+ - lib/clickhouse/table.rb
106
107
  - lib/generators/clickhouse/install/install_generator.rb
107
108
  - lib/generators/clickhouse/install/templates/config/clickhouse.yml
108
109
  - lib/generators/clickhouse/install/templates/db/clickhouse/migrate/001_init.rb
@@ -119,6 +120,8 @@ files:
119
120
  - spec/spec_helper.rb
120
121
  - spec/support/generators.rb
121
122
  - spec/support/init.rb
123
+ - spec/support/migration.rb
124
+ - spec/table_spec.rb
122
125
  homepage: https://github.com/vsevolod/clickhouse-rails
123
126
  licenses:
124
127
  - MIT