tire-contrib 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -19,6 +19,10 @@ See specific files and folders inside the `lib/tire` folder for instructions and
19
19
 
20
20
  Adds support for [“more like this”](http://www.elasticsearch.org/guide/reference/query-dsl/mlt-query.html) queries.
21
21
 
22
+ ### Custom Filters Score ###
23
+
24
+ Adds support for [“custom filters score”](http://www.elasticsearch.org/guide/reference/query-dsl/custom-filters-score-query.html) queries.
25
+
22
26
  ### Rails Logger ###
23
27
 
24
28
  Adds support for displaying Tire related statistics in the Rails' log.
@@ -1,5 +1,5 @@
1
1
  module Tire
2
2
  module Contrib
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
@@ -0,0 +1,48 @@
1
+ # Custom Filters Score
2
+ # ==============
3
+ #
4
+ # Author: Jerry Luk <jerryluk@gmail.com>
5
+ #
6
+ #
7
+ # Adds support for "custom_filters_score" queries in Tire DSL.
8
+ #
9
+ # It hooks into the Query class and inserts the custom_filters_score query types.
10
+ #
11
+ #
12
+ # Usage:
13
+ # ------
14
+ #
15
+ # Require the component:
16
+ #
17
+ # require 'tire/queries/custom_filters_score'
18
+ #
19
+ # Example:
20
+ # -------
21
+ #
22
+ # Tire.search 'articles' do
23
+ # query do
24
+ # custom_filters_score do
25
+ # query { term :title, 'Harry Potter' }
26
+ # filter do
27
+ # filter :match_all
28
+ # boost 1.1
29
+ # end
30
+ # filter do
31
+ # filter :term, :author => 'Rowling',
32
+ # script '_score * 2.0'
33
+ # end
34
+ # score_mode 'total'
35
+ # end
36
+ # end
37
+ # end
38
+ #
39
+ # For available options for these queries see:
40
+ #
41
+ # * <http://www.elasticsearch.org/guide/reference/query-dsl/custom-filters-score-query.html>
42
+ #
43
+ #
44
+ require 'tire/queries/custom_filters_score/custom_filters_score'
45
+
46
+ Tire::Search::Query.class_eval do
47
+ include Tire::Search::CustomFiltersScore
48
+ end
@@ -0,0 +1,79 @@
1
+ module Tire
2
+ module Search
3
+ module CustomFiltersScore
4
+
5
+ def custom_filters_score(&block)
6
+ @custom_filters_score = CustomFiltersScoreQuery.new
7
+ block.arity < 1 ? @custom_filters_score.instance_eval(&block) : block.call(@custom_filters_score) if
8
+ block_given?
9
+ @value[:custom_filters_score] = @custom_filters_score.to_hash
10
+ @value
11
+ end
12
+
13
+ class CustomFiltersScoreQuery
14
+ class CustomFilter
15
+ def initialize(&block)
16
+ @value = {}
17
+ block.arity < 1 ? self.instance_eval(&block) : block.call(self) if block_given?
18
+ end
19
+
20
+ def filter(type, *options)
21
+ @value[:filter] = Filter.new(type, *options).to_hash
22
+ @value
23
+ end
24
+
25
+ def boost(value)
26
+ @value[:boost] = value
27
+ @value
28
+ end
29
+
30
+ def script(value)
31
+ @value[:script] = value
32
+ @value
33
+ end
34
+
35
+ def to_hash
36
+ @value
37
+ end
38
+
39
+ def to_json
40
+ to_hash.to_json
41
+ end
42
+ end
43
+
44
+ def initialize(&block)
45
+ @value = {}
46
+ block.arity < 1 ? self.instance_eval(&block) : block.call(self) if block_given?
47
+ end
48
+
49
+ def query(options={}, &block)
50
+ @value[:query] = Query.new(&block).to_hash
51
+ @value
52
+ end
53
+
54
+ def filter(&block)
55
+ custom_filter = CustomFilter.new
56
+ block.arity < 1 ? custom_filter.instance_eval(&block) : block.call(custom_filter) if block_given?
57
+ @value[:filters] ||= []
58
+ @value[:filters] << custom_filter.to_hash
59
+ @value
60
+ end
61
+
62
+ def score_mode(value)
63
+ @value[:score_mode] = value
64
+ @value
65
+ end
66
+
67
+ def to_hash
68
+ @value[:filters] ?
69
+ @value :
70
+ @value.merge(:filters => [CustomFilter.new{ filter(:match_all); boost(1) }.to_hash]) # Needs at least one filter
71
+ end
72
+
73
+ def to_json
74
+ to_hash.to_json
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+ require 'tire'
3
+ require 'tire/queries/custom_filters_score'
4
+
5
+ module Tire
6
+ module Search
7
+ class CustomFiltersScoreTest < Test::Unit::TestCase
8
+ context "CustomFiltersScoreQuery" do
9
+
10
+ should "not raise an error when no block is given" do
11
+ assert_nothing_raised { Query.new.custom_filters_score }
12
+ end
13
+
14
+ should "provides a default filter if no filter is given" do
15
+ query = Query.new.custom_filters_score do
16
+ query { term :foo, 'bar' }
17
+ end
18
+
19
+ query[:custom_filters_score].tap do |f|
20
+ assert_equal( { :term => { :foo => { :term => 'bar' } } }, f[:query].to_hash )
21
+ assert_equal( { :match_all => {} }, f[:filters].first[:filter])
22
+ assert_equal( 1.0, f[:filters].first[:boost])
23
+ end
24
+ end
25
+
26
+ should "properly encode filter with boost" do
27
+ query = Query.new.custom_filters_score do
28
+ query { term :foo, 'bar' }
29
+ filter do
30
+ filter :terms, :tags => ['ruby']
31
+ boost 2.0
32
+ end
33
+ end
34
+
35
+ query[:custom_filters_score].tap do |f|
36
+ assert_equal( { :term => { :foo => { :term => 'bar' } } }, f[:query].to_hash )
37
+ assert_equal( { :tags => ['ruby'] }, f[:filters].first[:filter][:terms])
38
+ assert_equal( 2.0, f[:filters].first[:boost])
39
+ end
40
+ end
41
+
42
+ should "properly encode filter with script" do
43
+ query = Query.new.custom_filters_score do
44
+ query { term :foo, 'bar' }
45
+ filter do
46
+ filter :terms, :tags => ['ruby']
47
+ script '_score * 2.0'
48
+ end
49
+ end
50
+
51
+ query[:custom_filters_score].tap do |f|
52
+ assert_equal( { :term => { :foo => { :term => 'bar' } } }, f[:query].to_hash )
53
+ assert_equal( { :tags => ['ruby'] }, f[:filters].first[:filter][:terms])
54
+ assert_equal( '_score * 2.0', f[:filters].first[:script])
55
+ end
56
+ end
57
+
58
+ should "properly encode multiple filters" do
59
+ query = Query.new.custom_filters_score do
60
+ query { term :foo, 'bar' }
61
+ filter do
62
+ filter :terms, :tags => ['ruby']
63
+ boost 2.0
64
+ end
65
+ filter do
66
+ filter :terms, :tags => ['python']
67
+ script '_score * 2.0'
68
+ end
69
+ end
70
+
71
+ query[:custom_filters_score].tap do |f|
72
+ assert_equal( { :term => { :foo => { :term => 'bar' } } }, f[:query].to_hash )
73
+ assert_equal( { :tags => ['ruby'] }, f[:filters].first[:filter][:terms])
74
+ assert_equal( 2.0, f[:filters].first[:boost])
75
+ assert_equal( { :tags => ['python'] }, f[:filters].last[:filter][:terms])
76
+ assert_equal( '_score * 2.0', f[:filters].last[:script])
77
+ end
78
+ end
79
+
80
+ should "allow setting the score_mode" do
81
+ query = Query.new.custom_filters_score do
82
+ query { term :foo, 'bar' }
83
+ score_mode 'total'
84
+ end
85
+
86
+ query[:custom_filters_score].tap do |f|
87
+ assert_equal( { :term => { :foo => { :term => 'bar' } } }, f[:query].to_hash )
88
+ assert_equal( 'total', f[:score_mode])
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+
95
+ end
96
+ end
@@ -2,8 +2,8 @@ require 'test_helper'
2
2
  require 'active_record'
3
3
  require 'active_support/core_ext/module/aliasing'
4
4
  require 'active_support/log_subscriber/test_helper'
5
- require 'tire/rails-logger/log_subscriber'
6
- require 'tire/rails-logger/instrumentation'
5
+ require 'tire/rails/logger/log_subscriber'
6
+ require 'tire/rails/logger/instrumentation'
7
7
 
8
8
  require File.expand_path('../active_record_article', __FILE__)
9
9
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tire-contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-03-26 00:00:00.000000000 Z
13
+ date: 2012-05-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: tire
17
- requirement: &70240919138540 !ruby/object:Gem::Requirement
17
+ requirement: &70105226816800 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70240919138540
25
+ version_requirements: *70105226816800
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &70240919135160 !ruby/object:Gem::Requirement
28
+ requirement: &70105226816020 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.1.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70240919135160
36
+ version_requirements: *70105226816020
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: turn
39
- requirement: &70240919151640 !ruby/object:Gem::Requirement
39
+ requirement: &70105226815300 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70240919151640
47
+ version_requirements: *70105226815300
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: shoulda
50
- requirement: &70240919149000 !ruby/object:Gem::Requirement
50
+ requirement: &70105226814420 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70240919149000
58
+ version_requirements: *70105226814420
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: mocha
61
- requirement: &70240919148260 !ruby/object:Gem::Requirement
61
+ requirement: &70105226813440 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70240919148260
69
+ version_requirements: *70105226813440
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: activerecord
72
- requirement: &70240919146940 !ruby/object:Gem::Requirement
72
+ requirement: &70105226812980 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70240919146940
80
+ version_requirements: *70105226812980
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activesupport
83
- requirement: &70240919160100 !ruby/object:Gem::Requirement
83
+ requirement: &70105226812540 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: '0'
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *70240919160100
91
+ version_requirements: *70105226812540
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: sqlite3
94
- requirement: &70240919157720 !ruby/object:Gem::Requirement
94
+ requirement: &70105226812020 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,7 +99,7 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *70240919157720
102
+ version_requirements: *70105226812020
103
103
  description:
104
104
  email:
105
105
  - karmi@karmi.cz
@@ -119,6 +119,8 @@ files:
119
119
  - lib/tire-contrib/README.markdown
120
120
  - lib/tire-contrib/version.rb
121
121
  - lib/tire/README.markdown
122
+ - lib/tire/queries/custom_filters_score.rb
123
+ - lib/tire/queries/custom_filters_score/custom_filters_score.rb
122
124
  - lib/tire/queries/more_like_this.rb
123
125
  - lib/tire/queries/more_like_this/more_like_this.rb
124
126
  - lib/tire/rails/logger.rb
@@ -126,6 +128,7 @@ files:
126
128
  - lib/tire/rails/logger/instrumentation.rb
127
129
  - lib/tire/rails/logger/log_subscriber.rb
128
130
  - lib/tire/rails/logger/railtie.rb
131
+ - test/queries/custom_filters_score/custom_filters_score_test.rb
129
132
  - test/queries/more_like_this/more_like_this_test.rb
130
133
  - test/rails/logger/active_record_article.rb
131
134
  - test/rails/logger/log_subscriber_test.rb
@@ -157,6 +160,7 @@ signing_key:
157
160
  specification_version: 3
158
161
  summary: Contributions and additions for the Tire gem
159
162
  test_files:
163
+ - test/queries/custom_filters_score/custom_filters_score_test.rb
160
164
  - test/queries/more_like_this/more_like_this_test.rb
161
165
  - test/rails/logger/active_record_article.rb
162
166
  - test/rails/logger/log_subscriber_test.rb