Class: Elasticated::Query

Inherits:
Object
  • Object
show all
Includes:
Mixins::BlockEvaluation, Mixins::Clonable, Mixins::Inspectionable
Defined in:
lib/elasticated/query.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixins::Inspectionable

#inspect, #text_for_inspect

Methods included from Mixins::BlockEvaluation

#evaluate

Methods included from Mixins::Clonable

#==, #clone

Constructor Details

#initializeQuery

Returns a new instance of Query.



20
21
22
23
24
25
# File 'lib/elasticated/query.rb', line 20

def initialize
  self._conditions = QueryConditions.new
  self._filter_conditions = QueryConditions.new
  self._post_conditions = QueryConditions.new
  self._aggregations = QueryAggregations.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)



176
177
178
179
180
181
182
183
184
# File 'lib/elasticated/query.rb', line 176

def method_missing(name, *args, &block)
  # delegates any "filter_*" method missing to the _filter_conditions object
  # delegates any other method missing to the _conditions object
  conditions_obj = name.to_s.start_with?('filter_') ? _filter_conditions : _conditions
  real_method_name = name.to_s.gsub(/^filter\_/, '').to_sym
  super unless conditions_obj.respond_to? real_method_name
  conditions_obj.send real_method_name, *args, &block
  self
end

Instance Attribute Details

#_aggregationsObject

Returns the value of attribute _aggregations.



18
19
20
# File 'lib/elasticated/query.rb', line 18

def _aggregations
  @_aggregations
end

#_conditionsObject

Returns the value of attribute _conditions.



16
17
18
# File 'lib/elasticated/query.rb', line 16

def _conditions
  @_conditions
end

#_filter_conditionsObject

Returns the value of attribute _filter_conditions.



16
17
18
# File 'lib/elasticated/query.rb', line 16

def _filter_conditions
  @_filter_conditions
end

#_fromObject

Returns the value of attribute _from.



17
18
19
# File 'lib/elasticated/query.rb', line 17

def _from
  @_from
end

#_post_conditionsObject

Returns the value of attribute _post_conditions.



16
17
18
# File 'lib/elasticated/query.rb', line 16

def _post_conditions
  @_post_conditions
end

#_sizeObject

Returns the value of attribute _size.



17
18
19
# File 'lib/elasticated/query.rb', line 17

def _size
  @_size
end

#_sortObject

Returns the value of attribute _sort.



17
18
19
# File 'lib/elasticated/query.rb', line 17

def _sort
  @_sort
end

#_sourceObject

Returns the value of attribute _source.



17
18
19
# File 'lib/elasticated/query.rb', line 17

def _source
  @_source
end

Class Method Details

.build(&block) ⇒ Object



5
6
7
8
9
# File 'lib/elasticated/query.rb', line 5

def build(&block)
  q = new
  q.evaluate block
  q
end

Instance Method Details

#aggregated?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/elasticated/query.rb', line 115

def aggregated?
  !_aggregations.empty?
end

#aggregations(&block) ⇒ Object Also known as: aggs



91
92
93
94
# File 'lib/elasticated/query.rb', line 91

def aggregations(&block)
  _aggregations.evaluate block
  self
end

#build_for_aggregated_searchObject Also known as: build, to_h



151
152
153
154
155
# File 'lib/elasticated/query.rb', line 151

def build_for_aggregated_search
  ret = build_for_search
  ret.merge! aggs: _aggregations.build unless _aggregations.empty?
  ret
end

#build_for_aggregationsObject



128
129
130
131
132
133
134
# File 'lib/elasticated/query.rb', line 128

def build_for_aggregations
  raise "No aggregations present in query" unless aggregated?
  ret = build_for_count
  ret.merge! size: 0
  ret.merge! aggs: _aggregations.build
  ret
end

#build_for_countObject

to_hash methods



121
122
123
124
125
126
# File 'lib/elasticated/query.rb', line 121

