Class: Elastify::Helpers::QueryBuilder
- Inherits:
-
Object
- Object
- Elastify::Helpers::QueryBuilder
- Defined in:
- lib/elastify/helpers/query_builder.rb
Instance Attribute Summary collapse
-
#filters ⇒ Object
Returns the value of attribute filters.
-
#queries ⇒ Object
Returns the value of attribute queries.
-
#scroll_size(size) ⇒ Object
Returns the value of attribute scroll_size.
-
#scroll_timeout(timeout) ⇒ Object
Returns the value of attribute scroll_timeout.
-
#sort(field, direction) ⇒ Object
Returns the value of attribute sort.
Instance Method Summary collapse
- #filter(*args) ⇒ Object
-
#initialize(scroll_size: 15, scroll_timeout: '1m') ⇒ QueryBuilder
constructor
A new instance of QueryBuilder.
- #must_filter(fields, field_rules) ⇒ Object
- #scroll(scroll_size, scroll_timeout) ⇒ Object
- #search_term(fields, term) ⇒ Object
- #should_filter(fields, field_rules) ⇒ Object
- #to_dsl ⇒ Object
Constructor Details
#initialize(scroll_size: 15, scroll_timeout: '1m') ⇒ QueryBuilder
Returns a new instance of QueryBuilder.
7 8 9 10 11 12 13 |
# File 'lib/elastify/helpers/query_builder.rb', line 7 def initialize(scroll_size: 15, scroll_timeout: '1m') @queries = [] @filters = [] @sort = {} @scroll_size = scroll_size @scroll_timeout = scroll_timeout end |
Instance Attribute Details
#filters ⇒ Object
Returns the value of attribute filters.
5 6 7 |
# File 'lib/elastify/helpers/query_builder.rb', line 5 def filters @filters end |
#queries ⇒ Object
Returns the value of attribute queries.
5 6 7 |
# File 'lib/elastify/helpers/query_builder.rb', line 5 def queries @queries end |
#scroll_size(size) ⇒ Object
Returns the value of attribute scroll_size.
5 6 7 |
# File 'lib/elastify/helpers/query_builder.rb', line 5 def scroll_size @scroll_size end |
#scroll_timeout(timeout) ⇒ Object
Returns the value of attribute scroll_timeout.
5 6 7 |
# File 'lib/elastify/helpers/query_builder.rb', line 5 def scroll_timeout @scroll_timeout end |
#sort(field, direction) ⇒ Object
Returns the value of attribute sort.
5 6 7 |
# File 'lib/elastify/helpers/query_builder.rb', line 5 def sort @sort end |
Instance Method Details
#filter(*args) ⇒ Object
19 20 21 |
# File 'lib/elastify/helpers/query_builder.rb', line 19 def filter(*args) must_filter(*args) end |
#must_filter(fields, field_rules) ⇒ Object
23 24 25 |
# File 'lib/elastify/helpers/query_builder.rb', line 23 def must_filter(fields, field_rules) @filters << { type: :must, field_rules: field_rules, fields: fields.instance_of?(Array) ? fields : [fields] } end |
#scroll(scroll_size, scroll_timeout) ⇒ Object
35 36 37 38 |
# File 'lib/elastify/helpers/query_builder.rb', line 35 def scroll(scroll_size, scroll_timeout) @scroll_size = scroll_size @scroll_timeout = scroll_timeout end |
#search_term(fields, term) ⇒ Object
15 16 17 |
# File 'lib/elastify/helpers/query_builder.rb', line 15 def search_term(fields, term) @queries << { term: term, fields: fields.instance_of?(Array) ? fields : [fields] } end |
#should_filter(fields, field_rules) ⇒ Object
27 28 29 |
# File 'lib/elastify/helpers/query_builder.rb', line 27 def should_filter(fields, field_rules) @filters << { type: :should, field_rules: field_rules, fields: fields.instance_of?(Array) ? fields : [fields] } end |
#to_dsl ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/elastify/helpers/query_builder.rb', line 48 def to_dsl max_scroll_size = 100; @scroll_size ||= 15 @scroll_size = @scroll_size.to_i <= max_scroll_size ? @scroll_size : max_scroll_size if @sort.blank? @sort = @queries.blank? ? { id: { order: :desc } } : { _score: { order: :desc } } end dsl = { sort: @sort, size: @scroll_size, query: {} } if @queries.blank? and @filters.blank? dsl[:query][:match_all] = {} return dsl end dsl[:query] = { bool: { must: [], must_not: [], should: [] } } if @queries.present? dsl[:query][:bool][:must] += @queries.map do |query| { multi_match: { query: "#{query[:term].sanitize}", fields: query[:fields], operator: :and } } end end if @filters.present? @filters.select { |filter| filter[:type].equal?(:must) }.each do |filter| filter[:fields].each do |field| dsl[:query][:bool][:must] += map_has(field, filter[:field_rules][:has]) if filter[:field_rules][:has].present? dsl[:query][:bool][:must] << map_in(field, filter[:field_rules][:in]) if filter[:field_rules][:in].present? dsl[:query][:bool][:must_not] << map_in(field, filter[:field_rules][:not_in]) if filter[:field_rules][:not_in].present? dsl[:query][:bool][:must] << map_range(field, filter[:field_rules][:range]) if filter[:field_rules][:range].present? end end @filters.select { |filter| filter[:type].equal?(:should) }.each do |filter| filter[:fields].each_with_index do |field, index| dsl[:query][:bool][:should][index] ||= { bool: { must: [], must_not: [] } } dsl[:query][:bool][:should][index][:bool][:must] += map_has(field, filter[:field_rules][:has]) if filter[:field_rules][:has].present? dsl[:query][:bool][:should][index][:bool][:must] << map_in(field, filter[:field_rules][:in]) if filter[:field_rules][:in].present? dsl[:query][:bool][:should][index][:bool][:must_not] << map_in(field, filter[:field_rules][:not_in]) if filter[:field_rules][:not_in].present? dsl[:query][:bool][:should][index][:bool][:must] << map_range(field, filter[:field_rules][:range]) if filter[:field_rules][:range].present? end end dsl[:query][:bool][:minimum_number_should_match] = 1 if dsl[:query][:bool][:should].present? end return dsl end |