elastic_queue 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fdf43269d558684715697697975c108d4d11f31d
4
- data.tar.gz: 43ce25310c882bee9ac73d5bf978c0f3657b2679
3
+ metadata.gz: 874af79f54d54bd97ed1bc58b7f3c45a66c8d915
4
+ data.tar.gz: 99fea70408e60937b93936fdf7512cbcc64a33dd
5
5
  SHA512:
6
- metadata.gz: 7ec73971d3c7452b12a21c0bdde935f52f78e0f5bf93265edd15b1be0bcb3c8a0291d40236a604e3b09aa49db2cd60eda5b51e865b6a9618dd22d6de9176e639
7
- data.tar.gz: e568ab3b5c296b870fe5f7cb47b813169ef25eba80d91d10cc66d16c9b1ad1d70aac50346ee72dd98696c91c4ebcac3f7ed8629ecc0015548975a4a7ebb7d1f6
6
+ metadata.gz: bee5165a495abd8785135c1eb8c45ad5d02ee9057183ce47db064582b38c7a9063a042aef642e3347f5dce6c02444fc593b0a50b0b6bf70275e9ee856a8de713
7
+ data.tar.gz: f754e63c2d2759ef31817a142ff33dc8c883a919aec2bd80980fbfe355f04ddb2ec449c202b208b97ef60ef0f10f39ae16001c3a4fa173fdf1bb543a4266493e
@@ -17,13 +17,17 @@ module ElasticQueue
17
17
  elsif value.is_a? Hash
18
18
  # date?
19
19
  time_filter(key, value)
20
+ elsif value.nil?
21
+ null_filter(key, value)
20
22
  else
21
23
  term_filter(key, value)
22
24
  end
23
25
  end
24
26
 
25
27
  def or_filter(term, values)
26
- { or: values.map { |v| term_filter(term, v) } }
28
+ # flatten here because ranges return arrays
29
+ conditions = values.map { |v| option_to_filter(term, v) }.flatten
30
+ { or: conditions }
27
31
  end
28
32
 
29
33
  def term_filter(term, value)
@@ -42,5 +46,10 @@ module ElasticQueue
42
46
  def range_filter(term, value, comparator)
43
47
  { range: { term => { comparator => value } } }
44
48
  end
49
+
50
+ def null_filter(term, value)
51
+ { missing: { field: term, existence: true, null_value: true } }
52
+ end
53
+
45
54
  end
46
55
  end
@@ -5,13 +5,13 @@ module ElasticQueue
5
5
  module ClassMethods
6
6
  def percolator_queries
7
7
  queries = {}
8
- search = search_client.search index: '_percolator', body: { 'query' => { 'match_all' => {} } }, size: 1000
9
- search['hits']['hits'].each { |hit| queries[hit['_id']] = hit['_source'] }
8
+ search = search_client.search index: '_percolator', body: { query: { match_all: {} } }, size: 1000
9
+ search['hits']['hits'].each { |hit| queries[hit['_id']] = hit['_source'] }
10
10
  queries
11
11
  end
12
12
 
13
13
  def reverse_search(model)
14
- percolation = search_client.percolate index: index_name, body: { 'doc' => model.indexed_for_queue }
14
+ percolation = search_client.percolate index: index_name, body: { doc: model.indexed_for_queue }
15
15
  percolation['matches']
16
16
  end
17
17
 
@@ -22,14 +22,20 @@ module ElasticQueue
22
22
  def register_percolator_query(name, body)
23
23
  search_client.index index: '_percolator', type: index_name, id: name, body: body
24
24
  end
25
+
26
+ def dynamically_percolate(model, percolator_body)
27
+ search_id = SecureRandom.uuid
28
+ # create a dynamic percolator with the query params, index our model in it and see if there are any matches
29
+ search_client.index index: '_percolator', type: 'dynamic_percolator', id: search_id, body: percolator_body, refresh: true
30
+ search = search_client.percolate index: 'dynamic_percolator', body: { doc: model.indexed_for_queue, query: { term: { _id: search_id } } }
31
+ search_client.delete index: '_percolator', type: 'dynamic_percolator', id: search_id
32
+ search
33
+ end
34
+
25
35
  end
26
36
 
27
37
  def in_queue?(model)
28
- return false unless self.class.model_names.include?(model.class.to_s.underscore.to_sym)
29
- search_id = SecureRandom.uuid
30
- self.class.search_client.index index: '_percolator', type: 'dynamic_percolator', id: search_id, body: @query.percolator_body, refresh: true
31
- search = self.class.search_client.percolate index: 'dynamic_percolator', body: { 'doc' => model.indexed_for_queue, 'query' => { 'term' => { '_id' => search_id } } }
32
- self.class.search_client.delete index: '_percolator', type: 'dynamic_percolator', id: search_id
38
+ search = self.class.dynamically_percolate(model, @query.percolator_body)
33
39
  search['matches'].length == 1
