1
0
Fork 0

fix `fullCount` value in some cases in cluster mode (#4722)

This commit is contained in:
Jan 2018-03-01 18:33:18 +01:00 committed by GitHub
parent f3659947f4
commit fa83a932ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 11 deletions

View File

@ -1,3 +1,9 @@
v3.3.5 (XXXX-XX-XX)
-------------------
* fix AQL `fullCount` result value in some cluster cases when it was off a bit
v3.3.4 (2018-02-28)
-------------------

View File

@ -31,7 +31,7 @@
using namespace arangodb::aql;
/// @brief convert the statistics to VelocyPack
void ExecutionStats::toVelocyPack(VPackBuilder& builder) const {
void ExecutionStats::toVelocyPack(VPackBuilder& builder, bool reportFullCount) const {
builder.openObject();
builder.add("writesExecuted", VPackValue(writesExecuted));
builder.add("writesIgnored", VPackValue(writesIgnored));
@ -40,9 +40,8 @@ void ExecutionStats::toVelocyPack(VPackBuilder& builder) const {
builder.add("filtered", VPackValue(filtered));
builder.add("httpRequests", VPackValue(httpRequests));
if (fullCount > -1) {
// fullCount is exceptional. it has a default value of -1 and is
// not reported with this value
if (reportFullCount) {
// fullCount is exceptional, as it may be hidden
builder.add("fullCount", VPackValue(fullCount));
}
@ -58,7 +57,7 @@ void ExecutionStats::toVelocyPackStatic(VPackBuilder& builder) {
builder.add("scannedIndex", VPackValue(0));
builder.add("filtered", VPackValue(0));
builder.add("httpRequests", VPackValue(0));
builder.add("fullCount", VPackValue(-1));
builder.add("fullCount", VPackValue(0));
builder.add("executionTime", VPackValue(0.0));
builder.close();
}
@ -70,7 +69,7 @@ ExecutionStats::ExecutionStats()
scannedIndex(0),
filtered(0),
httpRequests(0),
fullCount(-1),
fullCount(0),
executionTime(0.0) {}
ExecutionStats::ExecutionStats(VPackSlice const& slice)

View File

@ -42,7 +42,7 @@ struct ExecutionStats {
explicit ExecutionStats(arangodb::velocypack::Slice const& slice);
/// @brief convert the statistics to VelocyPack
void toVelocyPack(arangodb::velocypack::Builder&) const;
void toVelocyPack(arangodb::velocypack::Builder&, bool reportFullCount) const;
/// @brief create empty statistics for VelocyPack
static void toVelocyPackStatic(arangodb::velocypack::Builder&);
@ -59,7 +59,6 @@ struct ExecutionStats {
filtered += summand.filtered;
httpRequests += summand.httpRequests;
if (summand.fullCount > 0) {
// fullCount may be negative, don't add it then
fullCount += summand.fullCount;
}
// intentionally no modification of executionTime
@ -72,7 +71,7 @@ struct ExecutionStats {
scannedIndex = 0;
filtered = 0;
httpRequests = 0;
fullCount = -1;
fullCount = 0;
executionTime = 0.0;
}

View File

@ -1123,7 +1123,7 @@ void Query::exitContext() {
void Query::getStats(VPackBuilder& builder) {
if (_engine != nullptr) {
_engine->_stats.setExecutionTime(TRI_microtime() - _startTime);
_engine->_stats.toVelocyPack(builder);
_engine->_stats.toVelocyPack(builder, _queryOptions.fullCount);
} else {
ExecutionStats::toVelocyPackStatic(builder);
}
@ -1285,7 +1285,7 @@ void Query::cleanupPlanAndEngine(int errorCode, VPackBuilder* statsBuilder) {
try {
_engine->shutdown(errorCode);
if (statsBuilder != nullptr) {
_engine->_stats.toVelocyPack(*statsBuilder);
_engine->_stats.toVelocyPack(*statsBuilder, _queryOptions.fullCount);
}
} catch (...) {
// shutdown may fail but we must not throw here

View File

@ -192,6 +192,20 @@ function optimizerFullcountTestSuite () {
assertEqual(2, result.stats.fullCount);
assertEqual(0, result.json.length);
},
testJoin1 : function () {
let result = AQL_EXECUTE("FOR doc1 IN UnitTestsCollection LIMIT 1 FOR doc2 IN UnitTestsCollection RETURN 1", null, { fullCount: true });
assertEqual(3, result.stats.fullCount);
assertEqual(3, result.json.length);
},
testJoin2 : function () {
let result = AQL_EXECUTE("FOR doc1 IN UnitTestsCollection LIMIT 1 FOR doc2 IN UnitTestsCollection FILTER doc1._id == doc2._id RETURN 1", null, { fullCount: true });
assertEqual(3, result.stats.fullCount);
assertEqual(1, result.json.length);
}
};