15#include <nlohmann/json.hpp>
23constexpr auto kPausePollInterval = std::chrono::milliseconds(50);
27 while (req.pauseFlag && req.pauseFlag->load()) {
28 if (req.cancelFlag && req.cancelFlag->load())
return;
29 std::this_thread::sleep_for(kPausePollInterval);
37 std::shared_ptr<core::ports::diagnostics::IErrorReporter> errorReporter)
40 std::move(errorReporter))
52 std::filesystem::create_directories(path);
61 return [&](
double progress,
const std::string& phase) {
70 "core::import::DefaultImportStatementStrategy::progressCallback",
71 std::current_exception());
81 request.
outputDir = std::filesystem::path();
93 request.
dpi = renderRequest.
dpi;
94 request.
outputDir = std::filesystem::path();
104 const std::shared_ptr<core::ports::document_image_processing::IDocumentImageProcessor>& documentImageProcessor,
105 const std::shared_ptr<core::ports::text_recognition::ITextRecognizer>& tesseract,
110 std::mutex& artifactsMutex)
112 const size_t totalPages = std::max(renderResult.
images.size(), renderResult.
imageBytes.size());
114 const size_t totalUnits = std::max<size_t>(1, totalPages * unitsPerPage);
116 std::atomic<size_t> doneUnits{0};
117 std::vector<internal::PageWork> pages(totalPages);
118 std::vector<std::future<internal::PageWork>> futures;
119 futures.reserve(totalPages);
121 for (
size_t pageIndex = 0; pageIndex < totalPages; ++pageIndex) {
122 waitWhilePaused(req);
125 auto promise = std::make_shared<std::promise<internal::PageWork>>();
126 futures.push_back(promise->get_future());
134 documentImageProcessor,
146 for (
auto& future : futures) {
148 auto pageWork = future.get();
149 if (pageWork.pageIndex < pages.size()) pages[pageWork.pageIndex] = std::move(pageWork);
153 "core::import::DefaultImportStatementStrategy::pageFutureGet",
154 std::current_exception());
163 const std::vector<internal::PageWork>& pages,
170 nlohmann::json metrics;
185 pageArray = nlohmann::json::array();
186 for (
const auto& page : pages) {
187 nlohmann::json pageJson;
193 pageArray.push_back(std::move(pageJson));
196 const auto serialized = metrics.dump(2);
198 std::vector<uint8_t>(serialized.begin(), serialized.end());
202 "core::import::DefaultImportStatementStrategy::metricsArtifact",
203 std::current_exception());
Provides shared helpers for reporting structured errors and exceptions.
Defines private constants shared by core import orchestration.
Declares private support types and helpers for the default import strategy.
Declares a bounded worker queue and a simple slot limiter for import tasks.
Declares private unique identifier helpers for transient import/job artifacts.
void enqueue(Task t)
Enqueue a task, blocking when the queue is full.
Port for reporting structured diagnostic error events.
constexpr std::string_view kSourcePath
constexpr std::string_view kOcrWordsTotal
constexpr std::string_view kExtractSeconds
constexpr std::string_view kHasTable
constexpr std::string_view kJobId
constexpr std::string_view kTotalSeconds
constexpr std::string_view kPagesTotal
constexpr std::string_view kFinalizeSeconds
constexpr std::string_view kIndex
constexpr std::string_view kPages
constexpr std::string_view kRenderSeconds
constexpr std::string_view kPageWorkSecondsSum
constexpr std::string_view kOcrSecondsSum
constexpr std::string_view kPagesWithTable
constexpr std::string_view kPageWorkSecondsMax
constexpr std::string_view kOcrWords
constexpr std::string_view kPopplerExtractPrefix
constexpr std::string_view kMetricsArtifactName
constexpr double kRenderDpi
constexpr std::string_view kPopplerRenderPrefix
constexpr std::size_t kUnitsPerPage
PageWork processImportPage(size_t pageIndex, size_t totalPages, const ImportRequest &req, const poppler::RenderResult &renderRes, const poppler::ExtractResult &extractRes, const std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > &documentImageProcessor, const std::shared_ptr< core::ports::text_recognition::ITextRecognizer > &tesseract, core::jobs::SlotLimiter *ocrLimiter, const ProgressReporter &report, std::atomic< size_t > &doneUnits, size_t totalUnits, core::ports::diagnostics::IErrorReporter *errorReporter, ImportResult &out, std::mutex &artifactsMutex)
std::function< void(double, const std::string &)> ProgressReporter
core::ports::pdf_rendering::RenderRequest makeRenderRequest(const ImportRequest &req)
std::vector< internal::PageWork > collectPageWork(const ImportRequest &req, const core::ports::pdf_rendering::RenderResult &renderResult, const core::ports::pdf_rendering::ExtractResult &extractResult, const std::shared_ptr< core::ports::document_image_processing::IDocumentImageProcessor > &documentImageProcessor, const std::shared_ptr< core::ports::text_recognition::ITextRecognizer > &tesseract, SchedulerResources &resources, const internal::ProgressReporter &report, core::ports::diagnostics::IErrorReporter *errorReporter, ImportResult &out, std::mutex &artifactsMutex)
internal::ProgressReporter makeProgressReporter(const ImportRequest &req, core::ports::diagnostics::IErrorReporter *errorReporter)
void ensureDirectoryExists(const std::filesystem::path &path, core::ports::diagnostics::IErrorReporter *errorReporter, const char *origin)
core::ports::pdf_rendering::ExtractRequest makeExtractRequest(const core::ports::pdf_rendering::RenderRequest &renderRequest, const ImportRequest &req)
void attachMetricsArtifact(ImportResult &out, const ImportRequest &req, const std::vector< internal::PageWork > &pages, size_t totalPages, const internal::FinalizeStats &finalizeStats, const ImportRunTimings &timings, core::ports::diagnostics::IErrorReporter *errorReporter)
void reportException(core::ports::diagnostics::IErrorReporter *reporter, ErrorSeverity severity, const char *origin, std::exception_ptr exception)
Report an exception through the reporter's default exception handling.
std::string makeTransientId()
Generates a transient unique identifier for import and job artifacts.
Describes one import execution request.
std::shared_ptr< std::atomic< bool > > cancelFlag
std::function< void(double, const std::string &)> progressCallback
std::map< std::string, std::vector< std::uint8_t > > artifacts
ImportClock::time_point startedAt
core::jobs::SlotLimiter localOcrLimiter
core::jobs::Scheduler localScheduler
SchedulerResources(const ImportRequest &req, std::shared_ptr< core::ports::diagnostics::IErrorReporter > errorReporter)
core::jobs::SlotLimiter * ocrLimiter
core::jobs::Scheduler * scheduler
std::filesystem::path pdfPath
std::shared_ptr< std::atomic< bool > > cancelFlag
std::filesystem::path outputDir
std::vector< std::vector< uint8_t > > imageBytes
std::vector< std::filesystem::path > images