+static RSET rpn_search_APT_relevance (ZServerInfo *zi,
+ Z_AttributesPlusTerm *zapt)
+{
+ rset_relevance_parms parms;
+ char termz[IT_MAX_WORD+1];
+ char term_sub[IT_MAX_WORD+1];
+ char *p0 = termz, *p1 = NULL;
+ Z_Term *term = zapt->term;
+
+ parms.key_size = sizeof(struct it_key);
+ parms.max_rec = 100;
+ parms.cmp = key_compare;
+ parms.is = zi->wordIsam;
+
+ if (term->which != Z_Term_general)
+ {
+ zi->errCode = 124;
+ return NULL;
+ }
+ trans_term (zi, zapt, termz);
+ isam_p_indx = 0; /* global, set by trunc_term - see below */
+ while (1)
+ {
+ if ((p1 = strchr (p0, ' ')))
+ {
+ memcpy (term_sub, p0, p1-p0);
+ term_sub[p1-p0] = '\0';
+ }
+ else
+ strcpy (term_sub, p0);
+ if (trunc_term (zi, zapt, term_sub, &parms.isam_positions))
+ return NULL;
+ if (!p1)
+ break;
+ p0 = p1+1;
+ }
+ parms.no_isam_positions = isam_p_indx;
+ if (isam_p_indx > 0)
+ return rset_create (rset_kind_relevance, &parms);
+ else
+ return rset_create (rset_kind_null, NULL);
+}
+
+static RSET rpn_search_APT_word (ZServerInfo *zi,
+ Z_AttributesPlusTerm *zapt)
+{
+ ISAM_P *isam_positions;
+ rset_isam_parms parms;
+
+ char termz[IT_MAX_WORD+1];
+ Z_Term *term = zapt->term;
+
+ if (term->which != Z_Term_general)
+ {
+ zi->errCode = 124;
+ return NULL;
+ }
+ trans_term (zi, zapt, termz);
+ isam_p_indx = 0; /* global, set by trunc_term - see below */
+ if (trunc_term (zi, zapt, termz, &isam_positions))
+ return NULL;
+ if (isam_p_indx < 1)
+ return rset_create (rset_kind_null, NULL);
+ else if (isam_p_indx == 1)
+ {
+ parms.is = zi->wordIsam;
+ parms.pos = *isam_positions;
+ return rset_create (rset_kind_isam, &parms);
+ }
+ else
+ return rset_trunc (zi->wordIsam, isam_positions, 0, isam_p_indx, 400);
+}
+
+static RSET rpn_search_APT_phrase (ZServerInfo *zi,
+ Z_AttributesPlusTerm *zapt)
+{
+ ISAM_P *isam_positions;
+ rset_isam_parms parms;
+
+ char termz[IT_MAX_WORD+1];
+ Z_Term *term = zapt->term;
+
+ if (term->which != Z_Term_general)
+ {
+ zi->errCode = 124;
+ return NULL;
+ }
+ trans_term (zi, zapt, termz);
+ isam_p_indx = 0; /* global, set by trunc_term - see below */
+ if (trunc_term (zi, zapt, termz, &isam_positions))
+ return NULL;
+ if (isam_p_indx != 1)
+ return rset_create (rset_kind_null, NULL);
+ parms.is = zi->wordIsam;
+ parms.pos = *isam_positions;
+ return rset_create (rset_kind_isam, &parms);
+}
+
+static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt)