ferret 0.3.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/CHANGELOG +9 -0
  2. data/Rakefile +51 -25
  3. data/ext/analysis.c +553 -0
  4. data/ext/analysis.h +76 -0
  5. data/ext/array.c +83 -0
  6. data/ext/array.h +19 -0
  7. data/ext/bitvector.c +164 -0
  8. data/ext/bitvector.h +29 -0
  9. data/ext/compound_io.c +335 -0
  10. data/ext/document.c +336 -0
  11. data/ext/document.h +87 -0
  12. data/ext/ferret.c +88 -47
  13. data/ext/ferret.h +43 -109
  14. data/ext/field.c +395 -0
  15. data/ext/filter.c +103 -0
  16. data/ext/fs_store.c +352 -0
  17. data/ext/global.c +219 -0
  18. data/ext/global.h +73 -0
  19. data/ext/hash.c +446 -0
  20. data/ext/hash.h +80 -0
  21. data/ext/hashset.c +141 -0
  22. data/ext/hashset.h +37 -0
  23. data/ext/helper.c +11 -0
  24. data/ext/helper.h +5 -0
  25. data/ext/inc/lang.h +41 -0
  26. data/ext/ind.c +389 -0
  27. data/ext/index.h +884 -0
  28. data/ext/index_io.c +269 -415
  29. data/ext/index_rw.c +2543 -0
  30. data/ext/lang.c +31 -0
  31. data/ext/lang.h +41 -0
  32. data/ext/priorityqueue.c +228 -0
  33. data/ext/priorityqueue.h +44 -0
  34. data/ext/q_boolean.c +1331 -0
  35. data/ext/q_const_score.c +154 -0
  36. data/ext/q_fuzzy.c +287 -0
  37. data/ext/q_match_all.c +142 -0
  38. data/ext/q_multi_phrase.c +343 -0
  39. data/ext/q_parser.c +2180 -0
  40. data/ext/q_phrase.c +657 -0
  41. data/ext/q_prefix.c +75 -0
  42. data/ext/q_range.c +247 -0
  43. data/ext/q_span.c +1566 -0
  44. data/ext/q_term.c +308 -0
  45. data/ext/q_wildcard.c +146 -0
  46. data/ext/r_analysis.c +255 -0
  47. data/ext/r_doc.c +578 -0
  48. data/ext/r_index_io.c +996 -0
  49. data/ext/r_qparser.c +158 -0
  50. data/ext/r_search.c +2321 -0
  51. data/ext/r_store.c +263 -0
  52. data/ext/r_term.c +219 -0
  53. data/ext/ram_store.c +447 -0
  54. data/ext/search.c +524 -0
  55. data/ext/search.h +1065 -0
  56. data/ext/similarity.c +143 -39
  57. data/ext/sort.c +661 -0
  58. data/ext/store.c +35 -0
  59. data/ext/store.h +152 -0
  60. data/ext/term.c +704 -143
  61. data/ext/termdocs.c +599 -0
  62. data/ext/vector.c +594 -0
  63. data/lib/ferret.rb +9 -10
  64. data/lib/ferret/analysis/analyzers.rb +2 -2
  65. data/lib/ferret/analysis/standard_tokenizer.rb +1 -1
  66. data/lib/ferret/analysis/token.rb +14 -14
  67. data/lib/ferret/analysis/token_filters.rb +3 -3
  68. data/lib/ferret/document/field.rb +16 -17
  69. data/lib/ferret/index/document_writer.rb +4 -4
  70. data/lib/ferret/index/index.rb +39 -23
  71. data/lib/ferret/index/index_writer.rb +2 -2
  72. data/lib/ferret/index/multiple_term_doc_pos_enum.rb +1 -8
  73. data/lib/ferret/index/segment_term_vector.rb +4 -4
  74. data/lib/ferret/index/term.rb +5 -1
  75. data/lib/ferret/index/term_vector_offset_info.rb +6 -6
  76. data/lib/ferret/index/term_vectors_io.rb +5 -5
  77. data/lib/ferret/query_parser/query_parser.tab.rb +81 -77
  78. data/lib/ferret/search.rb +1 -1
  79. data/lib/ferret/search/boolean_query.rb +2 -1
  80. data/lib/ferret/search/field_sorted_hit_queue.rb +3 -3
  81. data/lib/ferret/search/fuzzy_query.rb +2 -1
  82. data/lib/ferret/search/index_searcher.rb +3 -0
  83. data/lib/ferret/search/{match_all_docs_query.rb → match_all_query.rb} +7 -7
  84. data/lib/ferret/search/multi_phrase_query.rb +6 -5
  85. data/lib/ferret/search/phrase_query.rb +3 -6
  86. data/lib/ferret/search/prefix_query.rb +4 -4
  87. data/lib/ferret/search/sort.rb +3 -1
  88. data/lib/ferret/search/sort_field.rb +9 -9
  89. data/lib/ferret/search/spans/near_spans_enum.rb +1 -1
  90. data/lib/ferret/search/spans/span_near_query.rb +1 -1
  91. data/lib/ferret/search/spans/span_weight.rb +1 -1
  92. data/lib/ferret/search/spans/spans_enum.rb +7 -7
  93. data/lib/ferret/store/fs_store.rb +10 -6
  94. data/lib/ferret/store/ram_store.rb +3 -3
  95. data/lib/rferret.rb +36 -0
  96. data/test/functional/thread_safety_index_test.rb +2 -2
  97. data/test/test_helper.rb +16 -2
  98. data/test/unit/analysis/c_token.rb +25 -0
  99. data/test/unit/analysis/tc_per_field_analyzer_wrapper.rb +1 -1
  100. data/test/unit/analysis/tc_standard_analyzer.rb +1 -1
  101. data/test/unit/document/{tc_document.rb → c_document.rb} +0 -0
  102. data/test/unit/document/c_field.rb +98 -0
  103. data/test/unit/document/tc_field.rb +0 -66
  104. data/test/unit/index/{tc_index.rb → c_index.rb} +62 -6
  105. data/test/unit/index/{tc_index_reader.rb → c_index_reader.rb} +51 -10
  106. data/test/unit/index/{tc_index_writer.rb → c_index_writer.rb} +0 -4
  107. data/test/unit/index/{tc_term.rb → c_term.rb} +1 -3
  108. data/test/unit/index/{tc_term_vector_offset_info.rb → c_term_voi.rb} +5 -5
  109. data/test/unit/index/tc_segment_term_vector.rb +2 -2
  110. data/test/unit/index/tc_term_vectors_io.rb +4 -4
  111. data/test/unit/query_parser/c_query_parser.rb +138 -0
  112. data/test/unit/search/{tc_filter.rb → c_filter.rb} +24 -24
  113. data/test/unit/search/{tc_fuzzy_query.rb → c_fuzzy_query.rb} +0 -0
  114. data/test/unit/search/{tc_index_searcher.rb → c_index_searcher.rb} +9 -26
  115. data/test/unit/search/{tc_search_and_sort.rb → c_search_and_sort.rb} +15 -15
  116. data/test/unit/search/{tc_sort.rb → c_sort.rb} +2 -1
  117. data/test/unit/search/c_sort_field.rb +27 -0
  118. data/test/unit/search/{tc_spans.rb → c_spans.rb} +0 -0
  119. data/test/unit/search/tc_sort_field.rb +7 -20
  120. data/test/unit/store/c_fs_store.rb +76 -0
  121. data/test/unit/store/c_ram_store.rb +35 -0
  122. data/test/unit/store/m_store.rb +34 -0
  123. data/test/unit/store/m_store_lock.rb +68 -0
  124. data/test/unit/store/tc_fs_store.rb +0 -53
  125. data/test/unit/store/tc_ram_store.rb +0 -20
  126. data/test/unit/store/tm_store.rb +0 -30
  127. data/test/unit/store/tm_store_lock.rb +0 -66
  128. metadata +84 -31
  129. data/ext/Makefile +0 -140
  130. data/ext/ferret_ext.so +0 -0
  131. data/ext/priority_queue.c +0 -232
  132. data/ext/ram_directory.c +0 -321
  133. data/ext/segment_merge_queue.c +0 -37
  134. data/ext/segment_term_enum.c +0 -326
  135. data/ext/string_helper.c +0 -42
  136. data/ext/tags +0 -344
  137. data/ext/term_buffer.c +0 -230
  138. data/ext/term_infos_reader.c +0 -54
  139. data/ext/terminfo.c +0 -160
  140. data/ext/token.c +0 -93
  141. data/ext/util.c +0 -12
