1
0
Fork 0
arangodb/tests/Aql/AqlHelper.cpp

102 lines
3.3 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/// DISCLAIMER
///
/// Copyright 2019 ArangoDB GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
///
/// @author Tobias Gödderz
////////////////////////////////////////////////////////////////////////////////
#include "AqlHelper.h"
#include "Aql/ExecutionStats.h"
#include "Basics/VelocyPackHelper.h"
using namespace arangodb;
using namespace arangodb::aql;
std::ostream& arangodb::aql::operator<<(std::ostream& stream, ExecutionStats const& stats) {
VPackBuilder builder{};
stats.toVelocyPack(builder, true);
return stream << builder.toJson();
}
std::ostream& arangodb::aql::operator<<(std::ostream& stream, AqlItemBlock const& block) {
stream << "[";
for (size_t row = 0; row < block.size(); row++) {
if (row > 0) {
stream << ",";
}
stream << " ";
VPackBuilder builder{};
builder.openArray();
for (RegisterId reg = 0; reg < block.getNrRegs(); reg++) {
if (reg > 0) {
stream << ",";
}
// will not work for docvecs or ranges
builder.add(block.getValueReference(row, reg).slice());
}
builder.close();
stream << builder.toJson();
}
stream << " ]";
return stream;
}
bool arangodb::aql::operator==(arangodb::aql::ExecutionStats const& left,
arangodb::aql::ExecutionStats const& right) {
TRI_ASSERT(left.nodes.empty());
TRI_ASSERT(right.nodes.empty());
TRI_ASSERT(left.executionTime == 0.0);
TRI_ASSERT(right.executionTime == 0.0);
TRI_ASSERT(left.peakMemoryUsage == 0);
TRI_ASSERT(right.peakMemoryUsage == 0);
// clang-format off
return left.writesExecuted == right.writesExecuted
&& left.writesIgnored == right.writesIgnored
&& left.scannedFull == right.scannedFull
&& left.scannedIndex == right.scannedIndex
&& left.filtered == right.filtered
&& left.requests == right.requests
&& left.fullCount == right.fullCount
&& left.count == right.count;
// clang-format on
}
bool arangodb::aql::operator==(arangodb::aql::AqlItemBlock const& left,
arangodb::aql::AqlItemBlock const& right) {
if (left.size() != right.size()) {
return false;
}
if (left.getNrRegs() != right.getNrRegs()) {
return false;
}
size_t const rows = left.size();
RegisterCount const regs = left.getNrRegs();
for (size_t row = 0; row < rows; row++) {
for (RegisterId reg = 0; reg < regs; reg++) {
AqlValue const& l = left.getValueReference(row, reg);
AqlValue const& r = right.getValueReference(row, reg);
// Doesn't work for docvecs or ranges
if (arangodb::basics::VelocyPackHelper::compare(l.slice(), r.slice(), false) != 0) {
return false;
}
}
}
return true;
}