indextank 0.0.5 → 0.0.6

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.
@@ -5,7 +5,7 @@ directory = File.expand_path(File.dirname(__FILE__))
5
5
  require File.join(directory, 'indextank', 'client')
6
6
 
7
7
  module IndexTank
8
- VERSION = "0.0.4"
8
+ VERSION = "0.0.6"
9
9
 
10
10
  def self.setup_connection(url, &block)
11
11
  @conn = Faraday::Connection.new(:url => url) do |builder|
@@ -7,7 +7,7 @@ module IndexTank
7
7
 
8
8
  def initialize(document_url, docid)
9
9
  @docid = docid
10
- builder = Proc.new { |builder| builder.use ResponseDocument }
10
+ builder = Proc.new { |builder| builder.use DocumentResponseMiddleware }
11
11
  @conn = IndexTank.setup_connection(document_url, &builder)
12
12
  end
13
13
 
@@ -59,22 +59,9 @@ module IndexTank
59
59
 
60
60
  resp.status
61
61
  end
62
- #private
63
- # Handles standard returns status. All methods on documents should return HTTP 200,
64
- # and the errors are 'common' for any other value
65
- #def handle_return_status(status)
66
- # case status
67
- # when 400
68
- # raise InvalidArgument
69
- # when 409
70
- # raise IndexInitializing
71
- # when 404
72
- # raise IndexNotFound
73
- # end
74
- #end
75
62
  end
76
63
 
77
- class ResponseDocument < Faraday::Response::Middleware
64
+ class DocumentResponseMiddleware < Faraday::Response::Middleware
78
65
  def self.register_on_complete(env)
79
66
  env[:response].on_complete do |finished_env|
80
67
  case finished_env[:status]
@@ -85,7 +72,7 @@ module IndexTank
85
72
  when 404
86
73
  raise NonExistentIndex
87
74
  when 400
88
- raise InvalidArgument
75
+ raise InvalidArgument, finished_env[:body]
89
76
  end
90
77
  end
91
78
  end
@@ -8,7 +8,8 @@ module IndexTank
8
8
  @uri = "#{function_url}/#{index}"
9
9
  @index = index
10
10
  @definition = definition
11
- builder = Proc.new { |builder| builder.use ResponseDocument }
11
+ # Function and Document have the same Response statuses .. so borrow DocumentResponseMiddleware
12
+ builder = Proc.new { |builder| builder.use IndexTank::DocumentResponseMiddleware }
12
13
  @conn = IndexTank.setup_connection(@uri, &builder)
13
14
  end
14
15
 
@@ -35,25 +36,4 @@ module IndexTank
35
36
  self.definition == other.definition
36
37
  end
37
38
  end
38
- class ResponseDocument < Faraday::Response::Middleware
39
- def self.register_on_complete(env)
40
- env[:response].on_complete do |finished_env|
41
- case finished_env[:status]
42
- when 401
43
- raise InvalidApiKey
44
- when 409
45
- raise IndexInitializing
46
- when 404
47
- raise NonExistentIndex
48
- when 400
49
- raise InvalidArgument
50
- end
51
- end
52
- end
53
-
54
- def initialize(app)
55
- super
56
- @parser = nil
57
- end
58
- end
59
39
  end
@@ -69,15 +69,60 @@ module IndexTank
69
69
  # for this query
70
70
  # :variables => a hash int => float, with variables that can be later
71
71
  # used in scoring :function
72
+ # :category_filters => a hash to filter the query based on document categories. Keys represent category names.
73
+ # see http://indextank.com/documentation/ruby-client#faceting
74
+ #
75
+ # Example:
76
+ # category_filters => {:size => "big", :price => "expensive"}
77
+ # means that only documents that have "big" as size category and "expensive" as price category
78
+ # will match the query
79
+ # :docvar_filters => a hash with int keys and Array values to filter the query based on document variables.
80
+ # see http://indextank.com/documentation/ruby-client#range_queries
81
+ #
82
+ # Example:
83
+ # docvar_filters = { 1 => [ [2, 3], [5, nil] ]}
84
+ # means that only documents with document variable number 1 between 2 and 3 or bigger than 5
85
+ # will match the query.
86
+ # :function_filters => a hash with int keys and Array values to filter the query based on scoring functions.
87
+ # see http://indextank.com/documentation/ruby-client#range_queries
88
+ #
89
+ # Example:
90
+ # function_filters = { 3 => [ [nil, 2], [5, 7], [8,14] ]}
91
+ # means that only documents whose score calculated by scoring function 3 is lower than 2,
92
+ # between 5 and 7 or between 8 and 14 will match the query.
72
93
  def search(query, options = {})
73
94
  options = {:start => 0, :len => 10 }.merge(options).merge(:q => query)
74
95
  if options[:variables]
