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