elastic_record 0.12.0 → 1.0.0

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: 3a25b326c628b294aff17e44d2465d1b988ca2c3
4
- data.tar.gz: f20002ac648ecf9f7df8f524bf639e6b1be55af2
3
+ metadata.gz: da221f93d4c557456f18f0b3892a5d2552caf4d2
4
+ data.tar.gz: ee3abb0b5a4c3d22a58f7eba64f7a621af29e973
5
5
  SHA512:
6
- metadata.gz: c3baffc104e19d488ae910b3265cd8dcb239ac5a1c05492cdbb1a7747bb2156f3e4085bd6de0defed0eea9dbd2b6b3478a17f759eeaf3a751e12d417f7912eef
7
- data.tar.gz: 1bdeaefcffd51c750ad47d36ff5d8018d9040557f2f9a63d994715bb9206346c1439b1c2e8abcf09c997f127bf06fa6ccacccceef33798993f50548c4c5069db
6
+ metadata.gz: 3f02b3fee7e8464da19f7a8dac186572eae381d1cfc042022671ab369487ecfba68d988b8c035d5cf860775469f41a52d3d5c78016267df47fa9ef885929ccea
7
+ data.tar.gz: f3afe2ea723942ef860a61fafcfb0d99680865e55117b59a2124109f2b1dd73bf55e17a3c783f7be30c63c03faea6eebe1e16f12fadbe8068a29f2bcd116869d
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  services:
2
2
  - elasticsearch
3
3
  rvm:
