inventory_refresh 0.1.2 → 0.2.3

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.gitignore +6 -0
  4. data/.travis.yml +3 -3
  5. data/Gemfile +4 -0
  6. data/inventory_refresh.gemspec +7 -5
  7. data/lib/inventory_refresh.rb +1 -0
  8. data/lib/inventory_refresh/inventory_collection.rb +114 -649
  9. data/lib/inventory_refresh/inventory_collection/builder.rb +249 -0
  10. data/lib/inventory_refresh/inventory_collection/graph.rb +0 -15
  11. data/lib/inventory_refresh/inventory_collection/helpers.rb +6 -0
  12. data/lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb +80 -0
  13. data/lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb +456 -0
  14. data/lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb +132 -0
  15. data/lib/inventory_refresh/inventory_collection/index/type/skeletal.rb +5 -5
  16. data/lib/inventory_refresh/inventory_collection/reference.rb +4 -0
  17. data/lib/inventory_refresh/inventory_collection/scanner.rb +111 -18
  18. data/lib/inventory_refresh/inventory_collection/serialization.rb +7 -7
  19. data/lib/inventory_refresh/inventory_collection/unconnected_edge.rb +19 -0
  20. data/lib/inventory_refresh/inventory_object.rb +17 -11
  21. data/lib/inventory_refresh/inventory_object_lazy.rb +20 -10
  22. data/lib/inventory_refresh/persister.rb +212 -0
  23. data/lib/inventory_refresh/save_collection/base.rb +18 -3
  24. data/lib/inventory_refresh/save_collection/saver/base.rb +25 -62
  25. data/lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb +73 -225
  26. data/lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb +226 -0
  27. data/lib/inventory_refresh/save_collection/saver/retention_helper.rb +115 -0
  28. data/lib/inventory_refresh/save_collection/saver/sql_helper.rb +122 -0
  29. data/lib/inventory_refresh/save_collection/saver/sql_helper_update.rb +24 -5
  30. data/lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb +6 -6
  31. data/lib/inventory_refresh/save_collection/sweeper.rb +69 -0
  32. data/lib/inventory_refresh/save_inventory.rb +18 -8
  33. data/lib/inventory_refresh/target_collection.rb +12 -0
  34. data/lib/inventory_refresh/version.rb +1 -1
  35. metadata +73 -25
  36. data/lib/inventory_refresh/save_collection/recursive.rb +0 -52
  37. data/lib/inventory_refresh/save_collection/saver/concurrent_safe.rb +0 -71
@@ -0,0 +1,132 @@
1
+ require_relative "../helpers"
2
+
3
+ module InventoryRefresh
4
+ class InventoryCollection
5
+ module Helpers
6
+ module QuestionsHelper
7
+ # @return [Boolean] true means we want to call .changed? on every ActiveRecord object before saving it
8
+ def check_changed?
9
+ check_changed
10
+ end
11
+
12
+ # @return [Boolean] true means we want to use ActiveRecord object for writing attributes and we want to perform
13
+ # casting on all columns
14
+ def use_ar_object?
15
+ use_ar_object
16
+ end
17
+
18
+ # @return [Boolean] true means the data is not complete, leading to only creating and updating data
19
+ def complete?
20
+ complete
21
+ end
22
+
23
+ # @return [Boolean] true means we want to only update data
24
+ def update_only?
25
+ update_only
26
+ end
27
+
28
+ # @return [Boolean] true means we will delete/soft-delete data
29
+ def delete_allowed?
30
+ complete? && !update_only?
31
+ end
32
+
33
+ # @return [Boolean] true means we will delete/soft-delete data
34
+ def create_allowed?
35
+ !update_only?
36
+ end
37
+
38
+ # @return [Boolean] true means that only create of new data is allowed
39
+ def create_only?
40
+ create_only
41
+ end
42
+
43
+ # @return [Boolean] true if the whole InventoryCollection object has all data persisted
44
+ def saved?
45
+ saved
46
+ end
47
+
48
+ # @return [Boolean] true if all dependencies have all data persisted
49
+ def saveable?
50
+ dependencies.all?(&:saved?)
51
+ end
52
+
53
+ # @return [Boolean] true if we are using a saver strategy that allows saving in parallel processes
54
+ def parallel_safe?
55
+ @parallel_safe_cache ||= %i(concurrent_safe concurrent_safe_batch).include?(saver_strategy)
56
+ end
57
+
58
+ # @return [Boolean] true if the model_class supports STI
59
+ def supports_sti?
60
+ @supports_sti_cache = model_class.column_names.include?("type") if @supports_sti_cache.nil?
61
+ @supports_sti_cache
62
+ end
63
+
64
+ # @param column_name [Symbol, String]
65
+ # @return [Boolean] true if the model_class supports given column
66
+ def supports_column?(column_name)
67
+ @supported_cols_cache ||= {}
68
+ return @supported_cols_cache[column_name.to_sym] unless @supported_cols_cache[column_name.to_sym].nil?
69
+
70
+ include_col = model_class.column_names.include?(column_name.to_s)
71
+ if %w(created_on created_at updated_on updated_at).include?(column_name.to_s)
72
+ include_col &&= ActiveRecord::Base.record_timestamps
73
+ end
74
+
75
+ @supported_cols_cache[column_name.to_sym] = include_col
76
+ end
77
+
78
+ # @return [Boolean] true if no more data will be added to this InventoryCollection object, that usually happens
79
+ # after the parsing step is finished
80
+ def data_collection_finalized?
81
+ data_collection_finalized
82
+ end
83
+
84
+ # @return [Boolean] true is processing of this InventoryCollection will be in targeted mode
85
+ def targeted?
86
+ targeted
87
+ end
88
+
89
+ # True if processing of this InventoryCollection object would lead to no operations. Then we use this marker to
90
+ # stop processing of the InventoryCollector object very soon, to avoid a lot of unnecessary Db queries, etc.
91
+ #
92
+ # @return [Boolean] true if processing of this InventoryCollection object would lead to no operations.
93
+ def noop?
94
+ # If this InventoryCollection doesn't do anything. it can easily happen for targeted/batched strategies.
95
+ saving_noop? && delete_complement_noop?
96
+ end
97
+
98
+ # @return [Boolean] true if processing InventoryCollection will not lead to any created/updated/deleted record
99
+ def saving_noop?
100
+ saving_targeted_parent_collection_noop? || saving_targeted_child_collection_noop? || saving_full_collection_noop?
101
+ end
102
+
103
+ # @return true if processing InventoryCollection will not lead to deleting the complement of passed ids
104
+ def delete_complement_noop?
105
+ all_manager_uuids.nil?
106
+ end
107
+
108
+ private
109
+
110
+ # @return true if it's a noop parent targeted InventoryCollection
111
+ def saving_targeted_parent_collection_noop?
112
+ targeted_noop_condition && parent_inventory_collections.blank? && targeted_scope.primary_references.blank?
113
+ end
114
+
115
+ # @return true if it's a noop child targeted InventoryCollection
116
+ def saving_targeted_child_collection_noop?
117
+ targeted_noop_condition && parent_inventory_collections.present? &&
118
+ parent_inventory_collections.all? { |x| x.targeted_scope.primary_references.blank? }
119
+ end
120
+
121
+ # @return true if it's a noop full InventoryCollection refresh
122
+ def saving_full_collection_noop?
123
+ !targeted? && data.blank? && !delete_allowed? && skeletal_primary_index.blank?
124
+ end
125
+
126
+ def targeted_noop_condition
127
+ targeted? && custom_save_block.nil? && skeletal_primary_index.blank?
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -87,19 +87,19 @@ module InventoryRefresh
87
87
  #
88
88
  # @param attributes [Hash] Attributes we want to extend with version related attributes
89
89
  def fill_versions!(attributes)
90
- if inventory_collection.supports_resource_timestamps_max? && attributes[:resource_timestamp]
90
+ if inventory_collection.supports_column?(:resource_timestamps_max) && attributes[:resource_timestamp]
91
91
  fill_specific_version_attr(:resource_timestamps, :resource_timestamp, attributes)
92
- elsif inventory_collection.supports_resource_versions_max? && attributes[:resource_version]
93
- fill_specific_version_attr(:resource_versions, :resource_version, attributes)
92
+ elsif inventory_collection.supports_column?(:resource_counters_max) && attributes[:resource_counter]
93
+ fill_specific_version_attr(:resource_counters, :resource_counter, attributes)
94
94
  end
95
95
  end
96
96
 
97
97
  # Add specific versions columns into the passed attributes
98
98
  #
99
99
  # @param partial_row_version_attr [Symbol] Attr name for partial rows, allowed values are
100
- # [:resource_timestamps, :resource_versions]
100
+ # [:resource_timestamps, :resource_counters]
101
101
  # @param full_row_version_attr [Symbol] Attr name for full rows, allowed values are
