First work on multi value sort ISAM
[idzebra-moved-to-github.git] / test / api / test_sortidx.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1995-2008 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 #include <idzebra/bfile.h>
21 #include <sortidx.h>
22 #include "testlib.h"
23
24 static void tst1(zebra_sort_index_t si)
25 {
26     zint sysno = 12; /* just some sysno */
27     int my_type = 2; /* just some type ID */
28     WRBUF w = wrbuf_alloc();
29
30     zebra_sort_type(si, my_type);
31
32     zebra_sort_sysno(si, sysno);
33     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
34
35     zebra_sort_add(si, "abcde1", 6);
36
37     zebra_sort_sysno(si, sysno);
38     YAZ_CHECK_EQ(zebra_sort_read(si, w), 1);
39     YAZ_CHECK(!strcmp(wrbuf_cstr(w), "abcde1"));
40
41     zebra_sort_sysno(si, sysno+1);
42     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
43
44     zebra_sort_sysno(si, sysno-1);
45     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
46
47     zebra_sort_sysno(si, sysno);
48     zebra_sort_delete(si);
49     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
50
51     zebra_sort_type(si, my_type);
52
53     zebra_sort_sysno(si, sysno);
54     YAZ_CHECK_EQ(zebra_sort_read(si, w), 0);
55
56     wrbuf_rewind(w);
57     zebra_sort_add(si, "abcde1", 6);
58
59     zebra_sort_sysno(si, sysno);
60     YAZ_CHECK_EQ(zebra_sort_read(si, w), 1);
61     YAZ_CHECK(!strcmp(wrbuf_cstr(w), "abcde1"));
62
63     zebra_sort_sysno(si, sysno);
64     zebra_sort_delete(si);
65
66     wrbuf_destroy(w);
67 }
68
69 static void tst2(zebra_sort_index_t si)
70 {
71     zint sysno = 15; /* just some sysno */
72     int my_type = 2; /* just some type ID */
73     int i;
74
75     zebra_sort_type(si, my_type);
76
77     for (sysno = 1; sysno < 50; sysno++)
78     {
79         WRBUF w1 = wrbuf_alloc();
80         WRBUF w2 = wrbuf_alloc();
81         zebra_sort_sysno(si, sysno);
82         YAZ_CHECK_EQ(zebra_sort_read(si, w2), 0);
83         
84         for (i = 0; i < 600; i++) /* 600 * 6 < max size =4K */
85             wrbuf_write(w1, "12345", 6);
86         
87         zebra_sort_add(si, wrbuf_buf(w1), wrbuf_len(w1));
88         
89         zebra_sort_sysno(si, sysno);
90         
91         YAZ_CHECK_EQ(zebra_sort_read(si, w2), 1);
92         
93         YAZ_CHECK_EQ(wrbuf_len(w1), wrbuf_len(w2));
94         YAZ_CHECK(!memcmp(wrbuf_buf(w1), wrbuf_buf(w2), wrbuf_len(w2)));
95         wrbuf_destroy(w1);
96         wrbuf_destroy(w2);
97     }
98 }
99
100 static void tst(int argc, char **argv)
101 {
102     BFiles bfs = bfs_create(".:50M", 0);
103     zebra_sort_index_t si;
104
105     YAZ_CHECK(bfs);
106     if (bfs)
107     {
108         bf_reset(bfs);
109         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_FLAT);
110         YAZ_CHECK(si);
111         if (si)
112         {
113             tst1(si);
114             zebra_sort_close(si);
115         }
116     }
117     if (bfs)
118     {
119         bf_reset(bfs);
120         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_ISAMB);
121         YAZ_CHECK(si);
122         if (si)
123         {
124             tst1(si);
125             zebra_sort_close(si);
126         }
127     }
128     if (bfs)
129     {
130         bf_reset(bfs);
131         si = zebra_sort_open(bfs, 1, ZEBRA_SORT_TYPE_MULTI);
132         YAZ_CHECK(si);
133         if (si)
134         {
135             tst1(si);
136             tst2(si);
137             zebra_sort_close(si);
138         }
139     }
140     if (bfs)
141         bfs_destroy(bfs);
142 }
143
144 TL_MAIN
145 /*
146  * Local variables:
147  * c-basic-offset: 4
148  * indent-tabs-mode: nil
149  * End:
150  * vim: shiftwidth=4 tabstop=8 expandtab
151  */
152