4
- - 1.9.3
4
+ - 2.0.0
data/LICENSE CHANGED
@@ -1,165 +1,176 @@
1
- GNU LESSER GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
-
9
- This version of the GNU Lesser General Public License incorporates
10
- the terms and conditions of version 3 of the GNU General Public
11
- License, supplemented by the additional permissions listed below.
12
-
13
- 0. Additional Definitions.
14
-
15
- As used herein, "this License" refers to version 3 of the GNU Lesser
16
- General Public License, and the "GNU GPL" refers to version 3 of the GNU
17
- General Public License.
18
-
19
- "The Library" refers to a covered work governed by this License,
20
- other than an Application or a Combined Work as defined below.
21
-
22
- An "Application" is any work that makes use of an interface provided
23
- by the Library, but which is not otherwise based on the Library.
24
- Defining a subclass of a class defined by the Library is deemed a mode
25
- of using an interface provided by the Library.
26
-
27
- A "Combined Work" is a work produced by combining or linking an
28
- Application with the Library. The particular version of the Library
29
- with which the Combined Work was made is also called the "Linked
30
- Version".
31
-
32
- The "Minimal Corresponding Source" for a Combined Work means the
33
- Corresponding Source for the Combined Work, excluding any source code
34
- for portions of the Combined Work that, considered in isolation, are
35
- based on the Application, and not on the Linked Version.
36
-
37
- The "Corresponding Application Code" for a Combined Work means the
38
- object code and/or source code for the Application, including any data
39
- and utility programs needed for reproducing the Combined Work from the
40
- Application, but excluding the System Libraries of the Combined Work.
41
-
42
- 1. Exception to Section 3 of the GNU GPL.
43
-
44
- You may convey a covered work under sections 3 and 4 of this License
45
- without being bound by section 3 of the GNU GPL.
46
-
47
- 2. Conveying Modified Versions.
48
-
49
- If you modify a copy of the Library, and, in your modifications, a
50
- facility refers to a function or data to be supplied by an Application
51
- that uses the facility (other than as an argument passed when the
52
- facility is invoked), then you may convey a copy of the modified
53
- version:
54
-
55
- a) under this License, provided that you make a good faith effort to
56
- ensure that, in the event an Application does not supply the
57
- function or data, the facility still operates, and performs
58
- whatever part of its purpose remains meaningful, or
59
-
60
- b) under the GNU GPL, with none of the additional permissions of
61
- this License applicable to that copy.
62
-
63
- 3. Object Code Incorporating Material from Library Header Files.
64
-
65
- The object code form of an Application may incorporate material from
66
- a header file that is part of the Library. You may convey such object
67
- code under terms of your choice, provided that, if the incorporated
68
- material is not limited to numerical parameters, data structure
69
- layouts and accessors, or small macros, inline functions and templates
70
- (ten or fewer lines in length), you do both of the following:
71
-
72
- a) Give prominent notice with each copy of the object code that the
73
- Library is used in it and that the Library and its use are
74
- covered by this License.
75
-
76
- b) Accompany the object code with a copy of the GNU GPL and this license
77
- document.
78
-
79
- 4. Combined Works.
80
-
81
- You may convey a Combined Work under terms of your choice that,
82
- taken together, effectively do not restrict modification of the
83
- portions of the Library contained in the Combined Work and reverse
84
- engineering for debugging such modifications, if you also do each of
85
- the following:
86
-
87
- a) Give prominent notice with each copy of the Combined Work that
88
- the Library is used in it and that the Library and its use are
89
- covered by this License.
90
-
91
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
92
- document.
93
-
94
- c) For a Combined Work that displays copyright notices during
95
- execution, include the copyright notice for the Library among
96
- these notices, as well as a reference directing the user to the
97
- copies of the GNU GPL and this license document.
98
-
99
- d) Do one of the following:
100
-
101
- 0) Convey the Minimal Corresponding Source under the terms of this
102
- License, and the Corresponding Application Code in a form
103
- suitable for, and under terms that permit, the user to
104
- recombine or relink the Application with a modified version of
105
- the Linked Version to produce a modified Combined Work, in the
106
- manner specified by section 6 of the GNU GPL for conveying
107
- Corresponding Source.
108
-
109
- 1) Use a suitable shared library mechanism for linking with the
110
- Library. A suitable mechanism is one that (a) uses at run time
111
- a copy of the Library already present on the user's computer
112
- system, and (b) will operate properly with a modified version
113
- of the Library that is interface-compatible with the Linked
114
- Version.
115
-
116
- e) Provide Installation Information, but only if you would otherwise
117
- be required to provide such information under section 6 of the
118
- GNU GPL, and only to the extent that such information is
119
- necessary to install and execute a modified version of the
120
- Combined Work produced by recombining or relinking the
121
- Application with a modified version of the Linked Version. (If
122
- you use option 4d0, the Installation Information must accompany
123
- the Minimal Corresponding Source and Corresponding Application
124
- Code. If you use option 4d1, you must provide the Installation
125
- Information in the manner specified by section 6 of the GNU GPL
126
- for conveying Corresponding Source.)
127
-
128
- 5. Combined Libraries.
129
-
130
- You may place library facilities that are a work based on the
131
- Library side by side in a single library together with other library
132
- facilities that are not Applications and are not covered by this
133
- License, and convey such a combined library under terms of your
134
- choice, if you do both of the following:
135
-
136
- a) Accompany the combined library with a copy of the same work based
137
- on the Library, uncombined with any other library facilities,
138
- conveyed under the terms of this License.
139
-
140
- b) Give prominent notice with the combined library that part of it
141
- is a work based on the Library, and explaining where to find the
142
- accompanying uncombined form of the same work.
143
-
144
- 6. Revised Versions of the GNU Lesser General Public License.
145
-
146
- The Free Software Foundation may publish revised and/or new versions
147
- of the GNU Lesser General Public License from time to time. Such new
148
- versions will be similar in spirit to the present version, but may
149
- differ in detail to address new problems or concerns.
150
-
151
- Each version is given a distinguishing version number. If the
152
- Library as you received it specifies that a certain numbered version
153
- of the GNU Lesser General Public License "or any later version"
154
- applies to it, you have the option of following the terms and
155
- conditions either of that published version or of any later version
156
- published by the Free Software Foundation. If the Library as you
157
- received it does not specify a version number of the GNU Lesser
158
- General Public License, you may choose any version of the GNU Lesser
159
- General Public License ever published by the Free Software Foundation.
160
-
161
- If the Library as you received it specifies that a proxy can decide
162
- whether future versions of the GNU Lesser General Public License shall
163
- apply, that proxy's public statement of acceptance of any version is
164
- permanent authorization for you to choose that version for the
165
- Library.
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
data/README.rdoc CHANGED
@@ -12,35 +12,10 @@ The usual Gemfile addition:
12
12
 
