ferret 0.10.6 → 0.10.7
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/analysis.c +136 -107
- data/ext/analysis.h +4 -0
- data/ext/bitvector.c +2 -2
- data/ext/bitvector.h +1 -1
- data/ext/compound_io.c +4 -4
- data/ext/defines.h +0 -2
- data/ext/filter.c +3 -3
- data/ext/fs_store.c +4 -4
- data/ext/hash.c +29 -18
- data/ext/hash.h +34 -16
- data/ext/hashset.c +6 -3
- data/ext/hashset.h +1 -1
- data/ext/index.c +22 -20
- data/ext/q_boolean.c +3 -3
- data/ext/q_const_score.c +1 -1
- data/ext/q_fuzzy.c +1 -1
- data/ext/q_match_all.c +1 -1
- data/ext/q_multi_term.c +2 -2
- data/ext/q_parser.c +21 -6
- data/ext/q_phrase.c +2 -2
- data/ext/q_prefix.c +1 -1
- data/ext/q_range.c +3 -3
- data/ext/q_span.c +8 -8
- data/ext/q_term.c +1 -1
- data/ext/q_wildcard.c +1 -1
- data/ext/r_analysis.c +10 -4
- data/ext/r_index.c +89 -12
- data/ext/r_qparser.c +67 -4
- data/ext/r_search.c +11 -1
- data/ext/r_store.c +51 -35
- data/ext/ram_store.c +18 -18
- data/ext/search.c +1 -1
- data/ext/search.h +25 -23
- data/ext/similarity.c +1 -1
- data/ext/sort.c +1 -1
- data/ext/store.c +22 -3
- data/ext/store.h +8 -2
- data/lib/ferret/index.rb +14 -4
- data/lib/ferret_version.rb +1 -1
- data/test/test_helper.rb +3 -0
- data/test/unit/analysis/tc_analyzer.rb +5 -5
- data/test/unit/analysis/tc_token_stream.rb +3 -3
- data/test/unit/index/tc_index_writer.rb +1 -1
- data/test/unit/query_parser/tc_query_parser.rb +7 -5
- data/test/unit/search/tc_filter.rb +1 -1
- data/test/unit/search/tc_fuzzy_query.rb +1 -1
- data/test/unit/search/tc_index_searcher.rb +1 -1
- data/test/unit/search/tc_multi_searcher.rb +1 -1
- data/test/unit/search/tc_search_and_sort.rb +1 -1
- data/test/unit/search/tc_spans.rb +1 -1
- metadata +4 -3
data/ext/hash.h
CHANGED
@@ -28,7 +28,7 @@ enum HashSetValues
|
|
28
28
|
*/
|
29
29
|
typedef struct
|
30
30
|
{
|
31
|
-
|
31
|
+
unsigned long hash;
|
32
32
|
void *key;
|
33
33
|
void *value;
|
34
34
|
} HashEntry;
|
@@ -58,11 +58,11 @@ typedef struct HashTable
|
|
58
58
|
|
59
59
|
/* the following function pointers are used internally and should not be
|
60
60
|
* used outside of the HashTable methods */
|
61
|
-
HashEntry
|
62
|
-
|
63
|
-
int
|
64
|
-
void
|
65
|
-
void
|
61
|
+
HashEntry *(*lookup_i)(struct HashTable *self, register const void *key);
|
62
|
+
unsigned long (*hash_i)(const void *key);
|
63
|
+
int (*eq_i)(const void *key1, const void *key2);
|
64
|
+
void (*free_key_i)(void *p);
|
65
|
+
void (*free_value_i)(void *p);
|
66
66
|
} HashTable;
|
67
67
|
|
68
68
|
/**
|
@@ -72,7 +72,7 @@ typedef struct HashTable
|
|
72
72
|
* @param key object to hash
|
73
73
|
* @return an unsigned 32-bit integer hash value
|
74
74
|
*/
|
75
|
-
typedef
|
75
|
+
typedef unsigned long (*hash_ft)(const void *key);
|
76
76
|
|
77
77
|
/**
|
78
78
|
* Equals function type used by HashTable. A function of this type must be
|
@@ -86,15 +86,33 @@ typedef int (*eq_ft)(const void *key1, const void *key2);
|
|
86
86
|
* function used to add integers to a HashTable, either as the key or the
|
87
87
|
* value.
|
88
88
|
*/
|
89
|
-
extern
|
89
|
+
extern unsigned long *imalloc(unsigned long value);
|
90
90
|
|
91
91
|
/**
|
92
92
|
* Determine a hash value for a string. The string must be null terminated
|
93
93
|
*
|
94
94
|
* @param str string to hash
|
95
|
-
* @return an unsigned
|
95
|
+
* @return an unsigned long integer hash value
|
96
|
+
*/
|
97
|
+
extern unsigned long str_hash(const char *const str);
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Determine a hash value for a pointer. Just cast the pointer to an unsigned
|
101
|
+
* long.
|
102
|
+
*
|
103
|
+
* @param ptr pointer to hash
|
104
|
+
* @return an unsigned long integer hash value
|
105
|
+
*/
|
106
|
+
extern unsigned long ptr_hash(const void *const ptr);
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Determine if two pointers point to the same point in memory.
|
110
|
+
*
|
111
|
+
* @param q1 first pointer
|
112
|
+
* @param q2 second pointer
|
113
|
+
* @return true if the pointers are equal
|
96
114
|
*/
|
97
|
-
extern
|
115
|
+
extern int ptr_eq(const void *q1, const void *q2);
|
98
116
|
|
99
117
|
/**
|
100
118
|
* Create a new HashTable that uses any type of object as it's key. The
|
@@ -280,7 +298,7 @@ extern int h_has_key(HashTable *self, const void *key);
|
|
280
298
|
* @return the value referenced by the key +key+. If there is no value
|
281
299
|
* referenced by that key, NULL is returned.
|
282
300
|
*/
|
283
|
-
extern void *h_get_int(HashTable *self, const
|
301
|
+
extern void *h_get_int(HashTable *self, const unsigned long key);
|
284
302
|
|
285
303
|
/**
|
286
304
|
* Delete the value in HashTable referenced by the integer key +key+. When the
|
@@ -297,7 +315,7 @@ extern void *h_get_int(HashTable *self, const ulong key);
|
|
297
315
|
* @return true if the object was successfully deleted or false if the key was
|
298
316
|
* not found
|
299
317
|
*/
|
300
|
-
extern int h_del_int(HashTable *self, const
|
318
|
+
extern int h_del_int(HashTable *self, const unsigned long key);
|
301
319
|
|
302
320
|
/**
|
303
321
|
* Remove the value in HashTable referenced by the integer key +key+. When the
|
@@ -311,7 +329,7 @@ extern int h_del_int(HashTable *self, const ulong key);
|
|
311
329
|
* @param key the integer key to lookup
|
312
330
|
* @return the value referenced by +key+ if it can be found or NULL otherwise
|
313
331
|
*/
|
314
|
-
extern void *h_rem_int(HashTable *self, const
|
332
|
+
extern void *h_rem_int(HashTable *self, const unsigned long key);
|
315
333
|
|
316
334
|
/**
|
317
335
|
* WARNING: this function may destroy an old value if the key already exists
|
@@ -341,7 +359,7 @@ extern void *h_rem_int(HashTable *self, const ulong key);
|
|
341
359
|
* the existing key so no key was freed
|
342
360
|
* </pre>
|
343
361
|
*/
|
344
|
-
extern int h_set_int(HashTable *self, const
|
362
|
+
extern int h_set_int(HashTable *self, const unsigned long key, void *value);
|
345
363
|
|
346
364
|
/**
|
347
365
|
* Add the value +value+ to the HashTable referencing it with integer key
|
@@ -353,7 +371,7 @@ extern int h_set_int(HashTable *self, const ulong key, void *value);
|
|
353
371
|
* @param value the value to add to the HashTable
|
354
372
|
* @return true if the value was successfully added or false otherwise
|
355
373
|
*/
|
356
|
-
extern int h_set_safe_int(HashTable *self, const
|
374
|
+
extern int h_set_safe_int(HashTable *self, const unsigned long key, void *value);
|
357
375
|
/**
|
358
376
|
* Check whether integer key +key+ exists in the HashTable.
|
359
377
|
*
|
@@ -361,7 +379,7 @@ extern int h_set_safe_int(HashTable *self, const ulong key, void *value);
|
|
361
379
|
* @param key the integer key to check for in the HashTable
|
362
380
|
* @return true if the key exists in the HashTable, false otherwise.
|
363
381
|
*/
|
364
|
-
extern int h_has_key_int(HashTable *self, const
|
382
|
+
extern int h_has_key_int(HashTable *self, const unsigned long key);
|
365
383
|
|
366
384
|
typedef void (*h_each_key_val_ft)(void *key, void *value, void *arg);
|
367
385
|
|
data/ext/hashset.c
CHANGED
@@ -17,7 +17,7 @@ static HashSet *hs_alloc(void (*free_elem) (void *p))
|
|
17
17
|
return hs;
|
18
18
|
}
|
19
19
|
|
20
|
-
HashSet *hs_new(
|
20
|
+
HashSet *hs_new(unsigned long (*hash)(const void *p),
|
21
21
|
int (*eq)(const void *p1, const void *p2),
|
22
22
|
void (*free_elem)(void *p))
|
23
23
|
{
|
@@ -129,11 +129,14 @@ void *hs_rem(HashSet *hs, void *elem)
|
|
129
129
|
}
|
130
130
|
else {
|
131
131
|
int i = *index;
|
132
|
+
int j;
|
132
133
|
ret_elem = hs->elems[i];
|
133
134
|
h_del(hs->ht, elem);
|
134
135
|
hs->size--;
|
135
|
-
|
136
|
-
|
136
|
+
for (j = i; j < hs->size; j++) {
|
137
|
+
hs->elems[j] = hs->elems[j+1];
|
138
|
+
h_set(hs->ht, hs->elems[j], imalloc(j));
|
139
|
+
}
|
137
140
|
return ret_elem;
|
138
141
|
}
|
139
142
|
}
|
data/ext/hashset.h
CHANGED
@@ -36,7 +36,7 @@ typedef struct HashSet
|
|
36
36
|
* when the HashSet if destroyed or duplicate elements are added to the Set
|
37
37
|
* @return a newly allocated HashSet structure
|
38
38
|
*/
|
39
|
-
extern HashSet *hs_new(
|
39
|
+
extern HashSet *hs_new(unsigned long (*hash)(const void *p),
|
40
40
|
int (*eq)(const void *p1, const void *p2),
|
41
41
|
void (*free_elem)(void *p));
|
42
42
|
|
data/ext/index.c
CHANGED
@@ -47,9 +47,9 @@ static char *ste_next(TermEnum *te);
|
|
47
47
|
*
|
48
48
|
***************************************************************************/
|
49
49
|
|
50
|
-
static
|
50
|
+
static unsigned long co_hash(const void *key)
|
51
51
|
{
|
52
|
-
return (
|
52
|
+
return (unsigned long)key;
|
53
53
|
}
|
54
54
|
|
55
55
|
static int co_eq(const void *key1, const void *key2)
|
@@ -2675,7 +2675,9 @@ static bool mtdpe_next(TermDocEnum *tde)
|
|
2675
2675
|
do {
|
2676
2676
|
freq += sub_tde->freq(sub_tde);
|
2677
2677
|
if (freq > mtdpe->pos_queue_capa) {
|
2678
|
-
|
2678
|
+
do {
|
2679
|
+
mtdpe->pos_queue_capa <<= 1;
|
2680
|
+
} while (freq > mtdpe->pos_queue_capa);
|
2679
2681
|
REALLOC_N(mtdpe->pos_queue, int, mtdpe->pos_queue_capa);
|
2680
2682
|
}
|
2681
2683
|
|
@@ -2804,7 +2806,7 @@ void ir_acquire_write_lock(IndexReader *ir)
|
|
2804
2806
|
}
|
2805
2807
|
|
2806
2808
|
if (ir->write_lock == NULL) {
|
2807
|
-
ir->write_lock =
|
2809
|
+
ir->write_lock = open_lock(ir->store, WRITE_LOCK_NAME);
|
2808
2810
|
if (!ir->write_lock->obtain(ir->write_lock)) {/* obtain write lock */
|
2809
2811
|
RAISE(LOCK_ERROR, "Could not obtain write lock when trying to "
|
2810
2812
|
"write changes to the index. Check that there "
|
@@ -2819,7 +2821,7 @@ void ir_acquire_write_lock(IndexReader *ir)
|
|
2819
2821
|
if (sis_read_current_version(ir->store) > ir->sis->version) {
|
2820
2822
|
ir->is_stale = true;
|
2821
2823
|
ir->write_lock->release(ir->write_lock);
|
2822
|
-
|
2824
|
+
close_lock(ir->write_lock);
|
2823
2825
|
ir->write_lock = NULL;
|
2824
2826
|
RAISE(STATE_ERROR, "IndexReader out of date and no longer valid "
|
2825
2827
|
"for delete, undelete, or set_norm operations. "
|
@@ -3016,7 +3018,7 @@ void ir_commit_i(IndexReader *ir)
|
|
3016
3018
|
Lock *commit_lock;
|
3017
3019
|
|
3018
3020
|
mutex_lock(&ir->store->mutex);
|
3019
|
-
commit_lock =
|
3021
|
+
commit_lock = open_lock(ir->store, COMMIT_LOCK_NAME);
|
3020
3022
|
if (!commit_lock->obtain(commit_lock)) { /* obtain write lock */
|
3021
3023
|
RAISE(LOCK_ERROR, "Error trying to commit the index. Commit "
|
3022
3024
|
"lock already obtained");
|
@@ -3026,13 +3028,13 @@ void ir_commit_i(IndexReader *ir)
|
|
3026
3028
|
sis_write(ir->sis, ir->store);
|
3027
3029
|
|
3028
3030
|
commit_lock->release(commit_lock);
|
3029
|
-
|
3031
|
+
close_lock(commit_lock);
|
3030
3032
|
mutex_unlock(&ir->store->mutex);
|
3031
3033
|
|
3032
3034
|
if (ir->write_lock != NULL) {
|
3033
3035
|
/* release write lock */
|
3034
3036
|
ir->write_lock->release(ir->write_lock);
|
3035
|
-
|
3037
|
+
close_lock(ir->write_lock);
|
3036
3038
|
ir->write_lock = NULL;
|
3037
3039
|
}
|
3038
3040
|
ir->has_changes = false;
|
@@ -3092,15 +3094,15 @@ bool ir_is_latest(IndexReader *ir)
|
|
3092
3094
|
{
|
3093
3095
|
volatile bool is_latest = false;
|
3094
3096
|
|
3095
|
-
Lock *commit_lock =
|
3097
|
+
Lock *commit_lock = open_lock(ir->store, COMMIT_LOCK_NAME);
|
3096
3098
|
if (!commit_lock->obtain(commit_lock)) {
|
3097
|
-
|
3099
|
+
close_lock(commit_lock);
|
3098
3100
|
RAISE(LOCK_ERROR, "Error detecting if the current index is latest "
|
3099
3101
|
"version. Commit lock currently obtained");
|
3100
3102
|
}
|
3101
3103
|
is_latest = (sis_read_current_version(ir->store) == ir->sis->version);
|
3102
3104
|
commit_lock->release(commit_lock);
|
3103
|
-
|
3105
|
+
close_lock(commit_lock);
|
3104
3106
|
|
3105
3107
|
return is_latest;
|
3106
3108
|
}
|
@@ -5156,7 +5158,7 @@ static void iw_merge_segments(IndexWriter *iw, const int min_seg,
|
|
5156
5158
|
si->doc_cnt = sm_merge(merger);
|
5157
5159
|
|
5158
5160
|
mutex_lock(&iw->store->mutex);
|
5159
|
-
commit_lock =
|
5161
|
+
commit_lock = open_lock(iw->store, COMMIT_LOCK_NAME);
|
5160
5162
|
|
5161
5163
|
/* *** OBTAIN COMMIT LOCK *** */
|
5162
5164
|
if (!commit_lock->obtain(commit_lock)) {
|
@@ -5179,7 +5181,7 @@ static void iw_merge_segments(IndexWriter *iw, const int min_seg,
|
|
5179
5181
|
iw_commit_compound_file(iw, si->name, commit_lock);
|
5180
5182
|
}
|
5181
5183
|
|
5182
|
-
|
5184
|
+
close_lock(commit_lock);
|
5183
5185
|
|
5184
5186
|
mutex_unlock(&iw->store->mutex);
|
5185
5187
|
|
@@ -5233,7 +5235,7 @@ static void iw_flush_ram_segment(IndexWriter *iw)
|
|
5233
5235
|
dw_flush(iw->dw);
|
5234
5236
|
|
5235
5237
|
mutex_lock(&iw->store->mutex);
|
5236
|
-
commit_lock =
|
5238
|
+
commit_lock = open_lock(iw->store, COMMIT_LOCK_NAME);
|
5237
5239
|
|
5238
5240
|
if (!commit_lock->obtain(commit_lock)) {
|
5239
5241
|
RAISE(LOCK_ERROR, "Couldn't obtain commit lock to write segments file");
|
@@ -5247,7 +5249,7 @@ static void iw_flush_ram_segment(IndexWriter *iw)
|
|
5247
5249
|
if (iw->config.use_compound_file) {
|
5248
5250
|
iw_commit_compound_file(iw, si->name, commit_lock);
|
5249
5251
|
}
|
5250
|
-
|
5252
|
+
close_lock(commit_lock);
|
5251
5253
|
mutex_unlock(&iw->store->mutex);
|
5252
5254
|
|
5253
5255
|
iw_maybe_merge_segments(iw);
|
@@ -5346,7 +5348,7 @@ void iw_close(IndexWriter *iw)
|
|
5346
5348
|
sim_destroy(iw->similarity);
|
5347
5349
|
|
5348
5350
|
iw->write_lock->release(iw->write_lock);
|
5349
|
-
|
5351
|
+
close_lock(iw->write_lock);
|
5350
5352
|
store_deref(iw->store);
|
5351
5353
|
|
5352
5354
|
mutex_destroy(&iw->mutex);
|
@@ -5364,7 +5366,7 @@ IndexWriter *iw_open(Store *store, Analyzer *analyzer, const Config *config)
|
|
5364
5366
|
iw->config = *config;
|
5365
5367
|
|
5366
5368
|
TRY
|
5367
|
-
iw->write_lock =
|
5369
|
+
iw->write_lock = open_lock(store, WRITE_LOCK_NAME);
|
5368
5370
|
if (!iw->write_lock->obtain(iw->write_lock)) {
|
5369
5371
|
RAISE(LOCK_ERROR,
|
5370
5372
|
"Couldn't obtain write lock when opening IndexWriter");
|
@@ -5376,7 +5378,7 @@ IndexWriter *iw_open(Store *store, Analyzer *analyzer, const Config *config)
|
|
5376
5378
|
XCATCHALL
|
5377
5379
|
if (iw->write_lock) {
|
5378
5380
|
iw->write_lock->release(iw->write_lock);
|
5379
|
-
|
5381
|
+
close_lock(iw->write_lock);
|
5380
5382
|
}
|
5381
5383
|
if (iw->sis) sis_destroy(iw->sis);
|
5382
5384
|
if (iw->fis) fis_deref(iw->fis);
|
@@ -5677,7 +5679,7 @@ void iw_add_readers(IndexWriter *iw, IndexReader **readers, const int r_cnt)
|
|
5677
5679
|
}
|
5678
5680
|
|
5679
5681
|
mutex_lock(&iw->store->mutex);
|
5680
|
-
commit_lock =
|
5682
|
+
commit_lock = open_lock(iw->store, COMMIT_LOCK_NAME);
|
5681
5683
|
|
5682
5684
|
if (!commit_lock->obtain(commit_lock)) {
|
5683
5685
|
RAISE(LOCK_ERROR, "Couldn't obtain commit lock to write segments file");
|
@@ -5686,7 +5688,7 @@ void iw_add_readers(IndexWriter *iw, IndexReader **readers, const int r_cnt)
|
|
5686
5688
|
fis_write(iw->fis, iw->store);
|
5687
5689
|
sis_write(iw->sis, iw->store);
|
5688
5690
|
commit_lock->release(commit_lock);
|
5689
|
-
|
5691
|
+
close_lock(commit_lock);
|
5690
5692
|
mutex_unlock(&iw->store->mutex);
|
5691
5693
|
|
5692
5694
|
iw_optimize_i(iw);
|
data/ext/q_boolean.c
CHANGED
@@ -1285,7 +1285,7 @@ void bc_deref(BooleanClause *self)
|
|
1285
1285
|
}
|
1286
1286
|
}
|
1287
1287
|
|
1288
|
-
static
|
1288
|
+
static unsigned long bc_hash(BooleanClause *self)
|
1289
1289
|
{
|
1290
1290
|
return ((q_hash(self->query) << 2) | self->occur);
|
1291
1291
|
}
|
@@ -1492,10 +1492,10 @@ static Similarity *bq_get_similarity(Query *self, Searcher *searcher)
|
|
1492
1492
|
return BQ(self)->similarity;
|
1493
1493
|
}
|
1494
1494
|
|
1495
|
-
static
|
1495
|
+
static unsigned long bq_hash(Query *self)
|
1496
1496
|
{
|
1497
1497
|
int i;
|
1498
|
-
|
1498
|
+
unsigned long hash = 0;
|
1499
1499
|
for (i = 0; i < BQ(self)->clause_cnt; i++) {
|
1500
1500
|
hash ^= bc_hash(BQ(self)->clauses[i]);
|
1501
1501
|
}
|
data/ext/q_const_score.c
CHANGED
data/ext/q_fuzzy.c
CHANGED
@@ -223,7 +223,7 @@ static void fuzq_destroy(Query *self)
|
|
223
223
|
q_destroy_i(self);
|
224
224
|
}
|
225
225
|
|
226
|
-
static
|
226
|
+
static unsigned long fuzq_hash(Query *self)
|
227
227
|
{
|
228
228
|
return str_hash(FzQ(self)->term) ^ str_hash(FzQ(self)->field)
|
229
229
|
^ float2int(FzQ(self)->min_sim) ^ FzQ(self)->pre_len;
|
data/ext/q_match_all.c
CHANGED
data/ext/q_multi_term.c
CHANGED
@@ -572,10 +572,10 @@ static void multi_tq_extract_terms(Query *self, HashSet *terms)
|
|
572
572
|
}
|
573
573
|
}
|
574
574
|
|
575
|
-
static
|
575
|
+
static unsigned long multi_tq_hash(Query *self)
|
576
576
|
{
|
577
577
|
int i;
|
578
|
-
|
578
|
+
unsigned long hash = str_hash(MTQ(self)->field);
|
579
579
|
PriorityQueue *boosted_terms = MTQ(self)->boosted_terms;
|
580
580
|
for (i = boosted_terms->size; i > 0; i--) {
|
581
581
|
BoostedTerm *bt = (BoostedTerm *)boosted_terms->heap[i];
|
data/ext/q_parser.c
CHANGED
@@ -1852,12 +1852,19 @@ static int yyerror(QParser *qp, char const *msg)
|
|
1852
1852
|
|
1853
1853
|
static TokenStream *get_cached_ts(QParser *qp, char *field, char *text)
|
1854
1854
|
{
|
1855
|
-
TokenStream *ts
|
1856
|
-
if (!
|
1857
|
-
ts =
|
1858
|
-
|
1855
|
+
TokenStream *ts;
|
1856
|
+
if (!qp->tokenized_fields || hs_exists(qp->tokenized_fields, field)) {
|
1857
|
+
ts = h_get(qp->ts_cache, field);
|
1858
|
+
if (!ts) {
|
1859
|
+
ts = a_get_ts(qp->analyzer, field, text);
|
1860
|
+
h_set(qp->ts_cache, estrdup(field), ts);
|
1861
|
+
}
|
1862
|
+
else {
|
1863
|
+
ts->reset(ts, text);
|
1864
|
+
}
|
1859
1865
|
}
|
1860
1866
|
else {
|
1867
|
+
ts = qp->non_tokenizer;
|
1861
1868
|
ts->reset(ts, text);
|
1862
1869
|
}
|
1863
1870
|
return ts;
|
@@ -2054,7 +2061,8 @@ static Query *get_wild_q(QParser *qp, char *field, char *pattern)
|
|
2054
2061
|
char *p;
|
2055
2062
|
int len = (int)strlen(pattern);
|
2056
2063
|
|
2057
|
-
if (qp->wild_lower
|
2064
|
+
if (qp->wild_lower
|
2065
|
+
&& (!qp->tokenized_fields || hs_exists(qp->tokenized_fields, field))) {
|
2058
2066
|
lower_str(pattern);
|
2059
2067
|
}
|
2060
2068
|
|
@@ -2277,15 +2285,20 @@ void qp_destroy(QParser *self)
|
|
2277
2285
|
if (self->close_def_fields) {
|
2278
2286
|
hs_destroy(self->def_fields);
|
2279
2287
|
}
|
2288
|
+
if (self->tokenized_fields) {
|
2289
|
+
hs_destroy(self->tokenized_fields);
|
2290
|
+
}
|
2280
2291
|
hs_destroy(self->all_fields);
|
2281
2292
|
hs_destroy(self->fields_buf);
|
2282
2293
|
h_destroy(self->field_cache);
|
2283
2294
|
h_destroy(self->ts_cache);
|
2295
|
+
tk_destroy(self->non_tokenizer);
|
2284
2296
|
a_deref(self->analyzer);
|
2285
2297
|
free(self);
|
2286
2298
|
}
|
2287
2299
|
|
2288
|
-
QParser *qp_new(HashSet *all_fields, HashSet *def_fields,
|
2300
|
+
QParser *qp_new(HashSet *all_fields, HashSet *def_fields,
|
2301
|
+
HashSet *tokenized_fields, Analyzer *analyzer)
|
2289
2302
|
{
|
2290
2303
|
int i;
|
2291
2304
|
QParser *self = ALLOC(QParser);
|
@@ -2298,6 +2311,7 @@ QParser *qp_new(HashSet *all_fields, HashSet *def_fields, Analyzer *analyzer)
|
|
2298
2311
|
self->def_slop = 0;
|
2299
2312
|
self->fields_buf = hs_new_str(NULL);
|
2300
2313
|
self->all_fields = all_fields;
|
2314
|
+
self->tokenized_fields = tokenized_fields;
|
2301
2315
|
if (def_fields) {
|
2302
2316
|
self->def_fields = def_fields;
|
2303
2317
|
for (i = 0; i < self->def_fields->size; i++) {
|
@@ -2321,6 +2335,7 @@ QParser *qp_new(HashSet *all_fields, HashSet *def_fields, Analyzer *analyzer)
|
|
2321
2335
|
self->analyzer = analyzer;
|
2322
2336
|
self->ts_cache = h_new_str(&free, (free_ft)&ts_deref);
|
2323
2337
|
self->buf_index = 0;
|
2338
|
+
self->non_tokenizer = non_tokenizer_new();
|
2324
2339
|
mutex_init(&self->mutex, NULL);
|
2325
2340
|
return self;
|
2326
2341
|
}
|