tire-contrib 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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