1// tmapped.cpp -- Regression test program, mapped view tests
2// $Id: tmapped.cpp 1230 2007-03-09 15:58:53Z jcw $
3// This is part of Metakit, the homepage is http://www.equi4.com/metakit.html
4
5#include "regress.h"
6
7void TestBlockDel(int pos_, int len_) {
8  printf("blockdel pos %d len %d\n", pos_, len_);
9
10  c4_ViewProp p1("_B");
11  c4_IntProp p2("p2");
12
13  c4_Storage s1;
14  c4_View v1 = s1.GetAs("v1[_B[p2:I]]");
15
16  int n = 0;
17  static int sizes[] =  {
18    999, 999, 999, 2, 0
19  };
20
21  for (int i = 0; sizes[i]; ++i) {
22    c4_View v;
23    v.SetSize(sizes[i]);
24    for (int j = 0; j < sizes[i]; ++j)
25      p2(v[j]) = ++n;
26    v1.Add(p1[v]);
27  }
28
29  c4_View v2 = v1.Blocked();
30  A(v2.GetSize() == 2999);
31
32  v2.RemoveAt(pos_, len_);
33  A(v2.GetSize() == 2999-len_);
34}
35
36void TestMapped() {
37  B(m01, Hash mapping, 0);
38   {
39    c4_StringProp p1("p1");
40
41    c4_Storage s1;
42    c4_View v1 = s1.GetAs("v1[p1:S]");
43    c4_View v2 = s1.GetAs("v2[_H:I,_R:I]");
44    c4_View v3 = v1.Hash(v2, 1);
45
46    v3.Add(p1["b93655249726e5ef4c68e45033c2e0850570e1e07"]);
47    v3.Add(p1["2ab03fba463d214f854a71ab5c951cea096887adf"]);
48    v3.Add(p1["2e196eecb91b02c16c23360d8e1b205f0b3e3fa3d"]);
49    A(v3.GetSize() == 3);
50
51    // infinite loop in 2.4.0, reported by Nathan Rogers, July 2001
52    // happens when looking for missing key after a hash collision
53    int f = v3.Find(p1["7c0734c9187133f34588517fb5b39294076f22ba3"]);
54    A(f ==  - 1);
55  }
56  E;
57
58  // example from Steve Baxter, Nov 2001, after block perf bugfix
59  // assertion failure on row 1001, due to commit data mismatch
60  B(m02, Blocked view bug, 0)W(m02a);
61   {
62    c4_BytesProp p1("p1");
63    c4_Bytes h;
64
65    c4_Storage s1("m02a", true);
66    c4_View v1 = s1.GetAs("v1[_B[p1:B]]");
67    c4_View v2 = v1.Blocked();
68
69    for (int i = 0; i < 1005; ++i) {
70      h.SetBuffer(2500+i);
71      v2.Add(p1[h]);
72
73      if (i >= 999)
74      // will crash a few rounds later, at row 1001
75        s1.Commit();
76    }
77
78    // reduce size to shorten the dump output
79    v2.RemoveAt(0, 990);
80    s1.Commit();
81
82  }
83  D(m02a);
84  R(m02a);
85  E;
86
87  B(m03, Hash adds, 0)W(m03a);
88   {
89    c4_StringProp p1("p1");
90
91    c4_Storage s1("m03a", true);
92
93    c4_View d1 = s1.GetAs("d1[p1:S]");
94    c4_View m1 = s1.GetAs("m1[_H:I,_R:I]");
95    c4_View h1 = d1.Hash(m1);
96
97    h1.Add(p1["one"]);
98    s1.Commit();
99
100    c4_View d2 = s1.GetAs("d2[p1:S]");
101    c4_View m2 = s1.GetAs("m2[_H:I,_R:I]");
102    c4_View h2 = d2.Hash(m2);
103
104    h1.Add(p1["two"]);
105    h2.Add(p1["two"]);
106    s1.Commit();
107
108    c4_View d3 = s1.GetAs("d3[p1:S]");
109    c4_View m3 = s1.GetAs("m3[_H:I,_R:I]");
110    c4_View h3 = d3.Hash(m3);
111
112    h1.Add(p1["three"]);
113    h2.Add(p1["three"]);
114    h3.Add(p1["three"]);
115    s1.Commit();
116
117    c4_View d4 = s1.GetAs("d4[p1:S]");
118    c4_View m4 = s1.GetAs("m4[_H:I,_R:I]");
119    c4_View h4 = d4.Hash(m4);
120
121    h1.Add(p1["four"]);
122    h2.Add(p1["four"]);
123    h3.Add(p1["four"]);
124    h4.Add(p1["four"]);
125    s1.Commit();
126
127  }
128  D(m03a);
129  R(m03a);
130  E;
131
132  B(m04, Locate bug, 0)W(m04a);
133   {
134    c4_IntProp p1("p1");
135    c4_StringProp p2("p2");
136
137    c4_Storage s1("m04a", true);
138    s1.AutoCommit();
139
140    c4_View v1 = s1.GetAs("v1[p1:I,p2:S]");
141
142    v1.Add(p1[1] + p2["one"]);
143    v1.Add(p1[2] + p2["two"]);
144    v1.Add(p1[3] + p2["three"]);
145    s1.Commit();
146
147    c4_View v2 = v1.Ordered();
148    A(v2.GetSize() == 3);
149    v2.Add(p1[6] + p2["six"]);
150    v2.Add(p1[5] + p2["five"]);
151    v2.Add(p1[4] + p2["four"]);
152    A(v2.GetSize() == 6);
153    A(v1.GetSize() == 6);
154
155    A(p1(v1[0]) == 1);
156    A(p1(v1[1]) == 2);
157    A(p1(v1[2]) == 3);
158    A(p1(v1[3]) == 4);
159    A(p1(v1[4]) == 5);
160    A(p1(v1[5]) == 6);
161
162    A(v2.Find(p1[4]) == 3);
163    A(v2.Search(p1[4]) == 3);
164
165    int i1 =  - 1;
166    A(v1.Locate(p1[4], &i1) == 1);
167    A(i1 == 3);
168
169    int i2 =  - 1;
170    A(v2.Locate(p1[4], &i2) == 1);
171    A(i2 == 3);
172
173  }
174  D(m04a);
175  R(m04a);
176  E;
177
178  // subviews are not relocated properly with blocked views in 2.4.7
179  B(m05, Blocked view with subviews, 0)W(m05a);
180   {
181    char buf[10];
182    c4_StringProp p1("p1");
183    c4_IntProp p2("p2");
184    c4_ViewProp pSv("sv");
185
186    c4_Storage s1("m05a", true);
187    c4_View v1 = s1.GetAs("v1[_B[p1:S,sv[p2:I]]]");
188    c4_View v2 = v1.Blocked();
189
190    for (int i = 0; i < 1000; ++i) {
191      sprintf(buf, "id-%d", i);
192      v2.Add(p1[buf]);
193
194      c4_View v3 = pSv(v2[i]);
195      v3.Add(p2[i]);
196    }
197
198    for (int j = 0; j < 1; ++j) {
199      sprintf(buf, "insert-%d", j);
200      v2.InsertAt(500, p1[buf]);
201    }
202
203    s1.Commit();
204
205  }
206  D(m05a);
207  R(m05a);
208  E;
209
210  // 2003/02/14 - assert fails for 2.4.8 in c4_Column::RemoveData
211  B(m06, Blocked view multi-row deletion, 0)W(m06a);
212   {
213    c4_IntProp p1("p1");
214
215    c4_Storage s1("m06a", true);
216    c4_View v1 = s1.GetAs("v1[p1:I]");
217    c4_View v2 = s1.GetAs("v2[_B[_H:I,_R:I]]");
218    c4_View v3 = v2.Blocked();
219    c4_View v4 = v1.Hash(v3, 1);
220
221    v4.Add(p1[1]);
222    v4.Add(p1[2]);
223    v4.RemoveAt(1);
224
225    for (int i = 100; i < 1000; ++i) {
226      v4.Add(p1[i]);
227    }
228
229    s1.Commit();
230
231  }
232  D(m06a);
233  R(m06a);
234  E;
235
236  // 2003/03/07 - still not correct on blocked veiw deletions
237  B(m07, All blocked view multi-deletion cases, 0);
238   {
239    int i, j;
240    for (i = 0; i < 2; ++i) {
241      for (j = 1; j < 4; ++j)
242        TestBlockDel(i, j);
243      for (j = 998; j < 1002; ++j)
244        TestBlockDel(i, j);
245      for (j = 1998; j < 2002; ++j)
246        TestBlockDel(i, j);
247    }
248    for (i = 998; i < 1002; ++i) {
249      for (j = 1; j < 4; ++j)
250        TestBlockDel(i, j);
251      for (j = 998; j < 1002; ++j)
252        TestBlockDel(i, j);
253    }
254    for (i = 1; i < 4; ++i)
255      TestBlockDel(2999-i, i);
256    for (i = 998; i < 1002; ++i)
257      TestBlockDel(2999-i, i);
258    for (i = 1998; i < 2002; ++i)
259      TestBlockDel(2999-i, i);
260  }
261  E;
262}
263