75
96
  options[:variables].each_pair { |k, v| options.merge!( :"var#{k}" => v ) }
97
+ options.delete :variables
98
+ end
99
+
100
+ if options[:docvar_filters]
101
+ # go from { 3 => [ [1, 3], [5, nil] ]} to filter_docvar3 => 1:3,5:*
102
+ options[:docvar_filters].each_pair { |k, v|
103
+ rng = v.map { |val|
104
+ raise ArgumentError, "using a range with bound count != 2" unless val.length == 2
105
+ "#{val[0] || '*'}:#{val[1] || '*'}"
106
+ }.join ","
107
+ options.merge!( :"filter_docvar#{k}" => rng )
108
+ }
109
+ options.delete :docvar_filters
110
+ end
111
+
112
+ if options[:function_filters]
113
+ # go from { 2 => [ [1 , 3],[5,8] ]} to filter_function2 => 1:3,5:8
114
+ options[:function_filters].each_pair { |k, v|
115
+ rng = v.map { |val|
116
+ raise ArgumentError, "using a range with bound count != 2" unless val.length == 2
117
+ "#{val[0] || '*'}:#{val[1] || '*'}"
118
+ }.join ","
119
+ options.merge!( :"filter_function#{k}" => rng )
120
+ }
121
+ options.delete :function_filters
76
122
  end
77
123
 
78
124
  if options[:category_filters]
79
125
  options[:category_filters] = options[:category_filters].to_json
80
- p options[:category_filters]
81
126
  end
82
127
 
83
128
  response = @conn.get do |req|
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indextank
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 0
9
- - 5
10
- version: 0.0.5
8
+ - 6
9
+ version: 0.0.6
11
10
  platform: ruby
12
11
  authors:
13
12
  - Santiago Perez
@@ -16,7 +15,7 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-08-24 00:00:00 -03:00
18
+ date: 2011-01-04 00:00:00 -03:00
20
19
  default_executable:
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
@@ -27,7 +26,6 @@ dependencies:
27
26
  requirements:
28
27
  - - "="
29
28
  - !ruby/object:Gem::Version
30
- hash: 7
31
29
  segments:
32
30
  - 1
33
31
  - 4
@@ -43,7 +41,6 @@ dependencies:
43
41
  requirements:
44
42
  - - ">="
45
43
  - !ruby/object:Gem::Version
46
- hash: 62196421
47
44
  segments:
48
45
  - 2
49
46
  - 0
@@ -61,7 +58,6 @@ dependencies:
61
58
  requirements:
62
59
  - - ">="
63
60
  - !ruby/object:Gem::Version
64
- hash: 62196421
65
61
  segments:
66
62
  - 2
67
63
  - 0
@@ -79,7 +75,6 @@ dependencies:
79
75
  requirements:
80
76
  - - "="
81
77
  - !ruby/object:Gem::Version
82
- hash: 33
83
78
  segments:
84
79
  - 0
85
80
  - 10
@@ -95,7 +90,6 @@ dependencies:
95
90
  requirements:
96
91
  - - "="
97
92
  - !ruby/object:Gem::Version
98
- hash: 49
99
93
  segments:
100
94
  - 0
101
95
  - 8
@@ -111,7 +105,6 @@ dependencies:
111
105
  requirements:
112
106
  - - ">="
113
107
  - !ruby/object:Gem::Version
114
- hash: 3
115
108
  segments:
116
109
  - 0
117
110
  version: "0"
@@ -125,7 +118,6 @@ dependencies:
125
118
  requirements:
126
119
  - - "="
127
120
  - !ruby/object:Gem::Version
128
- hash: 17
129
121
  segments:
130
122
  - 0
131
123
  - 3
@@ -141,7 +133,6 @@ dependencies:
141
133
  requirements:
142
134
  - - ">="
143
135
  - !ruby/object:Gem::Version
144
- hash: 3
145
136
  segments:
146
137
  - 0
147
138
  version: "0"
@@ -155,7 +146,6 @@ dependencies:
155
146
  requirements:
156
147
  - - "="
157
148
  - !ruby/object:Gem::Version
158
- hash: 13
159
149
  segments:
160
150
  - 0
161
151
  - 7
@@ -171,7 +161,6 @@ dependencies:
171
161
  requirements:
172
162
  - - "="
173
163
  - !ruby/object:Gem::Version
174
- hash: 11
175
164
  segments:
176
165
  - 1
177
166
  - 4
@@ -215,7 +204,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
215
204
  requirements:
216
205
  - - ">="
217
206
  - !ruby/object:Gem::Version
218
- hash: 3
219
207
  segments:
220
208
  - 0
221
209
  version: "0"
@@ -224,7 +212,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
212
  requirements:
225
213
  - - ">="
226
214
  - !ruby/object:Gem::Version
227
- hash: 3
228
215
  segments:
229
216
  - 0
230
217
  version: "0"