2 * Copyright (C) 1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1995-09-04 15:20:22 adam
10 * Revision 1.2 1995/09/04 12:33:43 adam
11 * Various cleanup. YAZ util used instead.
13 * Revision 1.1 1995/09/04 09:10:40 adam
14 * More work on index add/del/update.
15 * Merge sort implemented.
16 * Initial work on z39 server.
38 static RSET rpn_search_APT (struct index_info *ii, Z_AttributesPlusTerm *zapt)
40 struct rset_isam_parms parms;
42 Z_Term *term = zapt->term;
44 if (term->which != Z_Term_general)
46 if (!(info = dict_lookup (ii->dict, term->u.general->buf)))
48 assert (*info == sizeof(parms.pos));
49 memcpy (&parms.pos, info+1, sizeof(parms.pos));
51 return rset_create (rset_kind_isam, &parms);
54 static RSET rpn_search_and (struct index_info *ii, RSET r_l, RSET r_r)
61 r_dst = rset_create (rset_kind_temp, NULL);
64 i1 = rset_read (r_l, &k1);
65 i2 = rset_read (r_r, &k2);
68 if (k1.sysno > k2.sysno)
69 i2 = rset_read (r_r, &k2);
70 else if (k1.sysno < k2.sysno)
71 i1 = rset_read (r_l, &k1);
72 else if (!(i1 = key_compare_x (&k1, &k2)))
74 rset_write (r_dst, &k1);
75 i1 = rset_read (r_l, &k1);
76 i2 = rset_read (r_r, &k2);
80 rset_write (r_dst, &k2);
81 i2 = rset_read (r_r, &k2);
85 rset_write (r_dst, &k1);
86 i1 = rset_read (r_l, &k1);
93 static RSET rpn_search_or (struct index_info *ii, RSET r_l, RSET r_r)
98 static RSET rpn_search_not (struct index_info *ii, RSET r_l, RSET r_r)
103 static RSET rpn_search_ref (struct index_info *ii, Z_ResultSetId *resultSetId)
108 static RSET rpn_search_structure (struct index_info *ii, Z_RPNStructure *zs)
111 if (zs->which == Z_RPNStructure_complex)
115 r_l = rpn_search_structure (ii, zs->u.complex->s1);
116 r_r = rpn_search_structure (ii, zs->u.complex->s2);
118 switch (zs->u.complex->operator->which)
121 r = rpn_search_and (ii, r_l, r_r);
124 r = rpn_search_or (ii, r_l, r_r);
126 case Z_Operator_and_not:
127 r = rpn_search_not (ii, r_l, r_r);
135 else if (zs->which == Z_RPNStructure_simple)
137 if (zs->u.simple->which == Z_Operand_APT)
138 r = rpn_search_APT (ii, zs->u.simple->u.attributesPlusTerm);
139 else if (zs->u.simple->which == Z_Operand_resultSetId)
140 r = rpn_search_ref (ii, zs->u.simple->u.resultSetId);