simple_mysql_partitioning 0.1.2 → 0.2.0

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
- SHA1:
3
- metadata.gz: 22f919d9cbdcb91e2f0dd083acd3f47a93e588fe
4
- data.tar.gz: faa6e5b116f29c92ec42e0a242018d52ba23fca5
2
+ SHA256:
3
+ metadata.gz: 59e0a9007776bd60b91764a3dac868fdfcbf23c8e4abfa6e57b6ed29068e6ed7
4
+ data.tar.gz: afba71ed17a0d99e111987e08b7152d8571ae098dcd86043d3133f6467267cce
5
5
  SHA512:
6
- metadata.gz: a2cd4fe0d348bea5b6a6a32dc0ce48bf752eb253462ade84f2787ba839c0a89b51e47ea244a0e84b9a6dc3c226aca7f69ff77f0ce058e94d8c8355f998ad275d
7
- data.tar.gz: e6da4fc9b7ab2e07bcd87f1c5ab0d0a79c6c603b7314ff584587b3b028a79f95de5dca1145562d953187f6c72b7ff3b9308c21cfce7f02eca933c7e62c4aa7d2
6
+ metadata.gz: 1b751bb14ee88a45e12c461716625770ffdfd8db54f08e434fc9a01a5e0012de5a33753b1ae4f6897761e5220b8bab1461eb9411cc443ae449b30fe8f7b4c5e2
7
+ data.tar.gz: d3acbe4c209918294712fafe0fff86a6ced399bab903f7de6eb56881a729352f213c8b1b0a46076953d3cff36f105d5462623d1973641a519e506e3ab542c877
@@ -3,5 +3,5 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
- - 2.3.3
6
+ - 2.5.0
7
7
  before_install: gem install bundler -v 1.16.3
data/README.md CHANGED
@@ -9,7 +9,7 @@ TODO: Delete this and the text above, and describe your gem
9
9
  Add this line to your application's Gemfile:
10
10
 
11
11
  ```ruby
12
- gem 'simple_mysql_partitioning'
12
+ gem 'simple_mysql_partitioning', '~> 0.2.0'
13
13
  ```
14
14
 
15
15
  And then execute:
@@ -22,7 +22,36 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ``` ruby
26
+ class DailyReport < ActiveRecord::Base
27
+ include SimpleMySQLPartitioning
28
+
29
+ # arg1: column
30
+ # type: partitiong type
31
+ partitioning_by :day, type: :range
32
+ end
33
+
34
+
35
+ # partition name, less than value
36
+ pairs_name_with_values = [
37
+ ['p201808', '2018-09-01']
38
+ ]
39
+
40
+ # add partition
41
+ DailyReport.partition.add(pairs_name_with_values)
42
+
43
+ # reorganize partition
44
+ # If you want to reorganize partition, use this method and set reorganize partition name to second arg.
45
+ DailyReport.partition.reorganize(pairs_name_with_values, 'p999999')
46
+
47
+ # drop
48
+ DailyReport.partition.drop('p201808')
49
+
50
+ # exists?
51
+ DailyReport.partition.exists?('p201808')
52
+ ```
53
+
54
+ We support only range partitioning.
26
55
 
27
56
  ## Development
28
57
 
@@ -1,9 +1,16 @@
1
1
  require 'simple_mysql_partitioning/version'
2
2
  require 'active_record'
3
3
  require 'mysql2'
4
+ require 'simple_mysql_partitioning/adapter'
4
5
  require 'simple_mysql_partitioning/sql'
5
- require 'simple_mysql_partitioning/executor'
6
+ require 'simple_mysql_partitioning/range'
7
+ require 'simple_mysql_partitioning/base_partitioning'
6
8
 
7
- module SimpleMysqlParitioning
9
+ module SimpleMySQLPartitioning
8
10
  # Your code goes here...
11
+ class << self
12
+ def included(klass)
13
+ klass.send :include, SimpleMySQLPartitioning::Adapter
14
+ end
15
+ end
9
16
  end
