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:
|
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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
23
src/query.h
23
src/query.h
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue