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:
parent
7315a3f634
commit
f56ccd7055
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
23
src/query.h
23
src/query.h
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ private slots:
|
|||
void join();
|
||||
void selectPosts();
|
||||
void selectScoreAverage();
|
||||
void selectScoreSum();
|
||||
void selectScoreCount();
|
||||
void selectFirst();
|
||||
void selectPostsWithoutTitle();
|
||||
void selectPostIds();
|
||||
|
|
|
|||
Loading…
Reference in New Issue