indices 0.0.1 → 4.0.0.1
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
- metadata +13 -185
- data/MIT-LICENSE +0 -20
- data/README.md +0 -245
- data/Rakefile +0 -19
- data/lib/generators/indices/index_generator.rb +0 -15
- data/lib/generators/indices/install_generator.rb +0 -15
- data/lib/generators/indices/templates/index.rb +0 -12
- data/lib/generators/indices/templates/initializer.rb +0 -10
- data/lib/indices.rb +0 -102
- data/lib/indices/collection.rb +0 -195
- data/lib/indices/concern.rb +0 -23
- data/lib/indices/configuration.rb +0 -39
- data/lib/indices/dsl/api.rb +0 -85
- data/lib/indices/dsl/mappings.rb +0 -14
- data/lib/indices/dsl/search.rb +0 -25
- data/lib/indices/dsl/serializer.rb +0 -17
- data/lib/indices/index.rb +0 -149
- data/lib/indices/pagination.rb +0 -33
- data/lib/indices/proxy.rb +0 -17
- data/lib/indices/railtie.rb +0 -15
- data/lib/indices/version.rb +0 -5
- data/lib/tasks/indices.rake +0 -11
- data/test/dsl_test.rb +0 -92
- data/test/dummy/Rakefile +0 -5
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/test/dummy/app/controllers/application_controller.rb +0 -5
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/indices/products_index.rb +0 -51
- data/test/dummy/app/indices/shops_index.rb +0 -28
- data/test/dummy/app/models/product.rb +0 -5
- data/test/dummy/app/models/shop.rb +0 -5
- data/test/dummy/app/views/layouts/application.html.erb +0 -12
- data/test/dummy/bin/bundle +0 -4
- data/test/dummy/bin/rails +0 -5
- data/test/dummy/bin/rake +0 -5
- data/test/dummy/bin/setup +0 -30
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -25
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/database.yml +0 -7
- data/test/dummy/config/database.yml.travis +0 -3
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -41
- data/test/dummy/config/environments/production.rb +0 -79
- data/test/dummy/config/environments/test.rb +0 -42
- data/test/dummy/config/initializers/assets.rb +0 -11
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/indices.rb +0 -67
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -4
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -23
- data/test/dummy/config/routes.rb +0 -56
- data/test/dummy/config/secrets.yml +0 -22
- data/test/dummy/db/migrate/20161104164148_create_products.rb +0 -12
- data/test/dummy/db/migrate/20161104182219_create_shops.rb +0 -7
- data/test/dummy/db/schema.rb +0 -36
- data/test/dummy/log/development.log +0 -156
- data/test/dummy/log/test.log +0 -10249
- data/test/dummy/public/404.html +0 -67
- data/test/dummy/public/422.html +0 -67
- data/test/dummy/public/500.html +0 -66
- data/test/dummy/public/favicon.ico +0 -0
- data/test/generators_test.rb +0 -25
- data/test/indices_test.rb +0 -46
- data/test/record_test.rb +0 -25
- data/test/search_test.rb +0 -164
- data/test/tasks_test.rb +0 -25
- data/test/test_helper.rb +0 -14
data/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'bundler/setup'
|
3
|
-
rescue LoadError
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
-
end
|
6
|
-
|
7
|
-
Bundler::GemHelper.install_tasks
|
8
|
-
|
9
|
-
require 'rake/testtask'
|
10
|
-
|
11
|
-
Rake::TestTask.new(:test) do |t|
|
12
|
-
t.libs << 'lib'
|
13
|
-
t.libs << 'test'
|
14
|
-
t.pattern = 'test/**/*_test.rb'
|
15
|
-
t.verbose = false
|
16
|
-
t.warning = false
|
17
|
-
end
|
18
|
-
|
19
|
-
task default: :test
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rails/generators'
|
2
|
-
|
3
|
-
module Indices
|
4
|
-
module Generators
|
5
|
-
class IndexGenerator < Rails::Generators::NamedBase
|
6
|
-
|
7
|
-
source_root File.expand_path('../templates', __FILE__)
|
8
|
-
|
9
|
-
def create_index_file
|
10
|
-
template 'index.rb', "app/indices/#{table_name}_index.rb"
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'rails/generators'
|
2
|
-
|
3
|
-
module Indices
|
4
|
-
module Generators
|
5
|
-
class InstallGenerator < Rails::Generators::Base
|
6
|
-
|
7
|
-
source_root File.expand_path('../templates', __FILE__)
|
8
|
-
|
9
|
-
def create_initializer_file
|
10
|
-
copy_file 'initializer.rb', 'config/initializers/indices.rb'
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/lib/indices.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'generators/indices/index_generator'
|
2
|
-
require 'generators/indices/install_generator'
|
3
|
-
require 'indices/dsl/api'
|
4
|
-
require 'indices/dsl/mappings'
|
5
|
-
require 'indices/dsl/search'
|
6
|
-
require 'indices/dsl/serializer'
|
7
|
-
require 'indices/concern'
|
8
|
-
require 'indices/configuration'
|
9
|
-
require 'indices/index'
|
10
|
-
require 'indices/pagination'
|
11
|
-
require 'indices/proxy'
|
12
|
-
require 'indices/railtie'
|
13
|
-
require 'indices/collection'
|
14
|
-
require 'indices/version'
|
15
|
-
|
16
|
-
module Indices
|
17
|
-
class << self
|
18
|
-
|
19
|
-
delegate :any?, :none?, to: :registry
|
20
|
-
|
21
|
-
def namespace
|
22
|
-
"#{Rails.application.class.parent_name} #{Rails.env}".parameterize('_')
|
23
|
-
end
|
24
|
-
|
25
|
-
def client
|
26
|
-
@client ||= begin
|
27
|
-
require 'elasticsearch'
|
28
|
-
Elasticsearch::Client.new(
|
29
|
-
hosts: configuration.hosts,
|
30
|
-
log: configuration.log,
|
31
|
-
trace: configuration.trace
|
32
|
-
)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def configure
|
37
|
-
yield configuration
|
38
|
-
end
|
39
|
-
|
40
|
-
def configuration
|
41
|
-
@configuration ||= Configuration.new
|
42
|
-
end
|
43
|
-
|
44
|
-
def define(*args, &block)
|
45
|
-
Proxy.new *args, &block
|
46
|
-
end
|
47
|
-
|
48
|
-
def add(*args)
|
49
|
-
index = Index.new(*args)
|
50
|
-
registry[index.name] = index
|
51
|
-
end
|
52
|
-
|
53
|
-
def find(name)
|
54
|
-
registry[name]
|
55
|
-
end
|
56
|
-
alias_method :[], :find
|
57
|
-
|
58
|
-
def each(&block)
|
59
|
-
registry.values.sort.each &block
|
60
|
-
end
|
61
|
-
|
62
|
-
def build
|
63
|
-
unless client.indices.exists?(index: namespace)
|
64
|
-
client.indices.create(
|
65
|
-
index: namespace,
|
66
|
-
body: { settings: configuration.analysis }
|
67
|
-
)
|
68
|
-
end
|
69
|
-
each &:build
|
70
|
-
end
|
71
|
-
|
72
|
-
def exist?(type)
|
73
|
-
client.indices.exists? index: namespace, type: type
|
74
|
-
end
|
75
|
-
|
76
|
-
def rebuild
|
77
|
-
destroy
|
78
|
-
build
|
79
|
-
end
|
80
|
-
|
81
|
-
def destroy
|
82
|
-
if client.indices.exists?(index: namespace)
|
83
|
-
client.indices.delete index: namespace
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def suggest(*args)
|
88
|
-
response = client.suggest(
|
89
|
-
index: namespace,
|
90
|
-
body: { suggestions: Dsl::Api.new(args, &configuration.suggestions).to_h }
|
91
|
-
)
|
92
|
-
response['suggestions'].first['options'].map &:symbolize_keys
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def registry
|
98
|
-
@registry ||= {}
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|
data/lib/indices/collection.rb
DELETED
@@ -1,195 +0,0 @@
|
|
1
|
-
module Indices
|
2
|
-
class Collection
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
delegate :model, to: :index
|
6
|
-
delegate :model_name, to: :model
|
7
|
-
delegate :each, :map, :size, :length, :count, :[], :to_a, to: :records
|
8
|
-
|
9
|
-
alias_method :to_ary, :to_a
|
10
|
-
|
11
|
-
def initialize(index, *args, &block)
|
12
|
-
@loaded = false
|
13
|
-
@index = index
|
14
|
-
@options = args.extract_options!
|
15
|
-
@args = args
|
16
|
-
@block = block
|
17
|
-
end
|
18
|
-
|
19
|
-
def page(number, options={})
|
20
|
-
length = (fetch_option(options, :length) || 10)
|
21
|
-
padding = (fetch_option(options, :padding) || 0)
|
22
|
-
current_page = [number.to_i, 1].max
|
23
|
-
values = Module.new do
|
24
|
-
define_method :page_length do
|
25
|
-
length
|
26
|
-
end
|
27
|
-
define_method :padding do
|
28
|
-
padding
|
29
|
-
end
|
30
|
-
define_method :current_page do
|
31
|
-
current_page
|
32
|
-
end
|
33
|
-
end
|
34
|
-
overrides = {
|
35
|
-
from: ((length * (current_page - 1)) + padding),
|
36
|
-
size: length
|
37
|
-
}
|
38
|
-
%i(with without).each do |name|
|
39
|
-
if options.has_key?(name)
|
40
|
-
overrides[name] = options[name]
|
41
|
-
end
|
42
|
-
end
|
43
|
-
chain Pagination, values, overrides
|
44
|
-
end
|
45
|
-
|
46
|
-
def order(options)
|
47
|
-
mappings = Indices.configuration.mappings
|
48
|
-
sort = []
|
49
|
-
options.each do |property, direction|
|
50
|
-
if block = Indices.configuration.computed_sorts[property]
|
51
|
-
sort << Dsl::Api.new(direction, &block).to_h
|
52
|
-
elsif property == :id
|
53
|
-
sort << { _uid: { order: direction } }
|
54
|
-
elsif mappings.has_key?(property) && mappings[property][:type] == 'string'
|
55
|
-
sort << { "#{property}.raw" => { order: direction } }
|
56
|
-
end
|
57
|
-
end
|
58
|
-
if sort.any?
|
59
|
-
chain sort: sort
|
60
|
-
else
|
61
|
-
chain
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def response
|
66
|
-
if @loaded == true
|
67
|
-
@response
|
68
|
-
else
|
69
|
-
@loaded = true
|
70
|
-
@response = index.raw_search(query)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def query
|
75
|
-
@query ||= begin
|
76
|
-
pagination = options.slice(:from, :size, :sort)
|
77
|
-
without_ids = fetch_ids(options[:without])
|
78
|
-
body = Dsl::Search.new(args.append(options), &block).to_h[:query]
|
79
|
-
request = Dsl::Search.new do
|
80
|
-
if without_ids.any?
|
81
|
-
query do
|
82
|
-
filtered do
|
83
|
-
filter do
|
84
|
-
bool do
|
85
|
-
must_not do
|
86
|
-
without_ids.each do |id|
|
87
|
-
term do
|
88
|
-
_id id
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
query body
|
95
|
-
end
|
96
|
-
end
|
97
|
-
else
|
98
|
-
query body
|
99
|
-
end
|
100
|
-
%i(from size).each do |option|
|
101
|
-
if pagination.has_key?(option)
|
102
|
-
send option, pagination[option]
|
103
|
-
end
|
104
|
-
end
|
105
|
-
if pagination.has_key?(:sort)
|
106
|
-
sort pagination[:sort]
|
107
|
-
else
|
108
|
-
sort do
|
109
|
-
_uid do
|
110
|
-
order 'desc'
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
request.to_h
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
|
121
|
-
attr_reader :index, :args, :options, :block
|
122
|
-
|
123
|
-
def records
|
124
|
-
@records ||= begin
|
125
|
-
if missing_ids.any?
|
126
|
-
last_index = -(missing_ids.length + 1)
|
127
|
-
ids = (missing_ids.sort.reverse + hit_ids.to(last_index))
|
128
|
-
else
|
129
|
-
ids = hit_ids
|
130
|
-
end
|
131
|
-
index.model.includes(includes).where(id: ids).sort do |a,b|
|
132
|
-
ids.index(a.id) <=> ids.index(b.id)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def with_ids
|
138
|
-
@with_ids ||= fetch_ids(options[:with])
|
139
|
-
end
|
140
|
-
|
141
|
-
def hit_ids
|
142
|
-
@hit_ids ||= response['hits']['hits'].map{ |hit| hit['_id'].to_i }
|
143
|
-
end
|
144
|
-
|
145
|
-
def missing_ids
|
146
|
-
@missing_ids ||= (with_ids - hit_ids)
|
147
|
-
end
|
148
|
-
|
149
|
-
def includes
|
150
|
-
@inclues ||= begin
|
151
|
-
if options.has_key?(:includes)
|
152
|
-
Array options[:includes]
|
153
|
-
else
|
154
|
-
[]
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def fetch_option(options, name)
|
160
|
-
options[name] || begin
|
161
|
-
if Rails.configuration.cache_classes == false
|
162
|
-
Rails.application.eager_load!
|
163
|
-
end
|
164
|
-
if defined?(Pagers)
|
165
|
-
Pagers.config[name]
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def fetch_ids(source)
|
171
|
-
case source
|
172
|
-
when Fixnum,String
|
173
|
-
[source.to_i]
|
174
|
-
when ActiveRecord::Base
|
175
|
-
[source.id]
|
176
|
-
when ActiveRecord::Relation
|
177
|
-
source.ids
|
178
|
-
when Array
|
179
|
-
source.map{ |value| fetch_ids(value) }.flatten
|
180
|
-
else
|
181
|
-
[]
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def chain(*extensions)
|
186
|
-
overrides = extensions.extract_options!
|
187
|
-
Collection.new(index, *args.append(options.merge(overrides)), &block).tap do |collection|
|
188
|
-
extensions.each do |extension|
|
189
|
-
collection.extend extension
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
end
|
195
|
-
end
|
data/lib/indices/concern.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Indices
|
2
|
-
module Concern
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
after_commit :index, on: :create
|
7
|
-
after_commit :reindex, on: :update
|
8
|
-
after_commit :unindex, on: :destroy
|
9
|
-
end
|
10
|
-
|
11
|
-
%i(index reindex unindex).each do |name|
|
12
|
-
define_method name do
|
13
|
-
self.class.index.send name, self
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module ClassMethods
|
18
|
-
|
19
|
-
delegate :search, to: :index
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Indices
|
2
|
-
class Configuration
|
3
|
-
|
4
|
-
attr_accessor :hosts, :log, :trace
|
5
|
-
|
6
|
-
def computed_sorts
|
7
|
-
@computed_sorts ||= {}
|
8
|
-
end
|
9
|
-
|
10
|
-
def mappings(&block)
|
11
|
-
if block_given?
|
12
|
-
@mappings = Dsl::Mappings.new(&block).to_h
|
13
|
-
else
|
14
|
-
@mappings
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def analysis(&block)
|
19
|
-
if block_given?
|
20
|
-
@analysis = { analysis: Dsl::Api.new(&block).to_h }
|
21
|
-
else
|
22
|
-
@analysis
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def suggestions(&block)
|
27
|
-
if block_given?
|
28
|
-
@suggestions = block
|
29
|
-
else
|
30
|
-
@suggestions
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def add_computed_sort(name, &block)
|
35
|
-
self.computed_sorts[name] = block
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
data/lib/indices/dsl/api.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
module Indices
|
2
|
-
module Dsl
|
3
|
-
class Api
|
4
|
-
|
5
|
-
def initialize(args=[], parent={}, &block)
|
6
|
-
@args = args
|
7
|
-
@parent = parent
|
8
|
-
instance_exec *args, &block
|
9
|
-
end
|
10
|
-
|
11
|
-
def method_missing(name, *args, &block)
|
12
|
-
options = args.extract_options!
|
13
|
-
name = name.to_sym
|
14
|
-
if block_given?
|
15
|
-
child = add_block(name, args, options)
|
16
|
-
continue child, &block
|
17
|
-
elsif args.size > 0
|
18
|
-
add_argument name, args, options
|
19
|
-
elsif options.any?
|
20
|
-
add_options name, options
|
21
|
-
else
|
22
|
-
add_empty name
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def to_h
|
27
|
-
@parent
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def add_block(name, args, options)
|
33
|
-
case @parent
|
34
|
-
when Array
|
35
|
-
item = options.merge(name => {})
|
36
|
-
@parent << item
|
37
|
-
child = item[name]
|
38
|
-
when Hash
|
39
|
-
if @parent.has_key?(name)
|
40
|
-
child = @parent[name].merge!(options)
|
41
|
-
else
|
42
|
-
child = @parent[name] = {}
|
43
|
-
end
|
44
|
-
end
|
45
|
-
if args.any?
|
46
|
-
child[args.first.to_sym] = {}
|
47
|
-
else
|
48
|
-
child
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def add_argument(name, args, options)
|
53
|
-
@parent[name] = args.first
|
54
|
-
end
|
55
|
-
|
56
|
-
def add_options(name, options)
|
57
|
-
options.symbolize_keys!
|
58
|
-
case @parent
|
59
|
-
when Array
|
60
|
-
@parent << { name => options }
|
61
|
-
when Hash
|
62
|
-
if @parent.has_key?(name)
|
63
|
-
@parent[name].merge! options
|
64
|
-
else
|
65
|
-
@parent[name] = options
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def add_empty(name)
|
71
|
-
case @parent
|
72
|
-
when Array
|
73
|
-
@parent << { name => {} }
|
74
|
-
when Hash
|
75
|
-
@parent[name] = {}
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def continue(child, &block)
|
80
|
-
self.class.new @args, child, &block
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|