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 +4 -4
- data/lib/en_masse/refinements.rb +59 -12
- data/lib/en_masse/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d027aa18c0ede70cbc3033d8518116deea9415bd
|
4
|
+
data.tar.gz: 670c6c497af6d875812359afa3e8c42ed73c5d01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3be126dfa5c7fb988537d5ebbd316048475a4590adb3e58a90333e2db50a85b38c43b39effa7f72612efd9d6e36de4024a94e4bb10f98ba2c7433390907c2ed3
|
7
|
+
data.tar.gz: 1218b95c5702f866a381feb8e648417e81dff01138494410155b2c451d0a2c4635ec51a9cffa05b2c7c50b0081990bc37cea61bc97e33486e62445e1631fcad7
|
data/lib/en_masse/refinements.rb
CHANGED
@@ -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
|
-
}
|
16
|
-
|
17
|
-
|
18
|
-
|
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 =
|
81
|
-
.
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
data/lib/en_masse/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|