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/q_const_score.c CHANGED
@@ -3,146 +3,159 @@
3
3
 
4
4
  /***************************************************************************
5
5
  *
6
- * Weight
6
+ * ConstantScoreScorer
7
7
  *
8
8
  ***************************************************************************/
9
9
 
10
- char *csw_to_s(Weight *self)
10
+ #define CScQ(query) ((ConstantScoreQuery *)(query))
11
+ #define CScSc(scorer) ((ConstantScoreScorer *)(scorer))
12
+
13
+ typedef struct ConstantScoreScorer
14
+ {
15
+ Scorer super;
16
+ BitVector *bv;
17
+ float score;
18
+ } ConstantScoreScorer;
19
+
20
+ static float cssc_score(Scorer *self)
11
21
  {
12
- return strfmt("ConstantScoreWeight(%f)", self->value);
22
+ return CScSc(self)->score;
13
23
  }
14
24
 
15
- Explanation *csw_explain(Weight *self, IndexReader *ir, int doc_num)
25
+ static bool cssc_next(Scorer *self)
16
26
  {
17
- Filter *filter = (Filter *)self->query->data;
18
- Explanation *expl;
19
- char *filter_str = filter->to_s(filter);
20
- BitVector *bv = filt_get_bv(filter, ir);
21
-
22
- if (bv_get(bv, doc_num)) {
23
- expl = expl_create(self->value,
24
- strfmt("ConstantScoreQuery(%s), product of:", filter_str));
25
- expl_add_detail(expl, expl_create(self->query->boost, estrdup("boost")));
26
- expl_add_detail(expl, expl_create(self->qnorm, estrdup("query_norm")));
27
- } else {
28
- expl = expl_create(self->value,
29
- strfmt("ConstantScoreQuery(%s), does not match id %d",
30
- filter_str, doc_num));
31
- }
32
- free(filter_str);
33
- return expl;
27
+ return ((self->doc = bv_scan_next(CScSc(self)->bv)) >= 0);
34
28
  }
35
29
 
36
- Weight *csw_create(Query *query, Searcher *searcher)
30
+ static bool cssc_skip_to(Scorer *self, int doc_num)
37
31
  {
38
- Weight *self = w_create(query);
39
- self->scorer = &cssc_create;
40
- self->explain = &csw_explain;
41
- self->to_s = &csw_to_s;
42
- self->sum_of_squared_weights = &w_sum_of_squared_weights;
32
+ return ((self->doc = bv_scan_next_from(CScSc(self)->bv, doc_num)) >= 0);
33
+ }
43
34
 
44
- self->similarity = query->get_similarity(query, searcher);
45
- self->idf = 1.0;
35
+ static Explanation *cssc_explain(Scorer *self, int doc_num)
36
+ {
37
+ (void)self; (void)doc_num;
38
+ return expl_new(1.0, "ConstantScoreScorer");
39
+ }
46
40
 
47
- return self;
41
+ static Scorer *cssc_new(Weight *weight, IndexReader *ir)
42
+ {
43
+ Scorer *self = scorer_new(ConstantScoreScorer, weight->similarity);
44
+ Filter *filter = CScQ(weight->query)->filter;
45
+
46
+ CScSc(self)->score = weight->value;
47
+ CScSc(self)->bv = filt_get_bv(filter, ir);
48
+
49
+ self->score = &cssc_score;
50
+ self->next = &cssc_next;
51
+ self->skip_to = &cssc_skip_to;
52
+ self->explain = &cssc_explain;
53
+ self->destroy = &scorer_destroy_i;
54
+ return self;
48
55
  }
49
56
 
50
57
  /***************************************************************************
51
58
  *
52
- * ConstantScoreQuery
59
+ * ConstantScoreWeight
53
60
  *
54
61
  ***************************************************************************/
55
62
 
56
- char *csq_to_s(Query *self, char *field)
63
+ static char *csw_to_s(Weight *self)
57
64
  {
58
- Filter *filter = (Filter *)self->data;
59
- char *filter_str = filter->to_s(filter);
60
- char *buffer;
61
- if (self->boost == 1.0) {
62
- buffer = strfmt("ConstantScore(%s)", filter_str);
63
- } else {
64
- buffer = strfmt("ConstantScore(%s)^%f", filter_str, self->boost);
65
- }
66
- free(filter_str);
67
- return buffer;;
65
+ return strfmt("ConstantScoreWeight(%f)", self->value);
68
66
  }
