elastic_record 0.12.0 → 1.0.0

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: 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