102
- # [:resource_timestamp, :resource_version]
102
+ # [:resource_timestamp, :resource_counter]
103
103
  # @param attributes [Hash] Attributes we want to extend with version related attributes
104
104
  def fill_specific_version_attr(partial_row_version_attr, full_row_version_attr, attributes)
105
105
  # We have to symbolize, since serializing persistor makes these strings
@@ -35,6 +35,10 @@ module InventoryRefresh
35
35
  nested_secondary_index
36
36
  end
37
37
 
38
+ def loadable?
39
+ keys.any? { |attribute| full_reference[attribute].present? }
40
+ end
41
+
38
42
  class << self
39
43
  # Builds string uuid from passed Hash and keys
40
44
  #
@@ -13,7 +13,7 @@ module InventoryRefresh
13
13
  indexed_inventory_collections = inventory_collections.index_by(&:name)
14
14
 
15
15
  inventory_collections.each do |inventory_collection|
16
- new(inventory_collection, indexed_inventory_collections).scan!
16
+ new(inventory_collection, indexed_inventory_collections, build_association_hash(inventory_collections)).scan!
17
17
  end
18
18
 
19
19
  inventory_collections.each do |inventory_collection|
@@ -22,9 +22,21 @@ module InventoryRefresh
22
22
  end
23
23
  end
24
24
  end
25
+
26
+ def build_association_hash(inventory_collections)
27
+ associations_hash = {}
28
+ parents = inventory_collections.map(&:parent).compact.uniq
29
+ parents.each do |parent|
30
+ parent.class.reflect_on_all_associations(:has_many).each do |association|
31
+ through_assoc = association.options.try(:[], :through)
32
+ associations_hash[association.name] = through_assoc if association.options.try(:[], :through)
33
+ end
34
+ end
35
+ associations_hash
36
+ end
25
37
  end
26
38
 
27
- attr_reader :inventory_collection, :indexed_inventory_collections
39
+ attr_reader :associations_hash, :inventory_collection, :indexed_inventory_collections
28
40
 
29
41
  # Boolean helpers the scanner uses from the :inventory_collection
30
42
  delegate :inventory_object_lazy?,
@@ -40,19 +52,26 @@ module InventoryRefresh
40
52
  :to => :inventory_collection
41
53
 
42
54
  # The data scanner modifies inside of the :inventory_collection
43
- delegate :attribute_references,
55
+ delegate :all_manager_uuids_scope,
56
+ :association,
57
+ :arel,
58
+ :attribute_references,
59
+ :custom_save_block,
44
60
  :data_collection_finalized=,
45
61
  :dependency_attributes,
62
+ :targeted?,
46
63
  :targeted_scope,
64
+ :parent,
47
65
  :parent_inventory_collections,
48
66
  :parent_inventory_collections=,
49
67
  :references,
50
68
  :transitive_dependency_attributes,
51
69
  :to => :inventory_collection
52
70
 
53
- def initialize(inventory_collection, indexed_inventory_collections)
71
+ def initialize(inventory_collection, indexed_inventory_collections, associations_hash)
54
72
  @inventory_collection = inventory_collection
55
73
  @indexed_inventory_collections = indexed_inventory_collections
74
+ @associations_hash = associations_hash
56
75
  end
57
76
 
58
77
  def scan!
@@ -66,26 +85,85 @@ module InventoryRefresh
66
85
  end
67
86
  end
68
87
 
69
- # Transform :parent_inventory_collections symbols to InventoryCollection objects
70
- if parent_inventory_collections.present?
71
- self.parent_inventory_collections = parent_inventory_collections.map do |inventory_collection_index|
72
- ic = indexed_inventory_collections[inventory_collection_index]
73
- if ic.nil?
74
- raise "Can't find InventoryCollection #{inventory_collection_index} from #{inventory_collection}" if targeted?
75
- else
76
- # Add parent_inventory_collection as a dependency, so e.g. disconnect is done in a right order
77
- (dependency_attributes[:__parent_inventory_collections] ||= Set.new) << ic
78
- ic
79
- end
80
- end.compact
88
+ # Scan InventoryCollection skeletal data
89
+ inventory_collection.skeletal_primary_index.each_value do |inventory_object|
90
+ scan_inventory_object!(inventory_object)
81
91
  end
82
92
 
