bool arangodb::traverser::TraverserOptions::evaluateEdgeExpression( arangodb::velocypack::Slice edge, arangodb::velocypack::Slice vertex, size_t depth, size_t cursorId) const { if (_isCoordinator) { // The Coordinator never checks conditions. The DBServer is responsible! return true; } arangodb::aql::Expression* expression = nullptr; auto specific = _depthLookupInfo.find(depth); if (specific != _depthLookupInfo.end()) { TRI_ASSERT(!specific->second.empty()); TRI_ASSERT(specific->second.size() > cursorId); expression = specific->second[cursorId].expression; } else { TRI_ASSERT(!_baseLookupInfos.empty()); TRI_ASSERT(_baseLookupInfos.size() > cursorId); expression = _baseLookupInfos[cursorId].expression; } if (expression != nullptr) { TRI_ASSERT(!expression->isV8()); expression->setVariable(_tmpVar, edge); VPackValueLength vidLength; char const* vid = vertex.getString(vidLength); // inject _from/_to value auto node = expression->nodeForModification(); TRI_ASSERT(node->numMembers() > 0); auto dirCmp = node->getMemberUnchecked(node->numMembers() - 1); TRI_ASSERT(dirCmp->type == aql::NODE_TYPE_OPERATOR_BINARY_EQ); TRI_ASSERT(dirCmp->numMembers() == 2); auto idNode = dirCmp->getMemberUnchecked(1); TRI_ASSERT(idNode->type == aql::NODE_TYPE_VALUE); TRI_ASSERT(idNode->isValueType(aql::VALUE_TYPE_STRING)); idNode->stealComputedValue(); idNode->setStringValue(vid, vidLength); bool mustDestroy = false; aql::AqlValue res = expression->execute(_trx, _ctx, mustDestroy); expression->clearVariable(_tmpVar); bool result = res.toBoolean(); if (mustDestroy) { res.destroy(); } return result; } return true; }
arangodb::traverser::EdgeCursor* arangodb::traverser::TraverserOptions::nextCursorLocal(ManagedDocumentResult* mmdr, VPackSlice vertex, size_t depth, std::vector<LookupInfo>& list) const { TRI_ASSERT(mmdr != nullptr); auto allCursor = std::make_unique<SingleServerEdgeCursor>(mmdr, _trx, list.size()); auto& opCursors = allCursor->getCursors(); VPackValueLength vidLength; char const* vid = vertex.getString(vidLength); for (auto& info : list) { auto& node = info.indexCondition; TRI_ASSERT(node->numMembers() > 0); if (info.conditionNeedUpdate) { // We have to inject _from/_to iff the condition needs it auto dirCmp = node->getMemberUnchecked(info.conditionMemberToUpdate); TRI_ASSERT(dirCmp->type == aql::NODE_TYPE_OPERATOR_BINARY_EQ); TRI_ASSERT(dirCmp->numMembers() == 2); auto idNode = dirCmp->getMemberUnchecked(1); TRI_ASSERT(idNode->type == aql::NODE_TYPE_VALUE); TRI_ASSERT(idNode->isValueType(aql::VALUE_TYPE_STRING)); idNode->setStringValue(vid, vidLength); } std::vector<OperationCursor*> csrs; csrs.reserve(info.idxHandles.size()); for (auto const& it : info.idxHandles) { csrs.emplace_back(_trx->indexScanForCondition( it, node, _tmpVar, mmdr, UINT64_MAX, 1000, false)); } opCursors.emplace_back(std::move(csrs)); } return allCursor.release(); }
void RTCPInstance::onExpire1() { // Note: fTotSessionBW is kbits per second double rtcpBW = 0.05*fTotSessionBW*1024/8; // -> bytes per second OnExpire(this, // event numMembers(), // members (fSink != NULL) ? 1 : 0, // senders rtcpBW, // rtcp_bw (fSink != NULL) ? 1 : 0, // we_sent &fAveRTCPSize, // ave_rtcp_size &fIsInitial, // initial dTimeNow(), // tc &fPrevReportTime, // tp &fPrevNumMembers // pmembers ); }
void RTCPInstance::onReceive(int typeOfPacket, int totPacketSize, unsigned ssrc) { fTypeOfPacket = typeOfPacket; fLastReceivedSize = totPacketSize; fLastReceivedSSRC = ssrc; int members = (int)numMembers(); int senders = (fSink != NULL) ? 1 : 0; OnReceive(this, // p this, // e &members, // members &fPrevNumMembers, // pmembers &senders, // senders &fAveRTCPSize, // avg_rtcp_size &fPrevReportTime, // tp dTimeNow(), // tc fNextReportTime); }