13
13
  Include ElasticRecord into your model:
14
14
 
15
- class Product < YourFavoriteOrm::Base
15
+ class Product < ActiveRecord::Base
16
16
  include ElasticRecord::Model
17
17
  end
18
18
 
19
- == Configuration
20
-
21
- While elastic search automatically maps fields, you may wish to override the defaults:
22
-
23
- class Product < YourFavoriteOrm::Base
24
- elastic_index.configure do
25
- property :status, type: "string", index: "not_analyzed"
26
- end
27
- end
28
-
29
- You can also directly access Product.elastic_index.mapping and Product.elastic_index.settings:
30
-
31
- class Product
32
- elastic_index.mapping = {
33
- properties: {
34
- name: {type: "string", index: "analyzed"}
35
- status: {type: "string", index: "not_analyzed"}
36
- }
37
- }
38
- end
39
-
40
- Create the index:
41
-
42
- rake index:create
43
-
44
19
  == Searching
45
20
 
46
21
  ElasticRecord adds the method 'elastic_search' to your models. It works similar to active_record scoping:
@@ -97,7 +72,6 @@ To change the 'size' and 'from' values of a query, use offset and limit:
97
72
 
98
73
  search.limit(40).offset(80) # Creates a query with {size: 40, from: 80}
99
74
 
100
-
101
75
  === Facets
102
76
 
103
77
  Since term facets are the most common, they are the easiest to add to a query:
@@ -136,6 +110,31 @@ Class methods can be executed within scopes:
136
110
  # Increase the price of all red products by $10.
137
111
  Product.filter(color: 'red').increase_prices
138
112
 
113
+ == Configuration
114
+
115
+ While elastic search automatically maps fields, you may wish to override the defaults:
116
+
117
+ class Product < ActiveRecord::Base
118
+ elastic_index.configure do
119
+ property :status, type: "string", index: "not_analyzed"
120
+ end
121
+ end
122
+
123
+ You can also directly access Product.elastic_index.mapping and Product.elastic_index.settings:
124
+
125
+ class Product
126
+ elastic_index.mapping = {
127
+ properties: {
128
+ name: {type: "string", index: "analyzed"}
129
+ status: {type: "string", index: "not_analyzed"}
130
+ }
131
+ }
132
+ end
133
+
134
+ Create the index:
135
+
136
+ rake index:create
137
+
139
138
  == Index Information
140
139
 
141
140
  Core and Index APIs can be accessed with Product.elastic_index. Some examples include:
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'elastic_record'
5
- s.version = '0.12.0'
5
+ s.version = '1.0.0'
6
6
  s.summary = 'Use Elastic Search with your objects'
7
7
  s.description = 'Find your records with elastic search'
8
8
 
@@ -18,6 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.files = `git ls-files`.split("\n")
19
19
  s.test_files = `git ls-files -- {test}/*`.split("\n")
20
20
 
21
- s.add_dependency 'arelastic'
21
+ s.add_dependency 'arelastic', '>= 0.3.0'
22
22
  s.add_dependency 'activemodel'
23
23
  end
@@ -16,7 +16,7 @@ module ElasticRecord
16
16
  json = {}
17
17
  elastic_index.mapping[:properties].each_key do |key|
18
18
  next unless respond_to?(key)
19
- value = value = send(key)
19
+ value = send(key)
20
20
 
21
21
  if value.present? || value == false
22
22
  json[key] = value
@@ -21,7 +21,7 @@ module ElasticRecord
21
21
  if writes_made
22
22
  begin
23
23
  index.disable_deferring!
24
- index.reset
24
+ index.delete_by_query match_all: {}
25
25
  ensure
26
26
  index.enable_deferring!
