Fix documentation of of chr's equivalent directive ZEB-672
[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         "<gils>\n"
80         "<title>"
81         "\xe5" " og vandl" "\xf8" "b"
82         "</title>"
83         "</gils>"
84         ,
85         0} ;
86
87 static void tst(int argc, char **argv)
88 {
89     ZebraService zs = tl_start_up(0, argc, argv);
90     ZebraHandle zh = zebra_open(zs, 0);
91
92     YAZ_CHECK(tl_init_data(zh, myrec));
93
94     /* simple term */
95     YAZ_CHECK(tl_query(zh, "@attr 1=4 notfound", 0));
96     YAZ_CHECK(tl_query(zh, "@attr 1=4 title", 3));
97     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:w",
98                                   yaz_oid_recsyn_sutrs,
99                                   "facet w title\n"
100                                   "term 3 3: my\n"
101                                   "term 3 3: title\n"
102                                   "term 2 2: x\n"), ZEBRA_OK);
103
104     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:s",
105                                   yaz_oid_recsyn_sutrs,
106                                   "facet s title\n"
107                                   "term 1 1: my title\n"
108                                   "term 1 1: my title x\n"
109                                   "term 1 1: my x title\n"), ZEBRA_OK);
110
111     /* trunc right */
112     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=1 titl", 3));
113
114     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=1 x", 2));
115     YAZ_CHECK_EQ(tl_fetch_compare(zh, 1, "zebra::facet::title:w",
116                                   yaz_oid_recsyn_sutrs,
117                                   "facet w title\n"
118                                   "term 2 2: my\n"
119                                   "term 2 2: title\n"
120                                   "term 2 2: x\n"), ZEBRA_OK);
121
122     /* trunc left */
123     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 titl", 0));
124     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 x", 2));
125     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=2 le", 3));
126
127     /* trunc left&right */
128     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 titl", 3));
129     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 x", 2));
130     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=3 le", 3));
131
132     /* trunc none */
133     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 titl", 0));
134     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 x", 2));
135     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=100 le", 0));
136
137     /* trunc: process # in term */
138     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 titl", 0));
139     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 x", 2));
140     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 le", 0));
141     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=101 #le", 3));
142
143     /* trunc: re-1 */
144     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 titl", 0));
145     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 x", 2));
146     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 le", 0));
147     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=102 .*le", 3));
148
149     /* trunc: re-2 */
150     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titl", 3));
151     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titlx", 3));
152     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 titlxx", 0));
153     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 x", 3));
154     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 le", 0));
155     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=103 .*le", 3));
156
157     /* trunc: CCL #=. ?=.* (?[0-9] = n times .) */
158     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 titl", 0));
159     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 tit#e", 3));
160     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 x", 2));
161     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 le", 0));
162     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?le", 3));
163     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?1le", 0));
164     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?2le", 0));
165     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=104 ?3le", 3));
166
167     /* trunc: * = .*   ! = . and right truncate */
168     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 titl", 3));
169     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 tit!e", 3));
170     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 x", 2));
171     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 le", 0));
172     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=105 *le", 3));
173
174     /* trunc: * = .*   ! = . and do not truncate */
175     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 titl", 0));
176     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 tit!e", 3));
177     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 x", 2));
178     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 le", 0));
179     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 5=106 *le", 3));
180
181     /* string relations, < */
182     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=1 0", 0));
183     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=1 my", 1));
184
185     /* string relations, <= */
186     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=2 my", 4));
187     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=2 mn", 1));
188
189     /* = */
190     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=3 my", 3));
191     YAZ_CHECK(
192         tl_query(zh,
193                  "@attr 1=4 @attr 2=3 "
194                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
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
200
201                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
202                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
203                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
204                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
205                  "1234567890" "1234567890""1234567890""1234567890""1234567890"
206                  "1234567890" "1"
207                  , 1));
208
209     YAZ_CHECK(
210         tl_query_x(zh,
211                    "@attr 1=4 @attr 2=3 "
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
218                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
219                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
220                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
221                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
222                    "1234567890" "1234567890""1234567890""1234567890""1234567890"
223                    "1234567890" "12"
224                    , 0, 11));
225
226
227     /* string relations, >= */
228     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 x", 3));
229     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 tu", 3));
230     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=4 title", 4));
231
232     /* string relations, > */
233     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 x", 1));
234     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 tu", 3));
235     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=5 title", 3));
236
237     /* always-matches relation */
238     YAZ_CHECK(tl_query(zh, "@attr 1=_ALLRECORDS @attr 2=103 {ym}", 7));
239     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 2=103 {x my}", 6));
240     YAZ_CHECK(tl_query_x(zh, "@attr 1=1 @attr 2=103 {x my}", 0, 114));
241
242     /* and searches */
243     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 notfound @attr 1=4 x", 0));
244     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 notfound", 0));
245     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 notfound @attr 1=4 notfound", 0));
246     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 x", 2));
247     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 x @attr 1=4 my", 2));
248     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 my @attr 1=4 x", 2));
249     YAZ_CHECK(tl_query(zh, "@and @attr 1=4 my @attr 1=4 my", 3));
250
251     /* or searches */
252     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 notfound @attr 1=4 x", 2));
253     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 notfound", 2));
254     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 notfound @attr 1=4 notfound", 0));
255     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 x", 2));
256     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 x @attr 1=4 my", 3));
257     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 my @attr 1=4 x", 3));
258     YAZ_CHECK(tl_query(zh, "@or @attr 1=4 my @attr 1=4 my", 3));
259
260     /* not searches */
261     /* bug 619 */
262     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 notfound @attr 1=4 x", 0));
263     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 x @attr 1=4 x", 0));
264     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 my @attr 1=4 x", 1));
265     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 my @attr 1=4 notfound", 3));
266     YAZ_CHECK(tl_query(zh, "@not @attr 1=4 notfound @attr 1=4 notfound", 0));
267
268     /* phrase searches */
269     YAZ_CHECK(tl_query(zh, "@attr 1=4 my", 3));
270     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x}", 1));
271     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=1 {my x}", 1));
272     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x}", 1));
273     YAZ_CHECK(tl_query(zh, "@attr 1=4 {x my}", 0));
274     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my x title}", 1));
275     YAZ_CHECK(tl_query(zh, "@attr 1=4 {my title}", 2));
276
277     /* and-list searches */
278     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {x my}", 2));
279     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {my x}", 2));
280     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {my my}", 3));
281     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=6 {e x}", 0));
282
283     /* or-list searches */
284     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {x my}", 3));
285     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {my x}", 3));
286     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {my my}", 3));
287     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=105 {e x}", 2));
288     YAZ_CHECK(tl_query(zh, "@attr 1=4 @attr 4=106 {e x}", 2));
289
290     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
291     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 2 k 2 my x", 2));
292
293     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
294     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 2 k 2 x my", 0));
295
296     /* exl=0 distance=2 order=0 relation=2 (<=), known, unit=word */
297     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 0 2 k 2 x my", 2));
298
299     /* exl=0 distance=2 order=0 relation=3 (=), known, unit=word */
300     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 0 2 1 3 k 2 my x", 1));
301
302     /* exl=1 distance=2 order=0 relation=3 (=), known, unit=word */
303     YAZ_CHECK(tl_query(zh, "@attr 1=4 @prox 1 2 1 3 k 2 my x", 1));
304
305     /* exl=0 distance=2 order=1 relation=2 (<=), known, unit=word */
306     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 2 1 2 k 2 a y", 1));
307
308     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
309     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 a b", 1));
310
311
312     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
313     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 3 k 2 c a", 1));
314     /* exl=0 distance=1 order=1 relation=2 (<=), known, unit=word */
315     YAZ_CHECK(tl_query(zh, "@attr 1=1016 @prox 0 1 1 2 k 2 c a", 1));
316
317     /* exl=0 distance=1 order=1 relation=2 (<=), known, unit=word */
318     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));
319     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));
320
321     /* 3 term @prox test.. */
322     YAZ_CHECK(tl_query(zh, "@attr 1=1016 \"a b c\"", 1));
323
324     /* exl=0 distance=1 order=1 relation=2 (<=), 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 2 k 2 a @prox 0 1 1 2 k 2 b c", 0));
327     /* left associative (works fine) */
328     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));
329
330     /* exl=0 distance=1 order=1 relation=3 (=), known, unit=word */
331     /* right associative (does not work, so zero hits) */
332     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));
333     /* left associative (works fine) */
334     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));
335
336     /* Non-indexed numeric use, but specified in bib1.att (bug #1142) */
337     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 x", 0, 114));
338     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 @attr 14=0 x", 0, 114));
339     YAZ_CHECK(tl_query_x(zh, "@attr 1=1000 @attr 14=1 x", 0, 0));
340     /* Non-indexed numeric use and unspecified in bib1.att */
341     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 x", 0, 114));
342     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 14=1 x", 0, 114));
343     /* Non-indexed string use attribute */
344     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf  x", 0, 114));
345     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf @attr 14=0 x", 0, 114));
346     YAZ_CHECK(tl_query_x(zh, "@attr 1=gyf @attr 14=1 x", 0, 0));
347
348     /* provoke unsupported use attribute */
349     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=1 x", 0, 114));
350     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=6 x", 0, 114));
351     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=105 x", 0, 114));
352     YAZ_CHECK(tl_query_x(zh, "@attr 1=999 @attr 4=109 123", 0, 114));
353     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.840.10003.3.1 @attr 1=999 x",
354                          0, 114));
355     /* provoke unsupported attribute set */
356     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=1 x", 0, 121));
357     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=6 x", 0,
358                121));
359     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=105 x", 0,
360                121));
361     YAZ_CHECK(tl_query_x(zh, "@attrset 1.2.8 @attr 1=999 @attr 4=109 123",
362                0, 121));
363
364     /* provoke unsupported relation */
365     YAZ_CHECK(tl_query_x(zh, "@attr 1=4 @attr 2=6 x", 0, 117));
366     YAZ_CHECK(tl_query_x(zh, "@attr 1=1016 @attr 2=6 @attr 4=109 x", 0, 114));
367
368     /* position , phrase searches */
369     YAZ_CHECK(tl_query(zh, "@attr 3=1 title", 0));
370     YAZ_CHECK(tl_query(zh, "@attr 3=1 my", 3));
371
372     YAZ_CHECK(tl_query(zh, "@attr 3=1 {my title}", 2));
373     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {my title}", 2));
374
375     YAZ_CHECK(tl_query(zh, "@attr 3=1 {title my}", 0));
376     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {title my}", 0));
377
378     YAZ_CHECK(tl_query(zh, "@attr 4=1 @attr 3=1 {title my}", 0));
379
380     /* position , or-list */
381     YAZ_CHECK(tl_query(zh, "@attr 4=105 @attr 3=1 {title my}", 3));
382     YAZ_CHECK(tl_query(zh, "@attr 4=105 @attr 3=1 {title x}", 0));
383
384     /* position, and-list */
385     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 {title my}", 0));
386     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 {title x}", 0));
387     YAZ_CHECK(tl_query(zh, "@attr 4=6 @attr 3=1 my", 3));
388
389
390     /* 1=2038: West-Bounding-Coordinate 2039: East: 2040: North: 2041 South*/
391     /* 4=109: numeric string */
392     /* 2=3: equal  2=1: less, 2=4: greater or equal 2=5 greater */
393
394     /* N>=25, search attributes work */
395     YAZ_CHECK(tl_query(zh,  "@attr 2=4 @attr gils 1=2040 @attr 4=109 25", 2));
396
397     /* N>49, search attributes work */
398     YAZ_CHECK(tl_query(zh,  "@attr 2=5 @attr gils 1=2040 @attr 4=109 49", 0));
399
400     /* N>=49, search attributes work */
401     YAZ_CHECK(tl_query(zh,  "@attr 2=4 @attr gils 1=2040 @attr 4=109 49", 2));
402
403     /* N>48, search attributes work */
404     YAZ_CHECK(tl_query(zh,  "@attr 2=5 @attr gils 1=2040 @attr 4=109 48", 2));
405
406     /* N<48, search attributes work */
407     YAZ_CHECK(tl_query(zh,  "@attr 2=1 @attr gils 1=2040 @attr 4=109 48", 1));
408
409     /* N<=48, search attributes work */
410     YAZ_CHECK(tl_query(zh,  "@attr 2=2 @attr gils 1=2040 @attr 4=109 48", 1));
411
412     /* N=41, get rec1 only */
413     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2040 @attr 4=109 41", 1));
414
415     /* N=49, get both records */
416     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2040 @attr 4=109 49", 2));
417
418     /* W=-120 get both records */
419     YAZ_CHECK(tl_query(zh,  "@attr 2=3 @attr gils 1=2038 @attr 4=109 -120", 2));
420
421     /* W<-122 get only rec1 */
422     YAZ_CHECK(tl_query(zh,  "@attr 2=1 @attr gils 1=2038 @attr 4=109 '-120' ", 1));
423
424     /* N=41 and N=49 get only rec2 */
425     YAZ_CHECK(tl_query(zh, "@attr 2=3 @attr gils 1=2040 @attr 4=109 \"41 49\" ", 1));
426
427     /* N=41 and N=49, but relevance */
428     YAZ_CHECK(tl_query(zh, "@attr 2=102 @attr gils 1=2040 @attr 4=109 \"41 49\" ", 1));
429
430
431     /* = */
432     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=3 {2107-09-19 00:00:00}", 1));
433     /* < */
434     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=1 {2107-09-19 00:00:00}", 0));
435     /* <= */
436     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=2 {2107-09-19 00:00:00}", 1));
437     /* >= */
438     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=4 {2107-09-19 00:00:00}", 1));
439     /* > */
440     YAZ_CHECK(tl_query(zh, "@attr 1=30 @attr 4=5 @attr 2=5 {2107-09-19 00:00:00}", 0));
441
442
443     YAZ_CHECK(tl_query(zh, "@attr 1=4 {\xe5" " og vandl" "\xf8" "b}", 1));
444
445     YAZ_CHECK(tl_query(zh, "@attr 1=4 {\xc5" " OG VANDL" "\xd8" "B}", 1));
446
447     /* try equivalent directive */
448     YAZ_CHECK(tl_query(zh, "@attr 1=4 {aa" " OG VANDL" "\xd8" "B}", 1));
449     YAZ_CHECK(tl_query(zh, "@attr 1=4 {AA" " OG VANDL" "\xd8" "B}", 0));
450
451     YAZ_CHECK(tl_close_down(zh, zs));
452 }
453
454 TL_MAIN
455
456 /*
457  * Local variables:
458  * c-basic-offset: 4
459  * c-file-style: "Stroustrup"
460  * indent-tabs-mode: nil
461  * End:
462  * vim: shiftwidth=4 tabstop=8 expandtab
463  */
464