ferret 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -75,5 +75,13 @@ module Ferret::Analysis
75
75
  end
76
76
  @position_increment = pos_inc
77
77
  end
78
+
79
+ # Returns a string representation of the token with all the attributes.
80
+ def to_s
81
+ buf = "#{term_text}:#{start_offset}->#{end_offset}"
82
+ buf << "(pos_inc=#{@position_increment})" if (@position_increment != 1)
83
+ buf << "(type=#{@type})" if (@type != "word")
84
+ buf
85
+ end
78
86
  end
79
87
  end
@@ -20,16 +20,16 @@ module Ferret::Analysis
20
20
  # An abstract base class for simple regular expression oriented
21
21
  # tokenizers. Very powerful tokenizers can be created using this class as
22
22
  # can be seen from the StandardTokenizer class. Bellow is an example of a
23
- # simple implementation of a LetterTokenizer using an RETokenizer.
23
+ # simple implementation of a LetterTokenizer using an RegExpTokenizer.
24
24
  # Basically, a token is a sequence of alphabetic characters separated by
25
25
  # one or more non-alphabetic characters.
26
26
  #
27
- # class LetterTokenizer < RETokenizer
27
+ # class LetterTokenizer < RegExpTokenizer
28
28
  # def token_re()
29
29
  # /[a-zA-Z]+/
30
30
  # end
31
31
  # end
32
- class RETokenizer < Tokenizer
32
+ class RegExpTokenizer < Tokenizer
33
33
 
34
34
  # Initialize with an IO implementing input such as a file.
35
35
  #
@@ -76,10 +76,10 @@ module Ferret::Analysis
76
76
  # A LetterTokenizer is a tokenizer that divides text at non-letters.
77
77
  # That's to say, it defines tokens as maximal strings of adjacent letters,
78
78
  # as defined by the regular expression _/[a-zA-Z]+/_.
79
- class LetterTokenizer < RETokenizer
79
+ class LetterTokenizer < RegExpTokenizer
80
80
  protected
81
81
  # Collects only characters which satisfy the regular expression
82
- # _/[a-zA-Z]+/_.
82
+ # _/[a-zA-Z]+/_.
83
83
  def token_re()
84
84
  /[a-zA-Z]+/
85
85
  end
@@ -97,7 +97,7 @@ module Ferret::Analysis
97
97
 
98
98
  # A WhiteSpaceTokenizer is a tokenizer that divides text at whiteSpace.
99
99
  # Adjacent sequences of non-WhiteSpace characters form tokens.
100
- class WhiteSpaceTokenizer < RETokenizer
100
+ class WhiteSpaceTokenizer < RegExpTokenizer
101
101
  protected
102
102
  # Collects only characters which are not spaces tabs or carraige returns
103
103
  def token_re()
@@ -1,9 +1,81 @@
1
1
  module Ferret::Index
2
+ # This is a simplified interface to the index. See the TUTORIAL for more
3
+ # information on how to use this class.
2
4
  class Index
3
5
  include Ferret::Store
4
6
  include Ferret::Search
5
7
  include Ferret::Document
6
8
 
9
+ # If you create an Index without any options, it'll simply create an index
10
+ # in memory. But this class is highly configurable and every option that
11
+ # you can supply to IndexWriter and QueryParser, you can also set here.
12
+ #
13
+ # === Options
14
+ #
15
+ # path:: A string representing the path to the index
16
+ # directory. If you are creating the index for the
17
+ # first time the directory will be created if it's
18
+ # missing. You should not choose a directory which
19
+ # contains other files.
20
+ # create_if_missing:: Create the index if no index is found in the
21
+ # specified directory. Otherwise, use the existing
22
+ # index. This defaults to true and has no effect on
23
+ # in memory indexes.
24
+ # create:: Creates the index, even if one already exists.
25
+ # That means any existing index will be deleted.
26
+ # This option defaults to false and has no effect
27
+ # for in memory indexes. It is probably better to
28
+ # use the create_if_missing option.
29
+ # default_field:: This specifies the default field that will be
30
+ # used when you add a simple string to the index
31
+ # using #add_document. This will also be used for
32
+ # default_search_field unless you set it
33
+ # explicitly.
34
+ # default_search_field:: This specifies the field or fields that will be
35
+ # searched by the query parser. You can use a
36
+ # string to specify one field, eg, "title". Or you
37
+ # can specify multiple fields with a String -
38
+ # "title|content" - or with an Array - ["title",
39
+ # "content"]. This defaults to the value passed in
40
+ # for default_field. If default_field is nil then
41
+ # the default is "*" which signifies all fields in
42
+ # the index.
43
+ # analyzer:: Sets the default analyzer for the index. This is
44
+ # used by both the IndexWriter and the QueryParser
45
+ # to tokenize the input. The default is the
46
+ # StandardAnalyzer.
47
+ # dir:: This is an Ferret::Store::Directory object. This
48
+ # can be useful if you have an already existing
49
+ # in-memory index which you'd like to read with
50
+ # this class. If you want to create a new index,
51
+ # you are better off passing in a path.
52
+ # close_dir:: This specifies whether you would this class to
53
+ # close the index directory when this class is
54
+ # closed. This only has any meaning when you pass
55
+ # in a directory object in the *dir* option, in
56
+ # which case it defaults to false. Otherwise it is
57
+ # always true.
58
+ # occur_default:: Set to either BooleanClause::Occur::SHOULD
59
+ # (default) or BooleanClause::Occur::MUST to
60
+ # specify the default Occur operator.
61
+ # wild_lower:: Set to false if you don't want the terms in fuzzy
62
+ # and wild queries to be set to lower case. You
63
+ # should do this if your analyzer doesn't downcase.
64
+ # The default is true.
65
+ # default_slop:: Set the default slop for phrase queries. This
66
+ # defaults to 0.
67
+ #
68
+ # Some examples;
69
+ #
70
+ # index = Index::Index.new(:analyzer => WhiteSpaceAnalyzer.new())
71
+ #
72
+ # index = Index::Index.new(:path => '/path/to/index',
73
+ # :create_if_missing => false)
74
+ #
75
+ # index = Index::Index.new(:dir => directory,
76
+ # :close_dir => false
77
+ # :default_slop => 2)
78
+ #
7
79
  def initialize(options = {})
8
80
  if options[:path]
9
81
  options[:create_if_missing] = true if options[:create_if_missing].nil?
@@ -23,10 +95,13 @@ module Ferret::Index
23
95
  @reader = nil
24
96
  @options.delete(:create) # only want to create the first time if at all
25
97
  @close_dir = @options.delete(:close_dir) || false # we'll hold this here