data/lib/ferret.rb CHANGED
@@ -22,20 +22,19 @@
22
22
  #++
23
23
  # :include: ../TUTORIAL
24
24
  module Ferret
25
- VERSION = '0.3.2'
25
+ VERSION = '0.9.0'
26
26
  end
27
27
 
28
- require 'ferret/utils'
29
- require 'ferret/document'
30
- require 'ferret/stemmers'
31
- require 'ferret/analysis'
32
- require 'ferret/store'
33
- require 'ferret/index'
34
- require 'ferret/search'
35
- require 'ferret/query_parser'
36
-
37
28
  # try and load the C extension but it isn't necessary.
38
29
  begin
39
30
  require 'ferret_ext'
40
31
  rescue Exception => e
32
+ require 'ferret/utils'
33
+ require 'ferret/document'
34
+ require 'ferret/stemmers'
35
+ require 'ferret/analysis'
36
+ require 'ferret/store'
37
+ require 'ferret/index'
38
+ require 'ferret/search'
39
+ require 'ferret/query_parser'
41
40
  end
@@ -28,10 +28,10 @@ module Ferret::Analysis
28
28
  # exact PhraseQuery matches, for instance, across Field instance boundaries.
29
29
  #
30
30
  # field_name:: Field name being indexed.
31
- # position_increment_gap:: added to the next token emitted from
31
+ # pos_inc_gap:: added to the next token emitted from
32
32
  # #token_stream(String,Reader)