93
+ build_parent_inventory_collections!
94
+ scan_all_manager_uuids_scope!
95
+
83
96
  # Mark InventoryCollection as finalized aka. scanned
84
97
  self.data_collection_finalized = true
85
98
  end
86
99
 
87
100
  private
88
101
 
102
+ def scan_all_manager_uuids_scope!
103
+ return if all_manager_uuids_scope.nil?
104
+
105
+ all_manager_uuids_scope.each do |scope|
106
+ scope.each_value do |value|
107
+ scan_all_manager_uuids_scope_attribute!(value)
108
+ end
109
+ end
110
+ end
111
+
112
+ def build_parent_inventory_collections!
113
+ if parent_inventory_collections.nil?
114
+ build_parent_inventory_collection!
115
+ else
116
+ # We can't figure out what immediate parent is, we'll add parent_inventory_collections as dependencies
117
+ parent_inventory_collections.each { |ic_name| add_parent_inventory_collection_dependency!(ic_name) }
118
+ end
119
+
120
+ return if parent_inventory_collections.blank?
121
+
122
+ # Transform InventoryCollection object names to actual objects
123
+ self.parent_inventory_collections = parent_inventory_collections.map { |x| load_inventory_collection_by_name(x) }
124
+ end
125
+
126
+ def build_parent_inventory_collection!
127
+ return unless supports_building_inventory_collection?
128
+
129
+ if association.present? && parent.present? && associations_hash[association].present?
130
+ # Add immediate parent IC as dependency
131
+ add_parent_inventory_collection_dependency!(associations_hash[association])
132
+ # Add root IC in parent_inventory_collections
133
+ self.parent_inventory_collections = [find_parent_inventory_collection(associations_hash, inventory_collection.association)]
134
+ end
135
+ end
136
+
137
+ def supports_building_inventory_collection?
138
+ # Don't try to introspect ICs with custom query or saving code
139
+ return if arel.present? || custom_save_block.present?
140
+ # We support :parent_inventory_collections only for targeted mode, where all ICs are present
141
+ return unless targeted?
142
+
143
+ true
144
+ end
145
+
146
+ def add_parent_inventory_collection_dependency!(ic_name)
147
+ ic = load_inventory_collection_by_name(ic_name)
148
+ (dependency_attributes[:__parent_inventory_collections] ||= Set.new) << ic if ic
149
+ end
150
+
151
+ def find_parent_inventory_collection(hash, name)
152
+ if hash[name]
153
+ find_parent_inventory_collection(hash, hash[name])
154
+ else
155
+ name
156
+ end
157
+ end
158
+
159
+ def load_inventory_collection_by_name(name)
160
+ ic = indexed_inventory_collections[name]
161
+ if ic.nil?
162
+ raise "Can't find InventoryCollection :#{name} referenced from #{inventory_collection}" if targeted?
163
+ end
164
+ ic
165
+ end
166
+
89
167
  def scan_inventory_object!(inventory_object)
90
168
  inventory_object.data.each do |key, value|
91
169
  if value.kind_of?(Array)
@@ -96,8 +174,23 @@ module InventoryRefresh
96
174
  end
97
175
  end
98
176
 
177
+ def loadable?(value)
178
+ inventory_object_lazy?(value) || inventory_object?(value)
179
+ end
180
+
181
+ def add_reference(value_inventory_collection, value)
182
+ value_inventory_collection.add_reference(value.reference, :key => value.key)
183
+ end
184
+
185
+ def scan_all_manager_uuids_scope_attribute!(value)
186
+ return unless loadable?(value)
187
+
188
+ add_reference(value.inventory_collection, value)
189
+ (dependency_attributes[:__all_manager_uuids_scope] ||= Set.new) << value.inventory_collection
190
+ end
191
+
99
192
  def scan_inventory_object_attribute!(key, value)
100
- return if !inventory_object_lazy?(value) && !inventory_object?(value)
193
+ return unless loadable?(value)
101
194
  value_inventory_collection = value.inventory_collection
102
195
 
103
196
  # Storing attributes and their dependencies
@@ -105,7 +198,7 @@ module InventoryRefresh
105
198
 
106
199
  # Storing a reference in the target inventory_collection, then each IC knows about all the references and can
107
200
  # e.g. load all the referenced uuids from a DB
108
- value_inventory_collection.add_reference(value.reference, :key => value.key)
201
+ add_reference(value_inventory_collection, value)
109
202
 
110
203
  if inventory_object_lazy?(value)
