timeline.cpp 1.36 KB
#include "timeline.h"

#include "log.h"

using namespace osdev::components;

Timeline::Timeline()
    : m_timeline(10)
    , m_proposedChange()
{
}

const OrmBatchChange& Timeline::evaluate(const OrmBatchChange& desiredChange, bool exclusiveUpdate)
{
    m_proposedChange = OrmBatchChange {};
    if (m_timeline.full() && desiredChange < m_timeline.front())
    {
        LogWarning("[Timeline::evaluate]", QString("Incoming change (%1) is older then the oldest registered change (%2).").arg(desiredChange.timestamp().toString()).arg(m_timeline.front().timestamp().toString()));
        return m_proposedChange; // change is older then anything we know, discard.
    }

    m_proposedChange = desiredChange;
    for (const auto& ch : m_timeline)
    {
        if (!m_proposedChange.processChange(ch, exclusiveUpdate))
        {
            break;
        }
    }
    if (   m_proposedChange.valid()
        && !m_timeline.empty()
        && m_proposedChange < m_timeline.back())
    {
        // reset the timestamp so that the proposed change will be the latest in the timeline when committed.
        auto ts = m_timeline.back().timestamp();
        m_proposedChange.setTimestamp(++ts);
    }
    return m_proposedChange;
}

void Timeline::commit()
{
    if (m_proposedChange.valid())
    {
        m_timeline.push_back(m_proposedChange);
        m_proposedChange = OrmBatchChange {};
    }
}