Skip to content

Commit

Permalink
Added capabilities for querying with type in sad::db::Database. Fixed #…
Browse files Browse the repository at this point in the history
  • Loading branch information
mamontov-cpp committed Jun 28, 2015
1 parent 672fad5 commit 04de068
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 2 deletions.
100 changes: 100 additions & 0 deletions include/db/dbdatabase.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,16 +166,83 @@ class Database
\return a vector of objects by name
*/
sad::Vector<sad::db::Object *> queryByName(const sad::String & name) const;
/*! Tries to get objects by name
\param[in] id object id
\return objects
*/
template<typename T>
sad::Vector<T*> objectsByName(const sad::String & name) const
{
sad::Vector<T*> result;
sad::Vector<sad::db::Object *> o = queryByName(name);
this->filterObjectsByType<T>(result, o);
return result;
}
/*! Tries to get objects by name
\param[in] id object id
\return object
*/
template<typename T>
T* objectByName(const sad::String & name) const
{
T* result = NULL;
sad::Vector<sad::db::Object *> o = queryByName(name);
this->filterObjectByType<T>(result, o);
return result;
}
/*! Queries all tables in seatch of object by minor id
\param[in] id a minor id of searched objects
\return a vector of objects by name
*/
sad::Vector<sad::db::Object *> queryByMinorId(unsigned long long id) const;
/*! Tries to get objects by minor id
\param[in] id object id
\return objects
*/
template<typename T>
sad::Vector<T*> objectsByMinorId(unsigned long long id) const
{
sad::Vector<T*> result;
sad::Vector<sad::db::Object *> o = queryByMinorId(id);
this->filterObjectsByType<T>(result, o);
return result;
}
/*! Tries to get objects by minor id
\param[in] id object id
\return object
*/
template<typename T>
T* objectByMinorId(unsigned long long id) const
{
T* result = NULL;
sad::Vector<sad::db::Object *> o = queryByMinorId(id);
this->filterObjectByType<T>(result, o);
return result;
}
/*! Queries tables by major id
\param[in] id a major if of searched objects
\return object
*/
sad::db::Object * queryByMajorId(unsigned long long id) const;
/*! Tries to get one object by major id
\param[in] id object id
\return object
*/
template<typename T>
T* objectByMajorId(unsigned long long id) const
{
T* result = NULL;
sad::db::Object* o = queryByMajorId(id);
if (o)
{
sad::db::TypeName<T>::init();
if (o->isInstanceOf(sad::db::TypeName<T>::name()))
{
result = static_cast<T*>(o);
}
}
return result;
}
/*! Fetches tables from a database
\param[out] tables a tables in database
*/
Expand Down Expand Up @@ -255,6 +322,39 @@ class Database
/*! Linked renderer in database
*/
sad::Renderer * m_renderer;
/*! Filters objects by specific type
\param[out] result a resulting vector
\param[in] o objects
*/
template<typename T>
static void filterObjectsByType(sad::Vector<T*> & result, const sad::Vector<sad::db::Object*>& o)
{
sad::db::TypeName<T>::init();
for(size_t i = 0; i < o.size(); i++)
{
if (o[i]->isInstanceOf(sad::db::TypeName<T>::name()))
{
result << static_cast<T*>(o[i]);
}
}
}
/*! Filters object by specific type
\param[out] result a resulting vector
\param[in] o objects
*/
template<typename T>
static void filterObjectByType(T*& result, const sad::Vector<sad::db::Object*>& o)
{
sad::db::TypeName<T>::init();
result = NULL;
for(size_t i = 0; i < o.size() && result == NULL; i++)
{
if (o[i]->isInstanceOf(sad::db::TypeName<T>::name()))
{
result = static_cast<T*>(o[i]);
}
}
}
};

}
Expand Down
12 changes: 10 additions & 2 deletions tests/db/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,8 @@ struct SadDbDatabaseTest : tpunit::TestFixture

ASSERT_TRUE( db.queryByMajorId(1)->objectName() == "test");
ASSERT_TRUE( db.queryByMajorId(22) == NULL );

ASSERT_TRUE( db.objectByMajorId<Mock3>(1)->objectName() == "test");
}

void test_query_by_minorid()
Expand All @@ -261,7 +263,10 @@ struct SadDbDatabaseTest : tpunit::TestFixture

ASSERT_TRUE( db.queryByMinorId(1)[0]->objectName() == "test");
ASSERT_TRUE( db.queryByMinorId(22).size() == 0 );
}

ASSERT_TRUE( db.objectsByMinorId<Mock3>(1)[0]->objectName() == "test");
ASSERT_TRUE( db.objectByMinorId<Mock3>(1)->objectName() == "test");
}

void test_query_by_name()
{
Expand All @@ -276,6 +281,9 @@ struct SadDbDatabaseTest : tpunit::TestFixture

ASSERT_TRUE( db.queryByName("test")[0]->MinorId == 1);
ASSERT_TRUE( db.queryByName("test2").size() == 0 );
}
ASSERT_TRUE( db.objectsByName<Mock3>("test")[0]->objectName() == "test");
ASSERT_TRUE( db.objectByName<Mock3>("test")->objectName() == "test");

}

} _sad_db_database_test;

0 comments on commit 04de068

Please sign in to comment.