27
27
  end
@@ -15,7 +15,7 @@ module ElasticRecord
15
15
  connection.json_put "/#{index_name}/#{type}/#{id}", document
16
16
  end
17
17
  end
18
-
18
+
19
19
  def delete_document(id, index_name = nil)
20
20
  index_name ||= alias_name
21
21
 
@@ -26,6 +26,10 @@ module ElasticRecord
26
26
  end
27
27
  end
28
28
 
29
+ def delete_by_query(query)
30
+ connection.json_delete "/#{alias_name}/#{type}/_query", query
31
+ end
32
+
29
33
  def record_exists?(id)
30
34
  get(id)['exists']
31
35
  end
@@ -0,0 +1,24 @@
1
+ module ElasticRecord
2
+ class Index
3
+ module Warmer
4
+ def create_warmer(name, elastic_query)
5
+ connection.json_put "/#{alias_name}/#{type}/_warmer/#{name}", elastic_query
6
+ end
7
+
8
+ def delete_warmer(name)
9
+ connection.json_delete "/#{alias_name}/#{type}/_warmer/#{name}"
10
+ end
11
+
12
+ def get_warmer(name)
13
+ connection.json_get("/#{alias_name}/#{type}/_warmer/#{name}").values.first['warmers'][name]
14
+ end
15
+
16
+ def warmer_exists?(name)
17
+ get_warmer(name)
18
+ true
19
+ rescue ElasticRecord::ConnectionError
20
+ false
21
+ end
22
+ end
23
+ end
24
+ end
@@ -5,13 +5,19 @@ require 'elastic_record/index/manage'
5
5
  require 'elastic_record/index/mapping'
6
6
  require 'elastic_record/index/percolator'
7
7
  require 'elastic_record/index/settings'
8
+ require 'elastic_record/index/warmer'
8
9
 
9
- require 'active_support/core_ext/hash/deep_dup'
10
+ require 'active_support/version'
11
+ if ActiveSupport::VERSION::STRING < '4'
12
+ require 'active_support/core_ext/hash/deep_dup'
13
+ else
14
+ require 'active_support/core_ext/object/deep_dup'
15
+ end
10
16
 
11
17
  module ElasticRecord
12
18
  # ElasticRecord::Index provides access to elastic search's API. It is accessed with
13
19
  # <tt>Widget.elastic_index</tt>. The methods provided are:
14
- #
20
+ #
15
21
  # [create]
16
22
  # Create a new index that is not aliased
17
23
  # [create_and_deploy]
@@ -29,9 +35,8 @@ module ElasticRecord
29
35
  class Index
30
36
  include Documents
31
37
  include Manage
32
- include Mapping
33
- include Percolator
34
- include Settings
38
+ include Mapping, Settings
39
+ include Percolator, Warmer
35
40
  include Deferred
36
41
 
37
42
  attr_accessor :model
@@ -48,11 +53,11 @@ module ElasticRecord
48
53
  end
49
54
 
50
55
  def alias_name
51
- @alias_name ||= model.base_class.model_name.collection
56
+ @alias_name ||= model.base_class.name.demodulize.underscore.pluralize
52
57
  end
53
58
 
54
59
  def type
55
- @type ||= model.base_class.model_name.element
60
+ @type ||= model.base_class.name.demodulize.underscore
56
61
  end
57
62
 
58
63
  def disable!
@@ -0,0 +1,13 @@
1
+ module ElasticRecord
2
+ class Relation
3
+ module Admin
4
+ def create_percolator(name)
5
+ klass.elastic_index.create_percolator(name, as_elastic)
6
+ end
7
+
8
+ def create_warmer(name)
9
+ klass.elastic_index.create_warmer(name, as_elastic)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,8 +1,8 @@
1
1
  module ElasticRecord
2
2
  class Relation
3
3
  module Batches
4
- def find_each
5
- find_in_batches do |records|
4
+ def find_each(options = {})
5
+ find_in_batches(options) do |records|
6
6
  records.each { |record| yield record }
7
7
  end
