4
/***************************************************************************
8
***************************************************************************/
10
void filt_destroy_i(Filter *filt)
12
h_destroy(filt->cache);
16
void filt_deref(Filter *filt)
18
if (--(filt->ref_cnt) == 0) {
19
filt->destroy_i(filt);
23
BitVector *filt_get_bv(Filter *filt, IndexReader *ir)
25
CacheObject *co = h_get(filt->cache, ir);
32
bv = filt->get_bv_i(filt, ir);
33
co = co_create(filt->cache, ir->cache, filt, ir,
34
(free_ft)&bv_destroy, (void *)bv);
36
return (BitVector *)co->obj;
39
static char *filt_to_s_i(Filter *filt)
41
return estrdup(filt->name);
44
unsigned long filt_hash_default(Filter *filt)
50
int filt_eq_default(Filter *filt, Filter *o)
56
Filter *filt_create(size_t size, const char *name)
58
Filter *filt = (Filter *)emalloc(size);
59
filt->cache = co_hash_create();
60
filt->name = estrdup(name);
61
filt->to_s = &filt_to_s_i;
62
filt->hash = &filt_hash_default;
63
filt->eq = &filt_eq_default;
64
filt->destroy_i = &filt_destroy_i;
69
unsigned long filt_hash(Filter *filt)
71
return str_hash(filt->name) ^ filt->hash(filt);
74
int filt_eq(Filter *filt, Filter *o)
77
|| ((strcmp(filt->name, o->name) == 0)
78
&& (filt->eq == o->eq)
79
&& (filt->eq(filt, o))));
82
/***************************************************************************
86
***************************************************************************/
88
#define QF(filt) ((QueryFilter *)(filt))
89
typedef struct QueryFilter
95
static char *qfilt_to_s(Filter *filt)
97
Query *query = QF(filt)->query;
98
char *query_str = query->to_s(query, "");
99
char *filter_str = strfmt("QueryFilter< %s >", query_str);
104
static BitVector *qfilt_get_bv_i(Filter *filt, IndexReader *ir)
106
BitVector *bv = bv_new_capa(ir->max_doc(ir));
107
Searcher *sea = isea_new(ir);
108
Weight *weight = q_weight(QF(filt)->query, sea);
109
Scorer *scorer = weight->scorer(weight, ir);
111
while (scorer->next(scorer)) {
112
bv_set(bv, scorer->doc);
114
scorer->destroy(scorer);
116
weight->destroy(weight);
121
static unsigned long qfilt_hash(Filter *filt)
123
return q_hash(QF(filt)->query);
126
static int qfilt_eq(Filter *filt, Filter *o)
128
return q_eq(QF(filt)->query, QF(o)->query);
131
static void qfilt_destroy_i(Filter *filt)
133
Query *query = QF(filt)->query;
135
filt_destroy_i(filt);
138
Filter *qfilt_new_nr(Query *query)
140
Filter *filt = filt_new(QueryFilter);
142
QF(filt)->query = query;
144
filt->get_bv_i = &qfilt_get_bv_i;
145
filt->hash = &qfilt_hash;
146
filt->eq = &qfilt_eq;
147
filt->to_s = &qfilt_to_s;
148
filt->destroy_i = &qfilt_destroy_i;
152
Filter *qfilt_new(Query *query)
155
return qfilt_new_nr(query);