4e30697ce836ba36de1d61c1578fa9491991fc57
[idzebra-moved-to-github.git] / index / zrpn.c
1 /*
2  * Copyright (C) 1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: zrpn.c,v $
7  * Revision 1.3  1995-09-04 15:20:22  adam
8  * Minor changes.
9  *
10  * Revision 1.2  1995/09/04  12:33:43  adam
11  * Various cleanup. YAZ util used instead.
12  *
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.
17  *
18  */
19 #include <stdio.h>
20 #include <assert.h>
21 #include <unistd.h>
22
23 #include <alexutil.h>
24 #include <dict.h>
25 #include <isam.h>
26 #include <rsisam.h>
27 #include <rstemp.h>
28
29 #include <proto.h>
30
31 #include "index.h"
32
33 struct index_info {
34     Dict dict;
35     ISAM isam;
36 };
37
38 static RSET rpn_search_APT (struct index_info *ii, Z_AttributesPlusTerm *zapt)
39 {
40     struct rset_isam_parms parms;
41     const char *info;
42     Z_Term *term = zapt->term;
43
44     if (term->which != Z_Term_general)
45         return NULL; 
46     if (!(info = dict_lookup (ii->dict, term->u.general->buf)))
47         return NULL;
48     assert (*info == sizeof(parms.pos));
49     memcpy (&parms.pos, info+1, sizeof(parms.pos));
50     parms.is = ii->isam;
51     return rset_create (rset_kind_isam, &parms);
52 }
53
54 static RSET rpn_search_and (struct index_info *ii, RSET r_l, RSET r_r)
55 {
56     struct it_key k1, k2;
57     RSET r_dst;
58     int i1, i2;
59     rset_open (r_l, 0);
60     rset_open (r_r, 0);
61     r_dst = rset_create (rset_kind_temp, NULL);
62     rset_open (r_dst, 1);
63     
64     i1 = rset_read (r_l, &k1);
65     i2 = rset_read (r_r, &k2);
66     while (i1 && i2)
67     {
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)))
73         {
74             rset_write (r_dst, &k1);
75             i1 = rset_read (r_l, &k1);
76             i2 = rset_read (r_r, &k2);
77         }
78         else if (i1 > 0)
79         {
80             rset_write (r_dst, &k2);
81             i2 = rset_read (r_r, &k2);
82         }
83         else
84         {
85             rset_write (r_dst, &k1);
86             i1 = rset_read (r_l, &k1);
87         }
88     } 
89     rset_close (r_dst);
90     return r_dst;
91 }
92
93 static RSET rpn_search_or (struct index_info *ii, RSET r_l, RSET r_r)
94 {
95     return r_l;
96 }
97
98 static RSET rpn_search_not (struct index_info *ii, RSET r_l, RSET r_r)
99 {
100     return r_l;
101 }
102
103 static RSET rpn_search_ref (struct index_info *ii, Z_ResultSetId *resultSetId)
104 {
105     return NULL;
106 }
107
108 static RSET rpn_search_structure (struct index_info *ii, Z_RPNStructure *zs)
109 {
110     RSET r;
111     if (zs->which == Z_RPNStructure_complex)
112     {
113         RSET r_l, r_r;
114
115         r_l = rpn_search_structure (ii, zs->u.complex->s1);
116         r_r = rpn_search_structure (ii, zs->u.complex->s2);
117
118         switch (zs->u.complex->operator->which)
119         {
120         case Z_Operator_and:
121             r = rpn_search_and (ii, r_l, r_r);
122             break;
123         case Z_Operator_or:
124             r = rpn_search_or (ii, r_l, r_r);
125             break;
126         case Z_Operator_and_not:
127             r = rpn_search_not (ii, r_l, r_r);
128             break;
129         default:
130             assert (0);
131         }
132         rset_delete (r_l);
133         rset_delete (r_r);
134     }
135     else if (zs->which == Z_RPNStructure_simple)
136     {
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);
141         else
142         {
143             assert (0);
144         }
145     }
146     else
147     {
148         assert (0);
149     }
150     return r;
151 }