8
8
  end
@@ -20,7 +20,7 @@ module ElasticRecord
20
20
  scroll: scroll_keep_alive,
21
21
  size: 100,
22
22
  search_type: 'scan'
23
- }
23
+ }.update(options)
24
24
 
25
25
  scroll_id = klass.elastic_index.search(as_elastic, options)['_scroll_id']
26
26
 
@@ -24,7 +24,7 @@ module ElasticRecord
24
24
  end # end
25
25
  CODE
26
26
  end
27
-
27
+
28
28
  def query!(value)
29
29
  self.query_value = value
30
30
  self
@@ -226,24 +226,23 @@ module ElasticRecord
226
226
  end
227
227
 
228
228
  def build_orders(orders)
229
- unless orders.empty?
230
- orders = reverse_query_order(orders) if reverse_order_value
231
- Arelastic::Searches::Sort.new(orders) unless orders.empty?
229
+ return if orders.empty?
230
+
231
+ orders = orders.map do |order|
232
+ if order.is_a?(Arelastic::Sorts::Sort)
233
+ order
234
+ else
235
+ Arelastic::Sorts::Sort.new(order)
236
+ end
232
237
  end
238
+
239
+ orders = reverse_query_order(orders) if reverse_order_value
240
+ Arelastic::Searches::Sort.new(orders)
233
241
  end
234
242
 
235
243
  def reverse_query_order(orders)
236
- orders.reverse.map do |o|
237
- case o
238
- when String, Symbol
239
- {o => :desc}
240
- when Hash
241
- o.each_with_object({}) do |(field, dir), memo|
242
- memo[field] = (dir.to_sym == :asc ? :desc : :asc )
243
- end
244
- else
245
- o
246
- end
244
+ orders.reverse.map do |order|
245
+ order.reverse
247
246
  end
248
247
  end
249
248
  end
@@ -1,4 +1,5 @@
1
1
  require 'elastic_record/relation/value_methods'
2
+ require 'elastic_record/relation/admin'
2
3
  require 'elastic_record/relation/batches'
3
4
  require 'elastic_record/relation/delegation'
4
5
  require 'elastic_record/relation/finder_methods'
@@ -8,7 +9,7 @@ require 'elastic_record/relation/search_methods'
8
9
 
9
10
  module ElasticRecord
10
11
  class Relation
11
- include Batches, Delegation, FinderMethods, Merging, SearchMethods
12
+ include Admin, Batches, Delegation, FinderMethods, Merging, SearchMethods
12
13
 
13
14
  attr_reader :klass, :arelastic, :values
14
15
 
@@ -26,10 +27,6 @@ module ElasticRecord
26
27
  search_results['facets']
27
28
  end
28
29
 
29
- def create_percolator(name)
30
- klass.elastic_index.create_percolator(name, as_elastic)
31
- end
32
-
33
30
  def explain(id)
34
31
  klass.elastic_index.explain(id, as_elastic)
35
32
  end
@@ -69,7 +66,7 @@ module ElasticRecord
69
66
  def reset
70
67
  @search_results = @records = nil
71
68
  end
72
-
69
+
73
70
  def search_hits
74
71
  search_results['hits']['hits']
75
72
  end
@@ -28,9 +28,19 @@ class ElasticRecord::Index::DocumentsTest < MiniTest::Spec
28
28
  refute index.record_exists?('abc')
29
29
  end
30
30
 
31
+ def test_delete_by_query
32
+ index.index_document('bob', name: 'bob')
33
+ index.index_document('joe', name: 'joe')
34
+
35
+ index.delete_by_query(query_string: {query: 'name.analyzed:bob'})
36
+
37
+ refute index.record_exists?('bob')
38
+ assert index.record_exists?('joe')
39
+ end
40
+
31
41
  def test_bulk_add
32
42
  record = Widget.new(id: 'abc', color: 'red')
33
-
43
+
34
44
  index.bulk_add [record]
35
45
 
36
46
  assert index.record_exists?('abc')
@@ -1,59 +1,58 @@
1
1
  require 'helper'