33
33
  #
34
- def position_increment_gap(field_name)
34
+ def pos_inc_gap(field_name)
35
35
  return 0
36
36
  end
37
37
 
@@ -64,7 +64,7 @@ if __FILE__ == $0
64
64
  $stdin.each do |line|
65
65
  stk = Ferret::Analysis::StandardTokenizer.new(line)
66
66
  while tk = stk.next()
67
- puts " <" + tk.term_text + "> from " + tk.start_offset.to_s + " to " + tk.end_offset.to_s
67
+ puts " <" + tk.text + "> from " + tk.start_offset.to_s + " to " + tk.end_offset.to_s
68
68
  end
69
69
  end
70
70
  end
@@ -18,25 +18,25 @@ module Ferret::Analysis
18
18
  # end_offset:: is equal to one greater than the position of the last
19
19
  # character corresponding of this token Note that the
20
20
  # difference between @end_offset and @start_offset may not be
21
- # equal to @term_text.length(), as the term text may have been
21
+ # equal to @text.length(), as the term text may have been
22
22
  # altered by a stemmer or some other filter.
23
23
  class Token
24
24
  include Comparable
25
- attr_accessor :term_text
26
- attr_reader :position_increment, :start_offset, :end_offset, :type
25
+ attr_accessor :text
26
+ attr_reader :pos_inc, :start_offset, :end_offset, :type
27
27
 
28
28
  # Constructs a Token with the given term text, and start & end offsets.
29
29
  # The type defaults to "word."
30
- def initialize(txt, so, eo, typ="word", pos_inc=1)
31
- @term_text = txt
30
+ def initialize(txt, so, eo, pos_inc=1, typ="word")
31
+ @text = txt
32
32
  @start_offset = so
33
33
  @end_offset = eo
34
34
  @type = typ # lexical type
35
- @position_increment = pos_inc
35
+ @pos_inc = pos_inc
36
36
  end
37
37
 
38
38
  def set!(txt, so, eo)
39
- @term_text = txt
39
+ @text = txt
40
40
  @start_offset = so
41
41
  @end_offset = eo
42
42
  self
@@ -44,20 +44,20 @@ module Ferret::Analysis
44
44
 
45
45
  def eql?(o)
46
46
  return (o.instance_of?(Token) and @start_offset == o.start_offset and
47
- @end_offset == o.end_offset and @term_text == o.term_text)
47
+ @end_offset == o.end_offset and @text == o.text)
48
48
  end
49
49
  alias :== :eql?
50
50
 
51
51
  # Tokens are sorted by the position in the text at which they occur, ie
52
52
  # the start_offset. If two tokens have the same start offset, (see
53
- # position_increment=) then, they are sorted by the end_offset and then
53
+ # pos_inc=) then, they are sorted by the end_offset and then
54
54
  # lexically by the token text.
55
55
  def <=>(o)
56
56
  r = @start_offset <=> o.start_offset
57
57
  return r if r != 0
58
58
  r = @end_offset <=> o.end_offset
59
59
  return r if r != 0
60
- r = @term_text <=> o.term_text
60
+ r = @text <=> o.text
61
61
  return r
62
62
  end
63
63
 
@@ -82,17 +82,17 @@ module Ferret::Analysis
82
82
  # words and also sets the increment to the number of stop words removed
83
83
  # before each non-stop word. Then exact phrase queries will only match
84
84
  # when the terms occur with no intervening stop words.
85
- def position_increment=(pos_inc)
85
+ def pos_inc=(pos_inc)
86
86
  if (pos_inc < 0)
87
87
  raise ArgumentError, "Increment must be zero or greater: " + pos_inc
88
88
  end
89
- @position_increment = pos_inc
89
+ @pos_inc = pos_inc
90
90
  end
91
91
 
92
92
  # Returns a string representation of the token with all the attributes.
93
93
  def to_s
94
- buf = "#{term_text}:#{start_offset}->#{end_offset}"
95
- buf << "(pos_inc=#{@position_increment})" if (@position_increment != 1)
94
+ buf = "#{text}:#{start_offset}->#{end_offset}"
95
+ buf << "(pos_inc=#{@pos_inc})" if (@pos_inc != 1)
96
96
  buf << "(type=#{@type})" if (@type != "word")
97
97
  buf
98
98
  end
@@ -24,7 +24,7 @@ module Ferret::Analysis
24
24
  return nil
25
25
  end
26
26
 
27
- t.term_text = t.term_text.downcase()
27
+ t.text = t.text.downcase()
28
28
 
29
29
  return t
30
30
  end
@@ -50,7 +50,7 @@ module Ferret::Analysis
50
50
  def next()
51
51
  # return the first non-stop word found
52
52
  while token = @input.next()
53
- return token if ! @stop_set.include?(token.term_text)
53
+ return token if ! @stop_set.include?(token.text)
54
54
  end
55
55
  return nil
56
56
  end
@@ -78,7 +78,7 @@ module Ferret::Analysis
78
78
  if (token == nil)
79
79
  return nil
80
80
  else
81
- token.term_text = Stemmable.stem_porter(token.term_text)
81
+ token.text = Stemmable.stem_porter(token.text)
82
82
  end
83
83
  token
84
84
  end
@@ -27,8 +27,7 @@ module Ferret::Document
27
27
  # Documents returned from IndexReader#document(int) and
28
28
  # Hits#doc(int) may thus not have the same value present as when this field
29
29
  # was indexed.
30
- attr_accessor :boost, :data
31
-
30
+ attr_accessor :boost, :data
32
31
  attr_reader :name
33
32
 
34
33
  # True iff the value of the field is to be stored in the index for
@@ -160,34 +159,34 @@ module Ferret::Document
160
159
  # this field more important.
161
160
  def initialize(name,
162
161
  value,
163
- stored = Store::YES,
162
+ store = Store::YES,
164
163
  index = Index::UNTOKENIZED,
165
- store_term_vector = TermVector::NO,
164
+ term_vector = TermVector::NO,
166
165
  binary = false,
167
166
  boost = 1.0)