111
204
  # Storing if attribute is a transitive dependency, so a lazy_find :key results in dependency
@@ -4,6 +4,7 @@ module InventoryRefresh
4
4
  class InventoryCollection
5
5
  class Serialization
6
6
  delegate :all_manager_uuids,
7
+ :all_manager_uuids=,
7
8
  :build,
8
9
  :targeted_scope,
9
10
  :data,
@@ -27,18 +28,17 @@ module InventoryRefresh
27
28
  # @param available_inventory_collections [Array<InventoryRefresh::InventoryCollection>] List of available
28
29
  # InventoryCollection objects
29
30
  def from_hash(inventory_objects_data, available_inventory_collections)
30
- targeted_scope.merge!(inventory_objects_data["manager_uuids"].map(&:symbolize_keys!))
31
+ targeted_scope.merge!(inventory_objects_data["manager_uuids"].map(&:symbolize_keys!)) if inventory_objects_data["manager_uuids"]
31
32
 
32
- inventory_objects_data['data'].each do |inventory_object_data|
33
+ (inventory_objects_data['data'] || []).each do |inventory_object_data|
33
34
  build(hash_to_data(inventory_object_data, available_inventory_collections).symbolize_keys!)
34
35
  end
35
36
 
36
- inventory_objects_data['partial_data'].each do |inventory_object_data|
37
+ (inventory_objects_data['partial_data'] || []).each do |inventory_object_data|
37
38
  skeletal_primary_index.build(hash_to_data(inventory_object_data, available_inventory_collections).symbolize_keys!)
38
39
  end
39
40
 
40
- # TODO(lsmola) add support for all_manager_uuids serialization
41
- # self.all_manager_uuids = inventory_objects_data['all_manager_uuids']
41
+ self.all_manager_uuids = inventory_objects_data['all_manager_uuids']
42
42
  end
43
43
 
44
44
  # Serializes InventoryCollection's data storage into Array of Hashes
@@ -105,9 +105,9 @@ module InventoryRefresh
105
105
  raise "Nested lazy_relation of #{inventory_collection} is too deep, left processing: #{hash}" if depth > 20
106
106
 
107
107
  hash.transform_values do |value|
108
- if value.kind_of?(Hash) && value['type'] == "InventoryRefresh::InventoryObjectLazy"
108
+ if value.kind_of?(Hash) && value['inventory_collection_name']
109
109
  hash_to_lazy_relation(value, available_inventory_collections, depth)
110
- elsif value.kind_of?(Array) && value.first.kind_of?(Hash) && value.first['type'] == "InventoryRefresh::InventoryObjectLazy"
110
+ elsif value.kind_of?(Array) && value.first.kind_of?(Hash) && value.first['inventory_collection_name']
111
111
  # TODO(lsmola) do we need to compact it sooner? What if first element is nil? On the other hand, we want to
112
112
  # deprecate this Vm HABTM assignment because it's not effective
113
113
  value.compact.map { |x| hash_to_lazy_relation(x, available_inventory_collections, depth) }
@@ -0,0 +1,19 @@
1
+ require "active_support/core_ext/module/delegation"
2
+
3
+ module InventoryRefresh
4
+ class InventoryCollection
5
+ class UnconnectedEdge
6
+ attr_reader :inventory_object, :inventory_object_key, :inventory_object_lazy
7
+
8
+ # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject that couldn't connect the relation
9
+ # @param inventory_object_key [String] Relation name that couldn't be connected
10
+ # @param inventory_object_lazy [InventoryRefresh::InventoryObjectLazy] The lazy relation that failed to load
11
+ # this can happen only for relations with key, or pointing to DB only relations
12
+ def initialize(inventory_object, inventory_object_key, inventory_object_lazy)
13
+ @inventory_object = inventory_object
14
+ @inventory_object_key = inventory_object_key
15
+ @inventory_object_lazy = inventory_object_lazy
16
+ end
17
+ end
18
+ end
19
+ end
@@ -25,8 +25,13 @@ module InventoryRefresh
25
25
  reference.stringified_reference
26
26
  end
27
27
 
28
+ # @return [Hash] hash reference having :manager_ref keys, which can uniquely identity entity under a manager
29
+ def uuid
30
+ reference.full_reference.slice(*reference.keys).stringify_keys!
31
+ end
32
+
28
33
  # @return [InventoryRefresh::InventoryObject] returns self
29
- def load
34
+ def load(*_args)
30
35
  self
