Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

@@ -0,0 +1,509 @@
/**
* @RDE_HEADER@
* Custom record/replay functions
* $Id$
* $HeadURL$
* $Author$
*/
#include "aes_record_replay_plugin_custom.h"
#include <QElapsedTimer>
static bool OPTIMIZE = true; // GUEZE-3521 "Überarbeitung des Replays zur Performance Steigerung"
namespace AreaEffectSimulation {
RecordReplayPluginCustom::RecordReplayPluginCustom()
: m_currentReplayTime(0)
{
}
RecordReplayPluginCustom::~RecordReplayPluginCustom()
{
}
bool RecordReplayPluginCustom::initDts(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector, int exerciseId, bool bCanHandleSchemas, NSqlQuery &query)
{
RecordReplayPlugin::initDts(ddsConnector, exerciseId, bCanHandleSchemas, query);
m_ddsConnector = ddsConnector;
m_ddsDts = AreaEffectSimulation::Interface::Dts::create(m_ddsConnector);
m_ddsDts->enableAll();
//const qint64 startTime = time(nullptr) * 1000LL;
DEBUG_LOG(m_logger) << "RecordReplayPluginCustom::initDts successful";
return true;
}
bool RecordReplayPluginCustom::setReplayStartTime(NSqlQuery &q, qint64 startTime)
{
QElapsedTimer timer;
QElapsedTimer timer2;
timer2.start();
INFO_LOG(m_logger) << "setReplayStartTime " << startTime;
m_currentReplayTime = 0;
timer.start();
if (!readTrajectoryTimeAwareAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readTrajectoryTimeAwareAt " << startTime << " DONE";
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readTrajectoryTimeAwareAt " << startTime << " before: " << m_trajectoryTimeAwareMap.count();
if (OPTIMIZE)
{
auto copyTW = m_trajectoryTimeAwareMap;
for (const auto &key : m_trajectoryTimeAwareMap.keys())
{
for (const auto &valie : copyTW.values(key))
{
if (valie.trajectoryStartTime() < startTime - 210*1000)
{
m_trajectoryTimeAwareMap.remove(key, valie);
}
}
}
}
DEBUG_LOG(m_logger) << "setReplayStartTime-readTrajectoryTimeAwareAt " << startTime << " after: " << m_trajectoryTimeAwareMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readAirSupportImpactAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readAirSupportImpactAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readAirSupportImpactAt " << startTime << " before: " << m_airSupportImpactMap.count();
removeOld(m_airSupportImpactMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readAirSupportImpactAt " << startTime << " after: " << m_airSupportImpactMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readBCContaminationAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readBCContaminationAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readBCContaminationAt " << startTime << " before: " << m_bCContaminationMap.count();
removeOld(m_bCContaminationMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readBCContaminationAt " << startTime << " after: " << m_bCContaminationMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readBoobyTrapAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readBoobyTrapAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readBoobyTrapAt " << startTime << " before: " << m_boobyTrapMap.count();
removeOld(m_boobyTrapMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readBoobyTrapAt " << startTime << " after: " << m_boobyTrapMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readBorderlineAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readBorderlineAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readBorderlineAt " << startTime << " before: " << m_borderlineMap.count();
removeOld(m_borderlineMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readBorderlineAt " << startTime << " after: " << m_borderlineMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
if (!readChargeAdministrationAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDynamicParticipantDataAt " << startTime << " DONE";
timer.restart();
if (!readDangerAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDangerAreaAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readDangerAreaAt " << startTime << " before: " << m_dangerAreaMap.count();
removeOld(m_dangerAreaMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readDangerAreaAt " << startTime << " after: " << m_dangerAreaMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
if (!readDusMineStateAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDynamicParticipantDataAt " << startTime << " DONE";
if (!readDusSingleMineAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDynamicParticipantDataAt " << startTime << " DONE";
timer.restart();
if (!readExplosionAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readExplosionAreaAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionAreaAt " << startTime << " before: " << m_explosionAreaMap.count();
removeOld(m_explosionAreaMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionAreaAt " << startTime << " after: " << m_explosionAreaMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readExplosionClusterAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readExplosionClusterAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionClusterAt " << startTime << " before: " << m_explosionClusterMap.count();
removeOld(m_explosionClusterMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionClusterAt " << startTime << " after: " << m_explosionClusterMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readExplosionSingleAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readExplosionSingleAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionSingleAt " << startTime << " before: " << m_explosionSingleMap.count();
removeOld(m_explosionSingleMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readExplosionSingleAt " << startTime << " after: " << m_explosionSingleMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
if (!readFunctionalAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDynamicParticipantDataAt " << startTime << " DONE";
if (!readGasPipeAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readGasPipeAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readGasPipeAt " << startTime << " before: " << m_gasPipeMap.count();
removeOld(m_gasPipeMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readGasPipeAt " << startTime << " after: " << m_gasPipeMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readMineAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readMineAreaAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readMineAreaAt " << startTime << " before: " << m_mineAreaMap.count();
removeOld(m_mineAreaMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readMineAreaAt " << startTime << " after: " << m_mineAreaMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readMineCorridorAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readMineCorridorAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readMineCorridorAt " << startTime << " before: " << m_mineCorridorMap.count();
removeOld(m_mineCorridorMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readMineCorridorAt " << startTime << " after: " << m_mineCorridorMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readNContaminationAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readNContaminationAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readNContaminationAt " << startTime << " before: " << m_nContaminationMap.count();
removeOld(m_nContaminationMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readNContaminationAt " << startTime << " after: " << m_nContaminationMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
if (!readOffRouteMineAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readOffRouteMineAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readOffRouteMineAt " << startTime << " before: " << m_offRouteMineMap.count();
removeOld(m_offRouteMineMap, startTime);
DEBUG_LOG(m_logger) << "setReplayStartTime-readOffRouteMineAt " << startTime << " after: " << m_offRouteMineMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
if (!readReconAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readDynamicParticipantDataAt " << startTime << " DONE";
if (!readTechnicalAreaAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readTechnicalAreaAt " << startTime << " DONE";
if (!readEffectClusterAt(q, startTime))
{
ERROR_LOG(m_logger) << "setReplayStartTime-readEffectClusterAt " << startTime << " failed";
return false;
}
INFO_LOG(m_logger) << "setReplayStartTime-readEffectClusterAt " << startTime << " DONE";
if (!readChargeEffectAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readChargeEffectAt " << startTime << " DONE";
timer.restart();
if (!readTriggeredImpactsAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readTriggeredImpactsAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readTriggeredImpactsAt " << startTime << " before: " << m_triggeredImpactsMap.count();
if (OPTIMIZE)
{
auto copyTI = m_triggeredImpactsMap;
for (const auto &key : m_triggeredImpactsMap.keys())
{
for (const auto &valie : copyTI.values(key))
{
if (valie.sampleTime() < startTime - 210*1000)
m_triggeredImpactsMap.remove(key, valie);
}
}
}
DEBUG_LOG(m_logger) << "setReplayStartTime-readTriggeredImpactsAt " << startTime << " after: " << m_triggeredImpactsMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
//take aes item view last
timer.restart();
if (!readAesItemViewAt(q, startTime)) return false;
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
//manual remove_
timer.restart();
if (!readEffectsAt(q, startTime)) return false;
INFO_LOG(m_logger) << "setReplayStartTime-readEffectsAt " << startTime << " DONE";
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readEffectsAt " << startTime << " before: " << m_effectsMap.count();
if (OPTIMIZE)
{
//find missing aes item vies?!
auto copy = m_effectsMap;
for (const auto &key : copy.keys())
{
for (const auto &valie : copy.values(key))
{
if( m_explosionClusterKeys.find(valie.aesItemId()) != m_explosionClusterKeys.end())
{
m_effectsMap.remove(key, valie);
continue;
}
}
}
}
DEBUG_LOG(m_logger) << "setReplayStartTime-readEffectsAt " << startTime << " after: " << m_effectsMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
timer.restart();
DEBUG_LOG(m_logger) << "setReplayStartTime-readAesItemViewAt " << startTime << " before: " << m_aesItemViewMap.count();
if (OPTIMIZE)
{
// find missing aes item views?!
auto copy = m_aesItemViewMap;
for (const auto &key : m_aesItemViewMap.keys())
{
for (const auto &value : copy.values(key))
{
if (value.effectStateId() == AreaEffectSimulation::AesEffectState_def::EsCreated
|| value.effectStateId() == AreaEffectSimulation::AesEffectState_def::EsFired
|| value.effectStateId() == AreaEffectSimulation::AesEffectState_def::EsReceived
|| value.effectStateId() == AreaEffectSimulation::AesEffectState_def::EsPrepared
|| value.effectStateId() == AreaEffectSimulation::AesEffectState_def::EsActivated
)
continue;
// check regarding _Explosion_Cluster
{
static QVector<AesType_def::type> relavantAesTypeIds = {AesType_def::AtExplosionClusterGunToTargetLine, AesType_def::AtExplosionClusterSingleTrajectory};
if (relavantAesTypeIds.contains(value.aesTypeId().underlying()))
{
if (m_explosionClusterKeys.find(value.aesItemId()) != m_explosionClusterKeys.end() ) //contains not available until cpp 20
continue;
}
}
// E01562-E343 EffectCluster: GunToTargetLines fehlen im Replay&Snapshot
{
static QVector<AesType_def::type> relavantAesTypeIds = {AesType_def::AtEffectClusterGunToTargetLine, AesType_def::AtEffectClusterGunToTargetLine};
if (relavantAesTypeIds.contains(value.aesTypeId().underlying()))
{
if (m_effectClusterKeys.find(value.aesItemId()) != m_effectClusterKeys.end() ) //contains not available until cpp 20
continue;
}
}
if (value.effectStateId() == AesEffectState_def::EsRemoved || value.effectStart() < startTime - 210*1000)
{
m_aesItemViewMap.remove(key, value);
}
}
}
}
DEBUG_LOG(m_logger) << "setReplayStartTime-readAesItemViewAt " << startTime << " after: " << m_aesItemViewMap.count();
DEBUG_LOG(m_logger) << "took " << timer.elapsed();
DEBUG_LOG(m_logger) << "done db work took " << timer2.elapsed();
return true;
}
template<typename T>
void RecordReplayPluginCustom::removeOld(QMultiMap<long long, T> &map, qint64 desiredTime)
{
if (!OPTIMIZE)
return;
auto copy = map;
for (const auto &item : copy.keys())
{
for (const auto &inner : map.values(item))
{
// Remove delted ones
if (inner.isDeleted())
{
map.remove(item, inner);
continue;
}
// keep planned
if (!inner.effectStart().is_set())
continue;
// Remove to old ones
if (inner.effectStart().get()+inner.effectDuration() < desiredTime - 210*1000 )
map.remove(item, inner);
}
}
}
bool RecordReplayPluginCustom::ddsTopicsFromDatabase(NSqlQuery &q, qint64 fromTime, qint64 toTime)
{
INFO_LOG(m_logger) << "ddsTopicsFromDatabase " << fromTime << " to " << toTime;
// if (!readParticipant(q, fromTime, toTime)) return false;
bool ret = RecordReplayPlugin::ddsTopicsFromDatabase(q, fromTime, toTime);
DEBUG_LOG(m_logger) << "ddsTopicsFromDatabase ret: " << ret;
return ret;
}
bool RecordReplayPluginCustom::publishData(qint64 desiredTime)
{
INFO_LOG(m_logger) << "publishData " << desiredTime;
m_currentReplayTime = desiredTime;
QElapsedTimer timer;
QElapsedTimer timer2;
timer2.start();
timer.start();
DEBUG_LOG(m_logger) << "dispose map =" << m_aesItemViewDisposedMap.size();
DEBUG_LOG(m_logger) << "send map =" << m_aesItemViewMap.size();
if (!publishAesItemView(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishAesItemView took " << timer.elapsed();
timer.restart();
if (!publishAirSupportImpact(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishAirSupportImpact took " << timer.elapsed();
timer.restart();
if (!publishBCContamination(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishBCContamination took " << timer.elapsed();
timer.restart();
if (!publishBoobyTrap(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishBoobyTrap took " << timer.elapsed();
timer.restart();
if (!publishBorderline(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishBorderline took " << timer.elapsed();
timer.restart();
if (!publishChargeAdministration(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishChargeAdministration took " << timer.elapsed();
timer.restart();
if (!publishDangerArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishDangerArea took " << timer.elapsed();
timer.restart();
if (!publishDusMineState(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishDusMineState took " << timer.elapsed();
timer.restart();
if (!publishDusSingleMine(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishDusSingleMine took " << timer.elapsed();
timer.restart();
if (!publishEffects(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishEffects took " << timer.elapsed();
timer.restart();
if (!publishExplosionArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishExplosionArea took " << timer.elapsed();
timer.restart();
if (!publishExplosionCluster(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishExplosionCluster took " << timer.elapsed();
timer.restart();
if (!publishExplosionSingle(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishExplosionSingle took " << timer.elapsed();
timer.restart();
if (!publishFunctionalArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishFunctionalArea took " << timer.elapsed();
timer.restart();
if (!publishGasPipe(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishGasPipe took " << timer.elapsed();
timer.restart();
if (!publishMineArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishMineArea took " << timer.elapsed();
timer.restart();
if (!publishMineCorridor(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishMineCorridor took " << timer.elapsed();
timer.restart();
if (!publishNContamination(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishNContamination took " << timer.elapsed();
timer.restart();
if (!publishOffRouteMine(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishOffRouteMine took " << timer.elapsed();
timer.restart();
if (!publishReconArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishReconArea took " << timer.elapsed();
timer.restart();
if (!publishTechnicalArea(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishTechnicalArea took " << timer.elapsed();
timer.restart();
if (!publishEffectCluster(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishEffectCluster took " << timer.elapsed();
timer.restart();
if (!publishChargeEffect(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishtChargeEffect took " << timer.elapsed();
timer.restart();
if (!publishTrajectoryTimeAware(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishTrajectoryTimeAware took " << timer.elapsed();
timer.restart();
if (!publishTriggeredImpacts(desiredTime)) return false;
DEBUG_LOG(m_logger) << "publishTriggeredImpacts took " << timer.elapsed();
timer.restart();
//bool ret = RecordReplayPlugin::publishData(desiredTime);
//DEBUG_LOG(m_logger) << "publish ret: " << ret;
DEBUG_LOG(m_logger) << "publish totally took " << timer2.elapsed();
return true;
}
bool RecordReplayPluginCustom::waitForAsyncOperations(qint64 desiredTime)
{
Q_UNUSED(desiredTime);
bool ret = RecordReplayPlugin::waitForAsyncOperations(desiredTime);
DEBUG_LOG(m_logger) << "waitForAsyncOperations ret: " << ret;
return ret;
}
void RecordReplayPluginCustom::clearData()
{
RecordReplayPlugin::clearData();
}
} // namespace AreaEffectSimulation
@@ -0,0 +1,48 @@
/**
* @RDE_HEADER@
* Custom record/replay functions
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
#include <AreaEffectSimulation/aes_record_replay_plugin.h>
#include <AreaEffectSimulation/aes_dts.h>
// fixup include path on 42.3 -> missing interface
#include <../../Common/PluginInterfaces/record_replay_plugin.h>
namespace AreaEffectSimulation
{
class AESRECORDREPLAYPLUGIN_EXPORT RecordReplayPluginCustom final : public RecordReplayPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "special:3:recordreplay.aes")
Q_INTERFACES(RecordReplay::RecordReplayPlugin)
public:
RecordReplayPluginCustom();
~RecordReplayPluginCustom();
bool initDts(const std::shared_ptr<DDSConnector::DdsConnector> &ddsConnector,
int exerciseId,
bool bCanHandleSchemas,
NSqlQuery &query) override;
bool setReplayStartTime(NSqlQuery &q, qint64 startTime) override;
bool ddsTopicsFromDatabase(NSqlQuery &q, qint64 fromTime, qint64 toTime) override;
bool publishData(qint64 desiredTime) override;
bool waitForAsyncOperations(qint64 desiredTime) override;
void clearData() override;
private:
template<typename T>
void removeOld(QMultiMap<long long int , T> &map, qint64 desiredTime);
private:
std::shared_ptr<AreaEffectSimulation::Interface::Dts> m_ddsDts;
qint64 m_currentReplayTime;
};
} // namespace AreaEffectSimulation