Skip to content

v0.2.50..v0.2.51 changeset ChangesetCreator.cpp

Garret Voltz edited this page Jan 15, 2020 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/algorithms/changeset/ChangesetCreator.cpp b/hoot-core/src/main/cpp/hoot/core/algorithms/changeset/ChangesetCreator.cpp
index e3df9e5..4113a2d 100644
--- a/hoot-core/src/main/cpp/hoot/core/algorithms/changeset/ChangesetCreator.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/algorithms/changeset/ChangesetCreator.cpp
@@ -33,11 +33,9 @@
 #include <hoot/core/elements/InMemoryElementSorter.h>
 #include <hoot/core/io/ElementCriterionVisitorInputStream.h>
 #include <hoot/core/io/ElementStreamer.h>
-#include <hoot/core/io/OsmApiDbSqlChangesetFileWriter.h>
 #include <hoot/core/io/OsmMapReaderFactory.h>
 #include <hoot/core/io/OsmMapWriterFactory.h>
 #include <hoot/core/io/OsmPbfReader.h>
-#include <hoot/core/io/OsmXmlChangesetFileWriter.h>
 #include <hoot/core/io/PartialOsmMapReader.h>
 #include <hoot/core/ops/NamedOp.h>
 #include <hoot/core/util/ConfigOptions.h>
@@ -51,6 +49,8 @@
 #include <hoot/core/visitors/RemoveUnknownVisitor.h>
 #include <hoot/core/util/ConfigUtils.h>
 #include <hoot/core/algorithms/changeset/ChangesetDeriver.h>
+#include <hoot/core/io/OsmChangesetFileWriterFactory.h>
+#include <hoot/core/io/OsmChangesetFileWriter.h>
 
 //GEOS
 #include <geos/geom/Envelope.h>
@@ -60,11 +60,11 @@ namespace hoot
 
 const QString ChangesetCreator::JOB_SOURCE = "Derive Changeset";
 
-ChangesetCreator::ChangesetCreator(const bool printStats, const QString osmApiDbUrl) :
+ChangesetCreator::ChangesetCreator(const bool printDetailedStats, const QString osmApiDbUrl) :
 _osmApiDbUrl(osmApiDbUrl),
 _numTotalTasks(0),
 _currentTaskNum(0),
-_printStats(printStats),
+_printDetailedStats(printDetailedStats),
 _singleInput(false),
 _numCreateChanges(0),
 _numModifyChanges(0),
@@ -83,6 +83,11 @@ void ChangesetCreator::create(const QString& output, const QString& input1, cons
     throw IllegalArgumentException(
       "Output to SQL changeset requires an OSM API database URL be specified.");
   }
+  else if (!output.endsWith(".osc.sql") && !_osmApiDbUrl.isEmpty())
+  {
+    LOG_WARN(
+      "Ignoring OSM API database URL: " << _osmApiDbUrl << " for non-SQL changeset output...");
+  }
 
   LOG_DEBUG(
     "Creating changeset from inputs: " << input1 << " and " << input2 << " to output: " <<
@@ -155,8 +160,7 @@ void ChangesetCreator::create(const QString& output, const QString& input1, cons
     // there are for the external sorting (e.g. pre-sorted PBF file).
 
     progress.set(
-      (float)(_currentTaskNum - 1) / (float)_numTotalTasks,
-      "Sorting input elements; task #" + QString::number(_currentTaskNum) + "...");
+      (float)(_currentTaskNum - 1) / (float)_numTotalTasks, "Sorting input elements...");
     if (!_singleInput)
     {
       sortedElements1 = _sortElementsInMemory(map1);
@@ -355,7 +359,8 @@ void ChangesetCreator::_handleUnstreamableConvertOpsInMemory(const QString& inpu
           QString("(OsmMapOperation) on two data sources with overlapping element IDs: ") +
           e.what());
       }
-      throw e;
+      //  Rethrow the original exception
+      throw;
     }
   }
   else
