ferret 0.9.6 → 0.10.0

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.
Files changed (295) hide show
  1. data/MIT-LICENSE +1 -1
  2. data/README +12 -24
  3. data/Rakefile +38 -54
  4. data/TODO +14 -17
  5. data/ext/analysis.c +982 -823
  6. data/ext/analysis.h +133 -76
  7. data/ext/array.c +96 -58
  8. data/ext/array.h +40 -13
  9. data/ext/bitvector.c +476 -118
  10. data/ext/bitvector.h +264 -22
  11. data/ext/compound_io.c +217 -229
  12. data/ext/defines.h +49 -0
  13. data/ext/document.c +107 -317
  14. data/ext/document.h +31 -65
  15. data/ext/except.c +81 -36
  16. data/ext/except.h +117 -55
  17. data/ext/extconf.rb +2 -9
  18. data/ext/ferret.c +211 -104
  19. data/ext/ferret.h +22 -11
  20. data/ext/filter.c +97 -82
  21. data/ext/fs_store.c +348 -367
  22. data/ext/global.c +226 -188
  23. data/ext/global.h +44 -26
  24. data/ext/hash.c +474 -391
  25. data/ext/hash.h +441 -68
  26. data/ext/hashset.c +124 -96
  27. data/ext/hashset.h +169 -20
  28. data/ext/helper.c +56 -5
  29. data/ext/helper.h +7 -0
  30. data/ext/inc/lang.h +29 -49
  31. data/ext/inc/threading.h +31 -0
  32. data/ext/ind.c +288 -278
  33. data/ext/ind.h +68 -0
  34. data/ext/index.c +5688 -0
  35. data/ext/index.h +663 -616
  36. data/ext/lang.h +29 -49
  37. data/ext/libstemmer.c +3 -3
  38. data/ext/mem_pool.c +84 -0
  39. data/ext/mem_pool.h +35 -0
  40. data/ext/posh.c +1006 -0
  41. data/ext/posh.h +1007 -0
  42. data/ext/priorityqueue.c +117 -194
  43. data/ext/priorityqueue.h +135 -39
  44. data/ext/q_boolean.c +1305 -1108
  45. data/ext/q_const_score.c +106 -93
  46. data/ext/q_filtered_query.c +138 -135
  47. data/ext/q_fuzzy.c +206 -242
  48. data/ext/q_match_all.c +94 -80
  49. data/ext/q_multi_term.c +663 -0
  50. data/ext/q_parser.c +667 -593
  51. data/ext/q_phrase.c +992 -555
  52. data/ext/q_prefix.c +72 -61
  53. data/ext/q_range.c +235 -210
  54. data/ext/q_span.c +1480 -1166
  55. data/ext/q_term.c +273 -246
  56. data/ext/q_wildcard.c +127 -114
  57. data/ext/r_analysis.c +1720 -711
  58. data/ext/r_index.c +3049 -0
  59. data/ext/r_qparser.c +433 -146
  60. data/ext/r_search.c +2934 -1993
  61. data/ext/r_store.c +372 -143
  62. data/ext/r_utils.c +941 -0
  63. data/ext/ram_store.c +330 -326
  64. data/ext/search.c +1291 -668
  65. data/ext/search.h +403 -702
  66. data/ext/similarity.c +91 -113
  67. data/ext/similarity.h +45 -30
  68. data/ext/sort.c +721 -484
  69. data/ext/stopwords.c +361 -273
  70. data/ext/store.c +556 -58
  71. data/ext/store.h +706 -126
  72. data/ext/tags +3578 -2780
  73. data/ext/term_vectors.c +352 -0
  74. data/ext/threading.h +31 -0
  75. data/ext/win32.h +54 -0
  76. data/lib/ferret.rb +5 -17
  77. data/lib/ferret/document.rb +130 -2
  78. data/lib/ferret/index.rb +577 -26
  79. data/lib/ferret/number_tools.rb +157 -0
  80. data/lib/ferret_version.rb +3 -0
  81. data/test/test_helper.rb +5 -13
  82. data/test/unit/analysis/tc_analyzer.rb +513 -1
  83. data/test/unit/analysis/{ctc_tokenstream.rb → tc_token_stream.rb} +23 -0
  84. data/test/unit/index/tc_index.rb +183 -240
  85. data/test/unit/index/tc_index_reader.rb +312 -479
  86. data/test/unit/index/tc_index_writer.rb +397 -13
  87. data/test/unit/index/th_doc.rb +269 -206
  88. data/test/unit/query_parser/tc_query_parser.rb +40 -33
  89. data/test/unit/search/tc_filter.rb +59 -71
  90. data/test/unit/search/tc_fuzzy_query.rb +24 -16
  91. data/test/unit/search/tc_index_searcher.rb +23 -201
  92. data/test/unit/search/tc_multi_searcher.rb +78 -226
  93. data/test/unit/search/tc_search_and_sort.rb +93 -81
  94. data/test/unit/search/tc_sort.rb +23 -23
  95. data/test/unit/search/tc_sort_field.rb +7 -7
  96. data/test/unit/search/tc_spans.rb +51 -47
  97. data/test/unit/search/tm_searcher.rb +339 -0
  98. data/test/unit/store/tc_fs_store.rb +1 -1
  99. data/test/unit/store/tm_store_lock.rb +3 -3
  100. data/test/unit/tc_document.rb +81 -0
  101. data/test/unit/ts_analysis.rb +1 -1
  102. data/test/unit/ts_utils.rb +1 -1
  103. data/test/unit/utils/tc_bit_vector.rb +288 -0
  104. data/test/unit/utils/tc_number_tools.rb +117 -0
  105. data/test/unit/utils/tc_priority_queue.rb +106 -0
  106. metadata +140 -301
  107. data/CHANGELOG +0 -9
  108. data/ext/dummy.exe +0 -0
  109. data/ext/field.c +0 -408
  110. data/ext/frtio.h +0 -13
  111. data/ext/inc/except.h +0 -90
  112. data/ext/index_io.c +0 -382
  113. data/ext/index_rw.c +0 -2658
  114. data/ext/lang.c +0 -41
  115. data/ext/nix_io.c +0 -134
  116. data/ext/q_multi_phrase.c +0 -380
  117. data/ext/r_doc.c +0 -582
  118. data/ext/r_index_io.c +0 -1021
  119. data/ext/r_term.c +0 -219
  120. data/ext/term.c +0 -820
  121. data/ext/termdocs.c +0 -611
  122. data/ext/vector.c +0 -637
  123. data/ext/w32_io.c +0 -150
  124. data/lib/ferret/analysis.rb +0 -11
  125. data/lib/ferret/analysis/analyzers.rb +0 -112
  126. data/lib/ferret/analysis/standard_tokenizer.rb +0 -71
  127. data/lib/ferret/analysis/token.rb +0 -100
  128. data/lib/ferret/analysis/token_filters.rb +0 -86
  129. data/lib/ferret/analysis/token_stream.rb +0 -26
  130. data/lib/ferret/analysis/tokenizers.rb +0 -112
  131. data/lib/ferret/analysis/word_list_loader.rb +0 -27
  132. data/lib/ferret/document/document.rb +0 -152
  133. data/lib/ferret/document/field.rb +0 -312
  134. data/lib/ferret/index/compound_file_io.rb +0 -338
  135. data/lib/ferret/index/document_writer.rb +0 -289
  136. data/lib/ferret/index/field_infos.rb +0 -279
  137. data/lib/ferret/index/fields_io.rb +0 -181
  138. data/lib/ferret/index/index.rb +0 -675
  139. data/lib/ferret/index/index_file_names.rb +0 -33
  140. data/lib/ferret/index/index_reader.rb +0 -503
  141. data/lib/ferret/index/index_writer.rb +0 -534
  142. data/lib/ferret/index/multi_reader.rb +0 -377
  143. data/lib/ferret/index/multiple_term_doc_pos_enum.rb +0 -98
  144. data/lib/ferret/index/segment_infos.rb +0 -130
  145. data/lib/ferret/index/segment_merge_info.rb +0 -49
  146. data/lib/ferret/index/segment_merge_queue.rb +0 -16
  147. data/lib/ferret/index/segment_merger.rb +0 -358
  148. data/lib/ferret/index/segment_reader.rb +0 -412
  149. data/lib/ferret/index/segment_term_enum.rb +0 -169
  150. data/lib/ferret/index/segment_term_vector.rb +0 -58
  151. data/lib/ferret/index/term.rb +0 -53
  152. data/lib/ferret/index/term_buffer.rb +0 -83
  153. data/lib/ferret/index/term_doc_enum.rb +0 -291
  154. data/lib/ferret/index/term_enum.rb +0 -52
  155. data/lib/ferret/index/term_info.rb +0 -37
  156. data/lib/ferret/index/term_infos_io.rb +0 -321
  157. data/lib/ferret/index/term_vector_offset_info.rb +0 -20
  158. data/lib/ferret/index/term_vectors_io.rb +0 -553
  159. data/lib/ferret/query_parser.rb +0 -312
  160. data/lib/ferret/query_parser/query_parser.tab.rb +0 -928
  161. data/lib/ferret/search.rb +0 -50
  162. data/lib/ferret/search/boolean_clause.rb +0 -100
  163. data/lib/ferret/search/boolean_query.rb +0 -299
  164. data/lib/ferret/search/boolean_scorer.rb +0 -294
  165. data/lib/ferret/search/caching_wrapper_filter.rb +0 -40
  166. data/lib/ferret/search/conjunction_scorer.rb +0 -99
  167. data/lib/ferret/search/disjunction_sum_scorer.rb +0 -205
  168. data/lib/ferret/search/exact_phrase_scorer.rb +0 -32
  169. data/lib/ferret/search/explanation.rb +0 -41
  170. data/lib/ferret/search/field_cache.rb +0 -215
  171. data/lib/ferret/search/field_doc.rb +0 -31
  172. data/lib/ferret/search/field_sorted_hit_queue.rb +0 -184
  173. data/lib/ferret/search/filter.rb +0 -11
  174. data/lib/ferret/search/filtered_query.rb +0 -130
  175. data/lib/ferret/search/filtered_term_enum.rb +0 -79
  176. data/lib/ferret/search/fuzzy_query.rb +0 -154
  177. data/lib/ferret/search/fuzzy_term_enum.rb +0 -247
  178. data/lib/ferret/search/hit_collector.rb +0 -34
  179. data/lib/ferret/search/hit_queue.rb +0 -11
  180. data/lib/ferret/search/index_searcher.rb +0 -200
  181. data/lib/ferret/search/match_all_query.rb +0 -104
  182. data/lib/ferret/search/multi_phrase_query.rb +0 -216
  183. data/lib/ferret/search/multi_searcher.rb +0 -261
  184. data/lib/ferret/search/multi_term_query.rb +0 -65
  185. data/lib/ferret/search/non_matching_scorer.rb +0 -22
  186. data/lib/ferret/search/phrase_positions.rb +0 -55
  187. data/lib/ferret/search/phrase_query.rb +0 -214
  188. data/lib/ferret/search/phrase_scorer.rb +0 -152
  189. data/lib/ferret/search/prefix_query.rb +0 -54
  190. data/lib/ferret/search/query.rb +0 -140
  191. data/lib/ferret/search/query_filter.rb +0 -51
  192. data/lib/ferret/search/range_filter.rb +0 -103
  193. data/lib/ferret/search/range_query.rb +0 -139
  194. data/lib/ferret/search/req_excl_scorer.rb +0 -125
  195. data/lib/ferret/search/req_opt_sum_scorer.rb +0 -70
  196. data/lib/ferret/search/score_doc.rb +0 -38
  197. data/lib/ferret/search/score_doc_comparator.rb +0 -114
  198. data/lib/ferret/search/scorer.rb +0 -91
  199. data/lib/ferret/search/similarity.rb +0 -278
  200. data/lib/ferret/search/sloppy_phrase_scorer.rb +0 -47
  201. data/lib/ferret/search/sort.rb +0 -112
  202. data/lib/ferret/search/sort_comparator.rb +0 -60
  203. data/lib/ferret/search/sort_field.rb +0 -91
  204. data/lib/ferret/search/spans.rb +0 -12
  205. data/lib/ferret/search/spans/near_spans_enum.rb +0 -304
  206. data/lib/ferret/search/spans/span_first_query.rb +0 -79
  207. data/lib/ferret/search/spans/span_near_query.rb +0 -108
  208. data/lib/ferret/search/spans/span_not_query.rb +0 -130
  209. data/lib/ferret/search/spans/span_or_query.rb +0 -176
  210. data/lib/ferret/search/spans/span_query.rb +0 -25
  211. data/lib/ferret/search/spans/span_scorer.rb +0 -74
  212. data/lib/ferret/search/spans/span_term_query.rb +0 -105
  213. data/lib/ferret/search/spans/span_weight.rb +0 -84
  214. data/lib/ferret/search/spans/spans_enum.rb +0 -44
  215. data/lib/ferret/search/term_query.rb +0 -128
  216. data/lib/ferret/search/term_scorer.rb +0 -183
  217. data/lib/ferret/search/top_docs.rb +0 -36
  218. data/lib/ferret/search/top_field_docs.rb +0 -17
  219. data/lib/ferret/search/weight.rb +0 -54
  220. data/lib/ferret/search/wildcard_query.rb +0 -26
  221. data/lib/ferret/search/wildcard_term_enum.rb +0 -61
  222. data/lib/ferret/stemmers.rb +0 -1
  223. data/lib/ferret/stemmers/porter_stemmer.rb +0 -218
  224. data/lib/ferret/store.rb +0 -5
  225. data/lib/ferret/store/buffered_index_io.rb +0 -190
  226. data/lib/ferret/store/directory.rb +0 -141
  227. data/lib/ferret/store/fs_store.rb +0 -381
  228. data/lib/ferret/store/index_io.rb +0 -245
  229. data/lib/ferret/store/ram_store.rb +0 -286
  230. data/lib/ferret/utils.rb +0 -8
  231. data/lib/ferret/utils/bit_vector.rb +0 -123
  232. data/lib/ferret/utils/date_tools.rb +0 -138
  233. data/lib/ferret/utils/number_tools.rb +0 -91
  234. data/lib/ferret/utils/parameter.rb +0 -41
  235. data/lib/ferret/utils/priority_queue.rb +0 -120
  236. data/lib/ferret/utils/string_helper.rb +0 -47
  237. data/lib/ferret/utils/thread_local.rb +0 -28
  238. data/lib/ferret/utils/weak_key_hash.rb +0 -60
  239. data/lib/rferret.rb +0 -37
  240. data/rake_utils/code_statistics.rb +0 -106
  241. data/test/benchmark/tb_ram_store.rb +0 -76
  242. data/test/benchmark/tb_rw_vint.rb +0 -26
  243. data/test/functional/thread_safety_index_test.rb +0 -81
  244. data/test/functional/thread_safety_test.rb +0 -137
  245. data/test/longrunning/tc_numbertools.rb +0 -60
  246. data/test/longrunning/tm_store.rb +0 -19
  247. data/test/unit/analysis/ctc_analyzer.rb +0 -532
  248. data/test/unit/analysis/data/wordfile +0 -6
  249. data/test/unit/analysis/rtc_letter_tokenizer.rb +0 -20
  250. data/test/unit/analysis/rtc_lower_case_filter.rb +0 -20
  251. data/test/unit/analysis/rtc_lower_case_tokenizer.rb +0 -27
  252. data/test/unit/analysis/rtc_per_field_analyzer_wrapper.rb +0 -39
  253. data/test/unit/analysis/rtc_porter_stem_filter.rb +0 -16
  254. data/test/unit/analysis/rtc_standard_analyzer.rb +0 -20
  255. data/test/unit/analysis/rtc_standard_tokenizer.rb +0 -20
  256. data/test/unit/analysis/rtc_stop_analyzer.rb +0 -20
  257. data/test/unit/analysis/rtc_stop_filter.rb +0 -14
  258. data/test/unit/analysis/rtc_white_space_analyzer.rb +0 -21
  259. data/test/unit/analysis/rtc_white_space_tokenizer.rb +0 -20
  260. data/test/unit/analysis/rtc_word_list_loader.rb +0 -32
  261. data/test/unit/analysis/tc_token.rb +0 -25
  262. data/test/unit/document/rtc_field.rb +0 -28
  263. data/test/unit/document/tc_document.rb +0 -47
  264. data/test/unit/document/tc_field.rb +0 -98
  265. data/test/unit/index/rtc_compound_file_io.rb +0 -107
  266. data/test/unit/index/rtc_field_infos.rb +0 -127
  267. data/test/unit/index/rtc_fields_io.rb +0 -167
  268. data/test/unit/index/rtc_multiple_term_doc_pos_enum.rb +0 -83
  269. data/test/unit/index/rtc_segment_infos.rb +0 -74
  270. data/test/unit/index/rtc_segment_term_docs.rb +0 -17
  271. data/test/unit/index/rtc_segment_term_enum.rb +0 -60
  272. data/test/unit/index/rtc_segment_term_vector.rb +0 -71
  273. data/test/unit/index/rtc_term_buffer.rb +0 -57
  274. data/test/unit/index/rtc_term_info.rb +0 -19
  275. data/test/unit/index/rtc_term_infos_io.rb +0 -192
  276. data/test/unit/index/rtc_term_vectors_io.rb +0 -108
  277. data/test/unit/index/tc_term.rb +0 -27
  278. data/test/unit/index/tc_term_voi.rb +0 -18
  279. data/test/unit/search/rtc_similarity.rb +0 -37
  280. data/test/unit/search/rtc_sort_field.rb +0 -14
  281. data/test/unit/search/tc_multi_searcher2.rb +0 -126
  282. data/test/unit/store/rtc_fs_store.rb +0 -62
  283. data/test/unit/store/rtc_ram_store.rb +0 -15
  284. data/test/unit/store/rtm_store.rb +0 -150
  285. data/test/unit/store/rtm_store_lock.rb +0 -2
  286. data/test/unit/ts_document.rb +0 -2
  287. data/test/unit/utils/rtc_bit_vector.rb +0 -73
  288. data/test/unit/utils/rtc_date_tools.rb +0 -50
  289. data/test/unit/utils/rtc_number_tools.rb +0 -59
  290. data/test/unit/utils/rtc_parameter.rb +0 -40
  291. data/test/unit/utils/rtc_priority_queue.rb +0 -62
  292. data/test/unit/utils/rtc_string_helper.rb +0 -21
  293. data/test/unit/utils/rtc_thread.rb +0 -61
  294. data/test/unit/utils/rtc_weak_key_hash.rb +0 -25
  295. data/test/utils/number_to_spoken.rb +0 -132