2
2
 
3
- # class Cat
4
- # include TestModel
5
- # end
6
-
7
3
  class ElasticRecord::Index::ManageTest < MiniTest::Spec
4
+ class Felon
5
+ include TestModel
6
+ end
7
+
8
8
  def setup
9
9
  super
10
- index.disable_deferring!
11
- index.delete_all
10
+ Felon.elastic_index.delete_all
12
11
  end
13
12
 
14
13
  def test_create
15
- assert !index.exists?('widgets_foo')
14
+ assert !index.exists?('felons_foo')
16
15
 
17
- index.create 'widgets_foo'
16
+ index.create 'felons_foo'
18
17
 
19
- assert index.exists?('widgets_foo')
18
+ assert index.exists?('felons_foo')
20
19
  end
21
20
 
22
21
  def test_exists
23
- index.create 'widgets_foo'
22
+ index.create 'felons_foo'
24
23
 
25
- assert index.exists?('widgets_foo')
26
- assert !index.exists?('widgets_bar')
24
+ assert index.exists?('felons_foo')
25
+ assert !index.exists?('felons_bar')
27
26
  end
28
27
 
29
28
  def test_type_exists
30
- index.create 'widgets_foo'
29
+ index.create 'felons_foo'
31
30
 
32
- assert index.type_exists?('widgets_foo')
33
- assert !index.type_exists?('widgets_bar')
31
+ assert index.type_exists?('felons_foo')
32
+ assert !index.type_exists?('felons_bar')
34
33
  end
35
34
 
36
35
  def test_deploy
37
- index.create 'widgets_foo'
38
-
36
+ index.create 'felons_foo'
37
+
39
38
  assert index.aliased_names.empty?
40
- index.deploy 'widgets_foo'
39
+ index.deploy 'felons_foo'
41
40
 
42
- assert_equal ['widgets_foo'], index.aliased_names
41
+ assert_equal ['felons_foo'], index.aliased_names
43
42
  end
44
43
 
45
44
  def test_deploy_when_already_deployed
46
- index.create 'widgets_foo'
47
- index.deploy 'widgets_foo'
48
-
49
- index.deploy 'widgets_foo'
45
+ index.create 'felons_foo'
46
+ index.deploy 'felons_foo'
47
+
48
+ index.deploy 'felons_foo'
50
49
 
51
- assert_equal ['widgets_foo'], index.aliased_names
50
+ assert_equal ['felons_foo'], index.aliased_names
52
51
  end
53
52
 
54
53
  private
55
54
 
56
55
  def index
57
- @index ||= Widget.elastic_index
56
+ @index ||= Felon.elastic_index
58
57
  end
59
58
  end
@@ -2,6 +2,8 @@ require 'helper'
2
2
 
3
3
  class ElasticRecord::Index::PercolatorTest < MiniTest::Spec
4
4
  def test_create_percolator
5
+ index.disable_deferring!
6
+
5
7
  index.delete_percolator('green') if index.percolator_exists?('green')
6
8
  index.delete_percolator('blue') if index.percolator_exists?('blue')
7
9
 
@@ -12,6 +14,8 @@ class ElasticRecord::Index::PercolatorTest < MiniTest::Spec
12
14
  end
13
15
 
14
16
  def test_delete_percolator
17
+ index.disable_deferring!
18
+
15
19
  index.create_percolator('green', 'color' => 'green')
16
20
  assert index.percolator_exists?('green')
17
21
 
@@ -23,6 +27,7 @@ class ElasticRecord::Index::PercolatorTest < MiniTest::Spec
23
27
  end
24
28
 
25
29
  private
30
+
26
31
  def index
27
32
  Widget.elastic_index
28
33
  end
