tire 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -10,4 +10,5 @@ scratch/
10
10
  examples/*.html
11
11
  *.log
12
12
  .rvmrc
13
+ .rbenv-version
13
14
  tags
@@ -382,9 +382,6 @@ When you now save a record:
382
382
  ```
383
383
 
384
384
  it is automatically added into an index called 'articles', because of the included callbacks.
385
- (You may want to skip them in special cases, like when your records are indexed via some external
386
- mechanism, let's say a _CouchDB_ or _RabbitMQ_
387
- [river](http://www.elasticsearch.org/blog/2010/09/28/the_river.html).
388
385
 
389
386
  The document attributes are indexed exactly as when you call the `Article#to_json` method.
390
387
 
@@ -459,8 +456,8 @@ In this case, just wrap the `mapping` method in a `settings` one, passing it the
459
456
  ```
460
457
 
461
458
  It may well be reasonable to wrap the index creation logic declared with `Tire.index('urls').create`
462
- in a class method of your model, in a module method, etc, so have better control on index creation when
463
- bootstrapping your application with Rake tasks or when setting up the test suite.
459
+ in a class method of your model, in a module method, etc, to have better control on index creation when
460
+ bootstrapping the application with Rake tasks or when setting up the test suite.
464
461
  _Tire_ will not hold that against you.
465
462
 
466
463
  You may have just stopped wondering: what if I have my own `settings` class method defined?
@@ -545,6 +542,21 @@ Of course, it may well be reasonable to define the indexed JSON from the ground
545
542
  end
546
543
  ```
547
544
 
545
+ Notice, that you may want to skip including the `Tire::Model::Callbacks` module in special cases,
546
+ like when your records are indexed via some external mechanism, let's say a _CouchDB_ or _RabbitMQ_
547
+ [river](http://www.elasticsearch.org/blog/2010/09/28/the_river.html), or when you need better
548
+ control on how the documents are added to or removed from the index:
549
+
550
+ ```ruby
551
+ class Article < ActiveRecord::Base
552
+ include Tire::Model::Search
553
+
554
+ after_save do
555
+ update_index if state == 'published'
556
+ end
557
+ end
558
+ ```
559
+
548
560
  The results returned by `Article.search` are wrapped in the aforementioned `Item` class, by default.
549
561
  This way, we have a fast and flexible access to the properties returned from _ElasticSearch_ (via the
550
562
  `_source` or `fields` JSON properties). This way, we can index whatever JSON we like in _ElasticSearch_,
@@ -582,6 +582,7 @@ end
582
582
  # * [date](http://www.elasticsearch.org/guide/reference/api/search/facets/date-histogram-facet.html)
583
583
  # * [range](http://www.elasticsearch.org/guide/reference/api/search/facets/range-facet.html)
584
584
  # * [histogram](http://www.elasticsearch.org/guide/reference/api/search/facets/histogram-facet.html)
585
+ # * [query](http://www.elasticsearch.org/guide/reference/api/search/facets/query-facet.html)
585
586
 
586
587
  # We have seen that _ElasticSearch_ facets enable us to fetch complex aggregations from our data.
587
588
  #
@@ -37,6 +37,10 @@ module Tire
37
37
  self
38
38
  end
39
39
 
40
+ def query(&block)
41
+ @value = { :query => Query.new(&block).to_hash }
42
+ end
43
+
40
44
  def to_json
41
45
  to_hash.to_json
42
46
  end
@@ -1,14 +1,10 @@
1
1
  module Tire
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.5"
3
3
 
4
4
  CHANGELOG =<<-END
5
5
  IMPORTANT CHANGES LATELY:
6
6
 
7
- 0.3.4
8
- ---------------------------------------------------------
9
- # Added documentation (RDoc annotations and README)
10
- # Kaminari pagination support
11
- # Bugfixes (dependency on ES running, callbacks, bogus exceptions)
7
+ # Added a "query" facet for free-form aggregations
12
8
 
13
9
  END
14
10
  end
@@ -1 +1 @@
1
- {"title" : "One", "tags" : ["ruby"], "published_on" : "2011-01-01", "words" : 125}
1
+ {"title" : "One", "tags" : ["ruby"], "published_on" : "2011-01-01", "words" : 125, "draft" : true}
@@ -77,6 +77,7 @@ module Tire
77
77
  end
78
78
 
79
79
  context "histogram" do
80
+
80
81
  should "return aggregated values for all results" do
81
82
  s = Tire.search('articles-test') do
82
83
  query { all }
@@ -91,6 +92,53 @@ module Tire
91
92
  assert_equal({"key" => 200, "count" => 2}, facets.entries[1], facets.inspect)
92
93
  assert_equal({"key" => 300, "count" => 1}, facets.entries[2], facets.inspect)
93
94
  end
95
+
96
+ end
97
+
98
+ context "query facets" do
99
+
100
+ should "return aggregated values for a string query" do
101
+ s = Tire.search('articles-test') do
102
+ facet 'tees' do
103
+ query { string 'T*' }
104
+ end
105
+ end
106
+
107
+ count = s.results.facets['tees']['count']
108
+ assert_equal 2, count, s.results.facets['tees'].inspect
109
+ end
110
+
111
+ should "return aggregated values for _exists_ string query" do
112
+ s = Tire.search('articles-test') do
113
+ facet 'drafts' do
114
+ query { string '_exists_:draft' }
115
+ end
116
+ end
117
+
118
+ count = s.results.facets['drafts']['count']
119
+ assert_equal 1, count, s.results.facets['drafts'].inspect
120
+ end
121
+
122
+ should "return aggregated values for a terms query" do
123
+ s = Tire.search('articles-test') do
124
+ facet 'friends' do
125
+ query { terms :tags, ['ruby', 'python'] }
126
+ end
127
+ end
128
+
129
+ count = s.results.facets['friends']['count']
130
+ assert_equal 2, count, s.results.facets['friends'].inspect
131
+
132
+ s = Tire.search('articles-test') do
133
+ facet 'friends' do
134
+ query { terms :tags, ['ruby', 'python'], :minimum_match => 2 }
135
+ end
136
+ end
137
+
138
+ count = s.results.facets['friends']['count']
139
+ assert_equal 1, count, s.results.facets['friends'].inspect
140
+ end
141
+
94
142
  end
95
143
 
96
144
  end
@@ -81,6 +81,15 @@ module Tire::Search
81
81
  end
82
82
  end
83
83
 
84
+ context "query facet" do
85
+ should "encode facet options" do
86
+ f = Facet.new('q_facet') do
87
+ query { string '_exists_:foo' }
88
+ end
89
+ assert_equal({ :q_facet => { :query => { :query_string => { :query => '_exists_:foo' } } } }.to_json, f.to_json)
90
+ end
91
+ end
92
+
84
93
  end
85
94
 
86
95
  end
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
 
27
27
  # = Library dependencies
28
28
  #
29
- s.add_dependency "rake", ">= 0.8.0"
29
+ s.add_dependency "rake", "~> 0.9.2"
30
30
  s.add_dependency "rest-client", "~> 1.6.0"
31
31
  s.add_dependency "multi_json", "~> 1.0"
32
32
  s.add_dependency "activemodel", "~> 3.0"
metadata CHANGED
@@ -1,238 +1,207 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tire
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 4
9
- version: 0.3.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.5
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Karel Minarik
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-09-29 00:00:00 +02:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rake
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 8
30
- - 0
31
- version: 0.8.0
16
+ requirement: &70362722303360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.2
32
22
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rest-client
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
24
+ version_requirements: *70362722303360
25
+ - !ruby/object:Gem::Dependency
26
+ name: rest-client
27
+ requirement: &70362722302860 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
39
30
  - - ~>
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 1
43
- - 6
44
- - 0
31
+ - !ruby/object:Gem::Version
45
32
  version: 1.6.0
46
33
  type: :runtime
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: multi_json
50
34
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- requirements:
35
+ version_requirements: *70362722302860
36
+ - !ruby/object:Gem::Dependency
37
+ name: multi_json
38
+ requirement: &70362722302360 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
53
41
  - - ~>
54
- - !ruby/object:Gem::Version
55
- segments:
56
- - 1
57
- - 0
58
- version: "1.0"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
59
44
  type: :runtime
60
- version_requirements: *id003
61
- - !ruby/object:Gem::Dependency
62
- name: activemodel
63
45
  prerelease: false
64
- requirement: &id004 !ruby/object:Gem::Requirement
65
- requirements:
46
+ version_requirements: *70362722302360
47
+ - !ruby/object:Gem::Dependency
48
+ name: activemodel
49
+ requirement: &70362722301880 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
66
52
  - - ~>
67
- - !ruby/object:Gem::Version
68
- segments:
69
- - 3
70
- - 0
71
- version: "3.0"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
72
55
  type: :runtime
73
- version_requirements: *id004
74
- - !ruby/object:Gem::Dependency
75
- name: bundler
76
56
  prerelease: false
77
- requirement: &id005 !ruby/object:Gem::Requirement
78
- requirements:
57
+ version_requirements: *70362722301880
58
+ - !ruby/object:Gem::Dependency
59
+ name: bundler
60
+ requirement: &70362722301400 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
79
63
  - - ~>
80
- - !ruby/object:Gem::Version
81
- segments:
82
- - 1
83
- - 0
84
- - 0
64
+ - !ruby/object:Gem::Version
85
65
  version: 1.0.0
86
66
  type: :development
87
- version_requirements: *id005
88
- - !ruby/object:Gem::Dependency
89
- name: yajl-ruby
90
67
  prerelease: false
91
- requirement: &id006 !ruby/object:Gem::Requirement
92
- requirements:
68
+ version_requirements: *70362722301400
69
+ - !ruby/object:Gem::Dependency
70
+ name: yajl-ruby
71
+ requirement: &70362722300940 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
93
74
  - - ~>
94
- - !ruby/object:Gem::Version
95
- segments:
96
- - 0
97
- - 8
98
- - 0
75
+ - !ruby/object:Gem::Version
99
76
  version: 0.8.0
100
77
  type: :development
101
- version_requirements: *id006
102
- - !ruby/object:Gem::Dependency
103
- name: shoulda
104
78
  prerelease: false
105
- requirement: &id007 !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- segments:
110
- - 0
111
- version: "0"
79
+ version_requirements: *70362722300940
80
+ - !ruby/object:Gem::Dependency
81
+ name: shoulda
82
+ requirement: &70362722300540 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
112
88
  type: :development
113
- version_requirements: *id007
114
- - !ruby/object:Gem::Dependency
115
- name: mocha
116
89
  prerelease: false
117
- requirement: &id008 !ruby/object:Gem::Requirement
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- segments:
122
- - 0
123
- version: "0"
90
+ version_requirements: *70362722300540
91
+ - !ruby/object:Gem::Dependency
92
+ name: mocha
93
+ requirement: &70362722300080 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
124
99
  type: :development
125
- version_requirements: *id008
126
- - !ruby/object:Gem::Dependency
127
- name: activerecord
128
100
  prerelease: false
129
- requirement: &id009 !ruby/object:Gem::Requirement
130
- requirements:
101
+ version_requirements: *70362722300080
102
+ - !ruby/object:Gem::Dependency
103
+ name: activerecord
104
+ requirement: &70362722299560 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
131
107
  - - ~>
132
- - !ruby/object:Gem::Version
133
- segments:
134
- - 3
135
- - 0
136
- - 7
108
+ - !ruby/object:Gem::Version
137
109
  version: 3.0.7
138
110
  type: :development
139
- version_requirements: *id009
140
- - !ruby/object:Gem::Dependency
141
- name: mongoid
142
111
  prerelease: false
143
- requirement: &id010 !ruby/object:Gem::Requirement
144
- requirements:
112
+ version_requirements: *70362722299560
113
+ - !ruby/object:Gem::Dependency
114
+ name: mongoid
115
+ requirement: &70362722288980 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
145
118
  - - ~>
146
- - !ruby/object:Gem::Version
147
- segments:
148
- - 2
149
- - 2
150
- - 1
119
+ - !ruby/object:Gem::Version
151
120
  version: 2.2.1
152
121
  type: :development
153
- version_requirements: *id010
154
- - !ruby/object:Gem::Dependency
155
- name: sqlite3
156
122
  prerelease: false
157
- requirement: &id011 !ruby/object:Gem::Requirement
158
- requirements:
159
- - - ">="
160
- - !ruby/object:Gem::Version
161
- segments:
162
- - 0
163
- version: "0"
123
+ version_requirements: *70362722288980
124
+ - !ruby/object:Gem::Dependency
125
+ name: sqlite3
126
+ requirement: &70362722288600 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
164
132
  type: :development
165
- version_requirements: *id011
166
- - !ruby/object:Gem::Dependency
167
- name: supermodel
168
133
  prerelease: false
169
- requirement: &id012 !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- segments:
174
- - 0
175
- version: "0"
134
+ version_requirements: *70362722288600
135
+ - !ruby/object:Gem::Dependency
136
+ name: supermodel
137
+ requirement: &70362722288140 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
176
143
  type: :development
177
- version_requirements: *id012
178
- - !ruby/object:Gem::Dependency
179
- name: sdoc
180
144
  prerelease: false
181
- requirement: &id013 !ruby/object:Gem::Requirement
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- segments:
186
- - 0
187
- version: "0"
145
+ version_requirements: *70362722288140
146
+ - !ruby/object:Gem::Dependency
147
+ name: sdoc
148
+ requirement: &70362722287700 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
188
154
  type: :development
189
- version_requirements: *id013
190
- - !ruby/object:Gem::Dependency
191
- name: rdoc
192
155
  prerelease: false
193
- requirement: &id014 !ruby/object:Gem::Requirement
194
- requirements:
195
- - - ">="
196
- - !ruby/object:Gem::Version
197
- segments:
198
- - 0
199
- version: "0"
156
+ version_requirements: *70362722287700
157
+ - !ruby/object:Gem::Dependency
158
+ name: rdoc
159
+ requirement: &70362722287280 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
200
165
  type: :development
201
- version_requirements: *id014
202
- - !ruby/object:Gem::Dependency
203
- name: rcov
204
166
  prerelease: false
205
- requirement: &id015 !ruby/object:Gem::Requirement
206
- requirements:
207
- - - ">="
208
- - !ruby/object:Gem::Version
209
- segments:
210
- - 0
211
- version: "0"
167
+ version_requirements: *70362722287280
168
+ - !ruby/object:Gem::Dependency
169
+ name: rcov
170
+ requirement: &70362722286860 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
212
176
  type: :development
213
- version_requirements: *id015
214
- - !ruby/object:Gem::Dependency
215
- name: turn
216
177
  prerelease: false
217
- requirement: &id016 !ruby/object:Gem::Requirement
218
- requirements:
219
- - - ">="
220
- - !ruby/object:Gem::Version
221
- segments:
222
- - 0
223
- version: "0"
178
+ version_requirements: *70362722286860
179
+ - !ruby/object:Gem::Dependency
180
+ name: turn
181
+ requirement: &70362722286440 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
224
187
  type: :development
225
- version_requirements: *id016
226
- description: " Tire is a Ruby client for the ElasticSearch search engine/database.\n\n It provides Ruby-like API for fluent communication with the ElasticSearch server\n and blends with ActiveModel class for convenient usage in Rails applications.\n\n It allows to delete and create indices, define mapping for them, supports\n the bulk API, and presents an easy-to-use DSL for constructing your queries.\n\n It has full ActiveRecord/ActiveModel compatibility, allowing you to index\n your models (incrementally upon saving, or in bulk), searching and\n paginating the results.\n\n Please check the documentation at <http://karmi.github.com/tire/>.\n"
188
+ prerelease: false
189
+ version_requirements: *70362722286440
190
+ description: ! " Tire is a Ruby client for the ElasticSearch search engine/database.\n\n
191
+ \ It provides Ruby-like API for fluent communication with the ElasticSearch server\n
192
+ \ and blends with ActiveModel class for convenient usage in Rails applications.\n\n
193
+ \ It allows to delete and create indices, define mapping for them, supports\n the
194
+ bulk API, and presents an easy-to-use DSL for constructing your queries.\n\n It
195
+ has full ActiveRecord/ActiveModel compatibility, allowing you to index\n your
196
+ models (incrementally upon saving, or in bulk), searching and\n paginating the
197
+ results.\n\n Please check the documentation at <http://karmi.github.com/tire/>.\n"
227
198
  email: karmi@karmi.cz
228
199
  executables: []
229
-
230
200
  extensions: []
231
-
232
- extra_rdoc_files:
201
+ extra_rdoc_files:
233
202
  - README.markdown
234
203
  - MIT-LICENSE
235
- files:
204
+ files:
236
205
  - .gitignore
237
206
  - .travis.yml
238
207
  - Gemfile
@@ -324,58 +293,35 @@ files:
324
293
  - test/unit/search_test.rb
325
294
  - test/unit/tire_test.rb
326
295
  - tire.gemspec
327
- has_rdoc: true
328
296
  homepage: http://github.com/karmi/tire
329
297
  licenses: []
330
-
331
- post_install_message: |
332
- ================================================================================
333
-
334
- Please check the documentation at <http://karmi.github.com/tire/>.
335
-
336
- --------------------------------------------------------------------------------
337
-
338
- IMPORTANT CHANGES LATELY:
339
-
340
- 0.3.4
341
- ---------------------------------------------------------
342
- # Added documentation (RDoc annotations and README)
343
- # Kaminari pagination support
344
- # Bugfixes (dependency on ES running, callbacks, bogus exceptions)
345
-
346
-
347
- See the full changelog at <http://github.com/karmi/tire/commits/v0.3.4>.
348
-
349
- --------------------------------------------------------------------------------
350
-
351
- rdoc_options:
298
+ post_install_message: ! "================================================================================\n\n
299
+ \ Please check the documentation at <http://karmi.github.com/tire/>.\n\n--------------------------------------------------------------------------------\n\n
300
+ \ IMPORTANT CHANGES LATELY:\n\n # Added a \"query\" facet for free-form aggregations\n\n\n
301
+ \ See the full changelog at <http://github.com/karmi/tire/commits/v0.3.5>.\n\n--------------------------------------------------------------------------------\n"
302
+ rdoc_options:
352
303
  - --charset=UTF-8
353
- require_paths:
304
+ require_paths:
354
305
  - lib
355
- required_ruby_version: !ruby/object:Gem::Requirement
356
- requirements:
357
- - - ">="
358
- - !ruby/object:Gem::Version
359
- segments:
360
- - 0
361
- version: "0"
362
- required_rubygems_version: !ruby/object:Gem::Requirement
363
- requirements:
364
- - - ">="
365
- - !ruby/object:Gem::Version
366
- segments:
367
- - 1
368
- - 3
369
- - 6
306
+ required_ruby_version: !ruby/object:Gem::Requirement
307
+ none: false
308
+ requirements:
309
+ - - ! '>='
310
+ - !ruby/object:Gem::Version
311
+ version: '0'
312
+ required_rubygems_version: !ruby/object:Gem::Requirement
313
+ none: false
314
+ requirements:
315
+ - - ! '>='
316
+ - !ruby/object:Gem::Version
370
317
  version: 1.3.6
371
318
  requirements: []
372
-
373
319
  rubyforge_project: tire
374
- rubygems_version: 1.3.6
320
+ rubygems_version: 1.8.10
375
321
  signing_key:
376
322
  specification_version: 3
377
323
  summary: Ruby client for ElasticSearch
378
- test_files:
324
+ test_files:
379
325
  - test/fixtures/articles/1.json
380
326
  - test/fixtures/articles/2.json
381
327
  - test/fixtures/articles/3.json