69
67
 
70
- void csq_destroy(Query *self)
68
+ static Explanation *csw_explain(Weight *self, IndexReader *ir, int doc_num)
71
69
  {
72
- if (self->destroy_all) {
73
- Filter *filter = (Filter *)self->data;
74
- filter->destroy(filter);
75
- }
76
- q_destroy_i(self);
70
+ Filter *filter = CScQ(self->query)->filter;
71
+ Explanation *expl;
72
+ char *filter_str = filter->to_s(filter);
73
+ BitVector *bv = filt_get_bv(filter, ir);
74
+
75
+ if (bv_get(bv, doc_num)) {
76
+ expl = expl_new(self->value,
77
+ "ConstantScoreQuery(%s), product of:", filter_str);
78
+ expl_add_detail(expl, expl_new(self->query->boost, "boost"));
79
+ expl_add_detail(expl, expl_new(self->qnorm, "query_norm"));
80
+ }
81
+ else {
82
+ expl = expl_new(self->value,
83
+ "ConstantScoreQuery(%s), does not match id %d",
84
+ filter_str, doc_num);
85
+ }
86
+ free(filter_str);
87
+ return expl;
77
88
  }
78
89
 
79
- static uint csq_hash(Query *self)
90
+ static Weight *csw_new(Query *query, Searcher *searcher)
80
91
  {
81
- return filt_hash((Filter *)self->data);
82
- }
92
+ Weight *self = w_new(Weight, query);
83
93
 
84
- static int csq_eq(Query *self, Query *o)
85
- {
86
- return filt_eq((Filter *)self->data, (Filter *)o->data);
87
- }
88
-
89
- Query *csq_create(Filter *filter)
90
- {
91
- Query *self = q_create();
92
- self->data = filter;
94
+ self->scorer = &cssc_new;
95
+ self->explain = &csw_explain;
96
+ self->to_s = &csw_to_s;
93
97
 
94
- self->type = CONSTANT_QUERY;
95
- self->to_s = &csq_to_s;
96
- self->hash = &csq_hash;
97
- self->eq = &csq_eq;
98
- self->destroy_i = &csq_destroy;
99
- self->create_weight_i = &csw_create;
98
+ self->similarity = query->get_similarity(query, searcher);
99
+ self->idf = 1.0;
100
100
 
101
- return self;
101
+ return self;
102
102
  }
103
103
 
104
104
  /***************************************************************************
105
105
  *
106
- * ConstantScoreScorer
106
+ * ConstantScoreQuery
107
107
  *
108
108
  ***************************************************************************/
109
109
 
110
- float cssc_score(Scorer *self)
110
+ static char *csq_to_s(Query *self, const char *field)
111
111
  {
112
- return ((ConstantScoreScorer *)self->data)->score;
112
+ Filter *filter = CScQ(self)->filter;
113
+ char *filter_str = filter->to_s(filter);
114
+ char *buffer;
115
+ (void)field;
116
+ if (self->boost == 1.0) {
117
+ buffer = strfmt("ConstantScore(%s)", filter_str);
118
+ }
119
+ else {
120
+ buffer = strfmt("ConstantScore(%s)^%f", filter_str, self->boost);
121
+ }
122
+ free(filter_str);
123
+ return buffer;;
113
124
  }
114
125
 
115
- bool cssc_next(Scorer *self)
126
+ static void csq_destroy(Query *self)
116
127
  {
117
- BitVector *bv = ((ConstantScoreScorer *)self->data)->bv;
118
- return ((self->doc = bv_scan_next(bv)) >= 0);
128
+ filt_deref(CScQ(self)->filter);
129
+ q_destroy_i(self);
119
130
  }
120
131
 
121
- bool cssc_skip_to(Scorer *self, int doc_num)
132
+ static ulong csq_hash(Query *self)
122
133
  {
123
- BitVector *bv = ((ConstantScoreScorer *)self->data)->bv;
124
- return ((self->doc = bv_scan_next_from(bv, doc_num)) >= 0);
134
+ return filt_hash(CScQ(self)->filter);
125
135
  }