@@ -0,0 +1,20 @@
1
+ require 'helper'
2
+
3
+ class ElasticRecord::Index::WarmerTest < MiniTest::Spec
4
+ def test_create_warmer
5
+ index.delete_warmer('green') if index.warmer_exists?('green')
6
+ refute index.warmer_exists?('green')
7
+
8
+ index.create_warmer('green', 'query' => { "match_all" => {} })
9
+
10
+ assert index.warmer_exists?('green')
11
+ expected = {"types" => ["widget"], "source" => {"query" => {"match_all"=>{}}}}
12
+ assert_equal expected, index.get_warmer('green')
13
+ end
14
+
15
+ private
16
+
17
+ def index
18
+ Widget.elastic_index
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class ElasticRecord::Relation::AdminTest < MiniTest::Spec
4
+ def test_create_percolator
5
+ Widget.elastic_index.reset_percolator
6
+
7
+ Widget.elastic_relation.filter(color: 'green').create_percolator('green')
8
+ Widget.elastic_relation.filter(color: 'blue').create_percolator('blue')
9
+ widget = Widget.new(color: 'green')
10
+
11
+ assert_equal ['green'], Widget.elastic_index.percolate(widget.as_search)
12
+ end
13
+
14
+ def test_create_warmer
15
+ Widget.elastic_index.delete_warmer('green') if Widget.elastic_index.warmer_exists?('green')
16
+
17
+ relation = Widget.elastic_relation.filter('color' => 'green')
18
+ relation.create_warmer('green')
19
+
20
+ assert_equal relation.as_elastic, Widget.elastic_index.get_warmer('green')['source']
21
+ end
22
+ end
@@ -10,7 +10,7 @@ class ElasticRecord::Relation::SearchMethodsTest < MiniTest::Spec
10
10
  def test_query_with_multiple_filters
11
11
  relation.filter!('foo' => 'bar')
12
12
  relation.filter!(Widget.arelastic['faz'].in ['baz', 'fum'])
