Advertisement
Guest User

Untitled

a guest
Apr 9th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rails 2.31 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement