elastic_queue 0.0.2 → 0.0.3
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 +4 -4
- data/lib/elastic_queue/base.rb +3 -3
- data/lib/elastic_queue/filters.rb +0 -1
- data/lib/elastic_queue/percolation.rb +30 -32
- data/lib/elastic_queue/persistence.rb +0 -3
- data/lib/elastic_queue/query.rb +13 -4
- data/lib/elastic_queue/query_options.rb +6 -5
- data/lib/elastic_queue/queueable.rb +1 -4
- data/lib/elastic_queue/results.rb +3 -9
- data/lib/elastic_queue/sorts.rb +0 -4
- data/lib/elastic_queue/version.rb +1 -1
- metadata +21 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdf43269d558684715697697975c108d4d11f31d
|
4
|
+
data.tar.gz: 43ce25310c882bee9ac73d5bf978c0f3657b2679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ec73971d3c7452b12a21c0bdde935f52f78e0f5bf93265edd15b1be0bcb3c8a0291d40236a604e3b09aa49db2cd60eda5b51e865b6a9618dd22d6de9176e639
|
7
|
+
data.tar.gz: e568ab3b5c296b870fe5f7cb47b813169ef25eba80d91d10cc66d16c9b1ad1d70aac50346ee72dd98696c91c4ebcac3f7ed8629ecc0015548975a4a7ebb7d1f6
|
data/lib/elastic_queue/base.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'elasticsearch'
|
2
2
|
require 'elastic_queue/persistence'
|
3
|
+
require 'elastic_queue/percolation'
|
3
4
|
require 'elastic_queue/query'
|
4
5
|
|
5
6
|
module ElasticQueue
|
6
7
|
class Base
|
7
8
|
include Persistence
|
8
|
-
|
9
|
+
include Percolation
|
9
10
|
|
10
11
|
def self.search_client
|
11
12
|
Elasticsearch::Client.new
|
@@ -16,7 +17,7 @@ module ElasticQueue
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def self.model_names
|
19
|
-
|
20
|
+
fail NotImplementedError, "No models defined in #{self.class}" unless defined?(@models)
|
20
21
|
@models
|
21
22
|
end
|
22
23
|
|
@@ -47,6 +48,5 @@ module ElasticQueue
|
|
47
48
|
def self.count
|
48
49
|
query.count
|
49
50
|
end
|
50
|
-
|
51
51
|
end
|
52
52
|
end
|
@@ -3,40 +3,38 @@ module ElasticQueue
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
module ClassMethods
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
def percolator_queries
|
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'] }
|
10
|
+
queries
|
11
|
+
end
|
12
|
+
|
13
|
+
def reverse_search(model)
|
14
|
+
percolation = search_client.percolate index: index_name, body: { 'doc' => model.indexed_for_queue }
|
15
|
+
percolation['matches']
|
16
|
+
end
|
17
|
+
|
18
|
+
def unregister_percolator_query(name)
|
19
|
+
search_client.delete index: '_percolator', type: index_name, id: name
|
20
|
+
end
|
21
|
+
|
22
|
+
def register_percolator_query(name, body)
|
23
|
+
search_client.index index: '_percolator', type: index_name, id: name, body: body
|
24
|
+
end
|
16
25
|
end
|
17
26
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
# def unregister_percolator_query(name)
|
28
|
-
# SEARCH_CLIENT.delete index: '_percolator', type: index_name, id: name
|
29
|
-
# end
|
30
|
-
|
31
|
-
# def model_in_queue?(model, queue_opts)
|
32
|
-
# return false unless model_names.include?(model.class.to_s.underscore.to_sym)
|
33
|
-
# search_id = SecureRandom.uuid
|
34
|
-
# body = { 'doc' => model.indexed_for_queue, 'query' => {'term' => {'_id' => search_id}} }
|
35
|
-
# SEARCH_CLIENT.index index: '_percolator', type: 'dynamic_percolator', id: search_id, body: translate_opts_to_query_for_percolator(queue_opts), refresh: true
|
36
|
-
# search = SEARCH_CLIENT.percolate index: 'dynamic_percolator', body: body.to_json
|
37
|
-
# SEARCH_CLIENT.delete index: '_percolator', type: 'dynamic_percolator', id: search_id
|
38
|
-
# search['matches'].length == 1
|
39
|
-
# end
|
27
|
+
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
|
33
|
+
search['matches'].length == 1
|
34
|
+
end
|
40
35
|
|
36
|
+
def register_as_percolator_query(name)
|
37
|
+
self.class.register_percolator_query(name, @query.percolator_body)
|
38
|
+
end
|
41
39
|
end
|
42
40
|
end
|
@@ -3,7 +3,6 @@ module ElasticQueue
|
|
3
3
|
module Persistence
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
module ClassMethods
|
6
|
-
|
7
6
|
def index_exists?
|
8
7
|
search_client.indices.exists index: index_name
|
9
8
|
end
|
@@ -61,8 +60,6 @@ module ElasticQueue
|
|
61
60
|
def remove_model(instance)
|
62
61
|
search_client.delete index: index_name, id: instance.id, type: instance.class.to_s.underscore
|
63
62
|
end
|
64
|
-
|
65
63
|
end
|
66
|
-
|
67
64
|
end
|
68
65
|
end
|
data/lib/elastic_queue/query.rb
CHANGED
@@ -3,7 +3,6 @@ require 'elastic_queue/results'
|
|
3
3
|
|
4
4
|
module ElasticQueue
|
5
5
|
class Query
|
6
|
-
|
7
6
|
def initialize(queue, options = {})
|
8
7
|
@queue = queue
|
9
8
|
@options = QueryOptions.new(options)
|
@@ -27,11 +26,23 @@ module ElasticQueue
|
|
27
26
|
@options.sorts
|
28
27
|
end
|
29
28
|
|
29
|
+
def body
|
30
|
+
@options.body
|
31
|
+
end
|
32
|
+
|
33
|
+
def percolator_body
|
34
|
+
@options.percolator_body
|
35
|
+
end
|
36
|
+
|
30
37
|
def paginate(options = {})
|
31
38
|
options.each { |k, v| @options.send("#{k}=", v) }
|
32
39
|
all.paginate
|
33
40
|
end
|
34
41
|
|
42
|
+
def page=(page)
|
43
|
+
@options.page = (page)
|
44
|
+
end
|
45
|
+
|
35
46
|
def all
|
36
47
|
@results ||= Results.new(@queue, execute, @options)
|
37
48
|
end
|
@@ -44,7 +55,7 @@ module ElasticQueue
|
|
44
55
|
def execute(count: false)
|
45
56
|
search_type = count ? 'count' : 'query_then_fetch'
|
46
57
|
begin
|
47
|
-
search = @queue.search_client.search index: @queue.index_name, body:
|
58
|
+
search = @queue.search_client.search index: @queue.index_name, body: body, search_type: search_type, from: @options.from, size: @options.per_page
|
48
59
|
# search[:page] = @page
|
49
60
|
# search = substitute_page(opts, search) if !count && opts[:page_substitution_ok] && search['hits']['hits'].length == 0 && search['hits']['total'] != 0
|
50
61
|
rescue Elasticsearch::Transport::Transport::Errors::BadRequest
|
@@ -56,7 +67,5 @@ module ElasticQueue
|
|
56
67
|
def failed_search
|
57
68
|
{ page: 0, hits: { hits: [], total: 0 } }
|
58
69
|
end
|
59
|
-
|
60
70
|
end
|
61
|
-
|
62
71
|
end
|
@@ -6,7 +6,7 @@ module ElasticQueue
|
|
6
6
|
include Filters
|
7
7
|
include Sorts
|
8
8
|
|
9
|
-
attr_reader :filters, :sorts
|
9
|
+
attr_reader :filters, :sorts, :page
|
10
10
|
attr_accessor :per_page
|
11
11
|
|
12
12
|
def initialize(options = {})
|
@@ -33,10 +33,6 @@ module ElasticQueue
|
|
33
33
|
@page = num.to_i unless num.blank?
|
34
34
|
end
|
35
35
|
|
36
|
-
def page
|
37
|
-
@page
|
38
|
-
end
|
39
|
-
|
40
36
|
def body
|
41
37
|
b = {}
|
42
38
|
b[:filter] = @filters unless @filters[:and].blank?
|
@@ -44,5 +40,10 @@ module ElasticQueue
|
|
44
40
|
b
|
45
41
|
end
|
46
42
|
|
43
|
+
def percolator_body
|
44
|
+
b = {}
|
45
|
+
b[:filter] = @filters unless @filters[:and].blank?
|
46
|
+
{ 'query' => { 'constant_score' => b } }
|
47
|
+
end
|
47
48
|
end
|
48
49
|
end
|
@@ -9,7 +9,6 @@ module ElasticQueue
|
|
9
9
|
end
|
10
10
|
|
11
11
|
module ClassMethods
|
12
|
-
|
13
12
|
def queues(*queues)
|
14
13
|
@queues ||= queues
|
15
14
|
end
|
@@ -39,9 +38,8 @@ module ElasticQueue
|
|
39
38
|
@not_analyzed_queue_attributes.each do |a|
|
40
39
|
properties[a.to_sym] = { type: :string, index: :not_analyzed }
|
41
40
|
end
|
42
|
-
{
|
41
|
+
{ to_s.underscore.to_sym => { properties: properties } }
|
43
42
|
end
|
44
|
-
|
45
43
|
end
|
46
44
|
|
47
45
|
def indexed_for_queue
|
@@ -61,6 +59,5 @@ module ElasticQueue
|
|
61
59
|
def remove_from_queue_indices
|
62
60
|
self.class.queue_classes.each { |q| q.send(:remove_model, self) }
|
63
61
|
end
|
64
|
-
|
65
62
|
end
|
66
63
|
end
|
@@ -1,26 +1,21 @@
|
|
1
1
|
require 'will_paginate/collection'
|
2
2
|
|
3
3
|
module ElasticQueue
|
4
|
-
|
5
4
|
class Results
|
5
|
+
attr_reader :paginate
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
delegate :empty?, :each, :total_entries, :total_pages, :current_page, to: :paginate
|
9
8
|
def initialize(queue, search_results, query_options)
|
10
9
|
@queue = queue
|
11
10
|
@instantiated_queue_items = instantiate_queue_items(search_results)
|
12
11
|
@start = query_options.page
|
13
12
|
@per_page = query_options.per_page
|
14
13
|
@total = search_results[:hits][:total]
|
15
|
-
@
|
14
|
+
@paginate = WillPaginate::Collection.create(@start, @per_page, @total) do |pager|
|
16
15
|
pager.replace(@instantiated_queue_items)
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
|
-
def paginate
|
21
|
-
@results
|
22
|
-
end
|
23
|
-
|
24
19
|
def instantiate_queue_items(search_results)
|
25
20
|
grouped_results, sort_order = group_sorted_results(search_results)
|
26
21
|
records = fetch_records(grouped_results)
|
@@ -62,6 +57,5 @@ module ElasticQueue
|
|
62
57
|
sort_order["#{a.class.name.underscore}_#{a.id}"] <=> sort_order["#{b.class.name.underscore}_#{b.id}"]
|
63
58
|
end
|
64
59
|
end
|
65
|
-
|
66
60
|
end
|
67
61
|
end
|
data/lib/elastic_queue/sorts.rb
CHANGED
@@ -2,9 +2,6 @@ module ElasticQueue
|
|
2
2
|
module Sorts
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
module ClassMethods
|
6
|
-
end
|
7
|
-
|
8
5
|
def options_to_sorts(options)
|
9
6
|
options.map { |k, v| option_to_sort(k, v) }
|
10
7
|
end
|
@@ -18,6 +15,5 @@ module ElasticQueue
|
|
18
15
|
def single_sort(order_by, order)
|
19
16
|
{ order_by => { order: order, ignore_unmapped: true } }
|
20
17
|
end
|
21
|
-
|
22
18
|
end
|
23
19
|
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.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruth Thompson
|
@@ -9,104 +9,104 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: elasticsearch
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: will_paginate
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: bundler
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 1.0.0
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: 1.0.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rspec
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - ~>
|
74
|
+
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '2.6'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - ~>
|
81
|
+
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '2.6'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: factory_girl
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: rake
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
description: A library for storing and filtering documents on elastic search with
|
@@ -118,8 +118,8 @@ executables: []
|
|
118
118
|
extensions: []
|
119
119
|
extra_rdoc_files: []
|
120
120
|
files:
|
121
|
-
- .gitignore
|
122
|
-
- .rubocop.yml
|
121
|
+
- ".gitignore"
|
122
|
+
- ".rubocop.yml"
|
123
123
|
- Gemfile
|
124
124
|
- Gemfile.lock
|
125
125
|
- LICENSE
|
@@ -153,17 +153,17 @@ require_paths:
|
|
153
153
|
- lib
|
154
154
|
required_ruby_version: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
|
-
- -
|
156
|
+
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: 1.9.2
|
159
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
160
|
requirements:
|
161
|
-
- -
|
161
|
+
- - ">="
|
162
162
|
- !ruby/object:Gem::Version
|
163
163
|
version: '0'
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.0.
|
166
|
+
rubygems_version: 2.2.0.preview.1
|
167
167
|
signing_key:
|
168
168
|
specification_version: 4
|
169
169
|
summary: A queueing system built on top of elasticsearch.
|