post_json 1.0.3 → 1.0.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: 90d8b0c0218c6e80aea604f49fe5ea5dfddff653
4
- data.tar.gz: 4e8e16084b21f5909e1d1e2728e5a707483c050b
3
+ metadata.gz: ba717a41c7ab9e983103b70305d09b301e8c1130
4
+ data.tar.gz: 564e3a2eee9880edde739632a7223f7d571f78a6
5
5
  SHA512:
6
- metadata.gz: cdb0d422a3cb9ae46eb28d2dc70e9c97ff2513e88654aa729ca207da8f8e835ce546813762446aadf588e298b721b72cb24ee36b69aab0c2ade5dc4b2d3b401e
7
- data.tar.gz: a7e994fced38b80d2b2644555bef27d82a62d6a6f00d92719f64f60e19871710ae6e2cbd0456f9d7624de5bd7d924840aa036740f2f1e6b9c38d02ab3ccaf3f7
6
+ metadata.gz: 96775c8330a18731ec8ba1b56c7c30a1287a8824c50d9deae8e85f877638ed17c107d26a88f2a22876bcf36e157d499ec9138dccc6f5f3acdc4ca54769bf9f29
7
+ data.tar.gz: af55ee745807c8c1246651a319ec9978e4dc266fd84460840f5c79a14d240afc04543c57da37ad97af00d55205e88094b317171d3dca077d2cac155971e34403
data/README.md CHANGED
@@ -158,7 +158,7 @@ Also, __notice you don't have to define model attributes anywhere!__
158
158
  We have created a feature we call `Dynamic Index`. It will automatically create indexes on slow queries, so queries
159
159
  speed up considerably.
160
160
 
161
- PostJson will measure the duration of each `SELECT` query and instruct PostgreSQL to create an Expression Index,
161
+ PostJson will measure the duration of each `SELECT` query and instruct PostgreSQL to create an Index,
162
162
  if the query duration is above a specified threshold.
163
163
 
164
164
  Each collection (like PostJson::Collection["people"]) have attribute `use_dynamic_index` (which is true by default) and
@@ -168,7 +168,7 @@ Lets say that you execute the following query and the duration is above the thre
168
168
 
169
169
  `PostJson::Collection["people"].where(name: "Jacob").count`
170
170
 
171
- PostJson will create (unless it already exists) an Expression Index on `name` behind the scenes. The next time
171
+ PostJson will create (unless it already exists) an Index on `name` behind the scenes. The next time
172
172
  you execute a query with `name` the performance will be much improved.
173
173
 
174
174
  ## Requirements
@@ -159,18 +159,11 @@ module PostJson
159
159
  end
160
160
 
161
161
  def default_scopes
162
- if @collection_name
163
- model_settings = ModelSettings.table_name
164
- # query = original_all.joins("INNER JOIN #{model_settings} ON #{table_name}.__doc__model_settings_id = #{model_settings}.id")
165
- # query = query.where("lower(#{model_settings}.collection_name) = ?", collection_name.downcase)
166
-
167
- query = original_all.joins("INNER JOIN #{model_settings} ON lower(#{model_settings}.collection_name) = '#{collection_name.downcase}'")
168
- query = query.where("#{table_name}.__doc__model_settings_id = #{model_settings}.id")
169
-
170
- [Proc.new { query }] + super
171
- else
172
- [Proc.new { none }] + super
173
- end
162
+ # query = original_all.where("\"#{table_name}\".__doc__model_settings_id = ?", settings_id)
163
+ model_settings = ModelSettings.table_name
164
+ query = original_all.joins("INNER JOIN \"#{model_settings}\" ON lower(\"#{model_settings}\".collection_name) = '#{collection_name.downcase}'")
165
+ query = query.where("\"#{table_name}\".__doc__model_settings_id = \"#{model_settings}\".id")
166
+ super + [Proc.new { query }]
174
167
  end
175
168
 
176
169
  def collection_name
@@ -185,12 +178,13 @@ end"
185
178
  def collection_name=(name)
186
179
  raise ArgumentError, "Collection name must be present" unless name.present?
187
180
  @collection_name = name.to_s.strip
181
+ reload_settings!
182
+ @collection_name
188
183
  end
189
184
 
190
185
  def rename_collection(new_name)
191
186
  new_name = new_name.to_s.strip
