Add sum feature (#83)

* Fix possible refering to unallocated memory by using QSharedPointer in
Query::toList

* - Implemented sum field feature
- Fixed SingleField typo
- Added test for sum, and count field feature
- Fixed test case for average field feature
This commit is contained in:
Miklós Márton 2020-04-03 08:13:38 +02:00 committed by GitHub
parent 7315a3f634
commit f56ccd7055
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 45 additions and 8 deletions

View File

@ -512,7 +512,10 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t,
case Count: case Count:
return "COUNT(" + arg + ")"; return "COUNT(" + arg + ")";
case SignleField: case Sum:
return "SUM(" + arg + ")";
case SingleField:
return arg; return arg;
} }
return QString(); // never reach return QString(); // never reach

View File

@ -61,18 +61,19 @@ public:
Min, Min,
Max, Max,
Average, Average,
SignleField SingleField,
Sum
}; };
explicit SqlGeneratorBase(Database *parent); explicit SqlGeneratorBase(Database *parent);
virtual ~SqlGeneratorBase() = default; virtual ~SqlGeneratorBase() = default;
virtual bool supportPrimaryKey(const QMetaType::Type &type) { virtual bool supportPrimaryKey(const QMetaType::Type &type) {
Q_UNUSED(type); Q_UNUSED(type)
return true; return true;
} }
virtual bool supportAutoIncrement(const QMetaType::Type &type) { virtual bool supportAutoIncrement(const QMetaType::Type &type) {
Q_UNUSED(type); Q_UNUSED(type)
return true; return true;
} }

View File

@ -92,6 +92,7 @@ public:
int count(); int count();
QVariant max(const FieldPhrase<int> &f); QVariant max(const FieldPhrase<int> &f);
QVariant min(const FieldPhrase<int> &f); QVariant min(const FieldPhrase<int> &f);
QVariant sum(const FieldPhrase<int> &f);
QVariant average(const FieldPhrase<int> &f); QVariant average(const FieldPhrase<int> &f);
QVariant insert(const AssignmentPhraseList &p); QVariant insert(const AssignmentPhraseList &p);
@ -119,7 +120,7 @@ Q_OUTOFLINE_TEMPLATE QList<O> Query<T>::select(const std::function<O (const QSql
d->joins.prepend(d->tableName); d->joins.prepend(d->tableName);
d->sql = d->database->sqlGenertor()->selectCommand( d->sql = d->database->sqlGenertor()->selectCommand(
d->tableName, d->tableName,
SqlGeneratorBase::SignleField, "*", SqlGeneratorBase::SingleField, "*",
d->wherePhrase, d->wherePhrase,
d->relations, d->relations,
d->skip, d->take); d->skip, d->take);
@ -350,7 +351,7 @@ Q_OUTOFLINE_TEMPLATE QList<F> Query<T>::select(const FieldPhrase<F> f)
d->joins.prepend(d->tableName); d->joins.prepend(d->tableName);
d->sql = d->database->sqlGenertor()->selectCommand( d->sql = d->database->sqlGenertor()->selectCommand(
d->tableName, d->tableName,
SqlGeneratorBase::SignleField, f.data->toString(), SqlGeneratorBase::SingleField, f.data->toString(),
d->wherePhrase, d->wherePhrase,
d->relations, d->relations,
d->skip, d->take); d->skip, d->take);
@ -435,6 +436,24 @@ Q_OUTOFLINE_TEMPLATE QVariant Query<T>::min(const FieldPhrase<int> &f)
return 0; return 0;
} }
template <class T>
Q_OUTOFLINE_TEMPLATE QVariant Query<T>::sum(const FieldPhrase<int> &f)
{
Q_D(Query);
d->joins.prepend(d->tableName);
d->sql = d->database->sqlGenertor()->selectCommand(
d->tableName,
SqlGeneratorBase::Sum, f.data->toString(),
d->wherePhrase,
d->relations);
QSqlQuery q = d->database->exec(d->sql);
if (q.next())
return q.value(0).toInt();
return 0;
}
template <class T> template <class T>
Q_OUTOFLINE_TEMPLATE QVariant Query<T>::average(const FieldPhrase<int> &f) Q_OUTOFLINE_TEMPLATE QVariant Query<T>::average(const FieldPhrase<int> &f)
{ {

View File

@ -170,11 +170,23 @@ void BasicTest::selectPosts()
void BasicTest::selectScoreAverage() void BasicTest::selectScoreAverage()
{ {
auto a = db.scores()->query() auto avg = db.scores()->query()
->join<Post>() ->join<Post>()
->setWhere(Post::idField() == 1) ->setWhere(Post::idField() == 1)
->average(Score::scoreField()); ->average(Score::scoreField());
qDebug() << a; QCOMPARE(avg, 2);
}
void BasicTest::selectScoreSum()
{
auto sum = db.scores()->query()->sum(Score::scoreField());
QCOMPARE(sum, 20);
}
void BasicTest::selectScoreCount()
{
auto count = db.scores()->query()->count();
QCOMPARE(count, 10);
} }
void BasicTest::selectFirst() void BasicTest::selectFirst()

View File

@ -31,6 +31,8 @@ private slots:
void join(); void join();
void selectPosts(); void selectPosts();
void selectScoreAverage(); void selectScoreAverage();
void selectScoreSum();
void selectScoreCount();
void selectFirst(); void selectFirst();
void selectPostsWithoutTitle(); void selectPostsWithoutTitle();
void selectPostIds(); void selectPostIds();