SHARE
TWEET

Untitled

a guest Apr 9th, 2019 107 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Products
  2.   module Elasticsearch
  3.     module Finders
  4.       class FindAllQueryBuildService
  5.  
  6.         MULTI_LEVEL_QUERY_MAP = {
  7.             size: ['variants.variant_options', 'value'],
  8.             color: ['variants.variant_options', 'value']
  9.         }
  10.  
  11.         def initialize(query)
  12.           if query.present?
  13.             @keyword = query.delete('keyword')
  14.             @prices = query.delete('price')
  15.             @multi_level_query = multi_level_query_data(query)
  16.             @sale = shift(query, 'sale', 'variants')
  17.             @filter = query
  18.           end
  19.         end
  20.  
  21.         def call
  22.           create_query
  23.         end
  24.  
  25.         private
  26.  
  27.         def create_query
  28.           {
  29.               bool: {
  30.                   should: [
  31.                       multi_match_query,
  32.                       flat_filter_query,
  33.                       sale_filter_query,
  34.                       price_range_query,
  35.                       *multi_level_query
  36.                   ].compact
  37.               },
  38.           }.keep_if{ |k, _| k }
  39.         end
  40.  
  41.         def price_range_query
  42.           Filters::CreatePriceRangeFilterService.new(@prices).call
  43.         end
  44.  
  45.         def multi_match_query
  46.           Filters::CreateQueryFilterService.new(@keyword).call
  47.         end
  48.  
  49.         def flat_filter_query
  50.           Filters::CreateFlatFilterService.new(@filter).call
  51.         end
  52.  
  53.         def sale_filter_query
  54.           Filters::CreateFlatFilterService.new(@sale, 'sale_display').call
  55.         end
  56.  
  57.         def multi_level_query
  58.           @multi_level_query.map do |hash|
  59.             Filters::CreateMultiLevelFilterService.new(hash).call
  60.           end if @multi_level_query.present?
  61.         end
  62.  
  63.         private
  64.  
  65.         def shift hash, key, path=nil
  66.           path = key if path.nil?
  67.           val = hash.delete(key)
  68.           {
  69.               "#{path}" => val
  70.           } unless val.nil?
  71.         end
  72.  
  73.         def multi_level_query_data(query)
  74.           arr = []
  75.           MULTI_LEVEL_QUERY_MAP.each do |key, val|
  76.             if query[key].present?
  77.               arr.push({
  78.                   path: val[0],
  79.                   query_val: query.delete(key),
  80.                   query_field: val[1]
  81.                 }
  82.               )
  83.             end
  84.           end
  85.           arr
  86.         end
  87.  
  88.       end
  89.     end
  90.   end
  91. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top