#include "processor/processor_task.h"
#include "common/task_system/progress_bar.h"
#include "main/client_context.h"
#include "main/settings.h"
#include "processor/execution_context.h"
#include "processor/result/result_set.h"
#include "storage/buffer_manager/memory_manager.h"
using namespace lbug::common;
namespace lbug {
namespace processor {
ProcessorTask::ProcessorTask(Sink* sink, ExecutionContext* executionContext)
: Task{executionContext->clientContext->getCurrentSetting(main::ThreadsSetting::name)
.getValue<uint64_t>()},
sharedStateInitialized{false}, sink{sink}, executionContext{executionContext} {}
void ProcessorTask::run() {
lock_t lck{taskMtx};
if (!sharedStateInitialized) {
sink->initGlobalState(executionContext);
sharedStateInitialized = true;
}
auto taskRoot = sink->copy();
lck.unlock();
ResultSet* resultSetPtr = nullptr;
std::unique_ptr<ResultSet> ownedResultSet;
if (auto* desc = sink->getDescriptor()) {
thread_local uint64_t cachedDescID = UINT64_MAX;
thread_local std::shared_ptr<processor::ResultSet> cachedResultSet;
if (cachedDescID == desc->id && cachedResultSet) {
cachedResultSet->resetForReuse();
resultSetPtr = cachedResultSet.get();
} else {
cachedResultSet = std::make_shared<processor::ResultSet>(desc,
storage::MemoryManager::Get(*executionContext->clientContext));
cachedDescID = desc->id;
resultSetPtr = cachedResultSet.get();
}
} else {
ownedResultSet =
sink->getResultSet(storage::MemoryManager::Get(*executionContext->clientContext));
resultSetPtr = ownedResultSet.get();
}
taskRoot->ptrCast<Sink>()->execute(resultSetPtr, executionContext);
}
void ProcessorTask::finalize() {
ProgressBar::Get(*executionContext->clientContext)->finishPipeline(executionContext->queryID);
sink->finalize(executionContext);
}
bool ProcessorTask::terminate() {
return sink->terminate();
}
} }