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); } } }
