2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 #include <dpl/test/test_runner.h>
17 #include <dpl/foreach.h>
18 #include <dpl/db/thread_database_support.h>
19 #include <generator_dpl_orm_test.h>
22 const char* PATH_DB = "/opt/share/wrt/wrt-commons/tests/db/dpl_orm_test.db";
26 #define TEST_REPETITION 16
32 SmartAttach(bool autoattach = true) :
34 DPL::DB::SqlConnection::Flag::UseLucene),
35 m_autoattach(autoattach)
38 m_interface.AttachToThread(DPL::DB::SqlConnection::Flag::RW);
45 m_interface.DetachFromThread();
49 DPL::DB::ThreadDatabaseSupport* get()
55 DPL::DB::ThreadDatabaseSupport m_interface;
59 template<typename ContainerType1, typename ContainerType2>
60 bool ContainerContentsEqual(const ContainerType1& container1,
61 const ContainerType2& container2)
63 using namespace DPL::DB::ORM::dpl_orm_test::TestTableInsert;
64 typedef std::set<typename ContainerType1::value_type> Set1;
65 typedef std::set<typename ContainerType2::value_type> Set2;
66 Set1 set1(container1.begin(), container1.end());
67 Set2 set2(container2.begin(), container2.end());
69 for (typename Set1::iterator it = set1.begin();
73 LogDebug("Set1 element: " << *it);
76 for (typename Set2::iterator it = set2.begin(); it != set2.end(); it++) {
77 LogDebug("Set2 element: " << *it);
84 std::list<T> makeList(const T& a, const T& b)
94 RUNNER_TEST_GROUP_INIT(DPL)
96 RUNNER_TEST(ORM_SelectSingleValue)
98 SmartAttach interface;
99 using namespace DPL::DB::ORM;
100 using namespace DPL::DB::ORM::dpl_orm_test;
101 //Getting each column
103 TestTable::Select select(interface.get());
104 select.Where(Equals<TestTable::ColumnInt>(8));
106 RUNNER_ASSERT_MSG((result =
107 *select.GetSingleValue<TestTable::ColumnOptInt>())
112 TestTable::Select select(interface.get());
113 select.Where(Equals<TestTable::ColumnInt>(8));
115 RUNNER_ASSERT_MSG((result =
116 *select.GetSingleValue<TestTable::ColumnOptText>(
121 TestTable::Select select(interface.get());
122 select.Where(Equals<TestTable::ColumnInt>(8));
124 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt>(
125 )) == 8, "Got " << result);
128 TestTable::Select select(interface.get());
129 select.Where(Equals<TestTable::ColumnInt>(8));
131 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
132 )) == 9, "Got " << result);
135 TestTable::Select select(interface.get());
136 select.Where(Equals<TestTable::ColumnInt>(8));
138 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnText>(
139 )) == L"ten", "Got " << result);
142 //Where on each column
144 TestTable::Select select(interface.get());
145 select.Where(Equals<TestTable::ColumnOptInt>(6));
147 RUNNER_ASSERT_MSG((result =
148 *select.GetSingleValue<TestTable::ColumnOptInt>())
153 TestTable::Select select(interface.get());
154 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
156 RUNNER_ASSERT_MSG((result =
157 *select.GetSingleValue<TestTable::ColumnOptText>(
162 TestTable::Select select(interface.get());
163 select.Where(Equals<TestTable::ColumnInt>(8));
165 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt>(
166 )) == 8, "Got " << result);
169 TestTable::Select select(interface.get());
170 select.Where(Equals<TestTable::ColumnInt2>(9));
172 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
173 )) == 9, "Got " << result);
176 TestTable::Select select(interface.get());
177 select.Where(Equals<TestTable::ColumnText>(L"ten"));
179 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnText>(
180 )) == L"ten", "Got " << result);
184 RUNNER_TEST(ORM_SelectSingleRow)
186 SmartAttach interface;
187 using namespace DPL::DB::ORM;
188 using namespace DPL::DB::ORM::dpl_orm_test;
190 TestTable::Select select(interface.get());
191 select.Where(Equals<TestTable::ColumnInt>(3));
192 TestTable::Row result = select.GetSingleRow();
193 TestTable::Row expected;
194 expected.Set_ColumnOptInt(1);
195 expected.Set_ColumnOptText(DPL::String(L"two"));
196 expected.Set_ColumnInt(3);
197 expected.Set_ColumnInt2(4);
198 expected.Set_ColumnText(L"five");
199 RUNNER_ASSERT_MSG(result == expected, "Got " << result);
203 TestTable::Select select(interface.get());
204 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
205 TestTable::Row result = select.GetSingleRow();
206 TestTable::Row expected;
207 expected.Set_ColumnOptInt(6);
208 expected.Set_ColumnOptText(DPL::String(L"seven"));
209 expected.Set_ColumnInt(8);
210 expected.Set_ColumnInt2(9);
211 expected.Set_ColumnText(L"ten");
212 RUNNER_ASSERT_MSG(result == expected, "Got " << result);
216 RUNNER_TEST(ORM_SelectRowList)
218 SmartAttach interface;
219 using namespace DPL::DB::ORM;
220 using namespace DPL::DB::ORM::dpl_orm_test;
222 TestTable::Select select(interface.get());
223 select.Where(Equals<TestTable::ColumnInt>(3));
224 std::list<TestTable::Row> result = select.GetRowList();
225 RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size());
227 TestTable::Row expected;
228 expected.Set_ColumnOptInt(1);
229 expected.Set_ColumnOptText(DPL::String(L"two"));
230 expected.Set_ColumnInt(3);
231 expected.Set_ColumnInt2(4);
232 expected.Set_ColumnText(L"five");
233 RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " <<
238 TestTable::Select select(interface.get());
239 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
240 std::list<TestTable::Row> result = select.GetRowList();
241 RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size());
243 TestTable::Row expected;
244 expected.Set_ColumnOptInt(6);
245 expected.Set_ColumnOptText(DPL::String(L"seven"));
246 expected.Set_ColumnInt(8);
247 expected.Set_ColumnInt2(9);
248 expected.Set_ColumnText(L"ten");
249 RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " <<
254 TestTable::Select select(interface.get());
255 select.Where(Equals<TestTable::ColumnInt>(99));
256 std::list<TestTable::Row> result = select.GetRowList();
258 TestTable::Row expected1;
259 expected1.Set_ColumnInt(99);
260 expected1.Set_ColumnInt2(11);
261 expected1.Set_ColumnText(L"twelve");
263 TestTable::Row expected2;
264 expected2.Set_ColumnInt(99);
265 expected2.Set_ColumnInt2(13);
266 expected2.Set_ColumnText(L"fourteen");
268 RUNNER_ASSERT(ContainerContentsEqual(makeList(expected1,
269 expected2), result));
273 RUNNER_TEST(ORM_SelectValueList)
275 SmartAttach interface;
276 using namespace DPL::DB::ORM;
277 using namespace DPL::DB::ORM::dpl_orm_test;
278 //Getting each column
280 TestTable::Select select(interface.get());
281 select.Where(Is<TestTable::ColumnOptInt>(DPL::Optional<int>::Null));
282 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
287 TestTable::Select select(interface.get());
288 select.Where(Is<TestTable::ColumnOptInt>(DPL::Optional<int>::Null));
289 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
294 TestTable::Select select(interface.get());
295 select.Where(Is<TestTable::ColumnOptInt>(DPL::Optional<int>::Null));
296 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
298 makeList(DPL::String(L"twelve"),
299 DPL::String(L"fourteen"))));
302 TestTable::Select select(interface.get());
303 select.Where(Is<TestTable::ColumnOptInt>(DPL::Optional<int>::Null));
304 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
306 makeList(DPL::Optional<DPL::String>
308 DPL::Optional<DPL::String>
312 //Where on each column
314 TestTable::Select select(interface.get());
315 select.Where(Is<TestTable::ColumnOptInt>(DPL::Optional<int>::Null));
316 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
321 TestTable::Select select(interface.get());
322 select.Where(Is<TestTable::ColumnOptText>(DPL::Optional<DPL::String>::
324 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
329 TestTable::Select select(interface.get());
330 select.Where(Is<TestTable::ColumnInt>(99));
331 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
337 RUNNER_TEST(ORM_MultipleCalls)
339 for (int j = 0; j < TEST_REPETITION; j++) {
340 for (int i = 0; i < TEST_REPETITION; i++) {
341 ORM_SelectSingleValue();
344 for (int i = 0; i < TEST_REPETITION; i++) {
345 ORM_SelectSingleRow();
348 for (int i = 0; i < TEST_REPETITION; i++) {
352 for (int i = 0; i < TEST_REPETITION; i++) {
353 ORM_SelectValueList();
358 RUNNER_TEST(ORM_Insert)
360 SmartAttach interface;
361 using namespace DPL::DB::ORM;
362 using namespace DPL::DB::ORM::dpl_orm_test;
364 TestTableInsert::Select select1(interface.get());
365 std::list<int> resultList = select1.GetValueList<TestTableInsert::ColumnInt>();
367 resultList.size() == 0, "Returned list has wrong size: " <<
369 std::list<TestTableInsert::Row> list;
371 TestTableInsert::Insert insert(interface.get());
372 TestTableInsert::Row row;
373 row.Set_ColumnOptInt(1);
374 row.Set_ColumnInt2(2);
375 row.Set_ColumnText(L"three");
379 row.Set_ColumnInt(99);
382 TestTableInsert::Select select2(interface.get());
383 RUNNER_ASSERT_MSG(ContainerContentsEqual(
384 select2.GetRowList(),
385 list), "Returned list doesn't match.");
388 TestTableInsert::Insert insert2(interface.get());
389 TestTableInsert::Row row2;
390 row2.Set_ColumnInt(4);
391 row2.Set_ColumnInt2(5);
392 row2.Set_ColumnText(L"six");
393 insert2.Values(row2);
396 list.push_back(row2);
398 TestTableInsert::Select select(interface.get());
399 RUNNER_ASSERT_MSG(ContainerContentsEqual(
401 list), "Returned list doesn't match.");
404 TestTableInsert::Insert insert3(interface.get());
405 TestTableInsert::Row row3;
406 row3.Set_ColumnOptInt(1);
407 row3.Set_ColumnInt2(7);
408 row3.Set_ColumnText(L"eight");
409 insert3.Values(row3);
412 row3.Set_ColumnInt(99);
413 list.push_back(row3);
415 TestTableInsert::Select select3(interface.get());
416 RUNNER_ASSERT_MSG(ContainerContentsEqual(
417 select3.GetRowList(),
418 list), "Returned list doesn't match.");
421 TestTableInsert::Insert insert4(interface.get());
422 TestTableInsert::Row row4;
423 row4.Set_ColumnOptInt(9);
424 row4.Set_ColumnInt2(10);
425 row4.Set_ColumnText(L"eleven");
426 insert4.Values(row4);
429 row4.Set_ColumnInt(99);
430 list.push_back(row4);
432 TestTableInsert::Select select4(interface.get());
433 RUNNER_ASSERT_MSG(ContainerContentsEqual(
434 select4.GetRowList(),
435 list), "Returned list doesn't match.");
438 // restore original table state
440 TestTableInsert::Delete del(interface.get());
443 TestTableInsert::Select select(interface.get());
444 RUNNER_ASSERT(select.GetRowList().size() == 0);
448 RUNNER_TEST(ORM_MultipleBindInsert)
450 for (int i = 0; i < TEST_REPETITION; i++) {
455 RUNNER_TEST(ORM_Delete)
457 SmartAttach interface;
458 using namespace DPL::DB::ORM;
459 using namespace DPL::DB::ORM::dpl_orm_test;
460 TestTableDelete::Select selectStart(interface.get());
461 selectStart.OrderBy(DPL::TypeListDecl<OrderingAscending<TestTableDelete::
463 std::list<TestTableDelete::Row> list = selectStart.GetRowList();
464 std::list<TestTableDelete::Row> originalList = list;
466 std::vector<TestTableDelete::Row> vector(list.begin(), list.end());
468 list.size() == 4, "Returned list has wrong size: " << list.size());
470 typedef DPL::String S;
474 TestTableDelete::Delete del(interface.get());
475 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(1),
476 Equals<TestTableDelete::ColumnOptText>(S(L"seven"))));
479 TestTableDelete::Select select(interface.get());
480 RUNNER_ASSERT_MSG(ContainerContentsEqual(
482 list), "Returned list doesn't match.");
486 TestTableDelete::Delete del(interface.get());
487 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(6),
488 Equals<TestTableDelete::ColumnOptText>(S(L"two"))));
491 TestTableDelete::Select select(interface.get());
492 RUNNER_ASSERT_MSG(ContainerContentsEqual(
494 list), "Returned list doesn't match.");
498 TestTableDelete::Delete del(interface.get());
499 del.Where(Equals<TestTableDelete::ColumnInt2>(10));
502 TestTableDelete::Select select(interface.get());
503 RUNNER_ASSERT_MSG(ContainerContentsEqual(
505 list), "Returned list doesn't match.");
510 list.remove(vector[1]);
512 TestTableDelete::Delete del(interface.get());
513 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(6),
514 Equals<TestTableDelete::ColumnText>(L"ten")));
517 TestTableDelete::Select select(interface.get());
518 RUNNER_ASSERT_MSG(ContainerContentsEqual(
520 list), "Returned list doesn't match.");
524 list.remove(vector[2]);
525 list.remove(vector[3]);
527 TestTableDelete::Delete del(interface.get());
528 del.Where(Is<TestTableDelete::ColumnOptText>(DPL::Optional<DPL::String>
532 TestTableDelete::Select select(interface.get());
533 RUNNER_ASSERT_MSG(ContainerContentsEqual(
535 list), "Returned list doesn't match.");
539 TestTableDelete::Delete del(interface.get());
542 TestTableDelete::Select select(interface.get());
544 select.GetRowList().size() == 0, "Returned list is not empty");
547 // Restore original table state
548 // This also tests if multiple different binds for Insert are working
550 for (std::list<TestTableDelete::Row>::iterator i = originalList.begin();
551 i != originalList.end();
554 TestTableDelete::Insert insert(interface.get());
560 TestTableDelete::Select select(interface.get());
561 RUNNER_ASSERT_MSG(ContainerContentsEqual(
564 "Returned list doesn't match.");
568 RUNNER_TEST(ORM_MultipleBindDelete)
570 for (int i = 0; i < TEST_REPETITION; i++) {
575 RUNNER_TEST(ORM_MultipleBindWhere)
577 SmartAttach interface;
578 using namespace DPL::DB::ORM;
579 using namespace DPL::DB::ORM::dpl_orm_test;
581 TestTable::Select select(interface.get());
583 select.Where(Equals<TestTable::ColumnInt>(8));
584 RUNNER_ASSERT_MSG((result =
585 *select.GetSingleValue<TestTable::ColumnOptInt>())
589 select.Where(Equals<TestTable::ColumnInt>(3));
590 RUNNER_ASSERT_MSG((result =
591 *select.GetSingleValue<TestTable::ColumnOptInt>())
595 select.Where(Equals<TestTable::ColumnInt>(8));
596 RUNNER_ASSERT_MSG((result =
597 *select.GetSingleValue<TestTable::ColumnOptInt>())
601 select.Where(Equals<TestTable::ColumnInt>(3));
602 RUNNER_ASSERT_MSG((result =
603 *select.GetSingleValue<TestTable::ColumnOptInt>())
609 TestTable::Select select(interface.get());
611 select.Where(And(Equals<TestTable::ColumnInt>(99),
612 Equals<TestTable::ColumnText>(L"fourteen")));
613 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
614 )) == 13, "Got " << result);
616 select.Where(And(Equals<TestTable::ColumnInt>(99),
617 Equals<TestTable::ColumnText>(L"twelve")));
618 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
619 )) == 11, "Got " << result);
621 select.Where(And(Equals<TestTable::ColumnInt>(99),
622 Equals<TestTable::ColumnText>(L"fourteen")));
623 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
624 )) == 13, "Got " << result);
626 select.Where(And(Equals<TestTable::ColumnInt>(99),
627 Equals<TestTable::ColumnText>(L"twelve")));
628 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
629 )) == 11, "Got " << result);
633 TestTable::Select select(interface.get());
635 select.Where(And(Equals<TestTable::ColumnText>(L"fourteen"),
636 Equals<TestTable::ColumnInt>(99)));
637 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
638 )) == 13, "Got " << result);
640 select.Where(And(Equals<TestTable::ColumnText>(L"twelve"),
641 Equals<TestTable::ColumnInt>(99)));
642 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
643 )) == 11, "Got " << result);
645 select.Where(And(Equals<TestTable::ColumnText>(L"fourteen"),
646 Equals<TestTable::ColumnInt>(99)));
647 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
648 )) == 13, "Got " << result);
650 select.Where(And(Equals<TestTable::ColumnText>(L"twelve"),
651 Equals<TestTable::ColumnInt>(99)));
652 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
653 )) == 11, "Got " << result);
657 RUNNER_TEST(ORM_Update)
659 SmartAttach interface;
660 using namespace DPL::DB::ORM;
661 using namespace DPL::DB::ORM::dpl_orm_test;
663 std::list<TestTableInsert::Row> list;
665 TestTableInsert::Delete del(interface.get());
670 TestTableInsert::Insert insert(interface.get());
671 TestTableInsert::Row row;
672 row.Set_ColumnOptInt(5);
673 row.Set_ColumnInt2(2);
674 row.Set_ColumnText(L"two");
678 row.Set_ColumnInt(99);
682 TestTableInsert::Insert insert(interface.get());
683 TestTableInsert::Row row;
684 row.Set_ColumnOptInt(1);
685 row.Set_ColumnInt2(2);
686 row.Set_ColumnText(L"three");
690 row.Set_ColumnInt(99);
694 TestTableInsert::Insert insert(interface.get());
695 TestTableInsert::Row row;
696 row.Set_ColumnOptInt(2);
697 row.Set_ColumnInt2(3);
698 row.Set_ColumnText(L"three");
702 row.Set_ColumnInt(99);
706 TestTableInsert::Select select(interface.get());
707 RUNNER_ASSERT_MSG(ContainerContentsEqual(
709 list), "Returned list doesn't match.");
713 TestTableInsert::Update update(interface.get());
714 TestTableInsert::Row row;
715 row.Set_ColumnInt2(4);
716 row.Set_ColumnText(L"four");
718 update.Where(Equals<TestTableInsert::ColumnInt2>(12));
722 TestTableInsert::Select select(interface.get());
723 RUNNER_ASSERT_MSG(ContainerContentsEqual(
725 list), "Returned list doesn't match.");
729 TestTableInsert::Update update(interface.get());
730 TestTableInsert::Row row;
731 row.Set_ColumnInt2(2);
732 row.Set_ColumnText(L"four");
734 update.Where(Equals<TestTableInsert::ColumnInt2>(3));
737 list.back().Set_ColumnInt2(2);
738 list.back().Set_ColumnText(L"four");
741 TestTableInsert::Select select(interface.get());
742 RUNNER_ASSERT_MSG(ContainerContentsEqual(
744 list), "Returned list doesn't match.");
748 // UPDATE - multiple rows
749 TestTableInsert::Update update(interface.get());
750 TestTableInsert::Row row;
751 row.Set_ColumnText(L"dup");
753 update.Where(Equals<TestTableInsert::ColumnInt2>(2));
758 it->Set_ColumnText(L"dup");
762 TestTableInsert::Select select(interface.get());
763 RUNNER_ASSERT_MSG(ContainerContentsEqual(
765 list), "Returned list doesn't match.");
768 // restore original table state
770 TestTableInsert::Delete del2(interface.get());
773 TestTableInsert::Select select(interface.get());
774 RUNNER_ASSERT(select.GetRowList().size() == 0);
778 RUNNER_TEST(ORM_MultipleBindUpdate)
780 for (int i = 0; i < TEST_REPETITION; i++) {
785 RUNNER_TEST(ORM_transactions)
787 SmartAttach interface;
788 DPL::DB::ORM::dpl_orm_test::ScopedTransaction transaction(interface.get());
791 RUNNER_TEST(ORM_MultiAttach)
793 SmartAttach interface(false);
795 !interface.get()->IsAttached(), "Is attached, but shouldn't be.");
796 interface.get()->AttachToThread();
798 interface.get()->IsAttached(), "Isn't attached, but should be.");
799 interface.get()->AttachToThread();
801 interface.get()->IsAttached(), "Isn't attached, but should be.");
802 interface.get()->DetachFromThread();
804 interface.get()->IsAttached(), "Isn't attached, but should be.");
805 interface.get()->DetachFromThread();
807 !interface.get()->IsAttached(), "Is attached, but shouldn't be.");
810 RUNNER_TEST(ORM_Join)
812 SmartAttach interface;
813 using namespace DPL::DB::ORM;
814 using namespace DPL::DB::ORM::dpl_orm_test;
816 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
817 TestTableJoin2::TestText2,
818 DPL::TypeListGuard>::Type JoinColumns;
820 /* Test for correct join:
821 * 5 ids from first table matches 5 ids from second table thus join result
823 TestTableJoin1::Select select(interface.get());
824 select.Join<JoinColumns>(Equal<TestTableJoin1::TestID,
825 TestTableJoin2::TestID>());
826 std::list<CustomRow<JoinColumns> > rowlist =
827 select.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
830 rowlist.size() == 5, "Invalid number of rows fetched: " << rowlist.size());
833 std::ostringstream oss;
835 FOREACH(rowit, rowlist)
840 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
841 oss << "text val " << cnt;
842 RUNNER_ASSERT_MSG(text.compare(
844 "Invalid value from first column: "
845 << text << " expected: " << oss.str());
846 oss.str(std::string());
849 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
850 oss << "text2 " << cnt;
851 RUNNER_ASSERT_MSG(text.compare(
853 "Invalid value from second column: "
854 << text << " expected: " << oss.str());
855 oss.str(std::string());
857 /* Test for empty join:
858 * None of number values from first table matches ids from second table
859 * - join result should be empty */
860 TestTableJoin1::Select select2(interface.get());
861 select2.Join<JoinColumns>(Equal<TestTableJoin1::TestNumber,
862 TestTableJoin2::TestID>());
863 rowlist = select2.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
865 RUNNER_ASSERT_MSG(rowlist.empty(), "Result should be empty but it is not!");
867 /* Test for "converted" join:
868 * - join made with int column and text column as keys
869 * - expected 5 matching rows (one row of 6 should not be matched)*/
870 TestTableJoin1::Select select3(interface.get());
871 select3.Join<JoinColumns>(Equal<TestTableJoin1::TestID,
872 TestTableJoin2::TestText1>());
873 rowlist = select3.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
875 rowlist.size() == 5, "Expected 5 rows while received: " << rowlist.size());
877 FOREACH(rowit, rowlist)
880 // look at last two insertions into TestTableJoin2
881 // for this skip understanding
886 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
887 oss << "text val " << cnt;
888 RUNNER_ASSERT_MSG(text.compare(
890 "Invalid value from first column: "
891 << text << " expected: " << oss.str() <<
892 " iteration: " << cnt);
893 oss.str(std::string());
896 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
897 oss << "text2 " << cnt;
898 RUNNER_ASSERT_MSG(text.compare(
900 "Invalid value from second column: "
901 << text << " expected: " << oss.str() <<
902 " iteration: " << cnt);
903 oss.str(std::string());
906 /* Test for join with non-unique nullable columns given as keys*/
907 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
908 TestTableJoin3::TestText33,
909 DPL::TypeListGuard>::Type JoinTables2;
910 TestTableJoin1::Select select4(interface.get());
911 select4.Join<JoinTables2>(Equal<TestTableJoin1::TestNumber,
912 TestTableJoin3::Value3>());
913 std::list<CustomRow<JoinTables2> > rowlist2 =
914 select4.GetCustomRowList<JoinTables2, CustomRow<JoinTables2> >();
916 rowlist2.size() == 4, "Expected 4 rows while received: " <<
919 DPL::Optional<DPL::String> optext;
920 FOREACH(rowit, rowlist2)
925 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
926 // values expected in subsequent (1,2,3,4) iterations: 1 1 2 2
927 oss << "text val " << (1 + (int)(cnt / 3));
928 RUNNER_ASSERT_MSG(text.compare(
930 "Invalid value from first column: "
931 << text << " expected: " << oss.str() <<
932 " iteration: " << cnt);
933 oss.str(std::string());
935 optext = (*rowit).GetColumnData<TestTableJoin3::TestText33>();
936 text = DPL::ToUTF8String(*optext);
937 oss << "test " << cnt;
938 RUNNER_ASSERT_MSG(text.compare(
940 "Invalid value from second column: "
941 << text << " expected: " << oss.str() <<
942 " iteration: " << cnt);
943 oss.str(std::string());
946 /* Test for join made on three tables:
947 * - 3 text columns selected for join
948 * - Equal made for TestID of (table1 and table2) and (table1 and table3) */
949 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
950 TestTableJoin2::TestText2,
951 TestTableJoin3::TestText33,
952 DPL::TypeListGuard>::Type Join3Tables;
953 TestTableJoin1::Select select5(interface.get());
954 select5.Join<Join3Tables>(Equal<TestTableJoin1::TestID,
955 TestTableJoin2::TestID>());
956 select5.Join<Join3Tables>(Equal<TestTableJoin1::TestID,
957 TestTableJoin3::TestID>());
958 std::list<CustomRow<Join3Tables> > rowlist3tab =
959 select5.GetCustomRowList<Join3Tables, CustomRow<Join3Tables> >();
961 rowlist3tab.size() == 3, "Expected 3 rows while received: " <<
964 FOREACH(rowit, rowlist3tab)
969 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
970 oss << "text val " << cnt;
971 RUNNER_ASSERT_MSG(text.compare(
973 "Invalid value from first column: "
974 << text << " expected: " << oss.str() <<
975 " iteration: " << cnt);
976 oss.str(std::string());
979 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
980 oss << "text2 " << cnt;
981 RUNNER_ASSERT_MSG(text.compare(
983 "Invalid value from first column: "
984 << text << " expected: " << oss.str() <<
985 " iteration: " << cnt);
986 oss.str(std::string());
988 optext = (*rowit).GetColumnData<TestTableJoin3::TestText33>();
989 text = DPL::ToUTF8String(*optext);
990 oss << "test " << cnt;
991 RUNNER_ASSERT_MSG(text.compare(
993 "Invalid value from second column: "
994 << text << " expected: " << oss.str() <<
995 " iteration: " << cnt);
996 oss.str(std::string());
1000 RUNNER_TEST(ORM_SelectOrderByMultipleColumns)
1002 SmartAttach interface;
1003 using namespace DPL::DB::ORM;
1004 using namespace DPL::DB::ORM::dpl_orm_test;
1006 TestTableJoin3::Select select(interface.get());
1008 // testing: " ORDER BY Value3 ASC, TestID DESC, TestID ASC"
1009 select.OrderBy(DPL::TypeListDecl<OrderingAscending<TestTableJoin3::
1011 OrderingDescending<TestTableJoin3::
1013 OrderingAscending<TestTableJoin3::
1016 std::list<TestTableJoin3::Row> result = select.GetRowList();
1017 std::list<TestTableJoin3::Row>::const_iterator iter = result.begin();
1019 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1020 DPL::FromASCIIString(
1021 "test 6"), "Wrong row 1 order");
1022 RUNNER_ASSERT_MSG(iter->Get_TestID() == 10, "Wrong row 1 order");
1026 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1027 DPL::FromASCIIString(
1028 "test 5"), "Wrong row 2 order");
1029 RUNNER_ASSERT_MSG(iter->Get_TestID() == 7, "Wrong row 2 order");
1033 RUNNER_ASSERT_MSG(iter->Get_Value3() == 111, "Wrong row 3 order");
1034 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1035 DPL::FromASCIIString(
1036 "test 2"), "Wrong row 3 order");
1037 RUNNER_ASSERT_MSG(iter->Get_TestID() == 2, "Wrong row 3 order");
1041 RUNNER_ASSERT_MSG(iter->Get_Value3() == 111, "Wrong row 4 order");
1042 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1043 DPL::FromASCIIString(
1044 "test 1"), "Wrong row 4 order");
1045 RUNNER_ASSERT_MSG(iter->Get_TestID() == 1, "Wrong row 4 order");
1049 RUNNER_ASSERT_MSG(iter->Get_Value3() == 222, "Wrong row 5 order");
1050 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1051 DPL::FromASCIIString(
1052 "test 4"), "Wrong row 5 order");
1053 RUNNER_ASSERT_MSG(iter->Get_TestID() == 6, "Wrong row 5 order");
1057 RUNNER_ASSERT_MSG(iter->Get_Value3() == 222, "Wrong row 6 order");
1058 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1059 DPL::FromASCIIString(
1060 "test 3"), "Wrong row 6 order");
1061 RUNNER_ASSERT_MSG(iter->Get_TestID() == 3, "Wrong row 6 order");