elastic_queue 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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