31
36
  end
32
37
 
@@ -92,8 +97,9 @@ module InventoryRefresh
92
97
  #
93
98
  # @param inventory_collection_scope [InventoryRefresh::InventoryCollection] parent InventoryCollection object
94
99
  # @param all_attribute_keys [Array<Symbol>] Attribute keys we will modify based on object's data
100
+ # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject object owning these attributes
95
101
  # @return [Hash] Data in DB format
96
- def attributes_with_keys(inventory_collection_scope = nil, all_attribute_keys = [])
102
+ def attributes_with_keys(inventory_collection_scope = nil, all_attribute_keys = [], inventory_object = nil)
97
103
  # We should explicitly pass a scope, since the inventory_object can be mapped to more InventoryCollections with
98
104
  # different blacklist and whitelist. The generic code always passes a scope.
99
105
  inventory_collection_scope ||= inventory_collection
@@ -106,7 +112,7 @@ module InventoryRefresh
106
112
  elsif loadable?(value) || inventory_collection_scope.association_to_foreign_key_mapping[key]
107
113
  # Lets fill also the original data, so other InventoryObject referring to this attribute gets the right
108
114
  # result
109
- data[key] = value.load if value.respond_to?(:load)
115
+ data[key] = value.load(inventory_object, key) if value.respond_to?(:load)
110
116
  if (foreign_key = inventory_collection_scope.association_to_foreign_key_mapping[key])
111
117
  # We have an association to fill, lets fill also the :key, cause some other InventoryObject can refer to it
112
118
  record_id = data[key].try(:id)
@@ -143,12 +149,12 @@ module InventoryRefresh
143
149
  attributes.each do |k, v|
144
150
  # We don't want timestamps or resource versions to be overwritten here, since those are driving the conditions
145
151
  next if %i(resource_timestamps resource_timestamps_max resource_timestamp).include?(k)
146
- next if %i(resource_versions resource_versions_max resource_version).include?(k)
152
+ next if %i(resource_counters resource_counters_max resource_counter).include?(k)
147
153
 
148
154
  if data[:resource_timestamp] && attributes[:resource_timestamp]
149
155
  assign_only_newest(:resource_timestamp, :resource_timestamps, attributes, data, k, v)
150
- elsif data[:resource_version] && attributes[:resource_version]
151
- assign_only_newest(:resource_version, :resource_versions, attributes, data, k, v)
156
+ elsif data[:resource_counter] && attributes[:resource_counter]
157
+ assign_only_newest(:resource_counter, :resource_counters, attributes, data, k, v)
152
158
  else
153
159
  public_send("#{k}=", v)
154
160
  end
@@ -156,8 +162,8 @@ module InventoryRefresh
156
162
 
157
163
  if attributes[:resource_timestamp]
158
164
  assign_full_row_version_attr(:resource_timestamp, attributes, data)
159
- elsif attributes[:resource_version]
160
- assign_full_row_version_attr(:resource_version, attributes, data)
165
+ elsif attributes[:resource_counter]
166
+ assign_full_row_version_attr(:resource_counter, attributes, data)
161
167
  end
162
168
 
163
169
  self
@@ -206,9 +212,9 @@ module InventoryRefresh
206
212
  # newer than existing attribute.
207
213
  #
208
214
  # @param full_row_version_attr [Symbol] Attr name for full rows, allowed values are
209
- # [:resource_timestamp, :resource_version]
215
+ # [:resource_timestamp, :resource_counter]
210
216
  # @param partial_row_version_attr [Symbol] Attr name for partial rows, allowed values are
211
- # [:resource_timestamps, :resource_versions]
217
+ # [:resource_timestamps, :resource_counters]
212
218
  # @param attributes [Hash] New attributes we are assigning
213
219
  # @param data [Hash] Existing attributes of the InventoryObject
214
220
  # @param k [Symbol] Name of the attribute we are assigning
@@ -247,7 +253,7 @@ module InventoryRefresh
247
253
  # Assigns attribute representing version of the whole row
248
254
  #
249
255
  # @param full_row_version_attr [Symbol] Attr name for full rows, allowed values are
250
- # [:resource_timestamp, :resource_version]
256
+ # [:resource_timestamp, :resource_counter]
251
257
  # @param attributes [Hash] New attributes we are assigning
252
258
  # @param data [Hash] Existing attributes of the InventoryObject
253
259
  def assign_full_row_version_attr(full_row_version_attr, attributes, data)