data/ext/termdocs.c DELETED
@@ -1,611 +0,0 @@
1
- #include "index.h"
2
- #include <string.h>
3
-
4
- static char * const TPE_VS_TDE_ERROR_MSG = "TermPosEnum does not handle processing multiple documents in one call. Use TermDocEnum instead.";
5
-
6
- /****************************************************************************
7
- *
8
- * SegmentTermDocEnum
9
- *
10
- ****************************************************************************/
11
-
12
-
13
- void stde_close(TermDocEnum *tde)
14
- {
15
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
16
-
17
- is_close(stde->freq_in);
18
- if (stde->skip_in != NULL)
19
- is_close(stde->skip_in);
20
-
21
- free(stde);
22
- free(tde);
23
- }
24
-
25
- void stde_seek_ti(TermDocEnum *tde, TermInfo *ti)
26
- {
27
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
28
- if (ti == NULL) {
29
- stde->doc_freq = 0;
30
- } else {
31
- stde->count = 0;
32
- stde->doc_freq = ti->doc_freq;
33
- stde->doc_num = 0;
34
- stde->skip_doc = 0;
35
- stde->skip_count = 0;
36
- stde->num_skips = stde->doc_freq / stde->skip_interval;
37
- stde->freq_pointer = ti->freq_pointer;
38
- stde->prox_pointer = ti->prox_pointer;
39
- stde->skip_pointer = ti->freq_pointer + ti->skip_offset;
40
- is_seek(stde->freq_in, ti->freq_pointer);
41
- stde->have_skipped = false;
42
- }
43
- }
44
-
45
- void stde_seek(TermDocEnum *tde, Term *term)
46
- {
47
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
48
- TermInfo *ti = tir_get_ti(stde->parent->tir, term);
49
- stde_seek_ti(tde, ti);
50
- ti_destroy(ti);
51
- }
52
-
53
- void stde_skip_prox(SegmentTermDocEnum *stde) { }
54
- void stde_seek_prox(SegmentTermDocEnum *stde, int prox_pointer) { }
55
-
56
- bool stde_next(TermDocEnum *tde)
57
- {
58
- int doc_code;
59
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
60
- while (true) {
61
-
62
- if (stde->count >= stde->doc_freq) {
63
- return false;
64
- }
65
-
66
- doc_code = (int)is_read_vint(stde->freq_in);
67
- stde->doc_num += doc_code >> 1; /* shift off low bit */
68
- if ((doc_code & 1) != 0) { /* if low bit is set */
69
- stde->freq = 1; /* freq is one */
70
- } else {
71
- stde->freq = (int)is_read_vint(stde->freq_in); /* read freq */
72
- }
73
-
74
- stde->count++;
75
-
76
- if (stde->deleted_docs == NULL ||
77
- bv_get(stde->deleted_docs, stde->doc_num) == 0) {
78
- break; /* We found an undeleted doc so return */
79
- }
80
-
81
- stde->skip_prox(stde);
82
- }
83
- return true;
84
- }
85
-
86
- int stde_doc_num(TermDocEnum *tde)
87
- { return ((SegmentTermDocEnum *)tde->data)->doc_num; }
88
-
89
- int stde_freq(TermDocEnum *tde)
90
- { return ((SegmentTermDocEnum *)tde->data)->freq; }
91
-
92
- bool stde_skip_to(TermDocEnum *tde, int target_doc_num)
93
- {
94
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
95
-
96
- if (stde->doc_freq >= stde->skip_interval) { /* optimized case */
97
- int last_skip_doc;
98
- int last_freq_pointer;
99
- int last_prox_pointer;
100
- int num_skipped;
101
-
102
- if (stde->skip_in == NULL) {
103
- stde->skip_in = is_clone(stde->freq_in); /* lazily clone */
104
- }
105
-
106
- if (!stde->have_skipped) { /* lazily seek skip stream */
107
- is_seek(stde->skip_in, stde->skip_pointer);
108
- stde->have_skipped = true;
109
- }
110
-
111
- /* scan skip data */
112
- last_skip_doc = stde->skip_doc;
113
- last_freq_pointer = is_pos(stde->freq_in);
114
- last_prox_pointer = -1;
115
- num_skipped = -1 - (stde->count % stde->skip_interval);
116
-
117
- while (target_doc_num > stde->skip_doc) {
118
- last_skip_doc = stde->skip_doc;
119
- last_freq_pointer = stde->freq_pointer;
120
- last_prox_pointer = stde->prox_pointer;
121
-
122
- if (stde->skip_doc != 0 && stde->skip_doc >= stde->doc_num) {
123
- num_skipped += stde->skip_interval;
124
- }
125
-
126
- if(stde->skip_count >= stde->num_skips) {
127
- break;
128
- }
129
-
130
- stde->skip_doc += (int)is_read_vint(stde->skip_in);
131
- stde->freq_pointer += (int)is_read_vint(stde->skip_in);
132
- stde->prox_pointer += (int)is_read_vint(stde->skip_in);
133
-
134
- stde->skip_count++;
135
- }
136
-
137
- /* if we found something to skip, so skip it */
138
- if (last_freq_pointer > is_pos(stde->freq_in)) {
139
- is_seek(stde->freq_in, last_freq_pointer);
140
- stde->seek_prox(stde, last_prox_pointer);
141
-
142
- stde->doc_num = last_skip_doc;
143
- stde->count += num_skipped;
144
- }
145
- }
146
-
147
- /* done skipping, now just scan */
148
- do {
149
- if (! tde->next(tde)) {
150
- return false;
151
- }
152
- } while (target_doc_num > ((SegmentTermDocEnum *)tde->data)->doc_num);
153
- return true;
154
- }
155
-
156
- int stde_read(TermDocEnum *tde, int *docs, int *freqs, int req_num)
157
- {
158
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
159
- int i = 0, doc_code;
160
- while (i < req_num && stde->count < stde->doc_freq) {
161
- /* manually inlined call to next() for speed */
162
- doc_code = (int)is_read_vint(stde->freq_in);
163
- stde->doc_num += (doc_code >> 1); /* shift off low bit */
164
- if ((doc_code & 1) != 0) { /* if low bit is set */
165
- stde->freq = 1; /* freq is one */
166
- } else {
167
- stde->freq = (int)is_read_vint(stde->freq_in); /* else read freq */
168
- }
169
-
170
- stde->count++;
171
-
172
- if (stde->deleted_docs == NULL ||
173
- bv_get(stde->deleted_docs, stde->doc_num) == 0) {
174
- docs[i] = stde->doc_num;
175
- freqs[i] = stde->freq;
176
- i++;
177
- }
178
- }
179
- return i;
180
- }
181
-
182
- TermDocEnum *stde_create(IndexReader *ir)
183
- {
184
- SegmentTermDocEnum *stde = ALLOC_AND_ZERO(SegmentTermDocEnum);
185
- SegmentReader *sr = (SegmentReader *)ir->data;
186
- TermDocEnum *tde = ALLOC(TermDocEnum);
187
- tde->seek = &stde_seek;
188
- tde->doc_num = &stde_doc_num;
189
- tde->freq = &stde_freq;
190
- tde->next = &stde_next;
191
- tde->read = &stde_read;
192
- tde->skip_to = &stde_skip_to;
193
- tde->next_position = NULL;
194
- tde->close = &stde_close;
195
-
196
- tde->data = stde;
197
- stde->parent = sr;
198
- stde->freq_in = is_clone(sr->freq_in);
199
- stde->deleted_docs = sr->deleted_docs;
200
- stde->skip_interval = sr->tir->skip_interval;
201
- stde->skip_in = NULL;
202
- stde->have_skipped = false;
203
- stde->skip_prox = &stde_skip_prox;
204
- stde->seek_prox = &stde_seek_prox;
205
- return tde;
206
- }
207
-
208
- /****************************************************************************
209
- *
210
- * SegmentTermPosEnum
211
- *
212
- ****************************************************************************/
213
-
214
- void stpe_seek(TermDocEnum *tde, Term *term)
215
- {
216
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
217
- TermInfo *ti = tir_get_ti(stde->parent->tir, term);
218
- stde_seek_ti(tde, ti);
219
- if (ti != NULL) {
220
- is_seek(stde->prox_in, ti->prox_pointer);
221
- }
222
- stde->prox_cnt = 0;
223
- ti_destroy(ti);
224
- }
225
-
226
- void stpe_close(TermDocEnum *tde)
227
- {
228
- // super
229
- is_close(((SegmentTermDocEnum *)tde->data)->prox_in);
230
- ((SegmentTermDocEnum *)tde->data)->prox_in = NULL;
231
- stde_close(tde);
232
- }
233
-
234
- void stpe_skip_prox(SegmentTermDocEnum *stde)
235
- {
236
- is_skip_vints(stde->prox_in, stde->freq);
237
- }
238
-
239
- void stpe_seek_prox(SegmentTermDocEnum *stde, int prox_pointer)
240
- {
241
- is_seek(stde->prox_in, prox_pointer);
242
- stde->prox_cnt = 0;
243
- }
244
-
245
- bool stpe_next(TermDocEnum *tde)
246
- {
247
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
248
- is_skip_vints(stde->prox_in, stde->prox_cnt);
249
-
250
- /* if super */
251
- if (stde_next(tde)) {
252
- stde->prox_cnt = stde->freq;
253
- stde->position = 0;
254
- return true;
255
- }
256
- return false;
257
- }
258
-
259
- int stpe_read(TermDocEnum *tde, int *docs, int *freqs, int req_num)
260
- {
261
- RAISE(ARG_ERROR, TPE_VS_TDE_ERROR_MSG);
262
- return -1;
263
- }
264
-
265
- int stpe_next_position(TermDocEnum *tde)
266
- {
267
- SegmentTermDocEnum *stde = (SegmentTermDocEnum *)tde->data;
268
- stde->prox_cnt--;
269
- return stde->position += (int)is_read_vint(stde->prox_in);
270
- }
271
-
272
- TermDocEnum *stpe_create(IndexReader *ir)
273
- {
274
- SegmentTermDocEnum *stde;
275
- SegmentReader *sr = (SegmentReader *)ir->data;
276
- TermDocEnum *tde = stde_create(ir);
277
- tde->close = &stpe_close;
278
- tde->seek = &stpe_seek;
279
- tde->next = &stpe_next;
280
- tde->read = &stpe_read;
281
- tde->next_position = &stpe_next_position;
282
-
283
- stde = (SegmentTermDocEnum *)tde->data;
284
- stde->prox_in = is_clone(sr->prox_in);
285
- stde->prox_cnt = 0;
286
- stde->position = 0;
287
- stde->skip_prox = &stpe_skip_prox;
288
- stde->seek_prox = &stpe_seek_prox;
289
-
290
- return tde;
291
- }
292
-
293
- /****************************************************************************
294
- *
295
- * MultiTermDocEnum
296
- *
297
- ****************************************************************************/
298
-
299
- void mtde_close(TermDocEnum *tde)
300
- {
301
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
302
- TermDocEnum *tmp_tde;
303
- int i;
304
- for (i = 0; i < mtde->ir_cnt; i++) {
305
- if ((tmp_tde = mtde->irs_tde[i]) != NULL)
306
- tmp_tde->close(tmp_tde);
307
- }
308
- if (mtde->term != NULL) term_destroy(mtde->term);
309
- free(mtde->irs_tde);
310
- free(mtde);
311
- free(tde);
312
- }
313
-
314
- void mtde_seek(TermDocEnum *tde, Term *term)
315
- {
316
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
317
- if (mtde->term != NULL) term_destroy(mtde->term);
318
- mtde->term = term_create(term->field, term->text);
319
- mtde->base = 0;
320
- mtde->pointer = 0;
321
- mtde->curr_tde = NULL;
322
- }
323
-
324
- TermDocEnum *mtde_term_docs_from_reader(IndexReader *ir)
325
- {
326
- return ir->term_docs(ir);
327
- }
328
-
329
- TermDocEnum *mtde_term_docs(MultiTermDocEnum *mtde, int i)
330
- {
331
- if (mtde->term == NULL) {
332
- return NULL;
333
- } else {
334
-
335
- TermDocEnum *tde = mtde->irs_tde[i];
336
- if (tde == NULL) {
337
- tde = mtde->irs_tde[i] = mtde->term_docs_from_reader(mtde->irs[i]);
338
- }
339
-
340
- tde->seek(tde, mtde->term);
341
- return tde;
342
- }
343
- }
344
-
345
- bool mtde_next(TermDocEnum *tde)
346
- {
347
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
348
- if (mtde->curr_tde != NULL && mtde->curr_tde->next(mtde->curr_tde)) {
349
- return true;
350
- } else if (mtde->pointer < mtde->ir_cnt) {
351
- mtde->base = mtde->starts[mtde->pointer];
352
- mtde->curr_tde = mtde_term_docs(mtde, mtde->pointer);
353
- mtde->pointer++;
354
- return mtde_next(tde);
355
- } else {
356
- return false;
357
- }
358
- }
359
-
360
- int mtde_doc_num(TermDocEnum *tde)
361
- {
362
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
363
- return mtde->base + mtde->curr_tde->doc_num(mtde->curr_tde);
364
- }
365
-
366
- int mtde_freq(TermDocEnum *tde)
367
- {
368
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
369
- return mtde->curr_tde->freq(mtde->curr_tde);
370
- }
371
-
372
- bool mtde_skip_to(TermDocEnum *tde, int target_doc_num)
373
- {
374
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
375
- while (mtde->pointer < mtde->ir_cnt) {
376
- if ((target_doc_num < mtde->starts[mtde->pointer]) &&
377
- (mtde->curr_tde->skip_to(mtde->curr_tde, target_doc_num - mtde->base))) {
378
- return true;
379
- }
380
-
381
- mtde->base = mtde->starts[mtde->pointer];
382
- mtde->curr_tde = mtde_term_docs(mtde, mtde->pointer);
383
- mtde->pointer++;
384
- }
385
- if (mtde->curr_tde) {
386
- return mtde->curr_tde->skip_to(mtde->curr_tde, target_doc_num - mtde->base);
387
- } else {
388
- return false;
389
- }
390
- }
391
-
392
- int mtde_read(TermDocEnum *tde, int *docs, int *freqs, int req_num)
393
- {
394
- int i, end = 0, last_end = 0, b;
395
- MultiTermDocEnum *mtde = (MultiTermDocEnum *)tde->data;
396
- while (true) {
397
- while (mtde->curr_tde == NULL) {
398
- if (mtde->pointer < mtde->ir_cnt) { // try next segment
399
- mtde->base = mtde->starts[mtde->pointer];
400
- mtde->curr_tde = mtde_term_docs(mtde, mtde->pointer++);
401
- } else {
402
- return end;
403
- }
404
- }
405
- end += mtde->curr_tde->read(mtde->curr_tde,
406
- &docs[last_end], &freqs[last_end], req_num - last_end);
407
- if (end == last_end) { // none left in segment
408
- mtde->curr_tde = NULL;
409
- } else { // got some
410
- b = mtde->base; // adjust doc numbers
411
- for (i = last_end; i < end; i++)
412
- docs[i] += b;
413
- if (end == req_num)
414
- return end;
415
- else
416
- last_end = end;
417
- }
418
- }
419
- }
420
-
421
- TermDocEnum *mtde_create(IndexReader **irs, int *starts, int ir_cnt)
422
- {
423
- MultiTermDocEnum *mtde = ALLOC_AND_ZERO(MultiTermDocEnum);
424
- TermDocEnum *tde = ALLOC(TermDocEnum);
425
- tde->close = &mtde_close;
426
- tde->seek = &mtde_seek;
427
- tde->next = &mtde_next;
428
- tde->doc_num = &mtde_doc_num;
429
- tde->freq = &mtde_freq;
430
- tde->skip_to = &mtde_skip_to;
431
- tde->read = &mtde_read;
432
- tde->next_position = NULL;
433
-
434
- tde->data = mtde;
435
- mtde->irs = irs;
436
- mtde->starts = starts;
437
- mtde->ir_cnt = ir_cnt;
438
- mtde->irs_tde = ALLOC_N(TermDocEnum *, ir_cnt);
439
- ZEROSET(mtde->irs_tde, TermDocEnum *, ir_cnt);
440
- mtde->term_docs_from_reader = &mtde_term_docs_from_reader;
441
-
442
- return tde;
443
- }
444
-
445
- /****************************************************************************
446
- *
447
- * MultiTermPosEnum
448
- *
449
- ****************************************************************************/
450
-
451
- TermDocEnum *mtpe_term_docs_from_reader(IndexReader *ir)
452
- {
453
- return ir->term_positions(ir);
454
- }
455
-
456
-
457
- int mtpe_next_position(TermDocEnum *tde)
458
- {
459
- TermDocEnum *curr_tde = ((MultiTermDocEnum *)tde->data)->curr_tde;
460
- return curr_tde->next_position(curr_tde);
461
- }
462
-
463
- TermDocEnum *mtpe_create(IndexReader **irs, int *starts, int ir_cnt)
464
- {
465
- TermDocEnum *tde = mtde_create(irs, starts, ir_cnt);
466
- tde->next_position = &mtpe_next_position;
467
- ((MultiTermDocEnum *)tde->data)->term_docs_from_reader = &mtpe_term_docs_from_reader;
468
- return tde;
469
- }
470
-
471
- /****************************************************************************
472
- *
473
- * MultipleTermDocPosEnum
474
- *
475
- ****************************************************************************/
476
-
477
- #define GET_MTDPE MultipleTermDocPosEnum *mtdpe = (MultipleTermDocPosEnum *)self->data
478
- void tde_destroy(TermDocEnum *self) {
479
- self->close(self);
480
- }
481
-
482
- void mtdpe_close(TermDocEnum *self)
483
- {
484
- GET_MTDPE;
485
-
486
- pq_clear(mtdpe->pq);
487
- pq_destroy(mtdpe->pq);
488
- free(mtdpe->pos_queue);
489
- free(mtdpe);
490
- free(self);
491
- }
492
-
493
- void mtdpe_seek(TermDocEnum *tde, Term *term)
494
- { RAISE(UNSUPPORTED_ERROR, UNSUPPORTED_ERROR_MSG);}
495
-
496
- bool mtdpe_next(TermDocEnum *self)
497
- {
498
- TermDocEnum *tde;
499
- int i = 0, freq = 0;
500
- int doc;
501
- GET_MTDPE;
502
-
503
- if (mtdpe->pq->count == 0) return false;
504
-
505
- tde = (TermDocEnum *)pq_top(mtdpe->pq);
506
- doc = tde->doc_num(tde);
507
-
508
- do {
509
- freq += tde->freq(tde);
510
- if (freq > mtdpe->pos_queue_capa) {
511
- mtdpe->pos_queue_capa *= 2;
512
- REALLOC_N(mtdpe->pos_queue, int, mtdpe->pos_queue_capa);
513
- }
514
-
515
- for (; i < freq; i++) {
516
- mtdpe->pos_queue[i] = tde->next_position(tde);
517
- }
518
-
519
- if (tde->next(tde)) {
520
- pq_down(mtdpe->pq);
521
- } else {
522
- tde = pq_pop(mtdpe->pq);
523
- tde->close(tde);
524
- }
525
- tde = (TermDocEnum *)pq_top(mtdpe->pq);
526
- } while ((mtdpe->pq->count > 0) && (tde->doc_num(tde) == doc));
527
-
528
- qsort(mtdpe->pos_queue, freq, sizeof(int), &icmp_risky);
529
-
530
- mtdpe->pos_queue_index = 0;
531
- mtdpe->freq = freq;
532
- mtdpe->doc_num = doc;
533
-
534
- return true;
535
- }
536
-
537
- int mtdpe_doc_num(TermDocEnum *self)
538
- { return ((MultipleTermDocPosEnum *)self->data)->doc_num; }
539
-
540
- int mtdpe_freq(TermDocEnum *self)
541
- { return ((MultipleTermDocPosEnum *)self->data)->freq; }
542
-
543
-
544
- bool tdpe_less_than(void *p1, void *p2)
545
- {
546
- return ((TermDocEnum *)p1)->doc_num((TermDocEnum *)p1) <
547
- ((TermDocEnum *)p2)->doc_num((TermDocEnum *)p2);
548
- }
549
-
550
- bool mtdpe_skip_to(TermDocEnum *self, int target_doc_num)
551
- {
552
- GET_MTDPE;
553
- TermDocEnum *tde;
554
- while ((tde = pq_top(mtdpe->pq)) != NULL &&
555
- (target_doc_num > tde->doc_num(tde))) {
556
- if (tde->skip_to(tde, target_doc_num)) {
557
- pq_down(mtdpe->pq);
558
- } else {
559
- tde = pq_pop(mtdpe->pq);
560
- tde->close(tde);
561
- }
562
- }
563
- return self->next(self);
564
- }
565
-
566
- int mtdpe_read(TermDocEnum *tde, int *docs, int *freqs, int req_num)
567
- {
568
- RAISE(UNSUPPORTED_ERROR, UNSUPPORTED_ERROR_MSG);
569
- return -1;
570
- }
571
-
572
- int mtdpe_next_position(TermDocEnum *self)
573
- {
574
- GET_MTDPE;
575
- return mtdpe->pos_queue[mtdpe->pos_queue_index++];
576
- }
577
-
578
- TermDocEnum *mtdpe_create(IndexReader *ir, Term **terms, int t_cnt)
579
- {
580
- int i;
581
- TermDocEnum *self = ALLOC(TermDocEnum);
582
- MultipleTermDocPosEnum *mtdpe = ALLOC_AND_ZERO_N(MultipleTermDocPosEnum, 1);
583
- PriorityQueue *pq;
584
- TermDocEnum *tpe;
585
-
586
- pq = mtdpe->pq = pq_create(t_cnt, &tdpe_less_than);
587
- mtdpe->pos_queue_capa = MTDPE_POS_QUEUE_INIT_CAPA;
588
- mtdpe->pos_queue = ALLOC_N(int, MTDPE_POS_QUEUE_INIT_CAPA);
589
- for (i = 0; i < t_cnt; i++) {
590
- tpe = ir_term_positions_for(ir, terms[i]);
591
- if (tpe->next(tpe)) {
592
- pq_push(pq, tpe);
593
- } else {
594
- tpe->close(tpe);
595
- }
596
- }
597
- pq->free_elem = (free_ft)&tde_destroy;
598
-
599
- self->data = mtdpe;
600
- self->close = &mtdpe_close;
601
- self->seek = &mtdpe_seek;
602
- self->next = &mtdpe_next;
603
- self->doc_num = &mtdpe_doc_num;
604
- self->freq = &mtdpe_freq;
605
- self->skip_to = &mtdpe_skip_to;
606
- self->read = &mtdpe_read;
607
- self->next_position = &mtdpe_next_position;
608
-
609
- return self;
610
- }
611
-