From 00f767ba8c39b9a78e067b9c77c95094775393da Mon Sep 17 00:00:00 2001 From: Lamont Granquist Date: Thu, 18 Feb 2016 16:05:29 -0800 Subject: more array perf tweaks --- lib/chef/node/attribute_cell.rb | 46 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/chef/node/attribute_cell.rb b/lib/chef/node/attribute_cell.rb index c43fc49e36..44c518ada3 100644 --- a/lib/chef/node/attribute_cell.rb +++ b/lib/chef/node/attribute_cell.rb @@ -273,7 +273,7 @@ class Chef def merged_array_key(key) # this is much faster than merged_array[key] - automatic_array_key(key) || override_array[key] || normal_array_key(key) || default_array[key] + automatic_array_key(key) || override_array_key(key) || normal_array_key(key) || default_array_key(key) end def merged_hash_key(key) @@ -343,6 +343,27 @@ class Chef default_array end + def default_array_key(key) + return nil unless DEFAULT_COMPONENTS_AS_SYMBOLS.any? do |component| + send(component).is_a?(Array) + end + # this is a one level deep deep_merge + default_array = [] + DEFAULT_COMPONENTS_AS_SYMBOLS.each do |component| + array = instance_variable_get(:"@#{component}") + next unless array.is_a?(Array) + default_array += array + end + value = default_array[key] + if value.is_a?(Hash) || value.is_a?(Array) + cell = self.class.allocate + cell.instance_variable_set(:@default, value) # XXX? set to default since we forgot where it came from + cell + else + value + end + end + def normal_array return nil unless @normal.is_a?(Array) @normal.map do |value| @@ -357,6 +378,7 @@ class Chef end def normal_array_key(key) + return nil unless @normal.is_a?(Array) value = @normal[key] if value.is_a?(Hash) || value.is_a?(Array) cell = self.class.allocate @@ -389,6 +411,27 @@ class Chef override_array end + def override_array_key(key) + return nil unless OVERRIDE_COMPONENTS_AS_SYMBOLS.any? do |component| + send(component).is_a?(Array) + end + # this is a one level deep deep_merge + override_array = [] + OVERRIDE_COMPONENTS_AS_SYMBOLS.each do |component| + array = instance_variable_get(:"@#{component}") + next unless array.is_a?(Array) + override_array += array + end + value = override_array[key] + if value.is_a?(Hash) || value.is_a?(Array) + cell = self.class.allocate + cell.instance_variable_set(:@override, value) # XXX? set to override since we forgot where it came from + cell + else + value + end + end + def automatic_array return nil unless @automatic.is_a?(Array) @automatic.map do |value| @@ -403,6 +446,7 @@ class Chef end def automatic_array_key(key) + return nil unless @automatic.is_a?(Array) value = @automatic[key] if value.is_a?(Hash) || value.is_a?(Array) cell = self.class.allocate -- cgit v1.2.1