You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2023/09/28 19:44:16 UTC
[incubator-baremaps] 15/35: Delete before import to prevent pk violations
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 <bc...@gmail.com>
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);
}
}
}