This is an automated email from the ASF dual-hosted git repository.

bchapuis pushed a commit to branch 745-daylight
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git

commit 50aac202a7012187e95a045a253c4f047413dd2b
Author: Bertil Chapuis <[email protected]>
AuthorDate: Tue Aug 29 08:08:59 2023 +0200

    Delete before import to prevent pk violations
---
 .../postgres/PostgresNodeRepository.java           | 11 ++++-----
 .../openstreetmap/repository/ChangeImporter.java   | 28 ++++++++--------------
 2 files changed, 15 insertions(+), 24 deletions(-)

diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/postgres/PostgresNodeRepository.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/postgres/PostgresNodeRepository.java
index 3b5b5911..27ecdc2f 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/postgres/PostgresNodeRepository.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/postgres/PostgresNodeRepository.java
@@ -54,6 +54,8 @@ public class PostgresNodeRepository implements NodeRepository 
{
 
   private final String delete;
 
+  private final String deleteIn;
+
   private final String copy;
 
   /**
@@ -119,6 +121,7 @@ public class PostgresNodeRepository implements 
NodeRepository {
         tableName, idColumn, versionColumn, uidColumn, timestampColumn, 
changesetColumn, tagsColumn,
         longitudeColumn, latitudeColumn, geometryColumn);
     this.delete = String.format("DELETE FROM %1$s WHERE %2$s = ?", tableName, 
idColumn);
+    this.deleteIn = String.format("DELETE FROM %1$s WHERE %2$s = ANY (?)", 
tableName, idColumn);
     this.copy = String.format(
         "COPY %1$s (%2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s) 
FROM STDIN BINARY",
         tableName, idColumn, versionColumn, uidColumn, timestampColumn, 
changesetColumn, tagsColumn,
@@ -248,12 +251,8 @@ public class PostgresNodeRepository implements 
NodeRepository {
       return;
     }
     try (Connection connection = dataSource.getConnection();
-        PreparedStatement statement = connection.prepareStatement(delete)) {
-      for (Long key : keys) {
-        statement.clearParameters();
-        statement.setObject(1, key);
-        statement.addBatch();
-      }
+        PreparedStatement statement = connection.prepareStatement(deleteIn)) {
+      statement.setArray(1, connection.createArrayOf("int8", keys.toArray()));
       statement.executeBatch();
     } catch (SQLException e) {
       throw new RepositoryException(e);
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/repository/ChangeImporter.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/repository/ChangeImporter.java
index 6c6a77f9..be3b3aac 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/repository/ChangeImporter.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/repository/ChangeImporter.java
@@ -55,56 +55,48 @@ public class ChangeImporter implements Consumer<Change> {
         .filter(entity -> entity instanceof Node)
         .map(entity -> (Node) entity)
         .toList();
+    var nodeIds = nodes.stream().map(Node::id).toList();
     var ways = change.getEntities().stream()
         .filter(entity -> entity instanceof Way)
         .map(entity -> (Way) entity)
         .toList();
+    var wayIds = ways.stream().map(Way::id).toList();
     var relations = change.getEntities().stream()
         .filter(entity -> entity instanceof Relation)
         .map(entity -> (Relation) entity)
         .toList();
+    var relationIds = relations.stream().map(Relation::id).toList();
     try {
       switch (change.getType()) {
-        case CREATE -> {
+        case CREATE, MODIFY -> {
           if (!nodes.isEmpty()) {
             logger.info("Creating {} nodes", nodes.size());
+            nodeRepository.delete(nodeIds);
             nodeRepository.copy(nodes);
           }
           if (!ways.isEmpty()) {
             logger.info("Creating {} ways", ways.size());
+            wayRepository.delete(wayIds);
             wayRepository.copy(ways);
           }
           if (!relations.isEmpty()) {
             logger.info("Creating {} relations", relations.size());
+            relationRepository.delete(relationIds);
             relationRepository.copy(relations);
           }
         }
-        case MODIFY -> {
-          if (!nodes.isEmpty()) {
-            logger.info("Modifying {} nodes", nodes.size());
-            nodeRepository.put(nodes);
-          }
-          if (!ways.isEmpty()) {
-            logger.info("Modifying {} ways", ways.size());
-            wayRepository.put(ways);
-          }
-          if (!relations.isEmpty()) {
-            logger.info("Modifying {} relations", relations.size());
-            relationRepository.put(relations);
-          }
-        }
         case DELETE -> {
           if (!nodes.isEmpty()) {
             logger.info("Deleting {} nodes", nodes.size());
-            nodeRepository.delete(nodes.stream().map(Node::id).toList());
+            nodeRepository.delete(nodeIds);
           }
           if (!ways.isEmpty()) {
             logger.info("Deleting {} ways", ways.size());
-            wayRepository.delete(ways.stream().map(Way::id).toList());
+            wayRepository.delete(wayIds);
           }
           if (!relations.isEmpty()) {
             logger.info("Deleting {} relations", relations.size());
-            
relationRepository.delete(relations.stream().map(Relation::id).toList());
+            relationRepository.delete(relationIds);
           }
         }
       }

Reply via email to