PointViewSet Stage::execute(PointTableRef table) { //printf("called %s\n", this->classname()); log()->setLevel(LogLevel::Enum::Debug); std::string cn(this->classname()); log()->setLeader(cn + " Stage::execute"); log()->get(LogLevel::Debug) << "Called by class " << std::endl; table.layout()->finalize(); PointViewSet views; if (m_inputs.empty()) { log()->get(LogLevel::Debug) << "if block, class" << std::endl; views.insert(PointViewPtr(new PointView(table))); } else { for (size_t i = 0; i < m_inputs.size(); ++i) { log()->get(LogLevel::Debug) << "block, class" << "input number "<< i << std::endl; log()->get(LogLevel::Debug) << "if block, class" << std::endl; Stage *prev = m_inputs[i]; PointViewSet temp = prev->execute(table); views.insert(temp.begin(), temp.end()); } } PointViewSet outViews; std::vector<StageRunnerPtr> runners; ready(table); for (auto const& it : views) { log()->get(LogLevel::Debug) << "run, class" << std::endl; StageRunnerPtr runner(new StageRunner(this, it)); runners.push_back(runner); runner->run(); } for (auto const& it : runners) { log()->get(LogLevel::Debug) << "wait, class" << std::endl; StageRunnerPtr runner(it); PointViewSet temp = runner->wait(); outViews.insert(temp.begin(), temp.end()); } l_done(table); done(table); return outViews; }
PointViewSet Stage::execute(PointTableRef table) { pushLogLeader(); table.finalize(); PointViewSet views; // If the inputs are empty, we're a reader. if (m_inputs.empty()) { views.insert(PointViewPtr(new PointView(table))); } else { for (size_t i = 0; i < m_inputs.size(); ++i) { Stage *prev = m_inputs[i]; PointViewSet temp = prev->execute(table); views.insert(temp.begin(), temp.end()); } } PointViewSet outViews; std::vector<StageRunnerPtr> runners; // Put the spatial references from the views onto the table. // The table's spatial references are only valid as long as the stage // is running. // ABELL - Should we clear the references once the stage run has // completed? Wondering if that would break something where a // writer wants to check a table's SRS. SpatialReference srs; table.clearSpatialReferences(); for (auto const& it : views) table.addSpatialReference(it->spatialReference()); gdal::ErrorHandler::getGlobalErrorHandler().set(m_log, m_debug); // Do the ready operation and then start running all the views // through the stage. ready(table); for (auto const& it : views) { StageRunnerPtr runner(new StageRunner(this, it)); runners.push_back(runner); runner->run(); } // As the stages complete (synchronously at this time), propagate the // spatial reference and merge the output views. srs = getSpatialReference(); for (auto const& it : runners) { StageRunnerPtr runner(it); PointViewSet temp = runner->wait(); // If our stage has a spatial reference, the view takes it on once // the stage has been run. if (!srs.empty()) for (PointViewPtr v : temp) v->setSpatialReference(srs); outViews.insert(temp.begin(), temp.end()); } l_done(table); popLogLeader(); return outViews; }