/*
- * Copyright (C) 1995-1999, Index Data
+ * Copyright (C) 1995-2002, Index Data
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
- * $Log: zrpn.c,v $
- * Revision 1.101 2000-03-02 14:35:03 adam
- * Fixed proximity handling.
- *
- * Revision 1.100 1999/12/28 15:48:12 adam
- * Minor Fix.
- *
- * Revision 1.99 1999/12/23 09:03:32 adam
- * Changed behaviour of trunc=105 so that * is regular .* and ! is regular .
- *
- * Revision 1.98 1999/11/30 13:48:04 adam
- * Improved installation. Updated for inclusion of YAZ header files.
- *
- * Revision 1.97 1999/10/14 14:33:50 adam
- * Added truncation 5=106.
- *
- * Revision 1.96 1999/09/23 10:05:05 adam
- * Implemented structure=105 searching.
- *
- * Revision 1.95 1999/09/07 07:19:21 adam
- * Work on character mapping. Implemented replace rules.
- *
- * Revision 1.94 1999/07/20 13:59:18 adam
- * Fixed bug that occurred when phrases had 0 hits.
- *
- * Revision 1.93 1999/06/17 14:38:40 adam
- * Bug fix: Scan SEGV'ed when getting unknown use attribute.
- *
- * Revision 1.92 1999/05/26 07:49:13 adam
- * C++ compilation.
- *
- * Revision 1.91 1999/02/02 14:51:13 adam
- * Updated WIN32 code specific sections. Changed header.
- *
- * Revision 1.90 1998/11/16 16:03:43 adam
- * Moved loggin utilities to Yaz. Was implemented in file zlogs.c.
- *
- * Revision 1.89 1998/11/16 10:11:55 adam
- * Added addtional info for error 114 - unsupported use attribute.
- *
- * Revision 1.88 1998/10/18 07:54:52 adam
- * Additional info added for diagnostics 114 (Unsupported use attribute) and
- * 121 (Unsupported attribute set).
- *
- * Revision 1.87 1998/09/28 11:19:12 adam
- * Fix for Compiled ASN.1.
- *
- * Revision 1.86 1998/09/22 10:48:20 adam
- * Minor changes in search API.
- *
- * Revision 1.85 1998/09/22 10:03:43 adam
- * Changed result sets to be persistent in the sense that they can
- * be re-searched if needed.
- * Fixed memory leak in rsm_or.
- *
- * Revision 1.84 1998/09/18 12:41:00 adam
- * Fixed bug with numerical relations.
- *
- * Revision 1.83 1998/09/02 13:53:19 adam
- * Extra parameter decode added to search routines to implement
- * persistent queries.
- *
- * Revision 1.82 1998/06/26 11:16:40 quinn
- * Added support (un-optimised) for left and left/right truncation
- *
- * Revision 1.81 1998/06/24 12:16:14 adam
- * Support for relations on text operands. Open range support in
- * DFA module (i.e. [-j], [g-]).
- *
- * Revision 1.80 1998/06/23 15:33:34 adam
- * Added feature to specify sort criteria in query (type 7 specifies
- * sort flags).
- *
- * Revision 1.79 1998/06/22 11:35:09 adam
- * Minor changes.
- *
- * Revision 1.78 1998/06/08 14:43:17 adam
- * Added suport for EXPLAIN Proxy servers - added settings databasePath
- * and explainDatabase to facilitate this. Increased maximum number
- * of databases and attributes in one register.
- *
- * Revision 1.77 1998/05/20 10:12:22 adam
- * Implemented automatic EXPLAIN database maintenance.
- * Modified Zebra to work with ASN.1 compiled version of YAZ.
- *
- * Revision 1.76 1998/04/02 14:35:29 adam
- * First version of Zebra that works with compiled ASN.1.
- *
- * Revision 1.75 1998/03/05 08:45:13 adam
- * New result set model and modular ranking system. Moved towards
- * descent server API. System information stored as "SGML" records.
- *
- * Revision 1.74 1998/02/10 12:03:06 adam
- * Implemented Sort.
- *
- * Revision 1.73 1998/01/29 13:40:11 adam
- * Better logging for scan service.
- *
- * Revision 1.72 1998/01/07 13:53:41 adam
- * Queries using simple ranked operands returns right number of hits.
- *
- * Revision 1.71 1997/12/18 10:54:24 adam
- * New method result set method rs_hits that returns the number of
- * hits in result-set (if known). The ranked result set returns real
- * number of hits but only when not combined with other operands.
- *
- * Revision 1.70 1997/10/31 12:34:43 adam
- * Changed a few log statements.
- *
- * Revision 1.69 1997/10/29 12:05:02 adam
- * Server produces diagnostic "Unsupported Attribute Set" when appropriate.
- *
- * Revision 1.68 1997/10/27 14:33:06 adam
- * Moved towards generic character mapping depending on "structure"
- * field in abstract syntax file. Fixed a few memory leaks. Fixed
- * bug with negative integers when doing searches with relational
- * operators.
- *
- * Revision 1.67 1997/09/29 09:06:10 adam
- * Removed one static var in order to make this module thread safe.
- *
- * Revision 1.66 1997/09/25 14:58:03 adam
- * Windows NT port.
- *
- * Revision 1.65 1997/09/22 12:39:06 adam
- * Added get_pos method for the ranked result sets.
- *
- * Revision 1.64 1997/09/18 08:59:20 adam
- * Extra generic handle for the character mapping routines.
- *
- * Revision 1.63 1997/09/17 12:19:18 adam
- * Zebra version corresponds to YAZ version 1.4.
- * Changed Zebra server so that it doesn't depend on global common_resource.
- *
- * Revision 1.62 1997/09/05 15:30:09 adam
- * Changed prototype for chr_map_input - added const.
- * Added support for C++, headers uses extern "C" for public definitions.
- *
- * Revision 1.61 1997/02/10 10:21:14 adam
- * Bug fix: in search terms character (^) wasn't observed.
- *
- * Revision 1.60 1997/01/31 11:10:34 adam
- * Bug fix: Leading and trailing white space weren't removed in scan tokens.
- *
- * Revision 1.59 1997/01/17 11:31:46 adam
- * Bug fix: complete phrase search didn't work.
- *
- * Revision 1.58 1996/12/23 15:30:45 adam
- * Work on truncation.
- * Bug fix: result sets weren't deleted after server shut down.
- *
- * Revision 1.57 1996/11/11 13:38:02 adam
- * Added proximity support in search.
- *
- * Revision 1.56 1996/11/08 11:10:32 adam
- * Buffers used during file match got bigger.
- * Compressed ISAM support everywhere.
- * Bug fixes regarding masking characters in queries.
- * Redesigned Regexp-2 queries.
- *
- * Revision 1.55 1996/11/04 14:07:44 adam
- * Moved truncation code to trunc.c.
- *
- * Revision 1.54 1996/10/29 14:09:52 adam
- * Use of cisam system - enabled if setting isamc is 1.
- *
- * Revision 1.53 1996/06/26 09:21:43 adam
- * Bug fix: local attribute set wasn't obeyed in scan.
- *
- * Revision 1.52 1996/06/17 14:26:20 adam
- * Function gen_regular_rel changed to handle negative numbers.
- *
- * Revision 1.51 1996/06/11 10:54:15 quinn
- * Relevance work
- *
- * Revision 1.50 1996/06/07 08:51:53 adam
- * Bug fix: Character mapping was broken (introducued by last revision).
- *
- * Revision 1.49 1996/06/04 10:18:11 adam
- * Search/scan uses character mapping module.
- *
- * Revision 1.48 1996/05/28 15:15:01 adam
- * Bug fix: Didn't handle unknown database correctly.
- *
- * Revision 1.47 1996/05/15 18:36:28 adam
- * Function trans_term transforms unsearchable characters to blanks.
- *
- * Revision 1.46 1996/05/15 11:57:56 adam
- * Fixed bug introduced by set/field mapping in search operations.
- *
- * Revision 1.45 1996/05/14 11:34:00 adam
- * Scan support in multiple registers/databases.
- *
- * Revision 1.44 1996/05/14 06:16:44 adam
- * Compact use/set bytes used in search service.
- *
- * Revision 1.43 1996/05/09 09:54:43 adam
- * Server supports maps from one logical attributes to a list of physical
- * attributes.
- * The extraction process doesn't make space consuming 'any' keys.
- *
- * Revision 1.42 1996/05/09 07:28:56 quinn
- * Work towards phrases and multiple registers
- *
- * Revision 1.41 1996/03/20 09:36:43 adam
- * Function dict_lookup_grep got extra parameter, init_pos, which marks
- * from which position in pattern approximate pattern matching should occur.
- * Approximate pattern matching is used in relevance=re-2.
- *
- * Revision 1.40 1996/02/02 13:44:44 adam
- * The public dictionary functions simply use char instead of Dict_char
- * to represent search strings. Dict_char is used internally only.
- *
- * Revision 1.39 1996/01/03 16:22:13 quinn
- * operator->roperator
- *
- * Revision 1.38 1995/12/11 09:12:55 adam
- * The rec_get function returns NULL if record doesn't exist - will
- * happen in the server if the result set records have been deleted since
- * the creation of the set (i.e. the search).
- * The server saves a result temporarily if it is 'volatile', i.e. the
- * set is register dependent.
- *
- * Revision 1.37 1995/12/06 15:05:28 adam
- * More verbose in count_set.
- *
- * Revision 1.36 1995/12/06 12:41:27 adam
- * New command 'stat' for the index program.
- * Filenames can be read from stdin by specifying '-'.
- * Bug fix/enhancement of the transformation from terms to regular
- * expressons in the search engine.
- *
- * Revision 1.35 1995/11/27 09:29:00 adam
- * Bug fixes regarding conversion to regular expressions.
- *
- * Revision 1.34 1995/11/16 17:00:56 adam
- * Better logging of rpn query.
- *
- * Revision 1.33 1995/11/01 13:58:28 quinn
- * Moving data1 to yaz/retrieval
- *
- * Revision 1.32 1995/10/27 14:00:11 adam
- * Implemented detection of database availability.
- *
- * Revision 1.31 1995/10/17 18:02:10 adam
- * New feature: databases. Implemented as prefix to words in dictionary.
- *
- * Revision 1.30 1995/10/16 09:32:38 adam
- * More work on relational op.
- *
- * Revision 1.29 1995/10/13 16:01:49 adam
- * Work on relations.
- *
- * Revision 1.28 1995/10/13 12:26:43 adam
- * Optimization of truncation.
- *
- * Revision 1.27 1995/10/12 17:07:22 adam
- * Truncation works.
- *
- * Revision 1.26 1995/10/12 12:40:54 adam
- * Bug fixes in rpn_prox.
- *
- * Revision 1.25 1995/10/10 13:59:24 adam
- * Function rset_open changed its wflag parameter to general flags.
- *
- * Revision 1.24 1995/10/09 16:18:37 adam
- * Function dict_lookup_grep got extra client data parameter.
- *
- * Revision 1.23 1995/10/06 16:33:37 adam
- * Use attribute mappings.
- *
- * Revision 1.22 1995/10/06 15:07:39 adam
- * Structure 'local-number' handled.
- *
- * Revision 1.21 1995/10/06 13:52:06 adam
- * Bug fixes. Handler may abort further scanning.
- *
- * Revision 1.20 1995/10/06 11:06:33 adam
- * Scan entries include 'occurrences' now.
- *
- * Revision 1.19 1995/10/06 10:43:56 adam
- * Scan added. 'occurrences' in scan entries not set yet.
- *
- * Revision 1.18 1995/10/04 16:57:20 adam
- * Key input and merge sort in one pass.
- *
- * Revision 1.17 1995/10/04 12:55:17 adam
- * Bug fix in ranked search. Use=Any keys inserted.
- *
- * Revision 1.16 1995/10/02 16:24:40 adam
- * Use attribute actually used in search requests.
- *
- * Revision 1.15 1995/10/02 15:18:52 adam
- * New member in recRetrieveCtrl: diagnostic.
- *
- * Revision 1.14 1995/09/28 12:10:32 adam
- * Bug fixes. Field prefix used in queries.
- *
- * Revision 1.13 1995/09/18 14:17:50 adam
- * Minor changes.
- *
- * Revision 1.12 1995/09/15 14:45:21 adam
- * Retrieve control.
- * Work on truncation.
- *
- * Revision 1.11 1995/09/14 11:53:27 adam
- * First work on regular expressions/truncations.
- *
- * Revision 1.10 1995/09/11 15:23:26 adam
- * More work on relevance search.
- *
- * Revision 1.9 1995/09/11 13:09:35 adam
- * More work on relevance feedback.
- *
- * Revision 1.8 1995/09/08 14:52:27 adam
- * Minor changes. Dictionary is lower case now.
- *
- * Revision 1.7 1995/09/07 13:58:36 adam
- * New parameter: result-set file descriptor (RSFD) to support multiple
- * positions within the same result-set.
- * Boolean operators: and, or, not implemented.
- * Result-set references.
- *
- * Revision 1.6 1995/09/06 16:11:18 adam
- * Option: only one word key per file.
- *
- * Revision 1.5 1995/09/06 10:33:04 adam
- * More work on present. Some log messages removed.
- *
- * Revision 1.4 1995/09/05 15:28:40 adam
- * More work on search engine.
- *
- * Revision 1.3 1995/09/04 15:20:22 adam
- * Minor changes.
- *
- * Revision 1.2 1995/09/04 12:33:43 adam
- * Various cleanup. YAZ util used instead.
- *
- * Revision 1.1 1995/09/04 09:10:40 adam
- * More work on index add/del/update.
- * Merge sort implemented.
- * Initial work on z39 server.
- *
+ * $Id: zrpn.c,v 1.109 2002-02-18 11:46:58 adam Exp $
*/
#include <stdio.h>
#include <assert.h>
static void rpn_char_map_prepare (ZebraHandle zh, int reg_type,
struct rpn_char_map_info *map_info)
{
- map_info->zm = zh->zebra_maps;
+ map_info->zm = zh->service->zebra_maps;
map_info->reg_type = reg_type;
- dict_grep_cmap (zh->dict, map_info, rpn_char_map_handler);
+ dict_grep_cmap (zh->service->dict, map_info, rpn_char_map_handler);
}
typedef struct {
Z_AttributesPlusTerm *zapt;
} AttrType;
-static int attr_find (AttrType *src, oid_value *attributeSetP)
+static int attr_find_ex (AttrType *src, oid_value *attributeSetP,
+ const char **string_value)
{
int num_attributes;
return *element->value.numeric;
break;
case Z_AttributeValue_complex:
- if (src->minor >= element->value.complex->num_list ||
- element->value.complex->list[src->minor]->which !=
+ if (src->minor >= element->value.complex->num_list)
+ break;
+ if (element->value.complex->list[src->minor]->which ==
Z_StringOrNumeric_numeric)
- break;
- ++(src->minor);
- if (element->attributeSet && attributeSetP)
- {
- oident *attrset;
-
- attrset = oid_getentbyoid (element->attributeSet);
- *attributeSetP = attrset->value;
- }
- return *element->value.complex->list[src->minor-1]->u.numeric;
+ {
+ ++(src->minor);
+ if (element->attributeSet && attributeSetP)
+ {
+ oident *attrset;
+
+ attrset = oid_getentbyoid (element->attributeSet);
+ *attributeSetP = attrset->value;
+ }
+ return
+ *element->value.complex->list[src->minor-1]->u.numeric;
+ }
+ else if (element->value.complex->list[src->minor]->which ==
+ Z_StringOrNumeric_string)
+ {
+ if (!string_value)
+ break;
+ ++(src->minor);
+ *string_value =
+ element->value.complex->list[src->minor-1]->u.string;
+ return -2;
+ }
+ else
+ break;
default:
assert (0);
}
return -1;
}
+static int attr_find (AttrType *src, oid_value *attributeSetP)
+{
+ return attr_find_ex (src, attributeSetP, 0);
+}
+
static void attr_init (AttrType *src, Z_AttributesPlusTerm *zapt,
int type)
{
int isam_p_indx;
ZebraHandle zh;
int reg_type;
+ ZebraSet termset;
};
static void term_untrans (ZebraHandle zh, int reg_type,
{
while (*src)
{
- const char *cp = zebra_maps_output (zh->zebra_maps, reg_type, &src);
+ const char *cp = zebra_maps_output (zh->service->zebra_maps,
+ reg_type, &src);
if (!cp)
*dst++ = *src++;
else
assert (*info == sizeof(*p->isam_p_buf));
memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf));
-#if 0
- term_untrans (p->zh, p->reg_type, term_tmp, name+2);
- logf (LOG_DEBUG, "grep: %s", term_tmp);
+#if 1
+ if (p->termset)
+ {
+ const char *db;
+ int set, use;
+ char term_tmp[512];
+ int su_code = 0;
+ int len = key_SU_decode (&su_code, name);
+
+ term_untrans (p->zh, p->reg_type, term_tmp, name+len+1);
+ logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp);
+ zebraExplain_lookup_ord (p->zh->service->zei,
+ su_code, &db, &set, &use);
+ logf (LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db);
+
+ resultSetAddTerm (p->zh, p->termset, name[len], db,
+ set, use, term_tmp);
+ }
#endif
(p->isam_p_indx)++;
}
int i = 0;
int j = 0;
+ const char *space_start = 0;
+ const char *space_end = 0;
+
if (!term_pre (zebra_maps, reg_type, src, NULL, NULL))
return 0;
s0 = *src;
{
s1 = s0;
map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
- if (space_split && **map == *CHR_SPACE)
- break;
+ if (space_split)
+ {
+ if (**map == *CHR_SPACE)
+ break;
+ }
+ else /* complete subfield only. */
+ {
+ if (**map == *CHR_SPACE)
+ { /* save space mapping for later .. */
+ space_start = s1;
+ space_end = s0;
+ continue;
+ }
+ else if (space_start)
+ { /* reload last space */
+ while (space_start < space_end)
+ {
+ if (!isalnum (*space_start) && *space_start != '-')
+ dst[i++] = '\\';
+ dst_term[j++] = *space_start;
+ dst[i++] = *space_start++;
+ }
+ /* and reset */
+ space_start = space_end = 0;
+ }
+ }
+ /* add non-space char */
while (s1 < s0)
{
if (!isalnum (*s1) && *s1 != '-')
switch (relation_value)
{
case 1:
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component,
+ if (!term_100 (zh->service->zebra_maps, reg_type,
+ term_sub, term_component,
space_split, term_dst))
return 0;
logf (LOG_DEBUG, "Relation <");
*term_tmp = '\0';
break;
case 2:
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component,
+ if (!term_100 (zh->service->zebra_maps, reg_type,
+ term_sub, term_component,
space_split, term_dst))
return 0;
logf (LOG_DEBUG, "Relation <=");
*term_tmp = '\0';
break;
case 5:
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component,
- space_split, term_dst))
+ if (!term_100 (zh->service->zebra_maps, reg_type,
+ term_sub, term_component, space_split, term_dst))
return 0;
logf (LOG_DEBUG, "Relation >");
*term_tmp = '\0';
break;
case 4:
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component,
- space_split, term_dst))
+ if (!term_100 (zh->service->zebra_maps, reg_type, term_sub,
+ term_component, space_split, term_dst))
return 0;
logf (LOG_DEBUG, "Relation >=");
case 3:
default:
logf (LOG_DEBUG, "Relation =");
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component,
- space_split, term_dst))
+ if (!term_100 (zh->service->zebra_maps, reg_type, term_sub,
+ term_component, space_split, term_dst))
return 0;
strcat (term_tmp, "(");
strcat (term_tmp, term_component);
}
return -1;
}
- if (zebraExplain_curDatabase (zh->zei, basenames[base_no]))
+ if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
{
zh->errCode = 109; /* Database unavailable */
zh->errString = basenames[base_no];
char ord_buf[32];
int i, ord_len;
- ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal,
+ ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
local_attr->local);
if (ord < 0)
continue;
else
term_dict[prefix_len++] = '(';
- ord_len = key_SU_code (ord, ord_buf);
+ ord_len = key_SU_encode (ord, ord_buf);
for (i = 0; i<ord_len; i++)
{
term_dict[prefix_len++] = 1;
reg_type, space_split, term_dst))
return 0;
logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict+prefix_len);
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, &max_pos,
- 0, grep_handle);
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0,
+ grep_info, &max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
break;
case 1: /* right truncation */
term_dict[j++] = '(';
- if (!term_100 (zh->zebra_maps, reg_type,
+ if (!term_100 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ".*)");
- dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
break;
case 2: /* keft truncation */
term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*';
- if (!term_100 (zh->zebra_maps, reg_type,
+ if (!term_100 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ")");
- dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
break;
case 3: /* left&right truncation */
term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*';
- if (!term_100 (zh->zebra_maps, reg_type,
+ if (!term_100 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ".*)");
- dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
break;
zh->errCode = 120;
return -1;
case 101: /* process # in term */
term_dict[j++] = '(';
- if (!term_101 (zh->zebra_maps, reg_type,
+ if (!term_101 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ")");
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r);
break;
case 102: /* Regexp-1 */
term_dict[j++] = '(';
- if (!term_102 (zh->zebra_maps, reg_type,
+ if (!term_102 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ")");
logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r);
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d",
case 103: /* Regexp-2 */
r = 1;
term_dict[j++] = '(';
- if (!term_103 (zh->zebra_maps, reg_type,
+ if (!term_103 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, &r, space_split, term_dst))
return 0;
strcat (term_dict, ")");
logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r);
- r = dict_lookup_grep (zh->dict, term_dict, r, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, r, grep_info,
&max_pos, 2, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d",
break;
case 104: /* process # and ! in term */
term_dict[j++] = '(';
- if (!term_104 (zh->zebra_maps, reg_type,
+ if (!term_104 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst))
return 0;
strcat (term_dict, ")");
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r);
break;
case 105: /* process * and ! in term */
term_dict[j++] = '(';
- if (!term_105 (zh->zebra_maps, reg_type,
+ if (!term_105 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst, 1))
return 0;
strcat (term_dict, ")");
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r);
break;
case 106: /* process * and ! in term */
term_dict[j++] = '(';
- if (!term_105 (zh->zebra_maps, reg_type,
+ if (!term_105 (zh->service->zebra_maps, reg_type,
&termp, term_dict + j, space_split, term_dst, 0))
return 0;
strcat (term_dict, ")");
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info,
&max_pos, 0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r);
while ((len = (cp_end - cp)) > 0)
{
- map = zebra_maps_input (zh->zebra_maps, reg_type, &cp, len);
+ map = zebra_maps_input (zh->service->zebra_maps, reg_type, &cp, len);
if (**map == *CHR_SPACE)
space_map = *map;
else
flags);
parms.rset_term->nn = min_nn;
parms.key_size = sizeof (struct it_key);
- parms.temp_path = res_get (zh->res, "setTmpDir");
+ parms.temp_path = res_get (zh->service->res, "setTmpDir");
result = rset_create (rset_kind_temp, &parms);
rsfd_result = rset_open (result, RSETF_WRITE);
flags);
parms.rset_term->nn = min_nn;
parms.key_size = sizeof (struct it_key);
- parms.temp_path = res_get (zh->res, "setTmpDir");
+ parms.temp_path = res_get (zh->service->res, "setTmpDir");
result = rset_create (rset_kind_temp, &parms);
rsfd_result = rset_open (result, RSETF_WRITE);
}
for (i = 0; i<rset_no; i++)
{
- if (rset[i])
+ if (rsfd[i])
rset_close (rset[i], rsfd[i]);
xfree (buf[i]);
}
break;
}
if (ex_list)
- wrbuf = zebra_replace(zh->zebra_maps, reg_id, ex_list,
+ wrbuf = zebra_replace(zh->service->zebra_maps, reg_id, ex_list,
termz, strlen(termz));
if (!wrbuf)
return nmem_strdup(stream, termz);
}
}
+static int grep_info_prepare (ZebraHandle zh,
+ Z_AttributesPlusTerm *zapt,
+ struct grep_info *grep_info,
+ int reg_type,
+ NMEM stream)
+{
+ AttrType termset;
+ int termset_value_numeric;
+ const char *termset_value_string;
+
+#ifdef TERM_COUNT
+ grep_info->term_no = 0;
+#endif
+ grep_info->isam_p_size = 0;
+ grep_info->isam_p_buf = NULL;
+ grep_info->zh = zh;
+ grep_info->reg_type = reg_type;
+ grep_info->termset = 0;
+
+ attr_init (&termset, zapt, 8);
+ termset_value_numeric =
+ attr_find_ex (&termset, NULL, &termset_value_string);
+ if (termset_value_numeric != -1)
+ {
+ char resname[32];
+ const char *termset_name = 0;
+ if (termset_value_numeric != -2)
+ {
+
+ sprintf (resname, "%d", termset_value_numeric);
+ termset_name = resname;
+ }
+ else
+ termset_name = termset_value_string;
+ logf (LOG_LOG, "creating termset set %s", termset_name);
+ grep_info->termset = resultSetAdd (zh, termset_name, 1);
+ if (!grep_info->termset)
+ {
+ zh->errCode = 128;
+ zh->errString = nmem_strdup (stream, termset_name);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+
static RSET rpn_search_APT_phrase (ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
const char *termp = termz;
-#ifdef TERM_COUNT
- grep_info.term_no = 0;
-#endif
- grep_info.isam_p_size = 0;
- grep_info.isam_p_buf = NULL;
- grep_info.zh = zh;
- grep_info.reg_type = reg_type;
-
+ if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream))
+ return 0;
while (1)
{
logf (LOG_DEBUG, "APT_phrase termp=%s", termp);
struct grep_info grep_info;
char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
const char *termp = termz;
-#ifdef TERM_COUNT
- grep_info.term_no = 0;
-#endif
- grep_info.isam_p_size = 0;
- grep_info.isam_p_buf = NULL;
- grep_info.zh = zh;
- grep_info.reg_type = reg_type;
+ if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream))
+ return 0;
while (1)
{
logf (LOG_DEBUG, "APT_or_list termp=%s", termp);
char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
const char *termp = termz;
-#ifdef TERM_COUNT
- grep_info.term_no = 0;
-#endif
- grep_info.isam_p_size = 0;
- grep_info.isam_p_buf = NULL;
- grep_info.zh = zh;
- grep_info.reg_type = reg_type;
-
+ if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream))
+ return 0;
while (1)
{
logf (LOG_DEBUG, "APT_and_list termp=%s", termp);
logf (LOG_DEBUG, "numeric relation value=%d", relation_value);
- if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_tmp, 1,
+ if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, term_tmp, 1,
term_dst))
return 0;
term_value = atoi (term_tmp);
sprintf (term_tmp, "(0*%d)", term_value);
}
logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp);
- r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, max_pos,
+ r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, max_pos,
0, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
zh->errCode = 121;
return -1;
}
- if (zebraExplain_curDatabase (zh->zei, basenames[base_no]))
+ if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
{
zh->errCode = 109; /* Database unavailable */
zh->errString = basenames[base_no];
char ord_buf[32];
int i, ord_len;
- ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal,
+ ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
local_attr->local);
if (ord < 0)
continue;
else
term_dict[prefix_len++] = '(';
- ord_len = key_SU_code (ord, ord_buf);
+ ord_len = key_SU_encode (ord, ord_buf);
for (i = 0; i<ord_len; i++)
{
term_dict[prefix_len++] = 1;
int i, r, rset_no = 0;
struct grep_info grep_info;
-#ifdef TERM_COUNT
- grep_info.term_no = 0;
-#endif
- grep_info.isam_p_size = 0;
- grep_info.isam_p_buf = NULL;
- grep_info.zh = zh;
- grep_info.reg_type = reg_type;
-
+ if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream))
+ return 0;
while (1)
{
logf (LOG_DEBUG, "APT_numeric termp=%s", termp);
parms.rset_term = rset_term_create (termz, -1, rank_type);
parms.key_size = sizeof (struct it_key);
- parms.temp_path = res_get (zh->res, "setTmpDir");
+ parms.temp_path = res_get (zh->service->res, "setTmpDir");
result = rset_create (rset_kind_temp, &parms);
rsfd = rset_open (result, RSETF_WRITE);
{
unsigned reg_id;
char *search_type = NULL;
- char *rank_type = NULL;
+ char rank_type[128];
int complete_flag;
int sort_flag;
char termz[IT_MAX_WORD+1];
- zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type,
- &rank_type, &complete_flag, &sort_flag);
+ zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type,
+ rank_type, &complete_flag, &sort_flag);
logf (LOG_DEBUG, "reg_id=%c", reg_id);
logf (LOG_DEBUG, "complete_flag=%d", complete_flag);
logf (LOG_DEBUG, "rpn_search_ref");
r = resultSetRef (zh, zs->u.simple->u.resultSetId);
if (!r)
+ {
r = rset_create (rset_kind_null, NULL);
+ zh->errCode = 30;
+ zh->errString =
+ nmem_strdup (stream, zs->u.simple->u.resultSetId);
+ return 0;
+ }
}
else
{
zh->errCode = 3;
- return NULL;
+ return 0;
}
}
else
{
zh->errCode = 3;
- return NULL;
+ return 0;
}
return r;
}
unsigned reg_id;
char *search_type = NULL;
- char *rank_type = NULL;
+ char rank_type[128];
int complete_flag;
int sort_flag;
*list = 0;
if (attributeset == VAL_NONE)
attributeset = VAL_BIB1;
- logf (LOG_DEBUG, "position = %d, num = %d", pos, num);
+ yaz_log (LOG_DEBUG, "position = %d, num = %d set=%d",
+ pos, num, attributeset);
attr_init (&use, zapt, 1);
use_value = attr_find (&use, &attributeset);
- if (zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type,
- &rank_type, &complete_flag, &sort_flag))
+ if (zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type,
+ rank_type, &complete_flag, &sort_flag))
{
+ *num_entries = 0;
zh->errCode = 113;
return ;
}
+ yaz_log (LOG_DEBUG, "use_value = %d", use_value);
if (use_value == -1)
use_value = 1016;
*num_entries = 0;
return;
}
- if (zebraExplain_curDatabase (zh->zei, basenames[base_no]))
+ if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no]))
{
zh->errString = basenames[base_no];
zh->errCode = 109; /* Database unavailable */
+ *num_entries = 0;
return;
}
for (local_attr = attp.local_attributes; local_attr && ord_no < 32;
{
int ord;
- ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal,
+ ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal,
local_attr->local);
if (ord > 0)
ords[ord_no++] = ord;
}
if (ord_no == 0)
{
+ *num_entries = 0;
zh->errCode = 113;
return;
}
for (j = 0; j<before+after; j++)
scan_info->list[j].term = NULL;
- prefix_len += key_SU_code (ords[i], termz + prefix_len);
+ prefix_len += key_SU_encode (ords[i], termz + prefix_len);
termz[prefix_len++] = reg_id;
termz[prefix_len] = 0;
strcpy (scan_info->prefix, termz);
trans_scan_term (zh, zapt, termz+prefix_len, reg_id);
- dict_scan (zh->dict, termz, &before_tmp, &after_tmp, scan_info,
- scan_handle);
+ dict_scan (zh->service->dict, termz, &before_tmp, &after_tmp,
+ scan_info, scan_handle);
}
glist = (ZebraScanEntry *)
odr_malloc (stream, (before+after)*sizeof(*glist));