98
+ @default_search_field = (@options[:default_search_field] || \
99
+ @options[:default_field] || "*")
26
100
  @default_field = @options[:default_field] || ""
27
101
  @open = true
28
102
  end
29
103
 
104
+ # Closes this index by closing its associated reader and writer objects.
30
105
  def close
31
106
  if not @open
32
107
  raise "tried to close an already closed directory"
@@ -63,6 +138,47 @@ module Ferret::Index
63
138
  # the local analyzer if provided. If the document contains more than
64
139
  # IndexWriter::MAX_FIELD_LENGTH terms for a given field, the remainder are
65
140
  # discarded.
141
+ #
142
+ # There are three ways to add a document to the index.
143
+ # To add a document you can simply add a string or an array of strings.
144
+ # This will store all the strings in the "" (ie empty string) field
145
+ # (unless you specify the default_field when you create the index).
146
+ #
147
+ # index << "This is a new document to be indexed"
148
+ # index << ["And here", "is another", "new document", "to be indexed"]
149
+ #
150
+ # But these are pretty simple documents. If this is all you want to index you
151
+ # could probably just use SimpleSearch. So let's give our documents some fields;
152
+ #
153
+ # index << {:title => "Programming Ruby", :content => "blah blah blah"}
154
+ # index << {:title => "Programming Ruby", :content => "yada yada yada"}
155
+ #
156
+ # Or if you are indexing data stored in a database, you'll probably want to
157
+ # store the id;
158
+ #
159
+ # index << {:id => row.id, :title => row.title, :date => row.date}
160
+ #
161
+ # The methods above while store all of the input data as well tokenizing and
162
+ # indexing it. Sometimes we won't want to tokenize (divide the string into
163
+ # tokens) the data. For example, we might want to leave the title as a complete
164
+ # string and only allow searchs for that complete string. Sometimes we won't
165
+ # want to store the data as it's already stored in the database so it'll be a
166
+ # waste to store it in the index. Or perhaps we are doing without a database and
167
+ # using Ferret to store all of our data, in which case we might not want to
168
+ # index it. For example, if we are storing images in the index, we won't want to
169
+ # index them. All of this can be done using Ferret's Ferret::Document module.
170
+ # eg;
171
+ #
172
+ # include Ferret::Document
173
+ # doc = Document.new
174
+ # doc << Field.new("id", row.id, Field::Store::NO, Field::Index::UNTOKENIZED)
175
+ # doc << Field.new("title", row.title, Field::Store::YES, Field::Index::UNTOKENIZED)
176
+ # doc << Field.new("data", row.data, Field::Store::YES, Field::Index::TOKENIZED)
177
+ # doc << Field.new("image", row.image, Field::Store::YES, Field::Index::NO)
178
+ # index << doc
179
+ #
180
+ # You can also compress the data that you are storing or store term vectors with
181
+ # the data. Read more about this in Ferret::Document::Field.
66
182
  def add_document(doc, analyzer = nil)
67
183
  ensure_writer_open()
68
184
  fdoc = nil
@@ -104,14 +220,16 @@ module Ferret::Index
104
220
  # num_docs:: The number of results returned. Default is 10
105
221
  # sort:: an array of SortFields describing how to sort the results.
106
222
  def search(query, options = {})
223
+ ensure_searcher_open()
107
224
  if query.is_a?(String)
108
225
  if @qp.nil?
109
- @qp = Ferret::QueryParser.new(@default_field, options)
226
+ @qp = Ferret::QueryParser.new(@default_search_field, @options)
110
227
  end
228
+ # we need to set this ever time, in case a new field has been added
229
+ @qp.fields = @reader.get_field_names.to_a
111
230
  query = @qp.parse(query)
112
231
  end
113
232
 
114
- ensure_searcher_open()
115
233
  return @searcher.search(query, options)
116
234
  end
117
235
 
@@ -53,12 +53,15 @@ module Index
53
53
  # +dir+, replacing the index already there, if any.
54
54
  # NOTE:: all options are passed in a hash.
55
55
  #
56
- # dir:: the index directory
57
- # analyzer:: the analyzer to use. Defaults to StandardAnalyzer.
58
- # create:: +true+ to create the index or overwrite the existing one
59
- # +false+ to append to the existing index
56
+ # dir:: the index directory
57
+ # analyzer:: the analyzer to use. Defaults to StandardAnalyzer.
58
+ # create:: +true+ to create the index or overwrite the existing
59
+ # one +false+ to append to the existing index
60
60
  # create_if_missing:: +true+ to create the index if it's missing
61
61
  # +false+ to throw an IOError if it's missing
62
+ # close_dir:: This specifies whether you would this class to close
63
+ # the index directory when this class is closed. The
64
+ # default is false.
62
65
  def initialize(dir, options = {})
63
66
  super()
64
67
  create = options[:create]||false
@@ -178,7 +178,7 @@ module Ferret
178
178
  end
179
179
 
180
180
  # See IndexReader#get_field_names
181
- def get_field_names(field_option)
181
+ def get_field_names(field_option = IndexReader::FieldOption::ALL)
182
182
  # maintain a unique set of field names
183
183
  field_set = Set.new
184
184
  @sub_readers.each do |reader|
@@ -188,7 +188,7 @@ module Ferret::Index
188
188
  end
189
189
 
190
190
  # See IndexReader#get_field_names
191
- def get_field_names(field_option)
191
+ def get_field_names(field_option = IndexReader::FieldOption::ALL)
192
192
  field_set = Set.new
193
193
  @field_infos.each do |fi|
194
194
  if (field_option == IndexReader::FieldOption::ALL)
@@ -106,12 +106,12 @@ module Ferret
106
106
  #
107
107
  # Some examples;
108
108
  #
109
- # '+sport:ski -sport:snowboard sport:toboggen'
109
+ # '+sport:ski -sport:snowboard sport:toboggan'
110
110
  # '+ingredient:chocolate +ingredient:strawberries -ingredient:wheat'
111
111
  #
112
112
  # You may also use the boolean operators "AND", "&&", "OR" and "||". eg;
113
113
  #
114
- # 'sport:ski AND NOT sport:snowboard OR sport:toboggen'
114
+ # 'sport:ski AND NOT sport:snowboard OR sport:toboggan'
115
115
  # 'ingredient:chocolate AND ingredient:strawberries AND NOT ingredient:wheat'
116
116
  #
117
117
  # You can set the default operator when you create the query parse.
@@ -128,10 +128,10 @@ module Ferret
128
128
  #
129
129
  # You can also do open ended queries like this;
130
130
  #
131
- # 'date:[20050725|' # all dates >= 20050725
132
- # 'date:{20050725|' # all dates > 20050725
133
- # 'date:|20050905]' # all dates <= 20050905
134
- # 'date:|20050905}' # all dates < 20050905
131
+ # 'date:[20050725>' # all dates >= 20050725
132
+ # 'date:{20050725>' # all dates > 20050725
133
+ # 'date:<20050905]' # all dates <= 20050905
134
+ # 'date:<20050905}' # all dates < 20050905
135
135
  #
136
136
  # Or like this;
137
137
  #
@@ -233,18 +233,26 @@ module Ferret
233
233
  #
234
234
  # default_field:: all queries without a specified query string are run on
235
235
  # this field.
236
- # options:: the following options exist;
237
236
  #
238
- # * *analyzer* the analyzer is used to break phrases up into terms and
239
- # to turn terms in tokens recognized in the index. Analysis::Analyzer
240
- # is the default
241
- # * *occur_default* Set to either BooleanClause::Occur::SHOULD (default)
242
- # or BooleanClause::Occur::MUST to specify the default Occur operator.
243
- # * *wild_lower* Set to false if you don't want the terms in fuzzy and
244
- # wild queries to be set to lower case. You should do this if your
245
- # analyzer doesn't downcase. The default is true.
246
- # * *default_slop* Set the default slop for phrase queries. This defaults
247
- # to 0.
237
+ # options:: the following options exist and should be passed in as a
238
+ # hash. eg;
239
+ #
240
+ # qp = QueryParser.new("*", { :analyzer => WhiteSpaceAnalyzer.new(),
241
+ # :wild_lower => true})
242
+ #
243
+ # === Options
244
+ #
245
+ # analyzer:: The analyzer is used to break phrases up into terms and
246
+ # to turn terms in tokens recognized in the index.
247
+ # Analysis::Analyzer is the default
248
+ # occur_default:: Set to either BooleanClause::Occur::SHOULD (default)
249
+ # or BooleanClause::Occur::MUST to specify the default
250
+ # Occur operator.
251
+ # wild_lower:: Set to false if you don't want the terms in fuzzy and
252
+ # wild queries to be set to lower case. You should do this
253
+ # if your analyzer doesn't downcase. The default is true.
254
+ # default_slop:: Set the default slop for phrase queries. This defaults
255
+ # to 0.
248
256
  def initialize(default_field = "", options = {})
249
257
  end
250
258
 
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
3
  # This file is automatically generated by racc 1.4.4
4
- # from racc grammer file "lib/ferret/query_parser/query_parser.y".
4
+ # from racc grammer file "query_parser.y".
5
5
  #
6
6
 
7
7
  require 'racc/parser'
@@ -11,8 +11,8 @@ module Ferret
11
11
 
12
12
  class QueryParser < Racc::Parser
13
13
 
14
- module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e53', 'lib/ferret/query_parser/query_parser.y', 121
15
- attr_accessor :default_field
14
+ module_eval <<'..end query_parser.y modeval..id2aa118b008', 'query_parser.y', 126
15
+ attr_accessor :default_field, :fields
16
16
 
17
17
  # true if you want to downcase wild card queries. This is set to try by
18
18
  # default.
@@ -21,13 +21,17 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
21
21
  def wild_lower?() @wild_lower end
22
22
 
23
23
 
24
- def initialize(default_field = "", options = {})
24
+ def initialize(default_field = "*", options = {})
25
25
  @yydebug = true
26
+ if default_field.is_a?(String) and default_field.index("|")
27
+ default_field = default_field.split("|")
28
+ end
26
29
  @field = @default_field = default_field
27
30
  @analyzer = options[:analyzer] || Analysis::Analyzer.new
28
31
  @wild_lower = options[:wild_lower].nil? ? true : options[:wild_lower]
29
32
  @occur_default = options[:occur_default] || BooleanClause::Occur::SHOULD
30
33
  @default_slop = options[:default_slop] || 0
34
+ @fields = options[:fields]||[]
31
35
  end
32
36
 
33
37
  RESERVED = {
@@ -156,43 +160,47 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
156
160
  return new_str.pack("c*")
157
161
  end
158
162
 
159
- def get_range_query(start_word, end_word, inc_upper, inc_lower)
160
- return RangeQuery.new(@field, start_word, end_word, inc_upper, inc_lower)
163
+ def get_range_query(field, start_word, end_word, inc_upper, inc_lower)
164
+ RangeQuery.new(field, start_word, end_word, inc_upper, inc_lower)
161
165
  end
162
166
 
163
- def get_term_query(word)
167
+ def get_term_query(field, word)
164
168
  tokens = []
165
- stream = @analyzer.token_stream(@field, word)
169
+ stream = @analyzer.token_stream(field, word)
166
170
  while token = stream.next
167
171
  tokens << token
168
172
  end
169
173
  if tokens.length == 0
170
174
  return nil
171
175
  elsif tokens.length == 1
172
- return TermQuery.new(Term.new(@field, tokens[0].term_text))
176
+ return TermQuery.new(Term.new(field, tokens[0].term_text))
173
177
  else
174
178
  pq = PhraseQuery.new()
175
179
  tokens.each do |token|
176
- pq.add(Term.new(@field, token.term_text), nil, token.position_increment)
180
+ pq.add(Term.new(field, token.term_text), nil, token.position_increment)
177
181
  end
178
182
  return pq
179
183
  end
180
184
  end
181
185
 
182
- def get_fuzzy_query(word, min_sim = nil)
186
+ def get_fuzzy_query(field, word, min_sim = nil)
183
187
  tokens = []
184
- stream = @analyzer.token_stream(@field, word)
188
+ stream = @analyzer.token_stream(field, word)
185
189
  if token = stream.next # only makes sense to look at one term for fuzzy
186
190
  if min_sim
187
- return FuzzyQuery.new(Term.new(@field, token.term_text), min_sim.to_f)
191
+ return FuzzyQuery.new(Term.new(field, token.term_text), min_sim.to_f)
188
192
  else
189
- return FuzzyQuery.new(Term.new(@field, token.term_text))
193
+ return FuzzyQuery.new(Term.new(field, token.term_text))
190
194
  end
191
195
  else
192
196
  return nil
193
197
  end
194
198
  end
195
199
 
200
+ def get_wild_query(field, regexp)
201
+ WildcardQuery.new(Term.new(field, regexp))
202
+ end
203
+
196
204
  def add_multi_word(words, word)
197
205
  last_word = words[-1]
198
206
  if not last_word.is_a?(Array)
@@ -202,7 +210,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
202
210
  return words
203
211
  end
204
212
 
205
- def get_normal_phrase_query(positions)
213
+ def get_normal_phrase_query(field, positions)
206
214
  pq = PhraseQuery.new()
207
215
  pq.slop = @default_slop
208
216
  pos_inc = 0
@@ -212,13 +220,13 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
212
220
  pos_inc += 1
213
221
  next
214
222
  end
215
- stream = @analyzer.token_stream(@field, position)
223
+ stream = @analyzer.token_stream(field, position)
216
224
  tokens = []
217
225
  while token = stream.next
218
226
  tokens << token
219
227
  end
220
228
  tokens.each do |token|
221
- pq.add(Term.new(@field, token.term_text), nil,
229
+ pq.add(Term.new(field, token.term_text), nil,
222
230
  token.position_increment + pos_inc)
223
231
  pos_inc = 0
224
232
  end
@@ -226,7 +234,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
226
234
  return pq
227
235
  end
228
236
 
229
- def get_multi_phrase_query(positions)
237
+ def get_multi_phrase_query(field, positions)
230
238
  mpq = MultiPhraseQuery.new()
231
239
  mpq.slop = @default_slop
232
240
  pos_inc = 0
@@ -240,21 +248,21 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
240
248
  position.compact! # it doesn't make sense to have an empty spot here
241
249
  terms = []
242
250
  position.each do |word|
243
- stream = @analyzer.token_stream(@field, word)
251
+ stream = @analyzer.token_stream(field, word)
244
252
  if token = stream.next # only put one term per word
245
- terms << Term.new(@field, token.term_text)
253
+ terms << Term.new(field, token.term_text)
246
254
  end
247
255
  end
248
256
  mpq.add(terms, nil, pos_inc + 1) # must go at least one forward
249
257
  pos_inc = 0
250
258
  else
251
- stream = @analyzer.token_stream(@field, position)
259
+ stream = @analyzer.token_stream(field, position)
252
260
  tokens = []
253
261
  while token = stream.next
254
262
  tokens << token
255
263
  end
256
264
  tokens.each do |token|
257
- mpq.add([Term.new(@field, token.term_text)], nil,
265
+ mpq.add([Term.new(field, token.term_text)], nil,
258
266
  token.position_increment + pos_inc)
259
267
  pos_inc = 0
260
268
  end
@@ -265,7 +273,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
265
273
 
266
274
  def get_phrase_query(positions, slop = nil)
267
275
  if positions.size == 1 and not positions[0].is_a?(Array)
268
- return get_term_query(words[0])
276
+ return _get_term_query(positions[0])
269
277
  end
270
278
 
271
279
  multi_phrase = false
@@ -278,14 +286,16 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
278
286
  end
279
287
  end
280
288
 
281
- q = nil
282
- if not multi_phrase
283
- q = get_normal_phrase_query(positions.flatten)
284
- else
285
- q = get_multi_phrase_query(positions)
289
+ return do_multiple_fields() do |field|
290
+ q = nil
291
+ if not multi_phrase
292
+ q = get_normal_phrase_query(field, positions.flatten)
293
+ else
294
+ q = get_multi_phrase_query(field, positions)
295
+ end
296
+ q.slop = slop if slop
297
+ next q
286
298
  end
287
- q.slop = slop if slop
288
- return q
289
299
  end
290
300
 
291
301
  def add_and_clause(clauses, clause)
@@ -323,7 +333,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
323
333
  return clauses[0].query
324
334
  end
325
335
  bq = BooleanQuery.new()
326
- clauses.each {|clause| bq << clause }
336
+ clauses.each {|clause| bq << clause }
327
337
  return bq
328
338
  end
329
339
 
@@ -332,131 +342,171 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e5
332
342
  return BooleanClause.new(query, occur)
333
343
  end
334
344
 
335
- ..end lib/ferret/query_parser/query_parser.y modeval..id4dd1430e53
345
+ def do_multiple_fields()
346
+ # set @field to all fields if @field is the multi-field operator
347
+ @field = @fields if @field.is_a?(String) and @field == "*"
348
+ if @field.is_a?(String)
349
+ return yield(@field)
350
+ elsif @field.size == 1
351
+ return yield(@field[0])
352
+ else
353
+ bq = BooleanQuery.new()
354
+ @field.each do |field|
355
+ q = yield(field)
356
+ bq << BooleanClause.new(q) if q
357
+ end
358
+ return bq
359
+ end
360
+ end
361
+
362
+ def method_missing(meth, *args)
363
+ if meth.to_s =~ /_(get_[a-z_]+_query)/
364
+ do_multiple_fields() do |field|
365
+ send($1, *([field] + args))
366
+ end
367
+ else
368
+ raise NoMethodError.new("No such method #{meth} in #{self.class}", meth, args)
369
+ end
370
+ end
371
+
372
+
373
+ ..end query_parser.y modeval..id2aa118b008
336
374
 
337
375
  ##### racc 1.4.4 generates ###
338
376
 
339
377
  racc_reduce_table = [
340
378
  0, 0, :racc_error,
341
- 1, 25, :_reduce_1,
342
- 1, 26, :_reduce_2,
343
- 3, 26, :_reduce_3,
344
- 3, 26, :_reduce_4,
345
- 2, 26, :_reduce_5,
346
- 2, 27, :_reduce_6,
347
- 2, 27, :_reduce_7,
348
- 1, 27, :_reduce_8,
379
+ 1, 26, :_reduce_1,
380
+ 1, 27, :_reduce_2,
381
+ 3, 27, :_reduce_3,
382
+ 3, 27, :_reduce_4,
383
+ 2, 27, :_reduce_5,
384
+ 2, 28, :_reduce_6,
385
+ 2, 28, :_reduce_7,
386
+ 1, 28, :_reduce_8,
387
+ 1, 30, :_reduce_none,
388
+ 3, 30, :_reduce_10,
389
+ 1, 29, :_reduce_none,
390
+ 3, 29, :_reduce_12,
391
+ 1, 29, :_reduce_none,
392
+ 1, 29, :_reduce_none,
393
+ 1, 29, :_reduce_none,
349
394
  1, 29, :_reduce_none,
350
- 3, 29, :_reduce_10,
351
- 1, 28, :_reduce_none,
352
- 3, 28, :_reduce_12,
353
- 1, 28, :_reduce_none,
354
- 1, 28, :_reduce_none,
355
- 1, 28, :_reduce_none,
356
- 1, 28, :_reduce_none,
357
- 1, 30, :_reduce_17,
358
- 3, 30, :_reduce_18,
359
- 2, 30, :_reduce_19,
360
- 1, 34, :_reduce_20,
361
- 0, 36, :_reduce_21,
362
- 4, 31, :_reduce_22,
363
- 1, 35, :_reduce_23,
364
- 3, 32, :_reduce_24,
395
+ 1, 31, :_reduce_17,
396
+ 3, 31, :_reduce_18,
397
+ 2, 31, :_reduce_19,
398
+ 1, 35, :_reduce_20,
399
+ 0, 37, :_reduce_21,
400
+ 4, 32, :_reduce_22,
401
+ 0, 38, :_reduce_23,
402
+ 0, 39, :_reduce_24,
365
403
  5, 32, :_reduce_25,
366
- 2, 32, :_reduce_26,
367
- 4, 32, :_reduce_27,
368
- 1, 37, :_reduce_28,
369
- 2, 37, :_reduce_29,
370
- 3, 37, :_reduce_30,
371
- 3, 37, :_reduce_31,
372
- 4, 33, :_reduce_32,
373
- 4, 33, :_reduce_33,
374
- 4, 33, :_reduce_34,
375
- 4, 33, :_reduce_35,
376
- 3, 33, :_reduce_36,
377
- 3, 33, :_reduce_37,
378
- 3, 33, :_reduce_38,
379
- 3, 33, :_reduce_39,
380
- 2, 33, :_reduce_40,
381
- 3, 33, :_reduce_41,
382
- 3, 33, :_reduce_42,
383
- 2, 33, :_reduce_43 ]
384
-
385
- racc_reduce_n = 44
386
-
387
- racc_shift_n = 73
404
+ 1, 36, :_reduce_26,
405
+ 3, 36, :_reduce_27,
406
+ 3, 33, :_reduce_28,
407
+ 5, 33, :_reduce_29,
408
+ 2, 33, :_reduce_30,
409
+ 4, 33, :_reduce_31,
410
+ 1, 40, :_reduce_32,
411
+ 2, 40, :_reduce_33,
412
+ 3, 40, :_reduce_34,
413
+ 3, 40, :_reduce_35,
414
+ 4, 34, :_reduce_36,
415
+ 4, 34, :_reduce_37,
416
+ 4, 34, :_reduce_38,
417
+ 4, 34, :_reduce_39,
418
+ 3, 34, :_reduce_40,
419
+ 3, 34, :_reduce_41,
420
+ 3, 34, :_reduce_42,
421
+ 3, 34, :_reduce_43,
422
+ 2, 34, :_reduce_44,
423
+ 3, 34, :_reduce_45,
424
+ 3, 34, :_reduce_46,
425
+ 2, 34, :_reduce_47 ]
426
+
427
+ racc_reduce_n = 48
428
+
429
+ racc_shift_n = 78
388
430
 
389
431
  racc_action_table = [
390
- 7, 10, 61, 47, 38, 36, 48, 21, 3, 41,
391
- 60, 6, 9, 12, 14, 16, 18, 37, 35, 1,
392
- 7, 10, 33, 34, 58, 59, 40, 21, 3, 45,
393
- -23, 6, 9, 12, 14, 16, 18, 7, 10, 1,
394
- 55, 42, 30, 56, 21, 3, 44, 28, 6, 9,
395
- 12, 14, 16, 18, 43, 57, 1, 7, 10, 33,
396
- 34, 70, 71, 39, 21, 3, 63, 64, 6, 9,
397
- 12, 14, 16, 18, 7, 10, 1, 27, 62, 25,
398
- 66, 21, 3, 67, 68, 6, 9, 12, 14, 16,
399
- 18, 7, 10, 1, 69, 23, 72, nil, 21, 3,
400
- nil, nil, 6, 9, 12, 14, 16, 18, 21, 3,
401
- 1, nil, 6, 9, 12, 14, 16, 18, 21, 3,
402
- 1, nil, 6, 9, 12, 14, 16, 18, 21, 3,
403
- 1, nil, 6, 9, 12, 14, 16, 18, 52, nil,
404
- 1, nil, nil, 49, 50, nil, 51 ]
432
+ 8, 10, 60, 59, 75, 74, 50, 21, 2, 25,
433
+ -26, 7, 9, 41, 13, 15, 17, 19, 8, 10,
434
+ 3, 43, 64, 26, -26, 21, 2, 40, 38, 7,
435
+ 9, 63, 13, 15, 17, 19, 8, 10, 3, 36,
436
+ 46, 53, 37, 21, 2, 49, 34, 7, 9, 45,
437
+ 13, 15, 17, 19, 58, 57, 3, 8, 10, 31,
438
+ 33, 54, 55, 56, 21, 2, 44, 48, 7, 9,
439
+ 61, 13, 15, 17, 19, 67, 66, 3, 8, 10,
440
+ 31, 33, 62, 42, 65, 21, 2, 39, 30, 7,
441
+ 9, 70, 13, 15, 17, 19, 8, 10, 3, 71,
442
+ 72, 73, 24, 21, 2, 77, nil, 7, 9, nil,
443
+ 13, 15, 17, 19, 21, 2, 3, nil, 7, 9,
444
+ nil, 13, 15, 17, 19, 21, 2, 3, nil, 7,
445
+ 9, nil, 13, 15, 17, 19, 21, 2, 3, nil,
446
+ 7, 9, nil, 13, 15, 17, 19, 21, 2, 3,
447
+ nil, 7, 9, nil, 13, 15, 17, 19, nil, nil,
448
+ 3 ]
405
449
 
406
450
  racc_action_check = [
407
- 0, 0, 41, 27, 14, 12, 28, 0, 0, 18,
408
- 41, 0, 0, 0, 0, 0, 0, 14, 12, 0,
409
- 24, 24, 24, 24, 40, 40, 16, 24, 24, 24,
410
- 21, 24, 24, 24, 24, 24, 24, 3, 3, 24,
411
- 35, 21, 9, 37, 3, 3, 23, 9, 3, 3,
412
- 3, 3, 3, 3, 23, 39, 3, 11, 11, 11,
413
- 11, 61, 61, 15, 11, 11, 44, 44, 11, 11,
414
- 11, 11, 11, 11, 34, 34, 11, 8, 42, 5,
415
- 48, 34, 34, 49, 50, 34, 34, 34, 34, 34,
416
- 34, 33, 33, 34, 51, 1, 67, nil, 33, 33,
417
- nil, nil, 33, 33, 33, 33, 33, 33, 10, 10,
418
- 33, nil, 10, 10, 10, 10, 10, 10, 25, 25,
419
- 10, nil, 25, 25, 25, 25, 25, 25, 7, 7,
420
- 25, nil, 7, 7, 7, 7, 7, 7, 29, nil,
421
- 7, nil, nil, 29, 29, nil, 29 ]
451
+ 0, 0, 38, 38, 64, 64, 30, 0, 0, 6,
452
+ 21, 0, 0, 17, 0, 0, 0, 0, 2, 2,
453
+ 0, 21, 42, 6, 21, 2, 2, 17, 15, 2,
454
+ 2, 42, 2, 2, 2, 2, 33, 33, 2, 13,
455
+ 24, 34, 15, 33, 33, 28, 13, 33, 33, 24,
456
+ 33, 33, 33, 33, 37, 35, 33, 23, 23, 23,
457
+ 23, 35, 35, 35, 23, 23, 23, 26, 23, 23,
458
+ 39, 23, 23, 23, 23, 46, 46, 23, 12, 12,
459
+ 12, 12, 40, 19, 43, 12, 12, 16, 11, 12,
460
+ 12, 53, 12, 12, 12, 12, 31, 31, 12, 54,
461
+ 55, 56, 3, 31, 31, 72, nil, 31, 31, nil,
462
+ 31, 31, 31, 31, 49, 49, 31, nil, 49, 49,
463
+ nil, 49, 49, 49, 49, 25, 25, 49, nil, 25,
464
+ 25, nil, 25, 25, 25, 25, 8, 8, 25, nil,
465
+ 8, 8, nil, 8, 8, 8, 8, 10, 10, 8,
466
+ nil, 10, 10, nil, 10, 10, 10, 10, nil, nil,
467
+ 10 ]
422
468
 
423
469
  racc_action_pointer = [
424
- -3, 85, nil, 34, nil, 77, nil, 118, 77, 32,
425
- 98, 54, -5, nil, -6, 54, 16, nil, -1, nil,
426
- nil, 28, nil, 36, 17, 108, nil, 3, -7, 128,
427
- nil, nil, nil, 88, 71, 30, nil, 33, nil, 45,
428
- 4, -8, 68, nil, 46, nil, nil, nil, 70, 70,
429
- 67, 84, nil, nil, nil, nil, nil, nil, nil, nil,
430
- nil, 41, nil, nil, nil, nil, nil, 86, nil, nil,
431
- nil, nil, nil ]
470
+ -3, nil, 15, 92, nil, nil, 7, nil, 126, nil,
471
+ 137, 88, 75, 29, nil, 18, 78, 3, nil, 73,
472
+ nil, 8, nil, 54, 30, 115, 57, nil, 43, nil,
473
+ 6, 93, nil, 33, 28, 45, nil, 44, -19, 60,
474
+ 72, nil, 12, 74, nil, nil, 54, nil, nil, 104,
475
+ nil, nil, nil, 81, 89, 87, 82, nil, nil, nil,
476
+ nil, nil, nil, nil, -17, nil, nil, nil, nil, nil,
477
+ nil, nil, 95, nil, nil, nil, nil, nil ]
432
478
 