126
136
 
127
- Explanation *cssc_explain(Scorer *self, int doc_num)
137
+ static int csq_eq(Query *self, Query *o)
128
138
  {
129
- return expl_create(1.0, estrdup("ConstantScoreScorer"));
139
+ return filt_eq(CScQ(self)->filter, CScQ(o)->filter);
140
+ }
141
+
142
+ Query *csq_new_nr(Filter *filter)
143
+ {
144
+ Query *self = q_new(ConstantScoreQuery);
145
+ CScQ(self)->filter = filter;
146
+
147
+ self->type = CONSTANT_QUERY;
148
+ self->to_s = &csq_to_s;
149
+ self->hash = &csq_hash;
150
+ self->eq = &csq_eq;
151
+ self->destroy_i = &csq_destroy;
152
+ self->create_weight_i = &csw_new;
153
+
154
+ return self;
130
155
  }
131
156
 
132
- Scorer *cssc_create(Weight *weight, IndexReader *ir)
157
+ Query *csq_new(Filter *filter)
133
158
  {
134
- Scorer *self = scorer_create(weight->similarity);
135
- Filter *filter = (Filter *)weight->query->data;
136
- ConstantScoreScorer *cssc = ALLOC(ConstantScoreScorer);
137
- ZEROSET(cssc, ConstantScoreScorer, 1);
138
- self->data = cssc;
139
- cssc->score = weight->value;
140
- cssc->bv = filt_get_bv(filter, ir);
141
-
142
- self->score = &cssc_score;
143
- self->next = &cssc_next;
144
- self->skip_to = &cssc_skip_to;
145
- self->explain = &cssc_explain;
146
- self->destroy = &scorer_destroy_i;
147
- return self;
159
+ REF(filter);
160
+ return csq_new_nr(filter);
148
161
  }
@@ -1,206 +1,209 @@
1
1
  #include "search.h"
2
2
  #include <string.h>
3
3
 
4
- Scorer *fqsc_create(Scorer *scorer, BitVector *bv, Similarity *sim);
5
-
6
4
  /***************************************************************************
7
5
  *
8
- * Weight
6
+ * FilteredQueryScorer
9
7
  *
10
8
  ***************************************************************************/
11
9
 
12
- char *fqw_to_s(Weight *self)
13
- {
14
- return strfmt("FilteredQueryWeight(%f)", self->value);
15
- }
10
+ #define FQSc(scorer) ((FilteredQueryScorer *)(scorer))
11
+ #define FQQ(query) ((FilteredQuery *)(query))
16
12
 
17
- float fqw_sum_of_squared_weights(Weight *self)
13
+ typedef struct FilteredQueryScorer
18
14
  {
19
- Weight *sw = (Weight *)self->data;
20
- return sw->sum_of_squared_weights(sw);
21
- }
15
+ Scorer super;
16
+ Scorer *sub_scorer;
17
+ BitVector *bv;
18
+ } FilteredQueryScorer;
22
19
 
23
- void fqw_normalize(Weight *self, float normalization_factor)
20
+ float fqsc_score(Scorer *self)
24
21
  {
25
- Weight *sw = (Weight *)self->data;
26
- sw->normalize(sw, normalization_factor);
22
+ Scorer *sub_sc = FQSc(self)->sub_scorer;
23
+ return sub_sc->score(sub_sc);
27
24
  }
28
25
 
29
- float fqw_get_value(Weight *self)
26
+ bool fqsc_next(Scorer *self)
30
27
  {
31
- Weight *sw = (Weight *)self->data;
32
- return sw->get_value(sw);
28
+ Scorer *sub_sc = FQSc(self)->sub_scorer;
29
+ BitVector *bv = FQSc(self)->bv;
30
+ while (sub_sc->next(sub_sc)) {
31
+ self->doc = sub_sc->doc;
32
+ if (bv_get(bv, self->doc)) return true;
33
+ }
34
+ return false;
33
35
  }
34
36
 
35
- Explanation *fqw_explain(Weight *self, IndexReader *ir, int doc_num)
37
+ bool fqsc_skip_to(Scorer *self, int doc_num)
36
38
  {
37
- Weight *sw = (Weight *)self->data;
38
- return sw->explain(sw, ir, doc_num);
39
+ Scorer *sub_sc = FQSc(self)->sub_scorer;
40
+ BitVector *bv = FQSc(self)->bv;
41
+ if (sub_sc->skip_to(sub_sc, doc_num)) {
42
+ self->doc = sub_sc->doc;
43
+ do {
44
+ if (bv_get(bv, self->doc)) return true;
45
+ } while (sub_sc->next(sub_sc));
46
+ }
47
+ return false;
39
48
  }
40
49
 
41
- Scorer *fqw_scorer(Weight *self, IndexReader *ir)
50
+ Explanation *fqsc_explain(Scorer *self, int doc_num)
42
51
  {
43
- Weight *sw = (Weight *)self->data;
44
- Scorer *scorer = sw->scorer(sw, ir);
45
- Filter *filter = ((FilteredQuery *)self->query->data)->filter;
46
-
47
- return fqsc_create(scorer, filter->get_bv(filter, ir), self->similarity);
52
+ Scorer *sub_sc = FQSc(self)->sub_scorer;
53
+ return sub_sc->explain(sub_sc, doc_num);
48
54
  }
49
55
 
50
- void fqw_destroy(Weight *self)
56
+ void fqsc_destroy(Scorer *self)
51
57
  {
52
- Weight *sw = (Weight *)self->data;
53
- sw->destroy(sw);
54
- w_destroy(self);
58
+ FilteredQueryScorer *fqsc = FQSc(self);
59
+ fqsc->sub_scorer->destroy(fqsc->sub_scorer);
60
+ scorer_destroy_i(self);
55
61
  }
56
62
 
57
- Weight *fqw_create(Query *query, Weight *sub_weight, Similarity *sim)
63
+ Scorer *fqsc_new(Scorer *scorer, BitVector *bv, Similarity *sim)
58
64
  {
59
- Weight *self = w_create(query);
60
-
61
- self->data = sub_weight;
65
+ Scorer *self = scorer_new(FilteredQueryScorer, sim);
62
66
 
63
- self->get_value = &fqw_get_value;
64
- self->normalize = &fqw_normalize;
65
- self->scorer = &fqw_scorer;
66
- self->explain = &fqw_explain;
67
- self->to_s = &fqw_to_s;
68
- self->destroy = &fqw_destroy;
69
- self->sum_of_squared_weights = &fqw_sum_of_squared_weights;
67
+ FQSc(self)->sub_scorer = scorer;
68
+ FQSc(self)->bv = bv;
70
69
 
71
- self->similarity = sim;
72
- self->idf = 1.0;
73
- self->value = sub_weight->value;
70
+ self->score = &fqsc_score;
71
+ self->next = &fqsc_next;
72
+ self->skip_to = &fqsc_skip_to;
73
+ self->explain = &fqsc_explain;
74
+ self->destroy = &fqsc_destroy;
74
75
 
75
- return self;
76
+ return self;
76
77
  }
77
78
 
78
79
  /***************************************************************************
79
80
  *
80
- * FilteredQueryQuery
81
+ * Weight
81
82
  *
82
83
  ***************************************************************************/
83
84
 
84
- char *fq_to_s(Query *self, char *field)
85
+ #define FQW(weight) ((FilteredQueryWeight *)(weight))
86
+ typedef struct FilteredQueryWeight
85
87
  {
86
- FilteredQuery *fq = (FilteredQuery *)self->data;
87
- char *filter_str = fq->filter->to_s(fq->filter);
88
- char *query_str = fq->query->to_s(fq->query, field);
89
- char *buffer;
90
- if (self->boost == 1.0) {
91
- buffer = strfmt("FilteredQuery(query:%s, filter:%s)",
92
- query_str, filter_str);
93
- } else {
94
- buffer = strfmt("FilteredQuery(query:%s, filter:%s)^%f",
95
- query_str, filter_str, self->boost);
96
- }
97
- free(filter_str);
98
- free(query_str);
99
- return buffer;;
88
+ Weight super;
89
+ Weight *sub_weight;
90
+ } FilteredQueryWeight;
91
+
92
+ static char *fqw_to_s(Weight *self)
93
+ {
94
+ return strfmt("FilteredQueryWeight(%f)", self->value);
100
95
  }
101
96
 
102
- void fq_destroy(Query *self)
97
+ static float fqw_sum_of_squared_weights(Weight *self)
103
98
  {
104
- if (self->destroy_all) {
105
- FilteredQuery *fq = (FilteredQuery *)self->data;
106
- fq->filter->destroy(fq->filter);
107
- q_deref(fq->query);
108
- }
109
- free(self->data);
110
- q_destroy_i(self);
99
+ Weight *sub_weight = FQW(self)->sub_weight;
100
+ return sub_weight->sum_of_squared_weights(sub_weight);
111
101
  }
112
102
 
113
- Weight *fq_create_weight(Query *self, Searcher *searcher)
103
+ static void fqw_normalize(Weight *self, float normalization_factor)
114
104
  {
115
- Query *sub_query = ((FilteredQuery *)self->data)->query;
116
- return fqw_create(self, q_weight(sub_query, searcher),
117
- searcher->similarity);
105
+ Weight *sub_weight = FQW(self)->sub_weight;
106
+ sub_weight->normalize(sub_weight, normalization_factor);
118
107
  }
119
108
 
120
- Query *fq_create(Query *query, Filter *filter)
109
+ static float fqw_get_value(Weight *self)
121
110
  {
122
- Query *self = q_create();
111
+ Weight *sub_weight = FQW(self)->sub_weight;
112
+ return sub_weight->get_value(sub_weight);
113
+ }
123
114
 
124
- FilteredQuery *fq = ALLOC(FilteredQuery);
125
- fq->query = query;
126
- fq->filter = filter;
127
- self->data = fq;
115
+ static Explanation *fqw_explain(Weight *self, IndexReader *ir, int doc_num)
116
+ {
117
+ Weight *sub_weight = FQW(self)->sub_weight;
118
+ return sub_weight->explain(sub_weight, ir, doc_num);
119
+ }
128
120
 
129
- self->type = FILTERED_QUERY;
130
- self->to_s = &fq_to_s;
131
- self->destroy_i = &fq_destroy;
132
- self->create_weight_i = &fq_create_weight;
121
+ static Scorer *fqw_scorer(Weight *self, IndexReader *ir)
122
+ {
123
+ Weight *sub_weight = FQW(self)->sub_weight;
124
+ Scorer *scorer = sub_weight->scorer(sub_weight, ir);
125
+ Filter *filter = FQQ(self->query)->filter;
133
126
 
134
- return self;
127
+ return fqsc_new(scorer, filt_get_bv(filter, ir), self->similarity);
128
+ }
129
+
130
+ static void fqw_destroy(Weight *self)
131
+ {
132
+ Weight *sub_weight = FQW(self)->sub_weight;
133
+ sub_weight->destroy(sub_weight);
134
+ w_destroy(self);
135
+ }
136
+
137
+ static Weight *fqw_new(Query *query, Weight *sub_weight, Similarity *sim)
138
+ {
139
+ Weight *self = w_new(FilteredQueryWeight, query);
140
+
141
+ FQW(self)->sub_weight = sub_weight;
142
+
143
+ self->get_value = &fqw_get_value;
144
+ self->normalize = &fqw_normalize;
145
+ self->scorer = &fqw_scorer;
146
+ self->explain = &fqw_explain;
147
+ self->to_s = &fqw_to_s;
148
+ self->destroy = &fqw_destroy;
149
+ self->sum_of_squared_weights = &fqw_sum_of_squared_weights;
150
+
151
+ self->similarity = sim;
152
+ self->idf = 1.0;
153
+ self->value = sub_weight->value;
154
+
155
+ return self;
135
156
  }
136
157
 
137
158
  /***************************************************************************
138
159
  *
139
- * FilteredQueryScorer
160
+ * FilteredQuery
140
161
  *
141
162
  ***************************************************************************/
142
163
 