168
- if (index == Index::NO and stored == Store::NO)
167
+ if (index == Index::NO and store == Store::NO)
169
168
  raise ArgumentError, "it doesn't make sense to have a field that " +
170
169
  "is neither indexed nor stored"
171
170
  end
172
- if (index == Index::NO && store_term_vector != TermVector::NO)
171
+ if (index == Index::NO && term_vector != TermVector::NO)
173
172
  raise ArgumentError, "cannot store term vector information for a " +
174
173
  "field that is not indexed"
175
174
  end
176
175
 
177
176
  # The name of the field (e.g., "date", "subject", "title", or "body")
178
- @name = name
177
+ @name = name.to_s
179
178
 
180
179
  # the one and only data object for all different kind of field values
181
180
  @data = value
182
- self.stored = stored
181
+ self.store = store
183
182
  self.index = index
184
- self.store_term_vector = store_term_vector
183
+ self.term_vector = term_vector
185
184
  @binary = binary
186
185
  @boost = boost
187
186
  end
188
187
 
189
- def stored=(stored)
190
- case stored
188
+ def store=(store)
189
+ case store
191
190
  when Store::YES
192
191
  @stored = true
193
192
  @compressed = false
@@ -198,7 +197,7 @@ module Ferret::Document
198
197
  @stored = false
199
198
  @compressed = false
200
199
  else
201
- raise "unknown stored parameter " + stored.to_s
200
+ raise "unknown stored parameter " + store.to_s
202
201
  end
203
202
  end
204
203
 
@@ -223,8 +222,8 @@ module Ferret::Document
223
222
  end
224
223
  end
225
224
 
226
- def store_term_vector=(store_term_vector)
227
- case store_term_vector
225
+ def term_vector=(term_vector)
226
+ case term_vector
228
227
  when TermVector::NO
229
228
  @store_term_vector = false
230
229
  @store_position = false
@@ -303,11 +302,11 @@ module Ferret::Document
303
302
  str << "indexed," if (@indexed)
304
303
  str << "tokenized," if (@tokenized)
305
304
  str << "store_term_vector," if (@store_term_vector)
306
- str << "tv_offset," if (@store_offset)
307
- str << "tv_position," if (@store_position)
305
+ str << "store_offsets," if (@store_offset)
306
+ str << "store_positions," if (@store_position)
308
307
  str << "omit_norms," if (@omit_norms)
309
308
  str << "binary," if (@binary)
310
- str << "<#{@name}:#{data}>"
309
+ str << "<#{@name}:#{@binary ? '=bin_data=' : data}>"
311
310
  end
312
311
  end
313
312
  end
@@ -92,7 +92,7 @@ module Ferret::Index
92
92
 
93
93
  length = @field_lengths[field_number] # length of field
94
94
  position = @field_positions[field_number] # position in field
95
- position += @analyzer.position_increment_gap(field_name) if length > 0
95
+ position += @analyzer.pos_inc_gap(field_name) if length > 0
96
96
  offset = @field_offsets[field_number] # offset field
97
97
 
98
98
  if field_info.indexed?
@@ -120,18 +120,18 @@ module Ferret::Index
120
120
  begin
121
121
  last_token = nil
122
122
  while token = stream.next
123
- position += (token.position_increment - 1)
123
+ position += (token.pos_inc - 1)
124
124
 
125
125
  if(field_info.store_offsets?())
126
126
  add_position(field_name,
127
- token.term_text(),
127
+ token.text(),
128
128
  position,
129
129
  TermVectorOffsetInfo.new(
130
130
  offset + token.start_offset(),
131
131
  offset + token.end_offset()))
132
132
  position += 1
133
133
  else
134
- add_position(field_name, token.term_text(), position, nil)
134
+ add_position(field_name, token.text(), position, nil)
135
135
  position += 1
136
136
  end
137
137
 
@@ -32,10 +32,15 @@ module Ferret::Index
32
32
  # use the create_if_missing option.
