Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Products
- module Elasticsearch
- module Finders
- class FindAllQueryBuildService
- MULTI_LEVEL_QUERY_MAP = {
- size: ['variants.variant_options', 'value'],
- color: ['variants.variant_options', 'value']
- }
- def initialize(query)
- if query.present?
- @keyword = query.delete('keyword')
- @prices = query.delete('price')
- @multi_level_query = multi_level_query_data(query)
- @sale = shift(query, 'sale', 'variants')
- @filter = query
- end
- end
- def call
- create_query
- end
- private
- def create_query
- {
- bool: {
- should: [
- multi_match_query,
- flat_filter_query,
- sale_filter_query,
- price_range_query,
- *multi_level_query
- ].compact
- },
- }.keep_if{ |k, _| k }
- end
- def price_range_query
- Filters::CreatePriceRangeFilterService.new(@prices).call
- end
- def multi_match_query
- Filters::CreateQueryFilterService.new(@keyword).call
- end
- def flat_filter_query
- Filters::CreateFlatFilterService.new(@filter).call
- end
- def sale_filter_query
- Filters::CreateFlatFilterService.new(@sale, 'sale_display').call
- end
- def multi_level_query
- @multi_level_query.map do |hash|
- Filters::CreateMultiLevelFilterService.new(hash).call
- end if @multi_level_query.present?
- end
- private
- def shift hash, key, path=nil
- path = key if path.nil?
- val = hash.delete(key)
- {
- "#{path}" => val
- } unless val.nil?
- end
- def multi_level_query_data(query)
- arr = []
- MULTI_LEVEL_QUERY_MAP.each do |key, val|
- if query[key].present?
- arr.push({
- path: val[0],
- query_val: query.delete(key),
- query_field: val[1]
- }
- )
- end
- end
- arr
- end
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement