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 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