1 #include <iostream>
2 #include <sstream>
3 #include "testlib/testlib_test.h"
4 #include <brdb/brdb_value.h>
5 #include <brdb/brdb_tuple.h>
6 #include <brdb/brdb_relation.h>
7 #include <brdb/brdb_relation_sptr.h>
8 #include <brdb/brdb_database.h>
9 #include <brdb/brdb_database_sptr.h>
10 #include <brdb/brdb_database_manager.h>
11 #include <brdb/brdb_query.h>
12 #ifdef _MSC_VER
13 # include "vcl_msvc_warnings.h"
14 #endif
15
test_database_manager()16 static void test_database_manager()
17 {
18 ////////////////////////////////////////////////////////////////////////////
19 // example: creating values, tuples and relations
20 ////////////////////////////////////////////////////////////////////////////
21
22 std::vector<std::string> r1_names(3);
23 std::vector<std::string> r1_types(3);
24 std::vector<brdb_tuple_sptr> r1_tuples(20);
25
26 std::vector<std::string> r2_names(2);
27 std::vector<std::string> r2_types(2);
28 std::vector<brdb_tuple_sptr> r2_tuples(30);
29
30 std::vector<std::string> r3_names(2);
31 std::vector<std::string> r3_types(2);
32 std::vector<brdb_tuple_sptr> r3_tuples(40);
33
34 r1_names[0] = "ID";
35 r1_names[1] = "Name";
36 r1_names[2] = "Gender";
37
38 r1_types[0] = brdb_value_t<int>::type();
39 r1_types[1] = brdb_value_t<std::string>::type();
40 r1_types[2] = brdb_value_t<bool>::type();
41
42 for (int i=0; i<20; i++)
43 {
44 int ID = 100+i;
45 std::stringstream SS;
46 SS << "zhao_yong_" << i;
47 std::string name;
48 SS >> name;
49 bool gender;
50
51 if (i%2)
52 gender = true;
53 else
54 gender = false;
55
56 r1_tuples[i] = new brdb_tuple(ID, name, gender);
57 r1_tuples[i]->print();
58 }
59
60 brdb_relation_sptr r1 = new brdb_relation(r1_names, r1_tuples, r1_types);
61
62 r2_names[0] = "ID";
63 r2_names[1] = "Age";
64
65 r2_types[0] = brdb_value_t<int>::type();
66 r2_types[1] = brdb_value_t<double>::type();
67
68 for (int i=0; i<30; i++)
69 {
70 int ID = 100+i;
71 double age = 20.0+i*0.1;
72
73 r2_tuples[i] = new brdb_tuple(ID, age);
74 r2_tuples[i]->print();
75 }
76
77 brdb_relation_sptr r2 = new brdb_relation(r2_names, r2_tuples, r2_types);
78
79 r3_names[0] = "ID";
80 r3_names[1] = "Department";
81
82 r3_types[0] = brdb_value_t<int>::type();
83 r3_types[1] = brdb_value_t<std::string>::type();
84
85 for (int i=0; i<40; i++)
86 {
87 int ID = 100+i;
88 std::stringstream SS;
89 SS << "dempartment_" << i;
90 std::string dept;
91 SS >> dept;
92
93 r3_tuples[i] = new brdb_tuple(ID, dept);
94 r3_tuples[i]->print();
95 }
96
97 brdb_relation_sptr r3 = new brdb_relation(r3_names, r3_tuples, r3_types);
98
99 ////////////////////////////////////////////////////////////////////////////
100 // example: creating database using relations
101 ////////////////////////////////////////////////////////////////////////////
102
103 std::vector<brdb_relation_sptr> test_relations;
104 test_relations.push_back(r1);
105 test_relations.push_back(r2);
106 test_relations.push_back(r3);
107
108 std::vector<std::string> relation_names;
109 relation_names.push_back("name_gender");
110 relation_names.push_back("age");
111 relation_names.push_back("department");
112
113 brdb_database_sptr test_db = new brdb_database(test_relations, relation_names);
114 test_db->print();
115
116 ////////////////////////////////////////////////////////////////////////////
117 // example: instance database_manager
118 ////////////////////////////////////////////////////////////////////////////
119 // brdb_database_manager::instance(test_db);
120 brdb_database_manager::instance();
121 TEST("constructor", true, true);
122
123 brdb_database_manager::instance()->set_database(test_db);
124 TEST("set_database()", true, true);
125
126 brdb_database_manager::instance()->print_database();
127 TEST("instance()", true, true);
128 TEST("print_database()", true, true);
129
130 //////////////////////////////////////////////////////////////////////////////////
131 //////// test the binary IO function of database
132 //////////////////////////////////////////////////////////////////////////////////
133 TEST("save_database()", brdb_database_manager::instance()->save_database("test_database_manager_bio.vsl"), true);
134 brdb_database_manager::instance()->clear_database();
135 TEST("load_database()", brdb_database_manager::instance()->load_database("test_database_manager_bio.vsl"), true);
136 brdb_database_manager::instance()->print_database();
137
138 TEST("merge_database", brdb_database_manager::instance()->merge_database("test_database_manager_bio.vsl"), true);
139 brdb_database_manager::instance()->print_database();
140
141 brdb_database_manager::instance()->clear_database();
142 brdb_database_manager::instance()->load_database("test_database_manager_bio.vsl");
143 brdb_database_manager::instance()->print_database();
144
145 brdb_database_manager::instance()->clear_relation("age");
146 brdb_database_manager::instance()->print_database();
147 TEST("clear_relation()", true, true);
148
149 std::set<std::string> names1;
150 names1.insert("age");
151 names1.insert("name_gender");
152 brdb_database_manager::instance()->clear_all_except(names1);
153 brdb_database_manager::instance()->print_database();
154 TEST("clear_all_except()", true, true);
155
156 std::set<std::string> names2;
157 names2.insert("age");
158 brdb_database_manager::instance()->remove_all_except(names2);
159 brdb_database_manager::instance()->print_database();
160 TEST("remove_all_except()", true, true);
161
162 brdb_database_manager::instance()->remove_relation("age");
163 brdb_database_manager::instance()->print_database();
164 TEST("remove_relation()", true, true);
165
166 brdb_database_manager::instance()->clear_database();
167 brdb_database_manager::instance()->print_database();
168 TEST("clear_database()", true, true);
169
170 brdb_database_manager::instance()->add_relation("name_gender", r1);
171 // note r2 is empty at this moment;
172 r2->clear();
173 brdb_database_manager::instance()->add_relation("age", r2);
174 brdb_database_manager::instance()->add_relation("department", r3);
175 brdb_database_manager::instance()->print_database();
176 TEST("add_relation()", true, true);
177
178 for (int i=0; i<30;i++)
179 brdb_database_manager::instance()->add_tuple("age", r2_tuples[i]);
180 brdb_database_manager::instance()->print_database();
181 TEST("add_relation()", true, true);
182
183 brdb_tuple_sptr r2_new_tuple = new brdb_tuple(1000, 32.1234);
184 brdb_database_manager::instance()->add_tuple("age", r2_new_tuple);
185 brdb_database_manager::instance()->print_database();
186 TEST("add_tuple()", true, true);
187
188 brdb_database_manager::instance()->print_database();
189
190 ////////////////////////////////////////////////////////////////////////////
191 // example: join two relations from database
192 ////////////////////////////////////////////////////////////////////////////
193 brdb_relation_sptr join1;
194 brdb_database_manager::instance()->join("name_gender", "age", join1);
195 join1->print();
196
197 brdb_relation_sptr join2;
198 brdb_database_manager::instance()->join("name_gender", "department", join2);
199 join2->print();
200 TEST("join two database relations", true, true);
201
202 brdb_database_manager::instance()->print_database();
203
204 ////////////////////////////////////////////////////////////////////////////
205 // example: join two user relations
206 ////////////////////////////////////////////////////////////////////////////
207 brdb_relation_sptr join3;
208 brdb_database_manager::instance()->join(join1, join2, join3);
209 join3->print();
210 TEST("join two user relations", true, true);
211
212 brdb_database_manager::instance()->print_database();
213
214 ////////////////////////////////////////////////////////////////////////////
215 // example: join one database relation and one user relations
216 ////////////////////////////////////////////////////////////////////////////
217 brdb_relation_sptr join4;
218 brdb_database_manager::instance()->join("age", join2, join4);
219 join4->print();
220 TEST("join one database relation and one user relation", true, true);
221
222 ////////////////////////////////////////////////////////////////////////////
223 // example: doing selecting on database relations;
224 ////////////////////////////////////////////////////////////////////////////
225 // define a query
226 brdb_query_sptr q1 = new brdb_query("name_gender", "ID", BT, 115);
227 brdb_selection_sptr s1;
228 brdb_database_manager::instance()->select(q1, s1);
229 s1->print();
230 s1->delete_tuples();
231 brdb_database_manager::instance()->print_database();
232
233 brdb_query_sptr q2 = new brdb_query("name_gender", "Name", BT, std::string("zhao_yong_5"));
234 brdb_selection_sptr s2;
235 brdb_database_manager::instance()->select(q2, s2);
236 s2->print();
237 s2->delete_tuples();
238 brdb_database_manager::instance()->print_database();
239
240 TEST("select in database relation", true, true);
241
242 ////////////////////////////////////////////////////////////////////////////
243 // example: automatic update feature of the selection
244 ////////////////////////////////////////////////////////////////////////////
245 brdb_query_sptr q1a = new brdb_query("name_gender", "ID", EQ, 102);
246 brdb_selection_sptr s1a;
247 brdb_database_manager::instance()->select(q1a, s1a);
248 brdb_query_sptr q1b = new brdb_query("name_gender", "ID", LT, 105);
249 brdb_selection_sptr s1b;
250 brdb_database_manager::instance()->select(q1b, s1b);
251 brdb_query_sptr q1c = new brdb_query("name_gender", "ID", EQ, 103);
252 brdb_selection_sptr s1c;
253 brdb_database_manager::instance()->select(q1c, s1c);
254 s1a->print();
255 s1a->delete_tuples();
256 s1a->print();
257 s1c->print();
258 s1c->delete_tuples();
259 s1c->print();
260 s1b->print();
261 brdb_database_manager::instance()->print_database();
262
263 ////////////////////////////////////////////////////////////////////////////
264 // example: doing selecting on user relations;
265 ////////////////////////////////////////////////////////////////////////////
266 // define a query
267 r2->print();
268 brdb_query_sptr q3 = new brdb_query(r2, "ID", LT, 115);
269 brdb_selection_sptr s3;
270 brdb_database_manager::instance()->select(q3, s3);
271 s3->print();
272 s3->delete_tuples();
273 r2->print();
274
275 TEST("select in user relation", true, true);
276
277 ////////////////////////////////////////////////////////////////////////////
278 // example: doing selecting on user selections;
279 ////////////////////////////////////////////////////////////////////////////
280 // define a query
281 r1->print();
282 brdb_query_sptr q4 = new brdb_query(r1, "ID", BT, 105);
283 brdb_selection_sptr s4;
284 brdb_database_manager::instance()->select(q4, s4);
285 s4->print();
286
287 brdb_query_sptr q5 = new brdb_query(s4, std::string("ID"), LT, 113);
288 brdb_selection_sptr s5;
289 brdb_database_manager::instance()->select(q5, s5);
290
291 s5->print();
292 s5->delete_tuples();
293 brdb_database_manager::instance()->print_database();
294
295 TEST("select in user selections", true, true);
296
297 ////////////////////////////////////////////////////////////////////////////
298 // example: getting tuple from database
299 ////////////////////////////////////////////////////////////////////////////
300 // define a query
301 brdb_query_sptr q6 = new brdb_query("name_gender", "ID", EQ, 114);
302 brdb_selection_sptr s6;
303 brdb_database_manager::instance()->select(q6, s6);
304 std::string get_name1;
305 bool get_gender1;
306 brdb_database_manager::instance()->get(s6, "Name", get_name1);
307 brdb_database_manager::instance()->get(s6, "Gender", get_gender1);
308 std::cout << "ID: 104 Name: " << get_name1 << " Gender: " << get_gender1 << std::endl;
309 TEST("get()", true, true);
310
311 brdb_query_sptr q6_a = new brdb_query("name_gender", "ID", LT, 105);
312 brdb_selection_sptr s6_a;
313 brdb_database_manager::instance()->select(q6_a, s6_a);
314 std::vector<std::string> get_names;
315
316 for (unsigned int i=0; i<s6_a->size(); i++)
317 {
318 std::string get_name_a;
319 brdb_database_manager::instance()->get(s6_a, "Name", i, get_name_a);
320 std::cout << get_name_a << " ";
321 }
322
323 ////////////////////////////////////////////////////////////////////////////
324 // example: update tuple/values in database
325 ////////////////////////////////////////////////////////////////////////////
326 // define a query
327 brdb_query_sptr q7 = new brdb_query("name_gender", "ID", EQ, 104);
328 brdb_selection_sptr s7;
329 brdb_database_manager::instance()->select(q7, s7);
330 brdb_tuple_sptr update_tuple = new brdb_tuple(104, std::string("monster"), true);
331 brdb_database_manager::instance()->update_selected_tuple(s7, update_tuple);
332 brdb_database_manager::instance()->print_database();
333
334 bool update_gender(false);
335 brdb_database_manager::instance()->update_selected_tuple_value(s7, "Name", std::string("zhao_yong_4"));
336 brdb_database_manager::instance()->update_selected_tuple_value(s7, "Gender", update_gender);
337 brdb_database_manager::instance()->print_database();
338 TEST("update tuple/values", true, true);
339
340 ////////////////////////////////////////////////////////////////////////////
341 // example: get sql view
342 ////////////////////////////////////////////////////////////////////////////
343 brdb_query_sptr q8 = new brdb_query("name_gender", "ID", BEQ, 104);
344 brdb_selection_sptr s8;
345 brdb_database_manager::instance()->select(q8, s8);
346 s8->print();
347 brdb_relation_sptr sql_view_r = brdb_database_manager::instance()->get_sqlview(s8);
348 sql_view_r->print();
349 sql_view_r->clear();
350 brdb_database_manager::instance()->print_database();
351 TEST("get_sqlview()", true, true);
352
353 ////////////////////////////////////////////////////////////////////////////
354 // example: selection and/or/xor
355 ////////////////////////////////////////////////////////////////////////////
356 brdb_query_sptr q9 = new brdb_query("age", "ID", LEQ, 125);
357 brdb_selection_sptr s9;
358 brdb_database_manager::instance()->select(q9, s9);
359 std::cout << "s9: " << std::endl;
360 s9->print();
361
362 brdb_query_sptr q10 = new brdb_query("age", "ID", BEQ, 120);
363 brdb_selection_sptr s10;
364 brdb_database_manager::instance()->select(q10, s10);
365 std::cout << "s10: " << std::endl;
366 s10->print();
367
368 brdb_selection_sptr s11;
369 brdb_selection_sptr s12;
370 brdb_selection_sptr s13;
371 brdb_selection_sptr s14;
372 s11 = brdb_database_manager::selection_and(s9, s10);
373 s12 = brdb_database_manager::selection_or(s9, s10);
374 s13 = brdb_database_manager::selection_xor(s9, s10);
375 s14 = brdb_database_manager::selection_not(s9);
376 s11->print();
377 s12->print();
378 s13->print();
379 s14->print();
380
381 s11->clear();
382 s12->clear();
383 s13->clear();
384 s14->clear();
385
386 s11 = s9 & s10;
387 std::cout << "s11: " << std::endl;
388 s11->print();
389 s12 = s9 | s10;
390 std::cout << "s12: " << std::endl;
391 s12->print();
392 s13 = s9 ^ s10;
393 std::cout << "s13: " << std::endl;
394 s13->print();
395 s14 = ~s9;
396 std::cout << "s14: " << std::endl;
397 s14->print();
398
399 TEST("selection_and()", true, true);
400 TEST("selection_or()", true, true);
401 TEST("selection_xor()", true, true);
402 TEST("selection_not()", true, true);
403
404 ////////////////////////////////////////////////////////////////////////////
405 // example: database ordering
406 ////////////////////////////////////////////////////////////////////////////
407 brdb_database_manager::instance()->order_by_name("age", "ID", false);
408 brdb_database_manager::instance()->print_database();
409 TEST("order_by_name()", true, true);
410
411 ////////////////////////////////////////////////////////////////////////////
412 // example: query by index
413 ////////////////////////////////////////////////////////////////////////////
414 brdb_database_manager::instance()->print_database();
415 brdb_query_sptr q15 = new brdb_query("age", 0);
416 brdb_selection_sptr s15;
417 brdb_database_manager::instance()->select(q15, s15);
418 s15->print();
419 s15->delete_tuples();
420 brdb_database_manager::instance()->print_database();
421 // notice that s15 still has something because the query was made by the 0th tuple in relation "age",
422 // and "age" still has its 0th tuple after the original 0th one was delete
423 s15->print();
424
425 s10->print();
426 brdb_query_sptr q16 = new brdb_query(s10, 2);
427 brdb_selection_sptr s16;
428 brdb_database_manager::instance()->select(q16, s16);
429 s16->print();
430 s16->delete_tuples();
431 // notice that s16 does not have anything because the query was made by the 0th tuple in selection s10
432 // and s10's tuple is deleted.
433 s16->print();
434
435 r1->print();
436 brdb_query_sptr q17 = new brdb_query(r1, 4);
437 brdb_selection_sptr s17;
438 brdb_database_manager::instance()->select(q17, s17);
439 s17->print();
440
441 TEST("selection by index()", true, true);
442 }
443
444 TESTMAIN(test_database_manager);
445