433
479
  racc_action_default = [
434
- -44, -44, -15, -44, -16, -44, -20, -44, -44, -44,
435
- -44, -1, -44, -2, -44, -9, -44, -8, -44, -11,
436
- -13, -17, -14, -44, -44, -44, -6, -44, -26, -44,
437
- -28, -7, -5, -44, -44, -44, -40, -44, -43, -44,
438
- -44, -44, -19, -39, -44, -12, -21, 73, -44, -24,
439
- -44, -44, -29, -3, -4, -41, -42, -10, -37, -36,
440
- -38, -44, -18, -34, -35, -22, -27, -44, -30, -31,
441
- -32, -33, -25 ]
480
+ -48, -14, -48, -48, -15, -16, -48, -20, -48, -23,
481
+ -48, -48, -1, -48, -2, -48, -9, -48, -8, -48,
482
+ -11, -17, -13, -48, -48, -48, -48, -6, -48, -7,
483
+ -48, -48, -5, -48, -30, -48, -32, -48, -44, -48,
484
+ -48, -47, -48, -19, -12, -43, -48, -21, -27, -48,
485
+ 78, -3, -4, -48, -48, -28, -48, -33, -45, -40,
486
+ -41, -10, -46, -42, -48, -18, -39, -38, -22, -24,
487
+ -31, -35, -48, -34, -37, -36, -25, -29 ]
442
488
 
443
489
  racc_goto_table = [
444
- 32, 26, 11, 8, 31, 24, 65, 29, nil, nil,
445
- nil, nil, nil, 32, nil, nil, nil, nil, nil, 46,
446
- nil, nil, 53, 54 ]
490
+ 27, 32, 29, 12, 68, 23, 11, 28, 76, 35,
491
+ nil, nil, 32, nil, nil, nil, nil, 47, nil, nil,
492
+ 51, nil, 52, nil, nil, nil, nil, nil, nil, nil,
493
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
494
+ nil, 69 ]
447
495
 
448
496
  racc_goto_check = [
449
- 3, 4, 2, 1, 4, 2, 12, 13, nil, nil,
450
- nil, nil, nil, 3, nil, nil, nil, nil, nil, 4,
451
- nil, nil, 3, 3 ]
497
+ 4, 3, 4, 2, 12, 2, 1, 13, 14, 15,
498
+ nil, nil, 3, nil, nil, nil, nil, 4, nil, nil,
499
+ 3, nil, 3, nil, nil, nil, nil, nil, nil, nil,
500
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
501
+ nil, 4 ]
452
502
 
453
503
  racc_goto_pointer = [
454
- nil, 3, 2, -11, -6, nil, nil, nil, nil, nil,
455
- nil, nil, -40, -2 ]
504
+ nil, 6, 3, -11, -8, nil, nil, nil, nil, nil,
505
+ nil, nil, -43, -2, -61, -4 ]
456
506
 
457
507
  racc_goto_default = [
458
- nil, nil, nil, 13, 15, 17, 19, 20, 22, 2,
459
- 4, 5, nil, nil ]
508
+ nil, nil, nil, 14, 16, 18, 20, 22, 1, 4,
509
+ 5, 6, nil, nil, nil, nil ]
460
510
 
461
511
  racc_token_table = {
462
512
  false => 0,
@@ -474,19 +524,20 @@ racc_token_table = {
474
524
  ")" => 12,
475
525
  "~" => 13,
476
526
  :WILD_STRING => 14,
477
- "\"" => 15,
478
- "<" => 16,
479
- ">" => 17,
480
- "|" => 18,
481
- "[" => 19,
482
- "]" => 20,
483
- "}" => 21,
484
- "{" => 22,
485
- "=" => 23 }
527
+ "*" => 15,
528
+ "|" => 16,
529
+ "\"" => 17,
530
+ "<" => 18,
531
+ ">" => 19,
532
+ "[" => 20,
533
+ "]" => 21,
534
+ "}" => 22,
535
+ "{" => 23,
536
+ "=" => 24 }
486
537
 
