en_masse 0.1.3 → 0.1.4

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
  SHA1:
3
- metadata.gz: d6aacf9d6b65da55afc86a7ddbee21ec434883d5
4
- data.tar.gz: ee5ddb583d9f6f960f93309c77ade2ec1aa10d14
3
+ metadata.gz: d027aa18c0ede70cbc3033d8518116deea9415bd
4
+ data.tar.gz: 670c6c497af6d875812359afa3e8c42ed73c5d01
5
5
  SHA512:
6
- metadata.gz: 1a1d8115b21cf42c7cd8eecfeffb1c462a3074594648f02b18f6d3bd780a0a5ff84da2f95f47bb8312a4720a9abdb969a51843df7e3260ce965a62cc46788140
7
- data.tar.gz: a69508c71040b07c3bcd3367cc60488a0501b3994b5fce81e3b5bf36e2ee350f23fba7e4bc7ec68575d55d5139541d5c3019e3141f3e6cc0325e04ed2cc22286
6
+ metadata.gz: 3be126dfa5c7fb988537d5ebbd316048475a4590adb3e58a90333e2db50a85b38c43b39effa7f72612efd9d6e36de4024a94e4bb10f98ba2c7433390907c2ed3
7
+ data.tar.gz: 1218b95c5702f866a381feb8e648417e81dff01138494410155b2c451d0a2c4635ec51a9cffa05b2c7c50b0081990bc37cea61bc97e33486e62445e1631fcad7
@@ -1,3 +1,5 @@
1
+ require "benchmark"
2
+
1
3
  module EnMasse::Refinements
2
4
 
3
5
  refine ::ActiveRecord::Base.singleton_class do
@@ -12,11 +14,15 @@ module EnMasse::Refinements
12
14
  end
13
15
  values = collection.map{|record|
14
16
  "(#{ record.values_for_insert(column_names).join(",") })"
15
- }.join(",")
16
- ActiveRecord::Base.connection.execute %Q[
17
- INSERT INTO #{table_name} (#{column_names.join(",")})
18
- VALUES #{values};
19
- ]
17
+ }
18
+ log_elapsed_time :debug, %Q[INSERT INTO #{table_name} (#{column_names.join(",")}) VALUES <#{values.count} values ...>;] do
19
+ with_ar_log_level Logger::ERROR do
20
+ connection.execute %Q[
21
+ INSERT INTO #{table_name} (#{column_names.join(",")})
22
+ VALUES #{values.join(",")};
23
+ ]
24
+ end
25
+ end
20
26
  end
21
27
 
22
28
  def reflect_on_dependent_associations
@@ -32,7 +38,7 @@ module EnMasse::Refinements
32
38
  end
33
39
 
34
40
  def allocate_ids amount
35
- next_value = connection.execute(%Q[
41
+ next_value = connection.execute(squeeze_ws(%Q[
36
42
  SELECT pg_advisory_lock(#{primary_key_sequence_update_lock}),
37
43
  setval('#{sequence_name}', greatest(
38
44
  (select max(id) from #{table_name}),
@@ -40,11 +46,42 @@ module EnMasse::Refinements
40
46
  + #{amount}),
41
47
  currval('#{sequence_name}'),
42
48
  pg_advisory_unlock(#{primary_key_sequence_update_lock});
43
- ]).first["currval"].to_i
49
+ ])).first["currval"].to_i
44
50
  start_value = next_value - amount + 1
45
51
  start_value..next_value
46
52
  end
47
53
 
54
+ def with_ar_log_level level, &block
55
+ if logger
56
+ begin
57
+ original_level = logger.level
58
+ logger.level = level
59
+ yield
60
+ ensure
61
+ logger.level = original_level if logger
62
+ end
63
+ else
64
+ yield
65
+ end
66
+ end
67
+
68
+ def log_elapsed_time level, message, &block
69
+ if logger
70
+ seconds = Benchmark.realtime &block
71
+ ms = "#{(seconds*1000).round(1)}ms"
72
+ logger.send level, " (#{ms}) #{message}"
73
+ else
74
+ yield
75
+ end
76
+ end
77
+
78
+ def squeeze_ws string
79
+ string
80
+ .gsub(/\A\s+/, "")
81
+ .gsub(/\s+\z/, "")
82
+ .gsub(/\s+/, " ")
83
+ end
84
+
48
85
  end
49
86
 
50
87
  refine ::ActiveRecord::Base do
@@ -77,13 +114,23 @@ module EnMasse::Refinements
77
114
  end
78
115
 
79
116
  def dependents
80
- direct_dependents = self.class
81
- .reflect_on_dependent_associations
82
- .flat_map{|association| self.send(association.name)}
83
- .compact
84
- .uniq
117
+ direct_dependents = with_cleared_pk {
118
+ self.class
119
+ .reflect_on_dependent_associations
120
+ .flat_map{|association| self.send(association.name) }
121
+ .compact
122
+ .uniq
123
+ }
85
124
  direct_dependents + direct_dependents.flat_map{|dependent| dependent.dependents}
86
125
  end
87
126
 
127
+ def with_cleared_pk &block
128
+ pk = self[self.class.primary_key]
129
+ self[self.class.primary_key] = nil
130
+ yield
131
+ ensure
132
+ self[self.class.primary_key] = pk
133
+ end
134
+
88
135
  end
89
136
  end
@@ -1,3 +1,3 @@
1
1
  module EnMasse
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: en_masse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Baguinski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-16 00:00:00.000000000 Z
11
+ date: 2016-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler