lib/looksist/hashed.rb in looksist-0.3.4 vs lib/looksist/hashed.rb in looksist-0.3.5

- old
+ new

@@ -59,15 +59,11 @@ entity_name = __entity__(opts[:bucket_name] || opts[:using]) values = Looksist.redis_service.send("#{entity_name}_for", keys) if opts[:populate].is_a? Array opts[:populate].each do |elt| value_hash = values.each_with_object([]) do |i, acc| - if i.nil? - acc << nil - else - acc << JSON.parse(i).deep_symbolize_keys[elt] - end + acc << JSON.parse(i || '{}').deep_symbolize_keys[elt] end alias_method = find_alias(opts[:as], elt) hash_offset[alias_method] = value_hash end else @@ -87,24 +83,56 @@ else inject_attributes_at(hash, opts) end.to_hash.deep_symbolize_keys else - inject_attributes_for(hash, opts) + inject_attributes_for_array(hash, opts) end end def inject_attributes_for(array_of_hashes, opts) entity_name = __entity__(opts[:bucket_name] || opts[:using]) keys = (array_of_hashes.collect { |i| i[opts[:using]] }).compact.uniq values = Hash[keys.zip(Looksist.redis_service.send("#{entity_name}_for", keys))] opts[:populate].is_a?(Array) ? composite_attribute_lookup(array_of_hashes, opts, values) : single_attribute_lookup(array_of_hashes, opts, values) end + def inject_attributes_for_array(array_of_hashes, opts) + entity_name = __entity__(opts[:bucket_name] || opts[:using]) + modified_array = if opts[:at].nil? + array_of_hashes.map(&:values) + else + json_path = JsonPath.new("#{opts[:at]}..#{opts[:using]}") + json_path.on(array_of_hashes.to_json) + end + keys = modified_array.flatten.compact.uniq + values = Hash[keys.zip(Looksist.redis_service.send("#{entity_name}_for", keys))] + opts[:populate].is_a?(Array) ? composite_attribute_lookup(array_of_hashes, opts, values) : single_attribute_lookup_for_array(array_of_hashes, opts, values) + end + def single_attribute_lookup(array_of_hashes, opts, values) array_of_hashes.each do |elt| alias_method = find_alias(opts[:as], opts[:populate]) elt[alias_method] = values[elt[opts[:using]]] + end + end + + def single_attribute_lookup_for_array(array_of_hashes, opts, values) + array_of_hashes.collect do |elt| + alias_method = find_alias(opts[:as], opts[:populate]) + if opts[:at].present? + JsonPath.for(elt.with_indifferent_access).gsub!(opts[:at]) do |node| + if node.is_a? Array + node.each { |x| x[alias_method] = values[x.with_indifferent_access[opts[:using]]] } + else + node[alias_method] = values[node.with_indifferent_access[opts[:using]]] + end + node + end.to_hash.deep_symbolize_keys + else + elt[alias_method] = values[elt[opts[:using]]] + elt + end end end def composite_attribute_lookup(array_of_hashes, opts, values) array_of_hashes.each do |elt|