34
40
  end
35
41
 
@@ -26,6 +26,15 @@ module ElasticQueue
26
26
  @options.sorts
27
27
  end
28
28
 
29
+ def search(string)
30
+ @options.add_search(string)
31
+ self
32
+ end
33
+
34
+ def searches
35
+ @options.search
36
+ end
37
+
29
38
  def body
30
39
  @options.body
31
40
  end
@@ -47,23 +56,41 @@ module ElasticQueue
47
56
  @results ||= Results.new(@queue, execute, @options)
48
57
  end
49
58
 
59
+ # return just the ids of the records (useful when combined with SQL queries)
60
+ def ids
61
+ results = execute
62
+ results[:hits][:hits].map { |h| h[:_source][:id] }
63
+ end
64
+
50
65
  def count
51
66
  res = execute(count: true)
52
67
  res[:hits][:total].to_i
53
68
  end
54
69
 
55
70
  def execute(count: false)
56
- search_type = count ? 'count' : 'query_then_fetch'
57
71
  begin
58
- search = @queue.search_client.search index: @queue.index_name, body: body, search_type: search_type, from: @options.from, size: @options.per_page
59
- # search[:page] = @page
60
- # search = substitute_page(opts, search) if !count && opts[:page_substitution_ok] && search['hits']['hits'].length == 0 && search['hits']['total'] != 0
72
+ search = execute_query(count: false)
73
+ search = substitute_page(search) if !count && search['hits']['hits'].length == 0 && search['hits']['total'] != 0
61
74
  rescue Elasticsearch::Transport::Transport::Errors::BadRequest
62
75
  search = failed_search
63
76
  end
64
77
  search.with_indifferent_access
65
78
  end
66
79
 
80
+ private
81
+
82
+ def execute_query(count: false)
83
+ search_type = count ? 'count' : 'query_then_fetch'
84
+ @queue.search_client.search index: @queue.index_name, body: body, search_type: search_type, from: @options.from, size: @options.per_page
85
+ end
86
+
87
+ def substitute_page(search)
88
+ total_hits = search['hits']['total'].to_i
89
+ per_page = @options.per_page
90
+ @options.page = (total_hits / per_page.to_f).ceil
91
+ execute_query
92
+ end
93
+
67
94
  def failed_search
68
95
  { page: 0, hits: { hits: [], total: 0 } }
69
96
  end
@@ -6,7 +6,7 @@ module ElasticQueue
6
6
  include Filters
7
7
  include Sorts
8
8
 
9
- attr_reader :filters, :sorts, :page
9
+ attr_reader :filters, :sorts, :page, :search
10
10
  attr_accessor :per_page
11
11
 
12
12
  def initialize(options = {})
@@ -25,6 +25,10 @@ module ElasticQueue
25
25
  @sorts += options_to_sorts(options)
26
26
  end
27
27
 
28
+ def add_search(string)
29
+ @search = string
30
+ end
31
+
28
32
  def from
29
33
  (page - 1) * per_page
30
34
  end
@@ -37,13 +41,14 @@ module ElasticQueue
37
41
  b = {}
38
42
  b[:filter] = @filters unless @filters[:and].blank?
39
43
  b[:sort] = @sorts unless @sorts.blank?
44
+ b[:query] = { query_string: { query: @search } } unless @search.blank?
40
45
  b
41
46
  end
42
47
 
43
48
  def percolator_body
44
49
  b = {}
45
50
  b[:filter] = @filters unless @filters[:and].blank?
46
- { 'query' => { 'constant_score' => b } }
51
+ { query: { constant_score: b } }
47
52
  end
48
53
  end
49
54
  end
@@ -5,6 +5,7 @@ module ElasticQueue
5
5
  attr_reader :paginate
6
6
 
7
7
  delegate :empty?, :each, :total_entries, :total_pages, :current_page, to: :paginate
8
+
8
9
  def initialize(queue, search_results, query_options)
9
10
  @queue = queue
10
11
  @instantiated_queue_items = instantiate_queue_items(search_results)
@@ -1,3 +1,3 @@
1
1
  module ElasticQueue
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruth Thompson
@@ -135,7 +135,6 @@ files:
135
135
  - lib/elastic_queue/query_options.rb
136
136
  - lib/elastic_queue/queueable.rb
137
137
  - lib/elastic_queue/results.rb
138
- - lib/elastic_queue/search.rb
139
138
  - lib/elastic_queue/sorts.rb
140
139
  - lib/elastic_queue/version.rb
141
140
  - spec/factories.rb
@@ -1,5 +0,0 @@
1
- module ElasticQueue
2
- class Search
3
- # TODO
4
- end
5
- end