en_masse 0.1.3 → 0.1.4
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 +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
|