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 +4 -0
- data/lib/tire-contrib/version.rb +1 -1
- data/lib/tire/queries/custom_filters_score.rb +48 -0
- data/lib/tire/queries/custom_filters_score/custom_filters_score.rb +79 -0
- data/test/queries/custom_filters_score/custom_filters_score_test.rb +96 -0
- data/test/rails/logger/log_subscriber_test.rb +2 -2
- metadata +22 -18
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.
|
data/lib/tire-contrib/version.rb
CHANGED
@@ -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
|
6
|
-
require 'tire/rails
|
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.
|
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-
|
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: &
|
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: *
|
25
|
+
version_requirements: *70105226816800
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
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: *
|
36
|
+
version_requirements: *70105226816020
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: turn
|
39
|
-
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: *
|
47
|
+
version_requirements: *70105226815300
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: shoulda
|
50
|
-
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: *
|
58
|
+
version_requirements: *70105226814420
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: mocha
|
61
|
-
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: *
|
69
|
+
version_requirements: *70105226813440
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: activerecord
|
72
|
-
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: *
|
80
|
+
version_requirements: *70105226812980
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: activesupport
|
83
|
-
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: *
|
91
|
+
version_requirements: *70105226812540
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: sqlite3
|
94
|
-
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: *
|
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
|