@@ -627,16 +632,13 @@ void ChangesetCreator::_streamChangesetOutput(const QList<ElementInputStreamPtr>
       "Changeset input data inputs are not the same size for streaming to output.");
   }
 
-  LOG_INFO("Streaming changeset output to " << output.right(25) << "...")
+  LOG_INFO("Streaming changeset output to " << output.right(25) << "...");
 
-  QString stats;
+  QString detailedStats;
   _numCreateChanges = 0;
   _numModifyChanges = 0;
   _numDeleteChanges = 0;
 
-  // Could this eventually be cleaned up to use OsmChangeWriterFactory and the OsmChange interface
-  // instead?
-
   QList<ChangesetProviderPtr> changesetProviders;
   for (int i = 0; i < inputs1.size(); i++)
   {
@@ -644,16 +646,20 @@ void ChangesetCreator::_streamChangesetOutput(const QList<ElementInputStreamPtr>
       ChangesetDeriverPtr(new ChangesetDeriver(inputs1.at(i), inputs2.at(i))));
   }
 
-  if (output.endsWith(".osc"))
-  {
-    OsmXmlChangesetFileWriter writer;
-    writer.write(output, changesetProviders);
-    stats = writer.getStatsTable();
-  }
-  else if (output.endsWith(".osc.sql"))
+  std::shared_ptr<OsmChangesetFileWriter> writer =
+    OsmChangesetFileWriterFactory::getInstance()
+      .createWriter(output, _osmApiDbUrl);
+  writer->write(output, changesetProviders);
+  if (_printDetailedStats)
   {
-    assert(!_osmApiDbUrl.isEmpty());
-    OsmApiDbSqlChangesetFileWriter(QUrl(_osmApiDbUrl)).write(output, changesetProviders);
+    if (output.endsWith(".osc")) // detailed stats currently only implemented for xml output
+    {
+      detailedStats = writer->getStatsTable();
+    }
+    else
+    {
+      LOG_WARN("Changeset statistics not implemented for output: " << output);
+    }
   }
 
   assert(inputs1.size() == changesetProviders.size());
@@ -662,12 +668,14 @@ void ChangesetCreator::_streamChangesetOutput(const QList<ElementInputStreamPtr>
     ChangesetDeriverPtr changesetDeriver =
       std::dynamic_pointer_cast<ChangesetDeriver>(changesetProviders.at(i));
     LOG_DEBUG("Derived changeset: " << i + 1 << " / " << inputs1.size() << ": ");
-    LOG_VARD(changesetDeriver->getNumCreateChanges());
+
     _numCreateChanges += changesetDeriver->getNumCreateChanges();
-    LOG_VARD(changesetDeriver->getNumModifyChanges());
     _numModifyChanges += changesetDeriver->getNumModifyChanges();
-    LOG_VARD(changesetDeriver->getNumDeleteChanges());
     _numDeleteChanges += changesetDeriver->getNumDeleteChanges();
+
+    LOG_VARD(changesetDeriver->getNumCreateChanges());
+    LOG_VARD(changesetDeriver->getNumModifyChanges());
+    LOG_VARD(changesetDeriver->getNumDeleteChanges());
     LOG_VARD(changesetDeriver->getNumFromElementsParsed());
     LOG_VARD(changesetDeriver->getNumToElementsParsed());
     if (changesetDeriver->getNumChanges() == 0)
@@ -694,9 +702,10 @@ void ChangesetCreator::_streamChangesetOutput(const QList<ElementInputStreamPtr>
     input2->close();
   }
 
-  if (_printStats)
+  LOG_VARD(_printDetailedStats);
+  if (_printDetailedStats && !detailedStats.isEmpty())
   {
-    LOG_STATUS("Changeset Stats:\n" << stats);
+    LOG_STATUS("Changeset Stats:\n" << detailedStats);
   }
   else
   {
Clone this wiki locally