33
33
  # default_field:: This specifies the default field that will be
34
34
  # used when you add a simple string to the index
35
- # using #add_document. This will also be used for
36
- # default_search_field unless you set it
35
+ # using #add_document or <<. This will also be used
36
+ # for default_search_field unless you set it
37
37
  # explicitly. The default for this value is the
38
- # empty string "".
38
+ # string "id".
39
+ # id_field: This field is as the field to search when doing
40
+ # searches on a term. For example, if you do a
41
+ # lookup by term "cat", ie index["cat"], this will
42
+ # be the field that is searched. This will default
43
+ # to default_field if not set.
39
44
  # default_search_field:: This specifies the field or fields that will be
40
45
  # searched by the query parser. You can use a
41
46
  # string to specify one field, eg, "title". Or you
@@ -54,7 +59,7 @@ module Ferret::Index
54
59
  # in-memory index which you'd like to read with
55
60
  # this class. If you want to create a new index,
56
61
  # you are better off passing in a path.
57
- # close_dir:: This specifies whether you would this class to
62
+ # close_dir:: This specifies whether you want this class to
58
63
  # close the index directory when this class is
59
64
  # closed. This only has any meaning when you pass
60
65
  # in a directory object in the *dir* option, in
@@ -76,7 +81,9 @@ module Ferret::Index
76
81
  # as an existing document, the existing document will
77
82
  # be replaced by the new object. This will slow
78
83
  # down indexing so it should not be used if
79
- # performance is a concern.
84
+ # performance is a concern. You must make sure that
85
+ # your key/keys are either untokenized or that they
86
+ # are not broken up by the analyzer.
80
87
  # use_compound_file:: Uses a compound file to store the index. This
81
88
  # prevents an error being raised for having too
82
89
  # many files open at the same time. The default is
@@ -117,13 +124,16 @@ module Ferret::Index
117
124
  def initialize(options = {})
118
125
  super()
119
126
 
120
- options[:default_search_field] &&= options[:default_search_field].to_s
121
127
  options[:default_field] &&= options[:default_field].to_s
122
128
  options[:create_if_missing] = true if options[:create_if_missing].nil?
123
129
  @key = [options[:key]].flatten if options[:key]
124
130
 
125
131
  if options[:path]
126
- @dir = FSDirectory.new(options[:path], options[:create])
132
+ begin
133
+ @dir = FSDirectory.new(options[:path], options[:create])
134
+ rescue IOError => io
135
+ @dir = FSDirectory.new(options[:path], options[:create_if_missing])
136
+ end
127
137
  options[:close_dir] = true
128
138
  elsif options[:dir]
129
139
  @dir = options[:dir]
@@ -145,7 +155,8 @@ module Ferret::Index
145
155
  @auto_flush = @options[:auto_flush] || false
146
156
  @default_search_field = (@options[:default_search_field] || \
147
157
  @options[:default_field] || "*")
148
- @default_field = @options[:default_field] || ""
158
+ @default_field = (@options[:default_field] || @options[:id_field] || "id").to_s
159
+ @id_field = (@options[:id_field] || @options[:default_field] || "id").to_s
149
160
  @options[:handle_parse_errors] = true if @options[:handle_parse_errors].nil?
150
161
  @open = true
151
162
  @qp = nil
@@ -261,7 +272,10 @@ module Ferret::Index
261
272
 
262
273
  # delete existing documents with the same key
263
274
  if @key
264
- query = @key.map {|field| "+#{field}:#{fdoc[field]}" }.join(" ")
275
+ query = @key.inject(BooleanQuery.new()) do |bq, field|
276
+ bq.add_query(TermQuery.new(Term.new(field, fdoc[field])),
277
+ BooleanClause::Occur::MUST)
278
+ end
265
279
  query_delete(query)
266
280
  end
267
281
 
@@ -317,7 +331,7 @@ module Ferret::Index
317
331
  @dir.synchronize do
318
332
  ensure_reader_open()
319
333
  if id.is_a?(String)