487
538
  racc_use_result_var = false
488
539
 
489
- racc_nt_base = 24
540
+ racc_nt_base = 25
490
541
 
491
542
  Racc_arg = [
492
543
  racc_action_table,
@@ -520,10 +571,11 @@ Racc_token_to_s_table = [
520
571
  '")"',
521
572
  '"~"',
522
573
  'WILD_STRING',
574
+ '"*"',
575
+ '"|"',
523
576
  '"\""',
524
577
  '"<"',
525
578
  '">"',
526
- '"|"',
527
579
  '"["',
528
580
  '"]"',
529
581
  '"}"',
@@ -540,8 +592,10 @@ Racc_token_to_s_table = [
540
592
  'phrase_query',
541
593
  'range_query',
542
594
  'wild_query',
543
- 'field_name',
595
+ 'field',
544
596
  '@1',
597
+ '@2',
598
+ '@3',
545
599
  'phrase_words']
546
600
 
547
601
  Racc_debug_parser = false
@@ -550,49 +604,49 @@ Racc_debug_parser = false
550
604
 
551
605
  # reduce 0 omitted
552
606
 
553
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 19
607
+ module_eval <<'.,.,', 'query_parser.y', 19
554
608
  def _reduce_1( val, _values)
555
609
  get_boolean_query(val[0])
556
610
  end
557
611
  .,.,
558
612
 
559
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 24
613
+ module_eval <<'.,.,', 'query_parser.y', 24
560
614
  def _reduce_2( val, _values)
561
615
  [val[0]]
562
616
  end
563
617
  .,.,
564
618
 
565
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 28
619
+ module_eval <<'.,.,', 'query_parser.y', 28
566
620
  def _reduce_3( val, _values)
567
621
  add_and_clause(val[0], val[2])
568
622
  end
569
623
  .,.,
570
624
 
571
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 32
625
+ module_eval <<'.,.,', 'query_parser.y', 32
572
626
  def _reduce_4( val, _values)
573
627
  add_or_clause(val[0], val[2])
574
628
  end
575
629
  .,.,
576
630
 
577
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 36
631
+ module_eval <<'.,.,', 'query_parser.y', 36
578
632
  def _reduce_5( val, _values)
579
633
  add_default_clause(val[0], val[1])
580
634
  end
581
635
  .,.,
582
636
 
583
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 41
637
+ module_eval <<'.,.,', 'query_parser.y', 41
584
638
  def _reduce_6( val, _values)
585
639
  get_boolean_clause(val[1], BooleanClause::Occur::MUST)
586
640
  end
587
641
  .,.,
588
642
 
589
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 45
643
+ module_eval <<'.,.,', 'query_parser.y', 45
590
644
  def _reduce_7( val, _values)
591
645
  get_boolean_clause(val[1], BooleanClause::Occur::MUST_NOT)
592
646
  end
593
647
  .,.,
594
648
 
595
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 49
649
+ module_eval <<'.,.,', 'query_parser.y', 49
596
650
  def _reduce_8( val, _values)
597
651
  get_boolean_clause(val[0], BooleanClause::Occur::SHOULD)
598
652
  end
@@ -600,7 +654,7 @@ module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 49
600
654
 
601
655
  # reduce 9 omitted
602
656
 
603
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 51
657
+ module_eval <<'.,.,', 'query_parser.y', 51
604
658
  def _reduce_10( val, _values)
605
659
  val[0].boost = val[2].to_f; return val[0]
606
660
  end
@@ -608,7 +662,7 @@ module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 51
608
662
 
609
663
  # reduce 11 omitted
610
664
 
611
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 58
665
+ module_eval <<'.,.,', 'query_parser.y', 58
612
666
  def _reduce_12( val, _values)
613
667
  get_boolean_query(val[1])
614
668
  end
@@ -622,165 +676,189 @@ module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 58
622
676
 
623
677
  # reduce 16 omitted
624
678
 
625
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 67
679
+ module_eval <<'.,.,', 'query_parser.y', 67
626
680
  def _reduce_17( val, _values)
627
- get_term_query(val[0])
681
+ _get_term_query(val[0])
628
682
  end
629
683
  .,.,
630
684
 
631
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 71
685
+ module_eval <<'.,.,', 'query_parser.y', 71
632
686
  def _reduce_18( val, _values)
633
- get_fuzzy_query(val[0], val[2])
687
+ _get_fuzzy_query(val[0], val[2])
634
688
  end
635
689
  .,.,
636
690
 
637
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 75
691
+ module_eval <<'.,.,', 'query_parser.y', 75
638
692
  def _reduce_19( val, _values)
639
- get_fuzzy_query(val[0])
693
+ _get_fuzzy_query(val[0])
640
694
  end
641
695
  .,.,
642
696
 
643
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 80
697
+ module_eval <<'.,.,', 'query_parser.y', 80
644
698
  def _reduce_20( val, _values)
645
- WildcardQuery.new(Term.new(@field, val[0]))
699
+ _get_wild_query(val[0])
646
700
  end
647
701
  .,.,
648
702
 
649
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 81
703
+ module_eval <<'.,.,', 'query_parser.y', 81
650
704
  def _reduce_21( val, _values)
651
705
  @field = @default_field
652
706
  end
653
707
  .,.,
654
708
 
655
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 85
709
+ module_eval <<'.,.,', 'query_parser.y', 85
656
710
  def _reduce_22( val, _values)
657
711
  val[2]
658
712
  end
659
713
  .,.,
660
714
 
661
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 86
715
+ module_eval <<'.,.,', 'query_parser.y', 85
662
716
  def _reduce_23( val, _values)
663
- @field = val[0]
717
+ @field = "*"
664
718
  end
665
719
  .,.,
666
720
 
667
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 92
721
+ module_eval <<'.,.,', 'query_parser.y', 85
668
722
  def _reduce_24( val, _values)
669
- get_phrase_query(val[1])
723
+ @field = @default_field
670
724
  end
671
725
  .,.,
672
726
 
673
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 96
727
+ module_eval <<'.,.,', 'query_parser.y', 89
674
728
  def _reduce_25( val, _values)
675
- get_phrase_query(val[1], val[4].to_i)
729
+ val[3]
676
730
  end
677
731
  .,.,
678
732
 
679
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 96
733
+ module_eval <<'.,.,', 'query_parser.y', 90
680
734
  def _reduce_26( val, _values)
681
- nil
735
+ @field = [val[0]]
682
736
  end
683
737
  .,.,
684
738
 
685
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 97
739
+ module_eval <<'.,.,', 'query_parser.y', 91
686
740
  def _reduce_27( val, _values)
687
- nil
741
+ @field = val[0] += [val[2]]
688
742
  end
689
743
  .,.,
690
744
 
691
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 99
745
+ module_eval <<'.,.,', 'query_parser.y', 97
692
746
  def _reduce_28( val, _values)
693
- [val[0]]
747
+ get_phrase_query(val[1])
694
748
  end
695
749
  .,.,
696
750
 
697
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 100
751
+ module_eval <<'.,.,', 'query_parser.y', 101
698
752
  def _reduce_29( val, _values)
699
- val[0] << val[1]
753
+ get_phrase_query(val[1], val[4].to_i)
700
754
  end
701
755
  .,.,
702
756
 
703
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 101
757
+ module_eval <<'.,.,', 'query_parser.y', 101
704
758
  def _reduce_30( val, _values)
705
- val[0] << nil
759
+ nil
706
760
  end
707
761
  .,.,
708
762
 
709
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 102
763
+ module_eval <<'.,.,', 'query_parser.y', 102
710
764
  def _reduce_31( val, _values)
711
- add_multi_word(val[0], val[2])
765
+ nil
712
766
  end
713
767
  .,.,
714
768
 
715
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 104
769
+ module_eval <<'.,.,', 'query_parser.y', 104
716
770
  def _reduce_32( val, _values)
717
- get_range_query(val[1], val[2], true, true)
771
+ [val[0]]
718
772
  end
719
773
  .,.,
720
774
 
721
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 105
775
+ module_eval <<'.,.,', 'query_parser.y', 105
722
776
  def _reduce_33( val, _values)
723
- get_range_query(val[1], val[2], true, false)
777
+ val[0] << val[1]
724
778
  end
725
779
  .,.,
726
780
 
727
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 106
781
+ module_eval <<'.,.,', 'query_parser.y', 106
728
782
  def _reduce_34( val, _values)
729
- get_range_query(val[1], val[2], false, true)
783
+ val[0] << nil
730
784
  end
731
785
  .,.,
732
786
 
733
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 107
787
+ module_eval <<'.,.,', 'query_parser.y', 107
734
788
  def _reduce_35( val, _values)
735
- get_range_query(val[1], val[2], false, false)
789
+ add_multi_word(val[0], val[2])
736
790
  end
737
791
  .,.,
738
792
 
739
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 108
793
+ module_eval <<'.,.,', 'query_parser.y', 109
740
794
  def _reduce_36( val, _values)
741
- get_range_query(nil, val[1], false, false)
795
+ _get_range_query(val[1], val[2], true, true)
742
796
  end
743
797
  .,.,
744
798
 
745
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 109
799
+ module_eval <<'.,.,', 'query_parser.y', 110
746
800
  def _reduce_37( val, _values)
747
- get_range_query(nil, val[1], false, true)
801
+ _get_range_query(val[1], val[2], true, false)
748
802
  end
749
803
  .,.,
750
804
 
751
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 110
805
+ module_eval <<'.,.,', 'query_parser.y', 111
752
806
  def _reduce_38( val, _values)
753
- get_range_query(val[1], nil, true, false)
807
+ _get_range_query(val[1], val[2], false, true)
754
808
  end
755
809
  .,.,
756
810
 
757
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 111
811
+ module_eval <<'.,.,', 'query_parser.y', 112
758
812
  def _reduce_39( val, _values)
759
- get_range_query(val[1], nil, false, false)
813
+ _get_range_query(val[1], val[2], false, false)
760
814
  end
761
815
  .,.,
762
816
 
763
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 112
817
+ module_eval <<'.,.,', 'query_parser.y', 113
764
818
  def _reduce_40( val, _values)
765
- get_range_query(nil, val[1], false, false)
819
+ _get_range_query(nil, val[1], false, false)
766
820
  end
767
821
  .,.,
768
822
 
769
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 113
823
+ module_eval <<'.,.,', 'query_parser.y', 114
770
824
  def _reduce_41( val, _values)
771
- get_range_query(nil, val[2], false, true)
825
+ _get_range_query(nil, val[1], false, true)
772
826
  end
773
827
  .,.,
774
828
 
775
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 114
829
+ module_eval <<'.,.,', 'query_parser.y', 115
776
830
  def _reduce_42( val, _values)
777
- get_range_query(val[2], nil, true, false)
831
+ _get_range_query(val[1], nil, true, false)
778
832
  end
779
833
  .,.,
780
834
 
781
- module_eval <<'.,.,', 'lib/ferret/query_parser/query_parser.y', 115
835
+ module_eval <<'.,.,', 'query_parser.y', 116
782
836
  def _reduce_43( val, _values)
783
- get_range_query(val[1], nil, false, false)
837
+ _get_range_query(val[1], nil, false, false)
838
+ end
839
+ .,.,
840
+
841
+ module_eval <<'.,.,', 'query_parser.y', 117
842
+ def _reduce_44( val, _values)
843
+ _get_range_query(nil, val[1], false, false)
844
+ end
845
+ .,.,
846
+
847
+ module_eval <<'.,.,', 'query_parser.y', 118
848
+ def _reduce_45( val, _values)
849
+ _get_range_query(nil, val[2], false, true)
850
+ end
851
+ .,.,
852
+
853
+ module_eval <<'.,.,', 'query_parser.y', 119
854
+ def _reduce_46( val, _values)
855
+ _get_range_query(val[2], nil, true, false)
856
+ end
857
+ .,.,
858
+
859
+ module_eval <<'.,.,', 'query_parser.y', 120
860
+ def _reduce_47( val, _values)
861
+ _get_range_query(val[1], nil, false, false)
784
862
  end
785
863
  .,.,
786
864
 
@@ -795,6 +873,7 @@ end # module Ferret
795
873
 
796
874
  if __FILE__ == $0
797
875
  $:.unshift File.join(File.dirname(__FILE__), '..')
876
+ $:.unshift File.join(File.dirname(__FILE__), '../..')
798
877
  require 'utils'
799
878
  require 'analysis'
800
879
  require 'document'
@@ -802,10 +881,15 @@ if __FILE__ == $0
802
881
  require 'index'
803
882
  require 'search'
804
883
 
884
+ include Ferret::Search
885
+ include Ferret::Index
886
+
805
887
  st = "\033[7m"
806
888
  en = "\033[m"
807
889
 
808
- parser = Ferret::QueryParser.new("default")
890
+ parser = Ferret::QueryParser.new("default",
891
+ :fields => ["f1", "f2", "f3"],
892
+ :analyzer => Ferret::Analysis::StandardAnalyzer.new)
809
893
 
810
894
  $stdin.each do |line|
811
895
  query = parser.parse(line)