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:
return "COUNT(" + arg + ")";
case SignleField:
case Sum:
return "SUM(" + arg + ")";
case SingleField:
return arg;
}
return QString(); // never reach

View File

@ -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;
}

View File

@ -92,6 +92,7 @@ public:
int count();
QVariant max(const FieldPhrase<int> &f);
QVariant min(const FieldPhrase<int> &f);
QVariant sum(const FieldPhrase<int> &f);
QVariant average(const FieldPhrase<int> &f);
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->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<F> Query<T>::select(const FieldPhrase<F> 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<T>::min(const FieldPhrase<int> &f)
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>
Q_OUTOFLINE_TEMPLATE QVariant Query<T>::average(const FieldPhrase<int> &f)
{

View File

@ -170,11 +170,23 @@ void BasicTest::selectPosts()
void BasicTest::selectScoreAverage()
{
auto a = db.scores()->query()
auto avg = db.scores()->query()
->join<Post>()
->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()

View File

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