IDZEBRA 2.2.8
rpnscan.c
Go to the documentation of this file.
1/* This file is part of the Zebra server.
2 Copyright (C) Index Data
3
4Zebra is free software; you can redistribute it and/or modify it under
5the terms of the GNU General Public License as published by the Free
6Software Foundation; either version 2, or (at your option) any later
7version.
8
9Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10WARRANTY; without even the implied warranty of MERCHANTABILITY or
11FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
18*/
19
20#if HAVE_CONFIG_H
21#include <config.h>
22#endif
23#include <stdio.h>
24#include <assert.h>
25#ifdef WIN32
26#include <io.h>
27#endif
28#if HAVE_UNISTD_H
29#include <unistd.h>
30#endif
31#include <ctype.h>
32
33#include <yaz/diagbib1.h>
34#include "index.h"
35#include <zebra_xpath.h>
36#include <yaz/wrbuf.h>
37#include <yaz/snprintf.h>
38#include <attrfind.h>
39#include <charmap.h>
40#include <rset.h>
41#include <yaz/oid_db.h>
42
43#define RPN_MAX_ORDS 32
44
45/* convert APT SCAN term to internal cmap */
46static ZEBRA_RES trans_scan_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
47 char *termz, zebra_map_t zm)
48{
49 char term_utf8[IT_MAX_WORD];
50
51 if (zapt_term_to_utf8(zh, zapt, term_utf8) == ZEBRA_FAIL)
52 return ZEBRA_FAIL; /* error */
53 else if (zebra_maps_is_icu(zm))
54 {
55 const char *res_buf;
56 size_t res_len;
57 zebra_map_tokenize_start(zm, term_utf8, strlen(term_utf8));
58
59 if (zebra_map_tokenize_next(zm, &res_buf, &res_len, 0, 0))
60 {
61 memcpy(termz, res_buf, res_len);
62 termz[res_len] = '\0';
63 }
64 else
65 termz[0] = '\0';
66 }
67 else
68 {
69 const char **map;
70 const char *cp = (const char *) term_utf8;
71 const char *cp_end = cp + strlen(cp);
72 const char *src;
73 int i = 0;
74 const char *space_map = NULL;
75 int len;
76
77 while ((len = (cp_end - cp)) > 0)
78 {
79 map = zebra_maps_input(zm, &cp, len, 0);
80 if (**map == *CHR_SPACE)
81 space_map = *map;
82 else
83 {
84 if (i && space_map)
85 for (src = space_map; *src; src++)
86 termz[i++] = *src;
87 space_map = NULL;
88 for (src = *map; *src; src++)
89 termz[i++] = *src;
90 }
91 }
92 termz[i] = '\0';
93 }
94 return ZEBRA_OK;
95}
96
98 RSET rset, zebra_snippets *snippets,
99 zint *sysno)
100{
101 struct it_key key;
102 RSFD rfd;
103 TERMID termid;
104 size_t sysno_mem_index = 0;
105
106 if (zh->m_staticrank)
107 sysno_mem_index = 1;
108
109 yaz_log(YLOG_DEBUG, "get_first_snippet_from_rset");
110
111 rfd = rset_open(rset, RSETF_READ);
112 *sysno = 0;
113 while (rset_read(rfd, &key, &termid))
114 {
115 if (key.mem[sysno_mem_index] != *sysno)
116 {
117 if (*sysno)
118 break;
119 *sysno = key.mem[sysno_mem_index];
120 }
121 if (termid)
122 {
123 struct ord_list *ol;
124 for (ol = termid->ol; ol; ol = ol->next)
125 {
126 zebra_snippets_append(snippets, key.mem[key.len-1], 0,
127 ol->ord, termid->name);
128 }
129 }
130 }
131 rset_close(rfd);
132}
133
141
142static int scan_handle2(char *name, const char *info, int pos, void *client)
143{
144 int len_prefix;
145 struct scan2_info_entry *scan_info = (struct scan2_info_entry *) client;
146
147 if (scan_info->pos_to_save != pos)
148 return 0;
149
150 len_prefix = strlen(scan_info->prefix);
151 if (memcmp(name, scan_info->prefix, len_prefix))
152 return 1;
153 wrbuf_rewind(scan_info->term);
154 wrbuf_puts(scan_info->term, name+len_prefix);
155
156 assert(*info == sizeof(ISAM_P));
157 memcpy(&scan_info->isam_p, info+1, sizeof(ISAM_P));
158 return 0;
159}
160
161
162static int scan_save_set(ZebraHandle zh, ODR stream, NMEM nmem,
163 struct rset_key_control *kc,
164 Z_AttributesPlusTerm *zapt,
165 RSET limit_set,
166 const char *term,
167 const char *index_type,
168 struct scan2_info_entry *ar, int ord_no,
169 ZebraScanEntry *glist, int pos)
170{
171 int i;
172 RSET rset = 0;
173 zint approx_limit = zh->approx_limit;
174 AttrType global_hits_limit_attr;
175 int l;
176 attr_init_APT(&global_hits_limit_attr, zapt, 12);
177
178 l = attr_find(&global_hits_limit_attr, NULL);
179 if (l != -1)
180 approx_limit = l;
181
182 for (i = 0; i < ord_no; i++)
183 {
184 if (ar[i].isam_p && strcmp(wrbuf_cstr(ar[i].term), term) == 0)
185 {
186 if (strcmp(term, FIRST_IN_FIELD_STR))
187 {
188 struct ord_list *ol = ord_list_create(nmem);
189 RSET rset_t;
190
191 ol = ord_list_append(nmem, ol, ar[i].ord);
192
193 assert(ol);
194 rset_t = rset_trunc(
195 zh, &ar[i].isam_p, 1,
196 wrbuf_buf(ar[i].term), wrbuf_len(ar[i].term),
197 NULL, 1, zapt->term->which, nmem,
198 kc, kc->scope, ol, index_type,
199 0 /* hits_limit_value */,
200 0 /* term_ref_id_str */);
201 if (!rset)
202 rset = rset_t;
203 else
204 {
205 RSET rsets[2];
206
207 rsets[0] = rset;
208 rsets[1] = rset_t;
209 rset = rset_create_or(nmem, kc, kc->scope, 0 /* termid */,
210 2, rsets);
211 }
212 }
213 ar[i].isam_p = 0;
214 }
215 }
216 if (rset)
217 {
218 RSET rset_snippet = rset; /* use only this for showing scan term */
219 zint count;
220 /* merge with limit_set if given */
221 if (limit_set)
222 {
223 RSET rsets[2];
224 rsets[0] = rset;
225 rsets[1] = rset_dup(limit_set);
226
227 rset = rset_create_and(nmem, kc, kc->scope, 2, rsets);
228 }
229 /* count it */
230 zebra_count_set(zh, rset, &count, approx_limit);
231
232 if (pos != -1)
233 {
234 zint sysno;
235 zebra_snippets *hit_snippets = zebra_snippets_create();
236
237 glist[pos].term = 0;
238 glist[pos].display_term = 0;
239
240 get_first_snippet_from_rset(zh, rset_snippet, hit_snippets, &sysno);
241 if (sysno)
242 {
243 zebra_snippets *rec_snippets = zebra_snippets_create();
244 int code = zebra_get_rec_snippets(zh, sysno, rec_snippets);
245 if (code == 0)
246 {
247 const struct zebra_snippet_word *w =
248 zebra_snippets_lookup(rec_snippets, hit_snippets);
249 if (w)
250 {
251 glist[pos].display_term = odr_strdup(stream, w->term);
252 }
253 else
254 {
255 yaz_log(YLOG_WARN, "zebra_snippets_lookup failed for pos=%d", pos);
256 }
257 }
258 zebra_snippets_destroy(rec_snippets);
259 }
260 if (zebra_term_untrans_iconv(zh, stream->mem, index_type,
261 &glist[pos].term, term))
262 {
263 /* failed.. use display_term instead (which could be 0) */
264 glist[pos].term = glist[pos].display_term;
265 }
266
267 if (!glist[pos].term)
268 {
269 yaz_log(YLOG_WARN, "Could not generate scan term for pos=%d",
270 pos);
271 glist[pos].term = "None";
272 }
273 glist[pos].occurrences = count;
274 zebra_snippets_destroy(hit_snippets);
275 }
277 if (count > 0)
278 return 1;
279 else
280 return 0;
281 }
282 return 0;
283}
284
285static ZEBRA_RES rpn_scan_norm(ZebraHandle zh, ODR stream, NMEM nmem,
286 struct rset_key_control *kc,
287 Z_AttributesPlusTerm *zapt,
288 int *position, int *num_entries,
289 ZebraScanEntry **list,
290 int *is_partial, RSET limit_set,
291 const char *index_type,
292 int ord_no, int *ords)
293{
294 struct scan2_info_entry *ar = nmem_malloc(nmem, sizeof(*ar) * ord_no);
295 struct rpn_char_map_info rcmi;
297 int i, dif;
298 int after_pos;
299 int pos = 0;
300
301 ZebraScanEntry *glist = (ZebraScanEntry *)
302 odr_malloc(stream, *num_entries * sizeof(*glist));
303
304 *is_partial = 0;
305 rpn_char_map_prepare(zh->reg, zm, &rcmi);
306
307 for (i = 0; i < ord_no; i++)
308 ar[i].term = wrbuf_alloc();
309
310 for (i = 0; i < ord_no; i++)
311 {
312 char termz[IT_MAX_WORD+20];
313 int prefix_len = 0;
314
315 prefix_len = key_SU_encode(ords[i], termz);
316 termz[prefix_len] = 0;
317 strcpy(ar[i].prefix, termz);
318
319 if (trans_scan_term(zh, zapt, termz+prefix_len, zm) ==
321 {
322 for (i = 0; i < ord_no; i++)
323 wrbuf_destroy(ar[i].term);
324 return ZEBRA_FAIL;
325 }
326 wrbuf_rewind(ar[i].term);
327 wrbuf_puts(ar[i].term, termz + prefix_len);
328 ar[i].isam_p = 0;
329 ar[i].ord = ords[i];
330 }
332 /* the glist index starts at zero (unlike scan positions */
333 for (pos = *position-2; pos >= 0; )
334 {
335 const char *hi = 0;
336
337 /* scan on all maximum terms */
338 for (i = 0; i < ord_no; i++)
339 {
340 if (ar[i].isam_p == 0)
341 {
342 char termz[IT_MAX_WORD+20];
343 int before = 1;
344 int after = 0;
345
346 ar[i].pos_to_save = -1;
347
348 strcpy(termz, ar[i].prefix);
349 strcat(termz, wrbuf_cstr(ar[i].term));
350 dict_scan(zh->reg->dict, termz, &before, &after,
351 ar+i, scan_handle2);
352 }
353 }
354 /* get maximum after scan */
355 for (i = 0; i < ord_no; i++)
356 {
357 if (ar[i].isam_p
358 && (hi == 0 || strcmp(wrbuf_cstr(ar[i].term), hi) > 0))
359 hi = wrbuf_cstr(ar[i].term);
360 }
361 if (!hi)
362 break;
363 if (scan_save_set(zh, stream, nmem, kc, zapt, limit_set, hi,
364 index_type, ar, ord_no, glist,
365 (pos >= 0 && pos < *num_entries) ? pos : -1))
366 --pos;
367 }
368 /* see if we got all terms before.. */
369 dif = 1 + pos;
370 if (dif > 0)
371 {
372 /* did not get all terms; adjust the real position and reduce
373 number of entries */
374 if (dif < *num_entries)
375 {
376 glist = glist + dif;
377 *num_entries -= dif;
378 }
379 else
380 *num_entries = 0;
381 *position -= dif;
382 *is_partial = 1;
383 }
384 for (i = 0; i < ord_no; i++)
385 {
386 char termz[IT_MAX_WORD+20];
387 int prefix_len = 0;
388
389 prefix_len = key_SU_encode(ords[i], termz);
390 termz[prefix_len] = 0;
391 strcpy(ar[i].prefix, termz);
392
393 if (trans_scan_term(zh, zapt, termz+prefix_len, zm) ==
395 return ZEBRA_FAIL;
396 wrbuf_rewind(ar[i].term);
397 wrbuf_puts(ar[i].term, termz + prefix_len);
398 ar[i].isam_p = 0;
399 ar[i].ord = ords[i];
400 }
401
402 after_pos = 1; /* immediate term first.. */
403 for (pos = *position-1; pos < *num_entries; )
404 {
405 const char *lo = 0;
406
407 /* scan on all minimum terms */
408 for (i = 0; i < ord_no; i++)
409 {
410 if (ar[i].isam_p == 0)
411 {
412 char termz[IT_MAX_WORD+20];
413 int before = 0;
414 int after = after_pos;
415
416 ar[i].pos_to_save = 1;
417
418 strcpy(termz, ar[i].prefix);
419 strcat(termz, wrbuf_cstr(ar[i].term));
420 dict_scan(zh->reg->dict, termz, &before, &after,
421 ar+i, scan_handle2);
422 }
423 }
424 after_pos = 2; /* next round we grab following term */
425
426 /* get minimum after scan */
427 for (i = 0; i < ord_no; i++)
428 {
429 if (ar[i].isam_p
430 && (lo == 0 || strcmp(wrbuf_cstr(ar[i].term), lo) < 0))
431 lo = wrbuf_cstr(ar[i].term);
432 }
433 if (!lo)
434 break;
435 if (scan_save_set(zh, stream, nmem, kc, zapt, limit_set, lo,
436 index_type, ar, ord_no, glist,
437 (pos >= 0 && pos < *num_entries) ? pos : -1))
438 pos++;
439
440 }
441 if (pos < *num_entries)
442 {
443 if (pos >= 0)
444 *num_entries = pos;
445 else
446 *num_entries = 0;
447 *is_partial = 1;
448 }
449
450 *list = glist;
451
452 for (i = 0; i < ord_no; i++)
453 wrbuf_destroy(ar[i].term);
454
455 return ZEBRA_OK;
456}
457
462
463struct scan_info {
465 ODR odr;
467 char prefix[20];
468};
469
470ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
471 const Odr_oid *attributeset,
472 int num_bases, char **basenames,
473 int *position, int *num_entries, ZebraScanEntry **list,
474 int *is_partial, const char *set_name)
475{
476 int base_no;
477 int ords[RPN_MAX_ORDS], ord_no = 0;
478
479 const char *index_type;
480 char *search_type = NULL;
481 char rank_type[128];
482 int complete_flag;
483 int sort_flag;
484 NMEM nmem;
485 ZEBRA_RES res;
486 struct rset_key_control *kc = 0;
487 RSET limit_set = 0;
488
489 *list = 0;
490 *is_partial = 0;
491
492 if (!attributeset)
493 attributeset = yaz_oid_attset_bib_1;
494
495 if (!set_name)
496 {
497 /* see if there is a @attr 8=set */
498 AttrType termset;
499 int termset_value_numeric;
500 const char *termset_value_string = 0;
501 attr_init_APT(&termset, zapt, 8);
502 termset_value_numeric =
503 attr_find_ex(&termset, NULL, &termset_value_string);
504 if (termset_value_numeric != -1)
505 {
506 if (termset_value_numeric != -2)
507 {
508 char resname[20];
509 yaz_snprintf(resname, sizeof(resname), "%d", termset_value_numeric);
510 set_name = odr_strdup(stream, resname);
511 }
512 else
513 set_name = odr_strdup(stream, termset_value_string);
514 }
515 }
516
517 if (set_name)
518 {
519 limit_set = resultSetRef(zh, set_name);
520
521 if (!limit_set)
522 {
524 YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
525 set_name);
526 return ZEBRA_FAIL;
527 }
528 }
529
530 yaz_log(YLOG_DEBUG, "position = %d, num = %d",
531 *position, *num_entries);
532
533 if (zebra_maps_attr(zh->reg->zebra_maps, zapt, &index_type, &search_type,
534 rank_type, &complete_flag, &sort_flag))
535 {
536 *num_entries = 0;
537 zebra_setError(zh, YAZ_BIB1_UNSUPP_ATTRIBUTE_TYPE, 0);
538 return ZEBRA_FAIL;
539 }
540 if (num_bases > RPN_MAX_ORDS)
541 {
542 zebra_setError(zh, YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED, 0);
543 return ZEBRA_FAIL;
544 }
545 for (base_no = 0; base_no < num_bases; base_no++)
546 {
547 int ord;
548
549 if (zebraExplain_curDatabase(zh->reg->zei, basenames[base_no]))
550 {
551 zebra_setError(zh, YAZ_BIB1_DATABASE_UNAVAILABLE,
552 basenames[base_no]);
553 *num_entries = 0;
554 return ZEBRA_FAIL;
555 }
556 if (zebra_apt_get_ord(zh, zapt, index_type, 0, attributeset, &ord)
557 != ZEBRA_OK)
558 continue;
559 ords[ord_no++] = ord;
560 }
561 if (ord_no == 0)
562 {
563 *num_entries = 0; /* zebra_apt_get_ord should set error reason */
564 return ZEBRA_FAIL;
565 }
566 if (*num_entries < 1)
567 {
568 *num_entries = 0;
569 return ZEBRA_OK;
570 }
571 nmem = nmem_create();
573
574 res = rpn_scan_norm(zh, stream, nmem, kc, zapt, position, num_entries,
575 list, is_partial, limit_set,
576 index_type, ord_no, ords);
577 nmem_destroy(nmem);
578 (*kc->dec)(kc);
579 return res;
580}
581
582/*
583 * Local variables:
584 * c-basic-offset: 4
585 * c-file-style: "Stroustrup"
586 * indent-tabs-mode: nil
587 * End:
588 * vim: shiftwidth=4 tabstop=8 expandtab
589 */
590
int attr_find(AttrType *src, const Odr_oid **attribute_set_oid)
Definition attrfind.c:99
void attr_init_APT(AttrType *src, Z_AttributesPlusTerm *zapt, int type)
Definition attrfind.c:27
int attr_find_ex(AttrType *src, const Odr_oid **attribute_set_oid, const char **string_value)
Definition attrfind.c:45
ZEBRA_RES zebra_apt_get_ord(ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char *index_type, const char *xpath_use, const Odr_oid *curAttributeSet, int *ord)
Definition attribute.c:135
const char * CHR_SPACE
Definition charmap.c:49
int dict_scan(Dict dict, char *str, int *before, int *after, void *client, int(*f)(char *name, const char *info, int pos, void *client))
dictionary scan
Definition scan.c:242
RSET resultSetRef(ZebraHandle zh, const char *resultSetId)
Definition zsets.c:1075
void rpn_char_map_prepare(struct zebra_register *reg, zebra_map_t zm, struct rpn_char_map_info *map_info)
Definition rpnsearch.c:63
struct rset_key_control * zebra_key_control_create(ZebraHandle zh)
Definition kcontrol.c:57
#define FIRST_IN_FIELD_STR
Definition index.h:419
void zebra_count_set(ZebraHandle zh, RSET rset, zint *count, zint approx_limit)
Definition zsets.c:1498
ZEBRA_RES zapt_term_to_utf8(ZebraHandle zh, Z_AttributesPlusTerm *zapt, char *termz)
Definition zaptterm.c:32
void zebra_setError(ZebraHandle zh, int code, const char *addinfo)
Definition zebraapi.c:2755
RSET rset_trunc(ZebraHandle zh, ISAM_P *isam_p, int no, const char *term, int length_term, const char *flags, int preserve_position, int term_type, NMEM rset_nmem, struct rset_key_control *kctrl, int scope, struct ord_list *ol, const char *index_type, zint hits_limit, const char *term_ref_id)
Definition trunc.c:403
int zebra_term_untrans_iconv(ZebraHandle zh, NMEM stream, const char *index_type, char **dst, const char *src)
Definition untrans.c:96
int zebra_get_rec_snippets(ZebraHandle zh, zint sysno, zebra_snippets *snippets)
Definition retrieve.c:465
zint ISAM_P
Definition isamc.h:28
#define IT_MAX_WORD
Definition it_key.h:27
int key_SU_encode(int ch, char *out)
Definition su_codec.c:31
ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, const Odr_oid *attributeset, int num_bases, char **basenames, int *position, int *num_entries, ZebraScanEntry **list, int *is_partial, const char *set_name)
Definition rpnscan.c:470
static void get_first_snippet_from_rset(ZebraHandle zh, RSET rset, zebra_snippets *snippets, zint *sysno)
Definition rpnscan.c:97
#define RPN_MAX_ORDS
Definition rpnscan.c:43
static int scan_save_set(ZebraHandle zh, ODR stream, NMEM nmem, struct rset_key_control *kc, Z_AttributesPlusTerm *zapt, RSET limit_set, const char *term, const char *index_type, struct scan2_info_entry *ar, int ord_no, ZebraScanEntry *glist, int pos)
Definition rpnscan.c:162
static ZEBRA_RES trans_scan_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, char *termz, zebra_map_t zm)
Definition rpnscan.c:46
static int scan_handle2(char *name, const char *info, int pos, void *client)
Definition rpnscan.c:142
static ZEBRA_RES rpn_scan_norm(ZebraHandle zh, ODR stream, NMEM nmem, struct rset_key_control *kc, Z_AttributesPlusTerm *zapt, int *position, int *num_entries, ZebraScanEntry **list, int *is_partial, RSET limit_set, const char *index_type, int ord_no, int *ords)
Definition rpnscan.c:285
void rset_delete(RSET rs)
Destructor RSETs.
Definition rset.c:218
RSET rset_create_or(NMEM nmem, struct rset_key_control *kcontrol, int scope, TERMID termid, int no_rsets, RSET *rsets)
RSET rset_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET *rsets)
#define rset_read(rfd, buf, term)
Definition rset.h:217
RSET rset_dup(RSET rs)
Duplicate an RSET.
Definition rset.c:255
struct ord_list * ord_list_create(NMEM nmem)
Definition rset.c:301
#define RSETF_READ
Definition rset.h:199
struct ord_list * ord_list_append(NMEM nmem, struct ord_list *list, int ord)
Definition rset.c:306
#define rset_open(rs, wflag)
Definition rset.h:202
void rset_close(RSFD rfd)
Closes a result set RFD handle.
Definition rset.c:98
void zebra_snippets_destroy(zebra_snippets *l)
Definition snippet.c:45
void zebra_snippets_append(zebra_snippets *l, zint seqno, int ws, int ord, const char *term)
Definition snippet.c:51
zebra_snippets * zebra_snippets_create(void)
Definition snippet.c:36
const struct zebra_snippet_word * zebra_snippets_lookup(const zebra_snippets *doc, const zebra_snippets *hit)
Definition snippet.c:218
zint occurrences
Definition api.h:63
char * term
Definition api.h:64
char * display_term
Definition api.h:65
int len
Definition it_key.h:31
zint mem[IT_KEY_LEVEL_MAX]
Definition it_key.h:32
int ord
Definition rset.h:36
struct ord_list * next
Definition rset.h:37
zebra_map_t zm
Definition index.h:404
void(* dec)(struct rset_key_control *kc)
Definition rset.h:138
struct ord_list * ol
Definition rset.h:64
char * name
Definition rset.h:51
Definition rset.h:151
Definition rset.h:73
Definition rpnscan.c:458
ISAM_P isam_p
Definition rpnscan.c:460
char * term
Definition rpnscan.c:459
Definition rpnscan.c:134
char prefix[20]
Definition rpnscan.c:136
int ord
Definition rpnscan.c:139
int pos_to_save
Definition rpnscan.c:138
WRBUF term
Definition rpnscan.c:135
ISAM_P isam_p
Definition rpnscan.c:137
char prefix[20]
Definition rpnscan.c:467
ODR odr
Definition rpnscan.c:465
int after
Definition rpnscan.c:466
int before
Definition rpnscan.c:466
struct scan1_info_entry * list
Definition rpnscan.c:464
ZebraExplainInfo zei
Definition index.h:139
zebra_maps_t zebra_maps
Definition index.h:143
struct zebra_register * reg
Definition index.h:174
zint approx_limit
Definition index.h:180
int m_staticrank
Definition index.h:205
long zint
Zebra integer.
Definition util.h:66
#define ZEBRA_FAIL
Definition util.h:81
#define ZEBRA_OK
Definition util.h:82
short ZEBRA_RES
Common return type for Zebra API.
Definition util.h:80
const char ** zebra_maps_input(zebra_map_t zm, const char **from, int len, int first)
Definition zebramap.c:399
int zebra_map_tokenize_next(zebra_map_t zm, const char **result_buf, size_t *result_len, const char **display_buf, size_t *display_len)
Definition zebramap.c:658
int zebra_maps_attr(zebra_maps_t zms, Z_AttributesPlusTerm *zapt, const char **reg_id, char **search_type, char *rank_type, int *complete_flag, int *sort_flag)
Definition zebramap.c:515
int zebra_maps_is_icu(zebra_map_t zm)
Definition zebramap.c:741
int zebra_map_tokenize_start(zebra_map_t zm, const char *buf, size_t len)
Definition zebramap.c:702
zebra_map_t zebra_map_get_or_add(zebra_maps_t zms, const char *id)
Definition zebramap.c:364
int zebraExplain_curDatabase(ZebraExplainInfo zei, const char *database)
Definition zinfo.c:790