192
- settings = find_settings
193
- if settings
187
+ if settings.persisted?
194
188
  settings.collection_name = new_name
195
189
  settings.save!
196
190
  end
@@ -238,18 +232,18 @@ end"
238
232
  self.id = self.__doc__body['id'] = SecureRandom.uuid
239
233
  end
240
234
 
241
- self.__doc__model_settings_id = __model__settings.id
235
+ self.__doc__model_settings_id = self.class.persisted_settings.id
242
236
  self.__doc__version = 1
243
237
 
244
- if __model__settings.include_version_number == true &&
245
- __doc__body_read_attribute(__model__settings.version_attribute_name) == nil
246
- __doc__body_write_attribute(__model__settings.version_attribute_name, self.__doc__version)
238
+ if self.class.persisted_settings.include_version_number == true &&
239
+ __doc__body_read_attribute(self.class.persisted_settings.version_attribute_name) == nil
240
+ __doc__body_write_attribute(self.class.persisted_settings.version_attribute_name, self.__doc__version)
247
241
  end
248
242
 
249
- if __model__settings.use_timestamps
243
+ if self.class.persisted_settings.use_timestamps
250
244
  __local__current_time = Time.zone.now.strftime('%Y-%m-%dT%H:%M:%S.%LZ')
251
- __doc__body_write_attribute(__model__settings.created_at_attribute_name, __local__current_time)
252
- __doc__body_write_attribute(__model__settings.updated_at_attribute_name, __local__current_time)
245
+ __doc__body_write_attribute(self.class.persisted_settings.created_at_attribute_name, __local__current_time)
246
+ __doc__body_write_attribute(self.class.persisted_settings.updated_at_attribute_name, __local__current_time)
253
247
  end
254
248
  super
255
249
  end
@@ -263,14 +257,14 @@ end"
263
257
  self.__doc__version = self.__doc__version + 1
264
258
  end
265
259
 
266
- if __model__settings.include_version_number == true &&
267
- __doc__body_attribute_changed?(__model__settings.version_attribute_name) == false
268
- __doc__body_write_attribute(__model__settings.version_attribute_name, self.__doc__version)
260
+ if self.class.persisted_settings.include_version_number == true &&
261
+ __doc__body_attribute_changed?(self.class.persisted_settings.version_attribute_name) == false
262
+ __doc__body_write_attribute(self.class.persisted_settings.version_attribute_name, self.__doc__version)
269
263
  end
270
264
 
271
- if __model__settings.use_timestamps && __doc__body_attribute_changed?(__model__settings.updated_at_attribute_name)
265
+ if self.class.persisted_settings.use_timestamps && __doc__body_attribute_changed?(self.class.persisted_settings.updated_at_attribute_name)
272
266
  __local__current_time = Time.zone.now.strftime('%Y-%m-%dT%H:%M:%S.%LZ')
273
- __doc__body_write_attribute(__model__settings.updated_at_attribute_name, __local__current_time)
267
+ __doc__body_write_attribute(self.class.persisted_settings.updated_at_attribute_name, __local__current_time)
274
268
  end
275
269
  super
276
270
  end
@@ -4,11 +4,10 @@ module PostJson
4
4
 
5
5
  module ClassMethods
6
6
  def dynamic_indexes
7
- settings = find_settings
8
- if settings
9
- DynamicIndex.indexed_selectors(settings.id)
10
- else
7
+ if settings.new_record?
11
8
  []
9
+ else
10
+ DynamicIndex.indexed_selectors(settings.id)
12
11
  end
13
12
  end
14
13
 
@@ -17,16 +16,14 @@ module PostJson
17
16
  end
18
17
 
19
18
  def create_dynamic_indexes(*selectors)
20
- settings = find_settings_or_create
21
- DynamicIndex.ensure_index(settings.id, *selectors).count
19
+ DynamicIndex.ensure_index(persisted_settings.id, *selectors).count
22
20
  end
23
21
 
24
22
  def destroy_dynamic_index(selector)
25
- settings = find_settings_or_create
26
- if settings
27
- DynamicIndex.destroy_index(settings.id, selector)
28
- else
23
+ if settings.new_record?
29
24
  false
25
+ else
26
+ DynamicIndex.destroy_index(settings.id, selector)
30
27
  end
31
28
  end
32
29
  end
@@ -2,32 +2,37 @@ module PostJson
2
2
  module SettingsMethods