13
-
13
+
14
14
  expected = {
15
15
  "constant_score" => {
16
16
  "filter" => {
@@ -27,7 +27,7 @@ class ElasticRecord::Relation::SearchMethodsTest < MiniTest::Spec
27
27
 
28
28
  def test_filter_with_arelastic
29
29
  relation.filter!(Widget.arelastic['faz'].in 3..5)
30
-
30
+
31
31
  expected = {
32
32
  "constant_score" => {
33
33
  "filter" => {
@@ -43,7 +43,7 @@ class ElasticRecord::Relation::SearchMethodsTest < MiniTest::Spec
43
43
 
44
44
  def test_filter_with_hash
45
45
  relation.filter!("prefix" => {"name" => "Jo"})
46
-
46
+
47
47
  expected = {
48
48
  "constant_score" => {
49
49
  "filter" => {
@@ -153,7 +153,20 @@ class ElasticRecord::Relation::SearchMethodsTest < MiniTest::Spec
153
153
 
154
154
  expected = [
155
155
  'foo',
156
- 'bar' => 'desc'
156
+ {'bar' => 'desc'}
157
+ ]
158
+
159
+ assert_equal expected, relation.as_elastic['sort']
160
+ end
161
+
162
+ def test_reverse_order
163
+ relation.order! 'foo' => {'missing' => '_last'}
164
+ relation.order! 'bar' => 'desc'
165
+ relation.reverse_order!
166
+
167
+ expected = [
168
+ {'bar' => 'asc'},
169
+ {'foo' => {'order' => 'desc', 'missing' => '_last'}}
157
170
  ]
158
171
 
159
172
  assert_equal expected, relation.as_elastic['sort']
@@ -15,16 +15,6 @@ class ElasticRecord::RelationTest < MiniTest::Spec
15
15
  assert_equal 2, facets['popular_colors']['total']
16
16
  end
17
17
 
18
- def test_create_percolator
19
- Widget.elastic_index.reset_percolator
20
-
21
- Widget.elastic_relation.filter(color: 'green').create_percolator('green')
22
- Widget.elastic_relation.filter(color: 'blue').create_percolator('blue')
23
- widget = Widget.new(color: 'green')
24
-
25
- assert_equal ['green'], Widget.elastic_index.percolate(widget.as_search)
26
- end
27
-
28
18
  def test_explain
29
19
  create_widgets [Widget.new(id: 10, color: 'blue')]
30
20
 
@@ -43,7 +33,7 @@ class ElasticRecord::RelationTest < MiniTest::Spec
43
33
 
44
34
  def test_to_a
45
35
  create_widgets [Widget.new(id: 5, color: 'red'), Widget.new(id: 10, color: 'blue')]
46
-
36
+
47
37
  array = Widget.elastic_relation.to_a
48
38
 
49
39
  assert_equal 2, array.size
@@ -2,7 +2,7 @@ require 'helper'
2
2
 
3
3
  class ElasticRecord::SearchingTest < MiniTest::Spec
4
4
  def test_elastic_search
5
-
5
+
6
6
  end
7
7
 
8
8
  def test_elastic_scope
data/test/helper.rb CHANGED
@@ -7,7 +7,6 @@ require 'support/connect'
7
7
  require 'support/models/test_model'
8
8
  require 'support/models/warehouse'
9
9
  require 'support/models/widget'
10
- Widget.elastic_index.reset
11
10
 
12
11
  ElasticRecord::Config.model_names = %w(Warehouse Widget)
13
12
 
@@ -19,6 +18,8 @@ module MiniTest
19
18
  super
20
19
  FakeWeb.clean_registry
21
20
 
21
+ Widget.elastic_index.create_and_deploy if Widget.elastic_index.all_names.empty?
22
+
22
23
  ElasticRecord::Config.models.each do |model|
23
24
  model.elastic_index.enable_deferring!
24
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infogroup
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-09 00:00:00.000000000 Z
12
+ date: 2013-05-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: arelastic
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - '>='
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: 0.3.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
- version: '0'
27
+ version: 0.3.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: activemodel
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -65,6 +65,7 @@ files:
65
65
  - lib/elastic_record/index/mapping.rb
66
66
  - lib/elastic_record/index/percolator.rb
67
67
  - lib/elastic_record/index/settings.rb
68
+ - lib/elastic_record/index/warmer.rb
68
69
  - lib/elastic_record/log_subscriber.rb
69
70
  - lib/elastic_record/lucene.rb
70
71
  - lib/elastic_record/model.rb
@@ -72,6 +73,7 @@ files:
72
73
  - lib/elastic_record/railtie.rb
73
74
  - lib/elastic_record/railties/controller_runtime.rb
74
75
  - lib/elastic_record/relation.rb
76
+ - lib/elastic_record/relation/admin.rb
75
77
  - lib/elastic_record/relation/batches.rb
76
78
  - lib/elastic_record/relation/delegation.rb
77
79
  - lib/elastic_record/relation/finder_methods.rb
@@ -96,11 +98,13 @@ files:
96
98
  - test/elastic_record/index/mapping_test.rb
97
99
  - test/elastic_record/index/percolator_test.rb
98
100
  - test/elastic_record/index/settings_test.rb
101
+ - test/elastic_record/index/warmer_test.rb
99
102
  - test/elastic_record/index_test.rb
100
103
  - test/elastic_record/log_subscriber_test.rb
101
104
  - test/elastic_record/lucene_test.rb
102
105
  - test/elastic_record/model_test.rb
103
106
  - test/elastic_record/railties/controller_runtime_test.rb
107
+ - test/elastic_record/relation/admin_test.rb
104
108
  - test/elastic_record/relation/batches_test.rb
105
109
  - test/elastic_record/relation/delegation_test.rb
106
110
  - test/elastic_record/relation/finder_methods_test.rb
@@ -108,6 +112,7 @@ files:
108
112
  - test/elastic_record/relation/none_test.rb
109
113
  - test/elastic_record/relation/search_methods_test.rb
110
114
  - test/elastic_record/relation_test.rb
115
+ - test/elastic_record/searches_many/association_test.rb
111
116
  - test/elastic_record/searches_many/autosave_test.rb
112
117
  - test/elastic_record/searches_many/collection_proxy_test.rb
113
118
  - test/elastic_record/searches_many/reflection_test.rb