clickhouse-rails 0.1.1 → 0.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 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