320
- t = Term.new("id", id.to_s)
334
+ t = Term.new(@id_field, id.to_s)
321
335
  return @reader.get_document_with_term(t)
322
336
  elsif id.is_a?(Term)
323
337
  return @reader.get_document_with_term(id)
@@ -338,7 +352,7 @@ module Ferret::Index
338
352
  cnt = 0
339
353
  ensure_reader_open()
340
354
  if id.is_a?(String)
341
- t = Term.new("id", id.to_s)
355
+ t = Term.new(@id_field, id.to_s)
342
356
  cnt = @reader.delete_docs_with_term(t)
343
357
  elsif id.is_a?(Term)
344
358
  cnt = @reader.delete_docs_with_term(id)
@@ -398,7 +412,7 @@ module Ferret::Index
398
412
  document = doc(id)
399
413
  if new_val.is_a?(Hash)
400
414
  new_val.each_pair {|name, content| document[name] = content.to_s}
401
- elsif new_val.is_a?(Document)
415
+ elsif new_val.is_a?(Ferret::Document::Document)
402
416
  document = new_val
403
417
  else
404
418
  document[@options[:default_field]] = new_val.to_s
@@ -478,6 +492,7 @@ module Ferret::Index
478
492
  @reader = nil
479
493
  @writer = nil
480
494
  @searcher = nil
495
+ @has_writes = false
481
496
  end
482
497
  end
483
498
 
@@ -575,27 +590,28 @@ module Ferret::Index
575
590
  @writer = IndexWriter.new(@dir, @options)
576
591
  end
577
592
 
593
+ # returns the new reader if one is opened
578
594
  def ensure_reader_open()
579
595
  raise "tried to use a closed index" if not @open
580
596
  if @reader
581
597
  if not @reader.latest?
582
- @reader = IndexReader.open(@dir, false)
598
+ return @reader = IndexReader.open(@dir, false)
583
599
  end
584
- return
585
- end
586
-
587
- if @writer
588
- @writer.close
589
- @writer = nil
600
+ else
601
+ if @writer
602
+ @writer.close
603
+ @writer = nil
604
+ end
605
+ return @reader = IndexReader.open(@dir, false)
590
606
  end
591
- @reader = IndexReader.open(@dir, false)
607
+ return false
592
608
  end
593
609
 
594
610
  def ensure_searcher_open()
595
611
  raise "tried to use a closed index" if not @open
596
- return if @searcher
597
- ensure_reader_open()
598
- @searcher = IndexSearcher.new(@reader)
612
+ if ensure_reader_open() or not @searcher
613
+ @searcher = IndexSearcher.new(@reader)
614
+ end
599
615
  end
600
616
 
601
617
  private
@@ -28,8 +28,8 @@ module Index
28
28
 
29
29
  WRITE_LOCK_TIMEOUT = 1
30
30
  COMMIT_LOCK_TIMEOUT = 10
31
- WRITE_LOCK_NAME = "write.lock"
32
- COMMIT_LOCK_NAME = "commit.lock"
31
+ WRITE_LOCK_NAME = "write"
32
+ COMMIT_LOCK_NAME = "commit"
33
33
  DEFAULT_MERGE_FACTOR = 10
34
34
  DEFAULT_MIN_MERGE_DOCS = 10
35
35
  DEFAULT_MAX_MERGE_DOCS = 0x7fffffff
@@ -4,6 +4,7 @@ module Ferret::Index
4
4
  # @author Anders Nielsen
5
5
  class MultipleTermDocPosEnum < TermDocEnum
6
6
 
7
+ attr_accessor :doc, :freq
7
8
  class TermPositionsQueue < Ferret::Utils::PriorityQueue
8
9
  def initialize(term_positions)
9
10
  super(term_positions.size)
@@ -76,14 +77,6 @@ module Ferret::Index
76
77
  return next?
77
78
  end
78
79
 
79
- def doc()
80
- return @doc
81
- end
82
-
83
- def freq()
84
- return @freq
85
- end
86
-
87
80
  def close()
88
81
  while (tps = @tps_queue.pop())
89
82
  tps.close()