+ 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)
+{
+ AttrType relation;
+ AttrType structure;
+ int relation_value, structure_value;
+
+ attr_init (&relation, zapt, 2);
+ attr_init (&structure, zapt, 4);
+
+ relation_value = attr_find (&relation);
+ structure_value = attr_find (&structure);
+ switch (structure_value)
+ {
+ case -1:
+ if (relation_value == 102) /* relevance relation */
+ return rpn_search_APT_relevance (zi, zapt);
+ return rpn_search_APT_word (zi, zapt);
+ case 1: /* phrase */
+ if (relation_value == 102) /* relevance relation */
+ return rpn_search_APT_relevance (zi, zapt);
+ return rpn_search_APT_phrase (zi, zapt);
+ break;
+ case 2: /* word */
+ if (relation_value == 102) /* relevance relation */
+ return rpn_search_APT_relevance (zi, zapt);
+ return rpn_search_APT_word (zi, zapt);
+ case 3: /* key */
+ break;
+ case 4: /* year */
+ break;
+ case 5: /* date - normalized */
+ break;
+ case 6: /* word list */
+ return rpn_search_APT_relevance (zi, zapt);
+ case 100: /* date - un-normalized */
+ break;
+ case 101: /* name - normalized */
+ break;
+ case 102: /* date - un-normalized */
+ break;
+ case 103: /* structure */
+ break;
+ case 104: /* urx */
+ break;
+ case 105: /* free-form-text */
+ return rpn_search_APT_relevance (zi, zapt);
+ case 106: /* document-text */
+ return rpn_search_APT_relevance (zi, zapt);
+ case 107: /* local-number */
+ break;
+ case 108: /* string */
+ return rpn_search_APT_word (zi, zapt);
+ case 109: /* numeric string */
+ break;
+ }
+ zi->errCode = 118;