From f56ccd705527613467777f373dff7e4f56b1d3b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20M=C3=A1rton?= Date: Fri, 3 Apr 2020 08:13:38 +0200 Subject: [PATCH] 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 --- src/generators/sqlgeneratorbase.cpp | 5 ++++- src/generators/sqlgeneratorbase_p.h | 7 ++++--- src/query.h | 23 +++++++++++++++++++++-- test/tst_basic/tst_basic.cpp | 16 ++++++++++++++-- test/tst_basic/tst_basic.h | 2 ++ 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 063fe74..aba4855 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -512,7 +512,10 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t, case Count: return "COUNT(" + arg + ")"; - case SignleField: + case Sum: + return "SUM(" + arg + ")"; + + case SingleField: return arg; } return QString(); // never reach diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index 70aca87..82ba188 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -61,18 +61,19 @@ public: Min, Max, Average, - SignleField + SingleField, + Sum }; explicit SqlGeneratorBase(Database *parent); virtual ~SqlGeneratorBase() = default; virtual bool supportPrimaryKey(const QMetaType::Type &type) { - Q_UNUSED(type); + Q_UNUSED(type) return true; } virtual bool supportAutoIncrement(const QMetaType::Type &type) { - Q_UNUSED(type); + Q_UNUSED(type) return true; } diff --git a/src/query.h b/src/query.h index 5e8c344..4edbbe6 100644 --- a/src/query.h +++ b/src/query.h @@ -92,6 +92,7 @@ public: int count(); QVariant max(const FieldPhrase &f); QVariant min(const FieldPhrase &f); + QVariant sum(const FieldPhrase &f); QVariant average(const FieldPhrase &f); QVariant insert(const AssignmentPhraseList &p); @@ -119,7 +120,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::functionjoins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( d->tableName, - SqlGeneratorBase::SignleField, "*", + SqlGeneratorBase::SingleField, "*", d->wherePhrase, d->relations, d->skip, d->take); @@ -350,7 +351,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) d->joins.prepend(d->tableName); d->sql = d->database->sqlGenertor()->selectCommand( d->tableName, - SqlGeneratorBase::SignleField, f.data->toString(), + SqlGeneratorBase::SingleField, f.data->toString(), d->wherePhrase, d->relations, d->skip, d->take); @@ -435,6 +436,24 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) return 0; } +template +Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &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 Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) { diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index e7a1ef1..003efce 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -170,11 +170,23 @@ void BasicTest::selectPosts() void BasicTest::selectScoreAverage() { - auto a = db.scores()->query() + auto avg = db.scores()->query() ->join() ->setWhere(Post::idField() == 1) ->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() diff --git a/test/tst_basic/tst_basic.h b/test/tst_basic/tst_basic.h index 2b97ceb..7fd4bd9 100644 --- a/test/tst_basic/tst_basic.h +++ b/test/tst_basic/tst_basic.h @@ -31,6 +31,8 @@ private slots: void join(); void selectPosts(); void selectScoreAverage(); + void selectScoreSum(); + void selectScoreCount(); void selectFirst(); void selectPostsWithoutTitle(); void selectPostIds();