@@ -0,0 +1,22 @@
1
+ module SimpleMySQLPartitioning
2
+ module Adapter
3
+ def self.included(model)
4
+ model.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def partitioning_by(column, type:)
9
+ @partition_config = { column: column, type: type }
10
+ @partition = "SimpleMySQLPartitioning::#{type.to_s.classify}".constantize.new(self)
11
+ end
12
+
13
+ def partition
14
+ @partition
15
+ end
16
+
17
+ def partition_config
18
+ @partition_config
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'active_record'
2
+ require 'simple_mysql_partitioning/sql'
3
+
4
+ module SimpleMySQLPartitioning
5
+ class BasePartitioning
6
+ attr_reader :klass, :table_name
7
+
8
+ def initialize(klass)
9
+ @klass = klass
10
+ @table_name = klass.table_name
11
+ end
12
+
13
+ def exists?(partition_name)
14
+ klass.connection.select_all(
15
+ SQL.exists_sql(table_name, partition_name)
16
+ ).to_hash.present?
17
+ end
18
+
19
+ def drop(partition_name)
20
+ klass.connection.execute(SQL.parge_sql(table_name, partition_name))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require 'active_record'
2
+ require 'simple_mysql_partitioning/sql'
3
+ require 'simple_mysql_partitioning/base_partitioning'
4
+
5
+ module SimpleMySQLPartitioning
6
+ class Range < BasePartitioning
7
+ def add(pairs_name_with_value)
8
+ pairs_name_with_value.map do |pair|
9
+ add_partition_sql = SQL.add_sql(table_name, pair.first, pair.last)
10
+ klass.connection.execute(add_partition_sql)
11
+ end
12
+ end
13
+
14
+ def reorganize(pairs_name_with_value, reorganize_partition_name)
15
+ pairs_name_with_value.map do |pair|
16
+ klass.connection.execute(
17
+ SQL.reorganize_sql(
18
+ table_name,
19
+ pair.first, pair.last,
20
+ reorganize_partition_name
21
+ )
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,7 +1,7 @@
1
1
  module SimpleMySQLPartitioning
2
2
  class SQL
3
3
  class << self
4
- def exist_sql(table_name, partition_name)
4
+ def exists_sql(table_name, partition_name)
5
5
  "SELECT
6
6
  table_schema,
7
7
  table_name,
@@ -16,15 +16,15 @@ module SimpleMySQLPartitioning
16
16
 
17
17
  def add_sql(table_name, partition_name, value)
18
18
  "ALTER TABLE #{table_name}
19
- ADD PARTITION ( PARTITION #{partition_name}
20
- VALUES LESS THAN ('#{value}'));"
19
+ ADD PARTITION ( PARTITION #{partition_name} VALUES LESS THAN ('#{value}'));"
21
20
  end
22
21
 
23
22
  def reorganize_sql(table_name, partition_name, value, reorganize_partition_name, max_value = 'MAXVALUE')
24
23
  "ALTER TABLE #{table_name}
25
- REORGANIZE PARTITION #{reorganize_partition_name} INTO (
26
- PARTITION #{partition_name} VALUES LESS THAN ('#{value}'),
27
- PARTITION #{reorganize_partition_name} VALUES LESS THAN #{max_value});"
24
+ REORGANIZE PARTITION #{reorganize_partition_name} INTO (
25
+ PARTITION #{partition_name} VALUES LESS THAN ('#{value}'),
26
+ PARTITION #{reorganize_partition_name} VALUES LESS THAN #{max_value}
27
+ );"
28
28
  end
29
29
 
30
30
  def parge_sql(table_name, partition_name)
@@ -1,3 +1,3 @@
1
1
  module SimpleMysqlParitioning
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ['lib']
23
23
 
24
- spec.add_dependency 'activerecord', ['> 3.2']
24
+ spec.add_dependency 'activerecord', ['> 4.2.5', '<= 5.2.0']
25
25
  spec.add_development_dependency 'bundler', '~> 1.16'
26
- spec.add_development_dependency 'mysql2', '~> 0.3.21'
26
+ spec.add_development_dependency 'mysql2', '~> 0.5.0'
27
27
  spec.add_development_dependency 'rake', '~> 10.0'
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_mysql_partitioning
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shunsuke Andoh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-26 00:00:00.000000000 Z
11
+ date: 2018-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.2'
19
+ version: 4.2.5
20
+ - - "<="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.2.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">"
25
28
  - !ruby/object:Gem::Version
26
- version: '3.2'
29
+ version: 4.2.5
30
+ - - "<="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.2.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +50,14 @@ dependencies:
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: 0.3.21
53
+ version: 0.5.0
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: 0.3.21
60
+ version: 0.5.0
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: rake
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -97,7 +103,9 @@ files:
97
103
  - bin/setup
98
104
  - docker/docker-compose.yml
99
105
  - lib/simple_mysql_partitioning.rb
100
- - lib/simple_mysql_partitioning/executor.rb
106
+ - lib/simple_mysql_partitioning/adapter.rb
107
+ - lib/simple_mysql_partitioning/base_partitioning.rb
108
+ - lib/simple_mysql_partitioning/range.rb
101
109
  - lib/simple_mysql_partitioning/sql.rb
102
110
  - lib/simple_mysql_partitioning/version.rb
103
111
  - simple_mysql_partitioning.gemspec
@@ -120,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
128
  version: '0'
121
129
  requirements: []
122
130
  rubyforge_project:
123
- rubygems_version: 2.5.2
131
+ rubygems_version: 2.7.7
124
132
  signing_key:
125
133
  specification_version: 4
126
134
  summary: Generate partitioning sql for mysql
@@ -1,40 +0,0 @@
1
- require 'active_record'
2
- require 'simple_mysql_partitioning/sql'
3
-
4
- module SimpleMySQLPartitioning
5
- class Executor
6
- def initialize(klass, partition_name)
7
- @klass = klass
8
- @table_name = @klass.table_name
9
- @partition_name = partition_name
10
- end
11
-
12
- def add(less_than_value)
13
- return if exist?
14
- add_partition_sql = SQL.add_sql(@table_name, @partition_name, less_than_value)
15
- @klass.connection.execute(add_partition_sql)
16
- end
17
-
18
- def reorganize(less_than_value, reorganize_partition_name)
19
- return if exist?
20
- @klass.connection.execute(
21
- SQL.reorganize_sql(
22
- @table_name,
23
- @partition_name, less_than_value,
24
- reorganize_partition_name
25
- )
26
- )
27
- end
28
-
29
- def exist?
30
- @klass.connection.select_all(
31
- SQL.exist_sql(@table_name, @partition_name)
32
- ).to_hash.present?
33
- end
34
-
35
- def drop
36
- return unless exist?
37
- @klass.connection.execute(SQL.parge_sql(@table_name, @partition_name))
38
- end
39
- end
40
- end