Happy new year
[idzebra-moved-to-github.git] / test / api / test_search.c
1 /* This file is part of the Zebra server.
2    Copyright (C) Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 /** \file
21     \brief test various search attributes */
22 #if HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <yaz/test.h>
26 #include "testlib.h"
27
28 const char *myrec[] = {
29         "<gils>\n<title>My title</title>\n"
30         "  <abstract>test record with single coordset, negatives</abstract>\n"
31         "  <Spatial-Domain><Bounding-Coordinates>\n"
32         "    <West-Bounding-Coordinate> -120 </West-Bounding-Coordinate>\n"
33         "    <East-Bounding-Coordinate> -102 </East-Bounding-Coordinate>\n"
34         "    <North-Bounding-Coordinate>  49 </North-Bounding-Coordinate>\n"
35         "    <South-Bounding-Coordinate>  31 </South-Bounding-Coordinate>\n"
36         "  </Bounding-Coordinates></Spatial-Domain>\n"
37         "</gils>\n",
38
39         "<gils>\n<title>My x title</title>\n"
40         "  <abstract>second test with two coord sets</abstract>\n"
41         "  <Spatial-Domain><Bounding-Coordinates>\n"
42         "    <West-Bounding-Coordinate> -120 </West-Bounding-Coordinate>\n"
43         "    <East-Bounding-Coordinate> -102 </East-Bounding-Coordinate>\n"
44         "    <North-Bounding-Coordinate>  49 </North-Bounding-Coordinate>\n"
45         "    <South-Bounding-Coordinate>  31 </South-Bounding-Coordinate>\n"
46         "  </Bounding-Coordinates>"
47         "  <Bounding-Coordinates>\n"
48         "    <West-Bounding-Coordinate> -125 </West-Bounding-Coordinate>\n"
49         "    <East-Bounding-Coordinate> -108 </East-Bounding-Coordinate>\n"
50         "    <North-Bounding-Coordinate>  41 </North-Bounding-Coordinate>\n"
51         "    <South-Bounding-Coordinate>  25 </South-Bounding-Coordinate>\n"
52         "  </Bounding-Coordinates></Spatial-Domain>\n"
53         "</gils>\n",
54
55         "<gils>\n<title>My title x</title><abstract>a b c c c a y</abstract>\n</gils>\n" ,
56         "<gils>\n<title>test</title><abstract>a1 a2 c a1 a2 a3</abstract>\n</gils>\n" ,
57
58         "<test_search>\n"
59         " <date>2107-09-19 00:00:00</date>\n"
60         "</test_search>\n"
61         ,
62         "<gils>\n"
63         "<title>"
64         "1234567890" "1234567890""1234567890""1234567890""1234567890"
65         "1234567890" "1234567890""1234567890""1234567890""1234567890"
66         "1234567890" "1234567890""1234567890""1234567890""1234567890"
67         "1234567890" "1234567890""1234567890""1234567890""1234567890"
68         "1234567890" "1234567890""1234567890""1234567890""1234567890"
69         "1234567890" "1234567890""1234567890""1234567890""1234567890"
70         "1234567890" "1234567890""1234567890""1234567890""1234567890"
71         "1234567890" "1234567890""1234567890""1234567890""1234567890"
72         "1234567890" "1234567890""1234567890""1234567890""1234567890"
73         "1234567890" "1234567890""1234567890""1234567890""1234567890"
74         "1234567890" "1"
75
76         "</title>"
77         "</gils>"
78         ,
79         0} ;
80
81 static void tst(int argc, char **argv)
82 {
83     ZebraService zs = tl_start_up(0, argc, argv);
84     ZebraHandle zh = zebra_open(zs, 0);
85
86     YAZ_CHECK(tl_init_data(zh, myrec));
87
88     /* simple term */
89     YAZ_CHECK(tl_query(zh, "@attr 1=4 notfound", 0));
90     YAZ_CHECK(tl_query(zh, "@attr 1=4 title", 3));
91     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:w",
92                                   yaz_oid_recsyn_sutrs,
93                                   "facet w title\n"
94                                   "term 3 3: my\n"
95                                   "term 3 3: title\n"
96                                   "term 2 2: x\n"), ZEBRA_OK);
97
98     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:s",
99                                   yaz_oid_recsyn_sutrs,
100                                   "facet s title\n"
101                                   "term 1 1: my title\n"
102                                   "term 1 1: my title x\n"
103                                   "term 1 1: my x title\n"), ZEBRA_OK);
104
105     /* trunc right */
106     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=1 titl", 3));
107
108     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=1 x", 2));
109     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:w",
110                                   yaz_oid_recsyn_sutrs,
111                                   "facet w title\n"
112                                   "term 2 2: my\n"
113                                   "term 2 2: title\n"
114                                   "term 2 2: x\n"), ZEBRA_OK);
115
116     /* trunc left */
117     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 titl", 0));
118     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 x", 2));
119     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 le", 3));
120
121     /* trunc left&right */
122     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 titl", 3));
123     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 x", 2));
124     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 le", 3));
125
126     /* trunc none */
127     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 titl", 0));
128     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 x", 2));
129     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 le", 0));
130
131     /* trunc: process # in term */
132     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 titl", 0));
133     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 x", 2));
134     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 le", 0));
135     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 #le", 3));
136
137     /* trunc: re-1 */
138     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 titl", 0));
139     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 x", 2));
140     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 le", 0));
141     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 .*le", 3));
142
143     /* trunc: re-2 */
144     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titl", 3));
145     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titlx", 3));
146     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titlxx", 0));
147     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 x", 2));
148     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 le", 0));
149     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 .*le", 3));
150
151     /* trunc: CCL #=. ?=.* (?[0-9] = n times .) */
152     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 titl", 0));
153     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 tit#e", 3));
154     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 x", 2));
155     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 le", 0));
156     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?le", 3));
157     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?1le", 0));
158     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?2le", 0));
159     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?3le", 3));
160
161     /* trunc: * = .*   ! = . and right truncate */
162     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 titl", 3));
163     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 tit!e", 3));
164     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 x", 2));
165     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 le", 0));
166     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 *le", 3));
167
168     /* trunc: * = .*   ! = . and do not truncate */
169     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 titl", 0));
170     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 tit!e", 3));
171     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 x", 2));
172     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 le", 0));
173     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 *le", 3));
174
175     /* string relations, < */
176     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=1 0", 0));
177     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=1 my", 1));
178
179     /* string relations, <= */
180     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=2 my", 4));
181     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=2 mn", 1));
182
183     /* = */
184     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=3 my", 3));
185     YAZ_CHECK(
186         tl_query(zh,
187                  "@attr 1=4 @attr 2=3 "
188                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
189                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
190                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
191                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
192                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
193
194
195                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
196                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
197                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
198                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
199                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
200                  "1234567890" "1"
201                  , 1));
202
203     YAZ_CHECK(
204         tl_query_x(zh,
205                    "@attr 1=4 @attr 2=3 "
206                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
207                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
208                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
209                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
210                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
211
212                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
213                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
214                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
215                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
216                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
217                    "1234567890" "12"
218                    , 0, 11));
219
220
221     /* string relations, >= */
222     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 x", 2));
223     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 tu", 2));
224     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 title", 3));
225
226     /* string relations, > */
227     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 x", 0));
228     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 tu", 2));
229     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 title", 2));
230
231     /* always-matches relation */
232     YAZ_CHECK(tl_query(zh, "@attr 1=_ALLRECORDS @attr 2=103 {ym}", 6));
233     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=103 {x my}", 5));
234     YAZ_CHECK(tl_query_x(zh, "@attr 1=1 @attr 2=103 {x my}", 0, 114));
235
236     /* and searches */
237     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 notfound @attr 1=4 x", 0));
238     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 notfound", 0));
239     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 notfound @attr 1=4 notfound", 0));
240     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 x", 2));
241     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 my", 2));
242     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 my @attr 1=4 x", 2));
243     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 my @attr 1=4 my", 3));
244
245     /* or searches */
246     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 notfound @attr 1=4 x", 2));
247     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 notfound", 2));
248     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 notfound @attr 1=4 notfound", 0));
249     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 x", 2));
250     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 my", 3));
251     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 my @attr 1=4 x", 3));
252     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 my @attr 1=4 my", 3));
253
254     /* not searches */
255     /* bug 619 */
256     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 notfound @attr 1=4 x", 0));
257     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 x @attr 1=4 x", 0));
258     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 my @attr 1=4 x", 1));
259     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 my @attr 1=4 notfound", 3));
260     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 notfound @attr 1=4 notfound", 0));
261
262     /* phrase searches */
263     YAZ_CHECK(tl_query(zh, "@attr 1=4 my", 3));
264     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x}", 1));
265     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=1 {my x}", 1));
266     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x}", 1));
267     YAZ_CHECK(tl_query(zh, "@attr 1=4 {x my}", 0));
268     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x title}", 1));
269     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my title}", 2));
270
271     /* and-list searches */
272     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {x my}", 2));
273     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {my x}", 2));
274     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {my my}", 3));
275     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {e x}", 0));
276
277     /* or-list searches */
278     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {x my}", 3));
279     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {my x}", 3));
280     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {my my}", 3));
281     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {e x}", 2));
282     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=106 {e x}", 2));
283
284     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
285     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 2 k 2 my x", 2));
286
287     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
288     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 2 k 2 x my", 0));
289
290     /* exl=0 distance=2 order=0 relation=2 (<=), known, unit=word */
291     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 0 2 k 2 x my", 2));
292
293     /* exl=0 distance=2 order=0 relation=3 (=), known, unit=word */
294     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 3 k 2 my x", 1));
295
296     /* exl=1 distance=2 order=0 relation=3 (=), known, unit=word */
297     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 1 2 1 3 k 2 my x", 1));
298
299     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
300     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 2 1 2 k 2 a y", 1));
301
302     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
303     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 a b", 1));
304
305
306     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
307     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 c a", 1));
308     /* exl=0 distance=1 order=1 relation=2 (<=), known, unit=word */
309     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 2 k 2 c a", 1));
310
311     /* exl=0 distance=1 order=1 relation=2 (<=), known, unit=word */
312     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 2 k 2 @prox 0 1 1 2 k 2 a1 a2 a3", 1));
313     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 @prox 0 1 1 3 k 2 a1 a2 a3", 1));
314
315     /* 3 term @prox test.. */
316     YAZ_CHECK(tl_query(zh, "@attr 1=1016 \"a b c\"", 1));
317
318     /* exl=0 distance=1 order=1 relation=2 (<=), known, unit=word */
319     /* right associative (does not work, so zero hits) */
320     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 2 k 2 a @prox 0 1 1 2 k 2 b c", 0));
321     /* left associative (works fine) */
322     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 2 k 2 @prox 0 1 1 2 k 2 a b c", 1));
323
324     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
325     /* right associative (does not work, so zero hits) */
326     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 a @prox 0 1 1 3 k 2 b c", 0));
327     /* left associative (works fine) */
328     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 @prox 0 1 1 3 k 2 a b c", 1));
329
330     /* Non-indexed numeric use, but specified in bib1.att (bug #1142) */
331     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 x", 0, 114));
332     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 @attr 14=0 x", 0, 114));
333     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 @attr 14=1 x", 0, 0));
334     /* Non-indexed numeric use and unspecified in bib1.att */
335     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 x", 0, 114));
336     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 14=1 x", 0, 114));
337     /* Non-indexed string use attribute */
338     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf  x", 0, 114));
339     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf @attr 14=0 x", 0, 114));
340     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf @attr 14=1 x", 0, 0));
341
342     /* provoke unsupported use attribute */
343     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=1 x", 0, 114));
344     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=6 x", 0, 114));
345     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=105 x", 0, 114));
346     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=109 123", 0, 114));
347     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.840.10003.3.1 @attr 1=999 x",
348                          0, 114));
349     /* provoke unsupported attribute set */
350     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=1 x", 0, 121));
351     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=6 x", 0,
352                121));
353     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=105 x", 0,
354                121));
355     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=109 123",
356                0, 121));
357
358     /* provoke unsupported relation */
359     YAZ_CHECK(tl_query_x(zh, "@attr 1=4 @attr 2=6 x", 0, 117));
360     YAZ_CHECK(tl_query_x(zh, "@attr 1=1016 @attr 2=6 @attr 4=109 x", 0, 114));
361
362     /* position , phrase searches */
363     YAZ_CHECK(tl_query(zh, "@attr 3=1 title", 0));
364     YAZ_CHECK(tl_query(zh, "@attr 3=1 my", 3));
365
366     YAZ_CHECK(tl_query(zh, "@attr 3=1 {my title}", 2));
367     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {my title}", 2));
368
369     YAZ_CHECK(tl_query(zh, "@attr 3=1 {title my}", 0));
370     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {title my}", 0));
371
372     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {title my}", 0));
373
374     /* position , or-list */
375     YAZ_CHECK(tl_query(zh, "@attr 4=105 @attr 3=1 {title my}", 3));
376     YAZ_CHECK(tl_query(zh, "@attr 4=105 @attr 3=1 {title x}", 0));
377
378     /* position, and-list */
379     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 {title my}", 0));
380     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 {title x}", 0));
381     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 my", 3));
382
383
384     /* 1=2038: West-Bounding-Coordinate 2039: East: 2040: North: 2041 South*/
385     /* 4=109: numeric string */
386     /* 2=3: equal  2=1: less, 2=4: greater or equal 2=5 greater */
387
388     /* N>=25, search attributes work */
389     YAZ_CHECK(tl_query(zh,  "@attr 2=4 @attr gils 1=2040 @attr 4=109 25", 2));
390
391     /* N>49, search attributes work */
392     YAZ_CHECK(tl_query(zh,  "@attr 2=5 @attr gils 1=2040 @attr 4=109 49", 0));
393
394     /* N>=49, search attributes work */
395     YAZ_CHECK(tl_query(zh,  "@attr 2=4 @attr gils 1=2040 @attr 4=109 49", 2));
396
397     /* N>48, search attributes work */
398     YAZ_CHECK(tl_query(zh,  "@attr 2=5 @attr gils 1=2040 @attr 4=109 48", 2));
399
400     /* N<48, search attributes work */
401     YAZ_CHECK(tl_query(zh,  "@attr 2=1 @attr gils 1=2040 @attr 4=109 48", 1));
402
403     /* N<=48, search attributes work */
404     YAZ_CHECK(tl_query(zh,  "@attr 2=2 @attr gils 1=2040 @attr 4=109 48", 1));
405
406     /* N=41, get rec1 only */
407     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2040 @attr 4=109 41", 1));
408
409     /* N=49, get both records */
410     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2040 @attr 4=109 49", 2));
411
412     /* W=-120 get both records */
413     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2038 @attr 4=109 -120", 2));
414
415     /* W<-122 get only rec1 */
416     YAZ_CHECK(tl_query(zh,  "@attr 2=1 @attr gils 1=2038 @attr 4=109 '-120' ", 1));
417
418     /* N=41 and N=49 get only rec2 */
419     YAZ_CHECK(tl_query(zh, "@attr 2=3 @attr gils 1=2040 @attr 4=109 \"41 49\" ", 1));
420
421
422     /* = */
423     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=3 {2107-09-19 00:00:00}", 1));
424     /* < */
425     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=1 {2107-09-19 00:00:00}", 0));
426     /* <= */
427     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=2 {2107-09-19 00:00:00}", 1));
428     /* >= */
429     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=4 {2107-09-19 00:00:00}", 1));
430     /* > */
431     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=5 {2107-09-19 00:00:00}", 0));
432
433
434     YAZ_CHECK(tl_close_down(zh, zs));
435 }
436
437 TL_MAIN
438
439 /*
440  * Local variables:
441  * c-basic-offset: 4
442  * c-file-style: "Stroustrup"
443  * indent-tabs-mode: nil
444  * End:
445  * vim: shiftwidth=4 tabstop=8 expandtab
446  */
447