IDZEBRA  2.2.7
rpnscan.c
Go to the documentation of this file.
1 /* This file is part of the Zebra server.
2  Copyright (C) Index Data
3 
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8 
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, 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 */
46 static 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 
135  WRBUF term;
136  char prefix[20];
139  int ord;
140 };
141 
142 static 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 
162 static 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  }
276  rset_delete(rset);
277  if (count > 0)
278  return 1;
279  else
280  return 0;
281  }
282  return 0;
283 }
284 
285 static 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;
296  zebra_map_t zm = zebra_map_get_or_add(zh->reg->zebra_maps, index_type);
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) ==
320  ZEBRA_FAIL)
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) ==
394  ZEBRA_FAIL)
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 
459  char *term;
461 };
462 
463 struct scan_info {
465  ODR odr;
466  int before, after;
467  char prefix[20];
468 };
469 
470 ZEBRA_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  {
523  zebra_setError(zh,
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();
572  kc = zebra_key_control_create(zh);
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
#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
struct rset_key_control * zebra_key_control_create(ZebraHandle zh)
Definition: kcontrol.c:57
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)
Definition: rsmultiandor.c:273
RSET rset_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET *rsets)
Definition: rsmultiandor.c:280
#define rset_read(rfd, buf, term)
Definition: rset.h:217
struct rset rset
RSET rset_dup(RSET rs)
Duplicate an RSET.
Definition: rset.c:255
struct ord_list * ord_list_append(NMEM nmem, struct ord_list *list, int ord)
Definition: rset.c:306
struct ord_list * ord_list_create(NMEM nmem)
Definition: rset.c:301
#define RSETF_READ
Definition: rset.h:199
#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
const struct zebra_snippet_word * zebra_snippets_lookup(const zebra_snippets *doc, const zebra_snippets *hit)
Definition: snippet.c:218
zebra_snippets * zebra_snippets_create(void)
Definition: snippet.c:36
zint occurrences
Definition: api.h:63
char * term
Definition: api.h:64
char * display_term
Definition: api.h:65
Definition: it_key.h:30
int len
Definition: it_key.h:31
zint mem[IT_KEY_LEVEL_MAX]
Definition: it_key.h:32
Definition: rset.h:35
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
Definition: rset.h:50
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
Dict dict
Definition: index.h:132
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
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
const char ** zebra_maps_input(zebra_map_t zm, const char **from, int len, int first)
Definition: zebramap.c:399
int zebraExplain_curDatabase(ZebraExplainInfo zei, const char *database)
Definition: zinfo.c:790