143
- typedef struct FilteredQueryScorer {
144
- Scorer *sub_scorer;
145
- BitVector *bv;
146
- } FilteredQueryScorer;
147
-
148
- float fqsc_score(Scorer *self)
164
+ static char *fq_to_s(Query *self, const char *field)
149
165
  {
150
- Scorer *sub_sc = ((FilteredQueryScorer *)self->data)->sub_scorer;
151
- return sub_sc->score(sub_sc);
166
+ FilteredQuery *fq = FQQ(self);
167
+ char *filter_str = fq->filter->to_s(fq->filter);
168
+ char *query_str = fq->query->to_s(fq->query, field);
169
+ char *buffer;
170
+ if (self->boost == 1.0) {
171
+ buffer = strfmt("FilteredQuery(query:%s, filter:%s)",
172
+ query_str, filter_str);
173
+ } else {
174
+ buffer = strfmt("FilteredQuery(query:%s, filter:%s)^%f",
175
+ query_str, filter_str, self->boost);
176
+ }
177
+ free(filter_str);
178
+ free(query_str);
179
+ return buffer;;
152
180
  }
153
181
 
154
- bool fqsc_next(Scorer *self)
182
+ void fq_destroy(Query *self)
155
183
  {
156
- Scorer *sub_sc = ((FilteredQueryScorer *)self->data)->sub_scorer;
157
- BitVector *bv = ((FilteredQueryScorer *)self->data)->bv;
158
- while (sub_sc->next(sub_sc)) {
159
- self->doc = sub_sc->doc;
160
- if (bv_get(bv, self->doc)) return true;
161
- }
162
- return false;
184
+ filt_deref(FQQ(self)->filter);
185
+ q_deref(FQQ(self)->query);
186
+ q_destroy_i(self);
163
187
  }
164
188
 
165
- bool fqsc_skip_to(Scorer *self, int doc_num)
189
+ Weight *fq_new_weight(Query *self, Searcher *searcher)
166
190
  {
167
- Scorer *sub_sc = ((FilteredQueryScorer *)self->data)->sub_scorer;
168
- BitVector *bv = ((FilteredQueryScorer *)self->data)->bv;
169
- if (sub_sc->skip_to(sub_sc, doc_num)) {
170
- self->doc = sub_sc->doc;
171
- do {
172
- if (bv_get(bv, self->doc)) return true;
173
- } while (sub_sc->next(sub_sc));
174
- }
175
- return false;
191
+ Query *sub_query = FQQ(self)->query;
192
+ return fqw_new(self, q_weight(sub_query, searcher),
193
+ searcher->similarity);
176
194
  }
177
195
 
178
- Explanation *fqsc_explain(Scorer *self, int doc_num)
196
+ Query *fq_new(Query *query, Filter *filter)
179
197
  {
180
- Scorer *sub_sc = ((FilteredQueryScorer *)self->data)->sub_scorer;
181
- return sub_sc->explain(sub_sc, doc_num);
182
- }
198
+ Query *self = q_new(FilteredQuery);
183
199
 
184
- void fqsc_destroy(Scorer *self)
185
- {
186
- FilteredQueryScorer *fqsc = (FilteredQueryScorer *)self->data;
187
- bv_destroy(fqsc->bv);
188
- fqsc->sub_scorer->destroy(fqsc->sub_scorer);
189
- scorer_destroy_i(self);
190
- }
200
+ FQQ(self)->query = query;
201
+ FQQ(self)->filter = filter;
191
202
 
192
- Scorer *fqsc_create(Scorer *scorer, BitVector *bv, Similarity *sim)
193
- {
194
- Scorer *self = scorer_create(sim);
195
- FilteredQueryScorer *fqsc = ALLOC(FilteredQueryScorer);
196
- fqsc->sub_scorer = scorer;
197
- fqsc->bv = bv;
198
- self->data = fqsc;
203
+ self->type = FILTERED_QUERY;
204
+ self->to_s = &fq_to_s;
205
+ self->destroy_i = &fq_destroy;
206
+ self->create_weight_i = &fq_new_weight;
199
207
 
200
- self->score = &fqsc_score;
201
- self->next = &fqsc_next;
202
- self->skip_to = &fqsc_skip_to;
203
- self->explain = &fqsc_explain;
204
- self->destroy = &fqsc_destroy;
205
- return self;
208
+ return self;
206
209
  }