2 * Copyright (C) 1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1995-09-04 12:33:43 adam
8 * Various cleanup. YAZ util used instead.
10 * Revision 1.1 1995/09/04 09:10:40 adam
11 * More work on index add/del/update.
12 * Merge sort implemented.
13 * Initial work on z39 server.
33 static RSET rpn_search_APT (Z_AttributesPlusTerm *zapt)
35 struct rset_isam_parms parms;
37 Z_Term *term = zapt->term;
39 if (term->which != Z_Term_general)
41 if (!(info = dict_lookup (dict, term->u.general->buf)))
43 assert (*info == sizeof(parms.pos));
44 memcpy (&parms.pos, info+1, sizeof(parms.pos));
46 return rset_create (rset_kind_isam, &parms);
49 static RSET rpn_search_and (RSET r_l, RSET r_r)
56 r_dst = rset_create (rset_kind_temp, NULL);
59 i1 = rset_read (r_l, &k1);
60 i2 = rset_read (r_r, &k2);
63 if (k1.sysno > k2.sysno)
64 i2 = rset_read (r_r, &k2);
65 else if (k1.sysno < k2.sysno)
66 i1 = rset_read (r_l, &k1);
67 else if (!(i1 = key_compare_x (&k1, &k2)))
69 rset_write (r_dst, &k1);
70 i1 = rset_read (r_l, &k1);
71 i2 = rset_read (r_r, &k2);
75 rset_write (r_dst, &k2);
76 i2 = rset_read (r_r, &k2);
80 rset_write (r_dst, &k1);
81 i1 = rset_read (r_l, &k1);
88 static RSET rpn_search_or (RSET r_l, RSET r_r)
93 static RSET rpn_search_not (RSET r_l, RSET r_r)
98 static RSET rpn_search_ref (Z_ResultSetId *resultSetId)
103 static RSET rpn_search_structure (Z_RPNStructure *zs)
106 if (zs->which == Z_RPNStructure_complex)
110 r_l = rpn_search_structure (zs->u.complex->s1);
111 r_r = rpn_search_structure (zs->u.complex->s2);
113 switch (zs->u.complex->operator->which)
116 r = rpn_search_and (r_l, r_r);
119 r = rpn_search_or (r_l, r_r);
121 case Z_Operator_and_not:
122 r = rpn_search_not (r_l, r_r);
130 else if (zs->which == Z_RPNStructure_simple)
132 if (zs->u.simple->which == Z_Operand_APT)
133 r = rpn_search_APT (zs->u.simple->u.attributesPlusTerm);
134 else if (zs->u.simple->which == Z_Operand_resultSetId)
135 r = rpn_search_ref (zs->u.simple->u.resultSetId);