2 * Copyright (C) 1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.1 1995-09-04 09:10:40 adam
8 * More work on index add/del/update.
9 * Merge sort implemented.
10 * Initial work on z39 server.
30 static RSET rpn_search_APT (Z_AttributesPlusTerm *zapt)
32 struct rset_isam_parms parms;
34 Z_Term *term = zapt->term;
36 if (term->which != Z_Term_general)
38 if (!(info = dict_lookup (dict, term->u.general->buf)))
40 assert (*info == sizeof(parms.pos));
41 memcpy (&parms.pos, info+1, sizeof(parms.pos));
43 return rset_create (rset_kind_isam, &parms);
46 static RSET rpn_search_and (RSET r_l, RSET r_r)
53 r_dst = rset_create (rset_kind_temp, NULL);
56 i1 = rset_read (r_l, &k1);
57 i2 = rset_read (r_r, &k2);
60 if (k1.sysno > k2.sysno)
61 i2 = rset_read (r_r, &k2);
62 else if (k1.sysno < k2.sysno)
63 i1 = rset_read (r_l, &k1);
64 else if (!(i1 = key_compare_x (&k1, &k2)))
66 rset_write (r_dst, &k1);
67 i1 = rset_read (r_l, &k1);
68 i2 = rset_read (r_r, &k2);
72 rset_write (r_dst, &k2);
73 i2 = rset_read (r_r, &k2);
77 rset_write (r_dst, &k1);
78 i1 = rset_read (r_l, &k1);
85 static RSET rpn_search_or (RSET r_l, RSET r_r)
90 static RSET rpn_search_not (RSET r_l, RSET r_r)
95 static RSET rpn_search_ref (Z_ResultSetId *resultSetId)
100 static RSET rpn_search_structure (Z_RPNStructure *zs)
103 if (zs->which == Z_RPNStructure_complex)
107 r_l = rpn_search_structure (zs->u.complex->s1);
108 r_r = rpn_search_structure (zs->u.complex->s2);
110 switch (zs->u.complex->operator->which)
113 r = rpn_search_and (r_l, r_r);
116 r = rpn_search_or (r_l, r_r);
118 case Z_Operator_and_not:
119 r = rpn_search_not (r_l, r_r);
127 else if (zs->which == Z_RPNStructure_simple)
129 if (zs->u.simple->which == Z_Operand_APT)
130 r = rpn_search_APT (zs->u.simple->u.attributesPlusTerm);
131 else if (zs->u.simple->which == Z_Operand_resultSetId)
132 r = rpn_search_ref (zs->u.simple->u.resultSetId);