def build_for_count
  return { query: _conditions.build } if _filter_conditions.empty?
  filtered = { filter: _filter_conditions.build }
  filtered.merge!(query: _conditions.build) unless _conditions.empty?
  { query: { filtered: filtered } }
end

#build_for_searchObject



145
146
147
148
149
# File 'lib/elasticated/query.rb', line 145

def build_for_search
  ret = build_for_count.merge build_for_top_hits
  ret.merge! post_filter: _post_conditions.build unless _post_conditions.empty?
  ret
end

#build_for_top_hitsObject



136
137
138
139
140
141
142
143
# File 'lib/elasticated/query.rb', line 136

def build_for_top_hits
  ret = Hash.new
  ret.merge! sort: _sort if _sort
  ret.merge! size: _size if _size
  ret.merge! from: _from if _from
  ret.merge! _source: _source unless _source.nil? # source can be false
  ret
end

#conditions(&block) ⇒ Object

builders & attrs



29
30
31
32
# File 'lib/elasticated/query.rb', line 29

def conditions(&block)
  _conditions.evaluate block
  self
end

#custom_sort(custom_hash) ⇒ Object



57
58
59
60
61
# File 'lib/elasticated/query.rb', line 57

def custom_sort(custom_hash)
  self._sort ||= Array.new
  _sort << custom_hash
  self
end

#fill_delimiter(field_delimiter) ⇒ Object

delimiters



167
168
169
170
# File 'lib/elasticated/query.rb', line 167

def fill_delimiter(field_delimiter)
  _conditions.fill_delimiter field_delimiter
  _filter_conditions.fill_delimiter field_delimiter
end

#filter(&block) ⇒ Object



34
35
36
37
# File 'lib/elasticated/query.rb', line 34

def filter(&block)
  _filter_conditions.evaluate block
  self
end

#from(value) ⇒ Object Also known as: offset



51
52
53
54
# File 'lib/elasticated/query.rb', line 51

def from(value)
  self._from = value
  self
end

#heavy_for?(repository) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/elasticated/query.rb', line 103

def heavy_for?(repository)
  !_size || _size > repository.search_page_size
end

#limited?Boolean

misc getters

Returns:

  • (Boolean)


99
100
101
# File 'lib/elasticated/query.rb', line 99

def limited?
  !!_size
end

#no_sourceObject



86
87
88
89
# File 'lib/elasticated/query.rb', line 86

def no_source
  self._source = false
  self
end

#offset?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/elasticated/query.rb', line 107

def offset?
  _from && _from > 0
end

#parse_aggregations(response) ⇒ Object

parse methods



161
162
163
# File 'lib/elasticated/query.rb', line 161

def parse_aggregations(response)
  _aggregations.parse response
end

#post(&block) ⇒ Object Also known as: post_filter



39
40
41
42
# File 'lib/elasticated/query.rb', line 39

def post(&block)
  _post_conditions.evaluate block
  self
end

#size(value) ⇒ Object Also known as: limit



45
46
47
48
# File 'lib/elasticated/query.rb', line 45

def size(value)
  self._size = value
  self
end

#sort(field, method = nil) ⇒ Object Also known as: sort_by_field



63
64
65
# File 'lib/elasticated/query.rb', line 63

def sort(field, method=nil)
  custom_sort(field => { order: method || :asc })
end

#sort_by_script(script_hash) ⇒ Object



68
69
70
# File 'lib/elasticated/query.rb', line 68

def sort_by_script(script_hash)
  custom_sort(_script: script_hash)
end

#sort_randomlyObject



72
73
74
# File 'lib/elasticated/query.rb', line 72

def sort_randomly
  sort_by_script(script: "Math.random()", type: "number")
end

#sorted?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/elasticated/query.rb', line 111

def sorted?
  !!_sort
end

#source(*fields_array) ⇒ Object Also known as: fields



76
77
78
79
80
81
82
83
# File 'lib/elasticated/query.rb', line 76

def source(*fields_array)
  if fields_array.count == 1 && fields_array.first == false
    no_source
  else
    self._source = fields_array.flatten
  end
  self
end