3
3
  extend ActiveSupport::Concern
4
4
 
5
- def __model__settings
6
- @__model__settings ||= self.class.find_settings_or_create
7
- end
8
-
9
5
  module ClassMethods
10
- def find_settings
11
- ModelSettings.by_collection(collection_name).first
12
- end
13
-
14
- def find_settings_or_create
15
- ModelSettings.by_collection(collection_name).first_or_create(collection_name: collection_name)
6
+ def settings
7
+ @settings ||= ModelSettings.by_collection(collection_name).first_or_initialize(collection_name: collection_name)
8
+ end
9
+
10
+ def persisted_settings
11
+ if settings.new_record?
12
+ existing = ModelSettings.by_collection(collection_name).first
13
+ if existing
14
+ updates = settings.changes.inject({}) {|result, (k,v)| result[k] = v[1]; result}
15
+ existing.update_attributes(updates)
16
+ @settings = existing
17
+ else
18
+ settings.save!
19
+ end
20
+ end
21
+ settings
16
22
  end
17
23
 
18
- def find_settings_or_initialize
19
- ModelSettings.by_collection(collection_name).first_or_initialize(collection_name: collection_name)
24
+ def reload_settings!
25
+ @settings = nil
26
+ settings
20
27
  end
21
28
 
22
29
  def read_settings_attribute(attribute_name)
23
30
  attribute_name = attribute_name.to_s
24
- settings = find_settings_or_initialize
25
31
  settings[attribute_name]
26
32
  end
27
33
 
28
34
  def write_settings_attribute(attribute_name, value)
29
35
  attribute_name = attribute_name.to_s
30
- settings = find_settings_or_initialize
31
36
  if settings[attribute_name] != value
32
37
  settings[attribute_name] = value
33
38
  settings.save!
@@ -35,18 +35,6 @@ module PostJson
35
35
  validates :selector, presence: true
36
36
 
37
37
  def index_name
38
- # if defined?(@index_name)
39
- # @index_name
40
- # else
41
- # prefix = "dyn_#{model_settings_id.gsub('-', '')}_"
42
- # @index_name = if 63 < prefix.length + selector.length
43
- # digest = Digest::MD5.hexdigest(selector)
44
- # "#{prefix}#{digest}"[0..62]
45
- # else
46
- # "#{prefix}#{selector.gsub('.', '_')}"
47
- # end
48
- # end
49
-
50
38
  @index_name ||= unless @index_name
51
39
  prefix = "dyn_#{model_settings_id.gsub('-', '')}_"
52
40
  if 63 < prefix.length + selector.length
@@ -90,10 +78,12 @@ IF NOT EXISTS (
90
78
  AND n.nspname = '#{current_schema}' -- 'public' by default
91
79
  ) THEN
92
80
 
93
- CREATE INDEX #{index_name} ON #{current_schema}.#{Base.table_name} (json_selector('#{selector}', __doc__body)) WHERE __doc__model_settings_id = '#{model_settings_id.gsub('-', '')}';
81
+ CREATE INDEX #{index_name} ON #{current_schema}.#{Base.table_name} (json_selector('#{selector}', __doc__body));
94
82
  END IF;
95
83
 
96
84
  END$$;"
97
85
  end
98
86
  end
99
87
  end
88
+
89
+ # CREATE INDEX #{index_name} ON #{current_schema}.#{Base.table_name} (json_selector('#{selector}', __doc__body)) WHERE __doc__model_settings_id = '#{model_settings_id.gsub('-', '')}';
@@ -28,7 +28,7 @@ module PostJson
28
28
  select_duration = ActiveRecord::Base.connection.last_select_query_duration * 1000
29
29
  if model_class.use_dynamic_index == true &&
30
30
  model_class.create_dynamic_index_milliseconds_threshold < select_duration
31
- selectors = select_query.scan(/.*?json_selector\('(.*?)', __doc__body\)/).flatten.uniq
31
+ selectors = select_query.scan(/.*?json_selector\('(.*?)', \"post_json_documents\"\.__doc__body\)/).flatten.uniq
32
32
  model_class.create_dynamic_indexes(selectors)
33
33
  end
34
34
  result
@@ -1,3 +1,3 @@
1
1
  module PostJson
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: post_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Madsen and Martin Thoegersen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-17 00:00:00.000000000 Z
11
+ date: 2013-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails