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/01/17 10:52:28 UTC

[incubator-baremaps] branch simplify-geometries updated: Refactor import and update services

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

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


The following commit(s) were added to refs/heads/simplify-geometries by this push:
     new 5f6195f2 Refactor import and update services
5f6195f2 is described below

commit 5f6195f2120f3eb79c06d8c29d056b03d201933a
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Tue Jan 17 11:52:21 2023 +0100

    Refactor import and update services
---
 .../baremaps/benchmarks/DataMapBenchmark.java      |   3 +-
 .../baremaps/collection/AppendOnlyBuffer.java      |  14 +-
 .../baremaps/collection/type/GeometryDataType.java |   2 +-
 .../collection/utils/CollectionAdapter.java        | 133 --------------
 .../apache/baremaps/database/ImportService.java    |  83 ---------
 .../apache/baremaps/database/UpdateService.java    |  96 ----------
 .../workflow/tasks/ImportOpenStreetMap.java        | 197 ++++++++++++---------
 .../workflow/tasks/SimplifyOpenStreetMap.java      | 114 +++++-------
 .../workflow/tasks/UpdateOpenStreetMap.java        |  66 +++++--
 .../database/database/ImportUpdateDataTest.java    |  12 +-
 .../database/ImportUpdateLiechtensteinTest.java    |  25 +--
 .../database/database/ImportUpdateMonacoTest.java  |  13 +-
 .../workflow/tasks/SimplifyOpenStreetMapTest.java  |   2 +-
 13 files changed, 251 insertions(+), 509 deletions(-)

diff --git a/baremaps-benchmark/src/main/java/org/apache/baremaps/benchmarks/DataMapBenchmark.java b/baremaps-benchmark/src/main/java/org/apache/baremaps/benchmarks/DataMapBenchmark.java
index 070bb9e9..1cbcbe02 100644
--- a/baremaps-benchmark/src/main/java/org/apache/baremaps/benchmarks/DataMapBenchmark.java
+++ b/baremaps-benchmark/src/main/java/org/apache/baremaps/benchmarks/DataMapBenchmark.java
@@ -67,7 +67,8 @@ public class DataMapBenchmark {
     benchmark(new MonotonicPairedDataMap<>(
         new MemoryAlignedDataList<>(
             new PairDataType<>(new LongDataType(), new LongDataType()),
-            new OffHeapMemory())), N);
+            new OffHeapMemory())),
+        N);
   }
 
   @Benchmark
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/collection/AppendOnlyBuffer.java b/baremaps-core/src/main/java/org/apache/baremaps/collection/AppendOnlyBuffer.java
index 44d49d2a..cb775ae7 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/collection/AppendOnlyBuffer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/collection/AppendOnlyBuffer.java
@@ -156,10 +156,18 @@ public class AppendOnlyBuffer<E> extends DataCollection<E> {
         }
         long segmentIndex = position / segmentSize;
         long segmentOffset = position % segmentSize;
-        ByteBuffer buffer = memory.segment((int) segmentIndex);
-        position += dataType.size(buffer, (int) segmentOffset);
+        ByteBuffer segment = memory.segment((int) segmentIndex);
+        int size = dataType.size(segment, (int) segmentOffset);
+        if (size == 0) {
+          segmentIndex = segmentIndex + 1;
+          segmentOffset = 0;
+          position = segmentIndex * segmentSize;
+          segment = memory.segment((int) segmentIndex);
+          size = dataType.size(segment, (int) segmentOffset);
+        }
+        position += size;
         index++;
-        return dataType.read(buffer, (int) segmentOffset);
+        return dataType.read(segment, (int) segmentOffset);
       }
     };
   }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/collection/type/GeometryDataType.java b/baremaps-core/src/main/java/org/apache/baremaps/collection/type/GeometryDataType.java
index bc497fe2..5b8e1760 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/collection/type/GeometryDataType.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/collection/type/GeometryDataType.java
@@ -44,7 +44,7 @@ public class GeometryDataType implements DataType<Geometry> {
   /** {@inheritDoc} */
   @Override
   public Geometry read(ByteBuffer buffer, int position) {
-    int size = size(buffer, position);
+    int size = buffer.getInt(position);
     byte[] bytes = new byte[size - Integer.BYTES];
     buffer.get(position + Integer.BYTES, bytes);
     return GeometryUtils.deserialize(bytes);
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/collection/utils/CollectionAdapter.java b/baremaps-core/src/main/java/org/apache/baremaps/collection/utils/CollectionAdapter.java
deleted file mode 100644
index 753cee97..00000000
--- a/baremaps-core/src/main/java/org/apache/baremaps/collection/utils/CollectionAdapter.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.baremaps.collection.utils;
-
-
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import org.apache.baremaps.collection.DataList;
-
-public class CollectionAdapter<T> implements Collection<T> {
-
-  private final DataList<T> dataList;
-
-  public CollectionAdapter(DataList<T> dataList) {
-    this.dataList = dataList;
-  }
-
-  @Override
-  public int size() {
-    if (dataList.sizeAsLong() > Integer.MAX_VALUE) {
-      throw new IllegalStateException(
-          "The collection is too large to be represented as an integer.");
-    }
-    return (int) dataList.sizeAsLong();
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return dataList.sizeAsLong() == 0;
-  }
-
-  @Override
-  public boolean contains(Object o) {
-    for (long i = 0; i < dataList.sizeAsLong(); i++) {
-      if (dataList.get(i).equals(o)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public Iterator<T> iterator() {
-    return new Iterator<>() {
-
-      private long index = 0;
-
-      private long size = dataList.sizeAsLong();
-
-      @Override
-      public boolean hasNext() {
-        return index < dataList.sizeAsLong();
-      }
-
-      @Override
-      public T next() {
-        if (!hasNext()) {
-          throw new NoSuchElementException();
-        }
-        return dataList.get(index++);
-      }
-    };
-  }
-
-  @Override
-  public Object[] toArray() {
-    return toArray(new Object[size()]);
-  }
-
-  @Override
-  public <T1> T1[] toArray(T1[] a) {
-    for (int i = 0; i < size(); i++) {
-      a[i] = (T1) dataList.get(i);
-    }
-    return a;
-  }
-
-  @Override
-  public boolean add(T t) {
-    dataList.addIndexed(t);
-    return true;
-  }
-
-  @Override
-  public boolean remove(Object o) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean containsAll(Collection<?> c) {
-    for (Object o : c) {
-      if (!contains(o)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public boolean addAll(Collection<? extends T> c) {
-    for (T t : c) {
-      add(t);
-    }
-    return true;
-  }
-
-  @Override
-  public boolean removeAll(Collection<?> c) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean retainAll(Collection<?> c) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void clear() {
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java b/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java
deleted file mode 100644
index 98169087..00000000
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.baremaps.database;
-
-import static org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
-import static org.apache.baremaps.stream.StreamUtils.batch;
-
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.concurrent.Callable;
-import org.apache.baremaps.collection.DataMap;
-import org.apache.baremaps.database.repository.HeaderRepository;
-import org.apache.baremaps.database.repository.Repository;
-import org.apache.baremaps.openstreetmap.function.*;
-import org.apache.baremaps.openstreetmap.model.Node;
-import org.apache.baremaps.openstreetmap.model.Relation;
-import org.apache.baremaps.openstreetmap.model.Way;
-import org.apache.baremaps.openstreetmap.pbf.PbfBlockReader;
-import org.locationtech.jts.geom.Coordinate;
-
-public class ImportService implements Callable<Void> {
-
-  private final Path path;
-  private final DataMap<Coordinate> coordinateMap;
-  private final DataMap<List<Long>> referenceMap;
-  private final HeaderRepository headerRepository;
-  private final Repository<Long, Node> nodeRepository;
-  private final Repository<Long, Way> wayRepository;
-  private final Repository<Long, Relation> relationRepository;
-  private final int databaseSrid;
-
-  public ImportService(Path path, DataMap<Coordinate> coordinateMap,
-      DataMap<List<Long>> referenceMap, HeaderRepository headerRepository,
-      Repository<Long, Node> nodeRepository, Repository<Long, Way> wayRepository,
-      Repository<Long, Relation> relationRepository, Integer databaseSrid) {
-    this.path = path;
-    this.coordinateMap = coordinateMap;
-    this.referenceMap = referenceMap;
-    this.headerRepository = headerRepository;
-    this.nodeRepository = nodeRepository;
-    this.wayRepository = wayRepository;
-    this.relationRepository = relationRepository;
-    this.databaseSrid = databaseSrid;
-  }
-
-  @Override
-  public Void call() throws Exception {
-    // Initialize and chain the entity handlers
-    var coordinateMapBuilder = new CoordinateMapBuilder(coordinateMap);
-    var referenceMapBuilder = new ReferenceMapBuilder(referenceMap);
-    var entityGeometryBuilder = new EntityGeometryBuilder(coordinateMap, referenceMap);
-    var entityProjectionTransformer = new EntityProjectionTransformer(4326, databaseSrid);
-    var entityHandler = coordinateMapBuilder
-        .andThen(referenceMapBuilder)
-        .andThen(entityGeometryBuilder)
-        .andThen(entityProjectionTransformer);
-
-    // Initialize the block mapper
-    var blockMapper = consumeThenReturn(new BlockEntitiesHandler(entityHandler));
-    var blockImporter =
-        new BlockImporter(headerRepository, nodeRepository, wayRepository, relationRepository);
-
-    // Process the blocks
-    try (InputStream inputStream = Files.newInputStream(path)) {
-      batch(new PbfBlockReader().stream(inputStream).map(blockMapper)).forEach(blockImporter);
-    }
-
-    return null;
-  }
-
-}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/UpdateService.java b/baremaps-core/src/main/java/org/apache/baremaps/database/UpdateService.java
deleted file mode 100644
index 6b5c36ec..00000000
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/UpdateService.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.baremaps.database;
-
-import static org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
-
-import java.io.BufferedInputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.zip.GZIPInputStream;
-import org.apache.baremaps.collection.DataMap;
-import org.apache.baremaps.database.repository.HeaderRepository;
-import org.apache.baremaps.database.repository.Repository;
-import org.apache.baremaps.openstreetmap.function.ChangeEntitiesHandler;
-import org.apache.baremaps.openstreetmap.function.EntityGeometryBuilder;
-import org.apache.baremaps.openstreetmap.function.EntityProjectionTransformer;
-import org.apache.baremaps.openstreetmap.model.Header;
-import org.apache.baremaps.openstreetmap.model.Node;
-import org.apache.baremaps.openstreetmap.model.Relation;
-import org.apache.baremaps.openstreetmap.model.Way;
-import org.apache.baremaps.openstreetmap.state.StateReader;
-import org.apache.baremaps.openstreetmap.xml.XmlChangeReader;
-import org.locationtech.jts.geom.Coordinate;
-
-public class UpdateService implements Callable<Void> {
-
-  private final DataMap<Coordinate> coordinateMap;
-  private final DataMap<List<Long>> referenceMap;
-  private final HeaderRepository headerRepository;
-  private final Repository<Long, Node> nodeRepository;
-  private final Repository<Long, Way> wayRepository;
-  private final Repository<Long, Relation> relationRepository;
-  private final int srid;
-
-  public UpdateService(DataMap<Coordinate> coordinateMap, DataMap<List<Long>> referenceMap,
-      HeaderRepository headerRepository, Repository<Long, Node> nodeRepository,
-      Repository<Long, Way> wayRepository, Repository<Long, Relation> relationRepository,
-      int srid) {
-    this.coordinateMap = coordinateMap;
-    this.referenceMap = referenceMap;
-    this.headerRepository = headerRepository;
-    this.nodeRepository = nodeRepository;
-    this.wayRepository = wayRepository;
-    this.relationRepository = relationRepository;
-    this.srid = srid;
-  }
-
-  @Override
-  public Void call() throws Exception {
-    var header = headerRepository.selectLatest();
-    var replicationUrl = header.getReplicationUrl();
-    var sequenceNumber = header.getReplicationSequenceNumber() + 1;
-
-    var createGeometry = new EntityGeometryBuilder(coordinateMap, referenceMap);
-    var reprojectGeometry = new EntityProjectionTransformer(4326, srid);
-    var prepareGeometries = new ChangeEntitiesHandler(createGeometry.andThen(reprojectGeometry));
-    var prepareChange = consumeThenReturn(prepareGeometries);
-    var saveChange = new ChangeImporter(nodeRepository, wayRepository, relationRepository);
-
-    var changeUrl = resolve(replicationUrl, sequenceNumber, "osc.gz");
-    try (var changeInputStream =
-        new GZIPInputStream(new BufferedInputStream(changeUrl.openStream()))) {
-      new XmlChangeReader().stream(changeInputStream).map(prepareChange).forEach(saveChange);
-    }
-
-    var stateUrl = resolve(replicationUrl, sequenceNumber, "state.txt");
-    try (var stateInputStream = new BufferedInputStream(stateUrl.openStream())) {
-      var state = new StateReader().state(stateInputStream);
-      headerRepository.put(new Header(state.getSequenceNumber(), state.getTimestamp(),
-          header.getReplicationUrl(), header.getSource(), header.getWritingProgram()));
-    }
-
-    return null;
-  }
-
-  public URL resolve(String replicationUrl, Long sequenceNumber, String extension)
-      throws MalformedURLException {
-    var s = String.format("%09d", sequenceNumber);
-    var uri = String.format("%s/%s/%s/%s.%s", replicationUrl, s.substring(0, 3), s.substring(3, 6),
-        s.substring(6, 9), extension);
-    return URI.create(uri).toURL();
-  }
-}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOpenStreetMap.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOpenStreetMap.java
index 84576b86..595d3571 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOpenStreetMap.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOpenStreetMap.java
@@ -12,102 +12,141 @@
 
 package org.apache.baremaps.workflow.tasks;
 
+import static org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
+import static org.apache.baremaps.stream.StreamUtils.batch;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
 import org.apache.baremaps.collection.*;
-import org.apache.baremaps.collection.memory.MemoryMappedFile;
 import org.apache.baremaps.collection.AppendOnlyBuffer;
 import org.apache.baremaps.collection.MemoryAlignedDataList;
+import org.apache.baremaps.collection.memory.MemoryMappedFile;
 import org.apache.baremaps.collection.type.LonLatDataType;
 import org.apache.baremaps.collection.type.LongDataType;
 import org.apache.baremaps.collection.type.LongListDataType;
 import org.apache.baremaps.collection.type.PairDataType;
 import org.apache.baremaps.collection.utils.FileUtils;
-import org.apache.baremaps.database.ImportService;
+import org.apache.baremaps.database.BlockImporter;
 import org.apache.baremaps.database.repository.*;
+import org.apache.baremaps.openstreetmap.function.*;
+import org.apache.baremaps.openstreetmap.model.Node;
+import org.apache.baremaps.openstreetmap.model.Relation;
+import org.apache.baremaps.openstreetmap.model.Way;
+import org.apache.baremaps.openstreetmap.pbf.PbfBlockReader;
 import org.apache.baremaps.workflow.Task;
 import org.apache.baremaps.workflow.WorkflowContext;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
 import org.locationtech.jts.geom.Coordinate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public record ImportOpenStreetMap(Path file, String database, Integer databaseSrid)
-  implements Task {
-
-  private static final Logger logger = LoggerFactory.getLogger(ImportOpenStreetMap.class);
-
-  @Override
-  public void execute(WorkflowContext context) throws Exception {
-    logger.info("Importing {} into {}", file, database);
-
-    var dataSource = context.getDataSource(database);
-    var path = file.toAbsolutePath();
-
-    var headerRepository = new PostgresHeaderRepository(dataSource);
-    var nodeRepository = new PostgresNodeRepository(dataSource);
-    var wayRepository = new PostgresWayRepository(dataSource);
-    var relationRepository = new PostgresRelationRepository(dataSource);
-
-    headerRepository.drop();
-    nodeRepository.drop();
-    wayRepository.drop();
-    relationRepository.drop();
-
-    headerRepository.create();
-    nodeRepository.create();
-    wayRepository.create();
-    relationRepository.create();
-
-    var cacheDir = Files.createTempDirectory(Paths.get("."), "cache_");
-
-    DataMap<Coordinate> coordinateMap;
-    if (Files.size(path) > 1 << 30) {
-      var coordinatesFile = Files.createFile(cacheDir.resolve("coordinates"));
-      coordinateMap = new MemoryAlignedDataMap<>(
-        new LonLatDataType(),
-        new MemoryMappedFile(coordinatesFile));
-    } else {
-      var coordinatesKeysFile = Files.createFile(cacheDir.resolve("coordinates_keys"));
-      var coordinatesValsFile = Files.createFile(cacheDir.resolve("coordinates_vals"));
-      coordinateMap =
-        new MonotonicDataMap<>(
-                new MemoryAlignedDataList<>(
-          new PairDataType<>(new LongDataType(), new LongDataType()),
-          new MemoryMappedFile(coordinatesKeysFile)
-        ), new AppendOnlyBuffer<>(
-                  new LonLatDataType(),
-                  new MemoryMappedFile(coordinatesValsFile))
+        implements Task {
+
+    private static final Logger logger = LoggerFactory.getLogger(ImportOpenStreetMap.class);
+
+    @Override
+    public void execute(WorkflowContext context) throws Exception {
+        logger.info("Importing {} into {}", file, database);
+
+        var dataSource = context.getDataSource(database);
+        var path = file.toAbsolutePath();
+
+        var headerRepository = new PostgresHeaderRepository(dataSource);
+        var nodeRepository = new PostgresNodeRepository(dataSource);
+        var wayRepository = new PostgresWayRepository(dataSource);
+        var relationRepository = new PostgresRelationRepository(dataSource);
+
+        headerRepository.drop();
+        nodeRepository.drop();
+        wayRepository.drop();
+        relationRepository.drop();
+
+        headerRepository.create();
+        nodeRepository.create();
+        wayRepository.create();
+        relationRepository.create();
+
+        var cacheDir = Files.createTempDirectory(Paths.get("."), "cache_");
+
+        DataMap<Coordinate> coordinateMap;
+        if (Files.size(path) > 1 << 30) {
+            var coordinatesFile = Files.createFile(cacheDir.resolve("coordinates"));
+            coordinateMap = new MemoryAlignedDataMap<>(
+                    new LonLatDataType(),
+                    new MemoryMappedFile(coordinatesFile));
+        } else {
+            var coordinatesKeysFile = Files.createFile(cacheDir.resolve("coordinates_keys"));
+            var coordinatesValsFile = Files.createFile(cacheDir.resolve("coordinates_vals"));
+            coordinateMap =
+                    new MonotonicDataMap<>(
+                            new MemoryAlignedDataList<>(
+                                    new PairDataType<>(new LongDataType(), new LongDataType()),
+                                    new MemoryMappedFile(coordinatesKeysFile)
+                            ), new AppendOnlyBuffer<>(
+                            new LonLatDataType(),
+                            new MemoryMappedFile(coordinatesValsFile))
+                    );
+        }
+
+        var referencesKeysDir = Files.createFile(cacheDir.resolve("references_keys"));
+        var referencesValuesDir = Files.createFile(cacheDir.resolve("references_vals"));
+        var referenceMap =
+                new MonotonicDataMap<>(
+                        new MemoryAlignedDataList<>(
+                                new PairDataType<>(new LongDataType(), new LongDataType()),
+                                new MemoryMappedFile(referencesKeysDir)
+                        ), new AppendOnlyBuffer<>(
+                        new LongListDataType(),
+                        new MemoryMappedFile(referencesValuesDir))
+                );
+
+        ImportOpenStreetMap.execute(
+                path,
+                coordinateMap,
+                referenceMap,
+                headerRepository,
+                nodeRepository,
+                wayRepository,
+                relationRepository,
+                databaseSrid
         );
+
+        FileUtils.deleteRecursively(cacheDir);
+
+        logger.info("Finished importing {} into {}", file, database);
     }
 
-    var referencesKeysDir = Files.createFile(cacheDir.resolve("references_keys"));
-    var referencesValuesDir = Files.createFile(cacheDir.resolve("references_vals"));
-    var referenceMap =
-      new MonotonicDataMap<>(
-              new MemoryAlignedDataList<>(
-        new PairDataType<>(new LongDataType(), new LongDataType()),
-        new MemoryMappedFile(referencesKeysDir)
-      ), new AppendOnlyBuffer<>(
-                new LongListDataType(),
-                new MemoryMappedFile(referencesValuesDir))
-      );
-
-    new ImportService(
-      path,
-      coordinateMap,
-      referenceMap,
-      headerRepository,
-      nodeRepository,
-      wayRepository,
-      relationRepository,
-      databaseSrid
-    ).call();
-
-    FileUtils.deleteRecursively(cacheDir);
-
-    logger.info("Finished importing {} into {}", file, database);
-  }
+    public static void execute(
+            Path path,
+            DataMap<Coordinate> coordinateMap,
+            DataMap<List<Long>> referenceMap,
+            HeaderRepository headerRepository,
+            Repository<Long, Node> nodeRepository,
+            Repository<Long, Way> wayRepository,
+            Repository<Long, Relation> relationRepository,
+            Integer databaseSrid) throws IOException {
+// Initialize and chain the entity handlers
+        var coordinateMapBuilder = new CoordinateMapBuilder(coordinateMap);
+        var referenceMapBuilder = new ReferenceMapBuilder(referenceMap);
+        var entityGeometryBuilder = new EntityGeometryBuilder(coordinateMap, referenceMap);
+        var entityProjectionTransformer = new EntityProjectionTransformer(4326, databaseSrid);
+        var entityHandler = coordinateMapBuilder
+                .andThen(referenceMapBuilder)
+                .andThen(entityGeometryBuilder)
+                .andThen(entityProjectionTransformer);
+
+        // Initialize the block mapper
+        var blockMapper = consumeThenReturn(new BlockEntitiesHandler(entityHandler));
+        var blockImporter =
+                new BlockImporter(headerRepository, nodeRepository, wayRepository, relationRepository);
+
+        // Process the blocks
+        try (InputStream inputStream = Files.newInputStream(path)) {
+            batch(new PbfBlockReader().stream(inputStream).map(blockMapper)).forEach(blockImporter);
+        }
+    }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMap.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMap.java
index e3622a20..9ee0da62 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMap.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMap.java
@@ -14,6 +14,8 @@ package org.apache.baremaps.workflow.tasks;
 
 
 
+import com.google.common.base.Predicates;
+import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -35,7 +37,12 @@ import org.apache.baremaps.collection.memory.MemoryMappedFile;
 import org.apache.baremaps.collection.memory.OffHeapMemory;
 import org.apache.baremaps.collection.type.*;
 import org.apache.baremaps.collection.utils.FileUtils;
+import org.apache.baremaps.feature.*;
 import org.apache.baremaps.openstreetmap.model.Element;
+import org.apache.baremaps.openstreetmap.pbf.PbfBlockReader;
+import org.apache.baremaps.openstreetmap.pbf.PbfEntityReader;
+import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
+import org.apache.baremaps.storage.postgres.PostgresDatabase;
 import org.apache.baremaps.workflow.Task;
 import org.apache.baremaps.workflow.WorkflowContext;
 import org.locationtech.jts.geom.Geometry;
@@ -43,78 +50,41 @@ import org.locationtech.jts.operation.union.CascadedPolygonUnion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public record SimplifyOpenStreetMap(Path file, String database, Integer databaseSrid) implements Task {
-
-    private static final Logger logger = LoggerFactory.getLogger(ImportOpenStreetMap.class);
-
-    @Override
-    public void execute(WorkflowContext context) throws Exception {
-        logger.info("Importing {} into {}", file, database);
-
-        var path = file.toAbsolutePath();
-
-        var cacheDir = Files.createTempDirectory(Paths.get("."), "cache_");
-
-        var coordinatesKeysFile = Files.createFile(cacheDir.resolve("coordinates_keys"));
-        var coordinatesValsFile = Files.createFile(cacheDir.resolve("coordinates_vals"));
-        var coordinateMap =
-                new MonotonicDataMap<>(
-                        new MemoryAlignedDataList<>(
-                        new PairDataType<>(
-                                new LongDataType(),
-                                new LongDataType()
-                        ), new MemoryMappedFile(coordinatesKeysFile)), new AppendOnlyBuffer<>(
-                                new LonLatDataType(),
-                                new MemoryMappedFile(coordinatesValsFile))
-                );
-
-        var referencesKeysFile = Files.createFile(cacheDir.resolve("references_keys"));
-        var referencesValuesFile = Files.createFile(cacheDir.resolve("references_vals"));
-        var referenceMap =
-                new MonotonicDataMap<>(
-                        new MemoryAlignedDataList<>(
-                        new PairDataType<>(
-                                new LongDataType(),
-                                new LongDataType()
-                        ), new MemoryMappedFile(referencesKeysFile)), new AppendOnlyBuffer<>(
-                                new LongListDataType(),
-                                new MemoryMappedFile(referencesValuesFile))
-                );
-
-        var collection = new IndexedDataMap<>(
-                new LongDataMap(new OffHeapMemory()),
-                new AppendOnlyBuffer<>(new GeometryDataType(), new OffHeapMemory()));
-
-        FileUtils.deleteRecursively(cacheDir);
-
-
-//        new PbfEntityReader(
-//                new PbfBlockReader()
-//                        .geometries(true)
-//                        .coordinateMap(coordinateMap)
-//                        .referenceMap(referenceMap))
-//                .stream(Files.newInputStream(path))
-//                .filter(Element.class::isInstance)
-//                .map(Element.class::cast)
-//                .filter(element -> element.getTags().containsKey("building"))
-//                .map(Element::getGeometry)
-//                .filter(Predicates.notNull())
-//                .forEach(collection::put);
-//
-//        var unionedGeometry = new CascadedPolygonUnion(new CollectionAdapter(collection)).union();
-//
-//        var unionGeometries = IntStream.range(0, unionedGeometry.getNumGeometries())
-//                .mapToObj(unionedGeometry::getGeometryN)
-//                .toList();
-//
-//        System.out.println(unionGeometries.size());
-//
-//        FileUtils.deleteRecursively(cacheDir);
-//
-//        logger.info("Finished importing {} into {}", file, database);
-    }
-
-    public static class PolygonUnionConsumer implements Consumer<Element> {
+public record SimplifyOpenStreetMap(Path file,String database,Integer databaseSrid)implements Task{
+
+private static final Logger logger=LoggerFactory.getLogger(ImportOpenStreetMap.class);
+
+@Override public void execute(WorkflowContext context)throws Exception{logger.info("Importing {} into {}",file,database);
+
+var path=file.toAbsolutePath();
+
+var cacheDir=Files.createTempDirectory(Paths.get("."),"cache_");
+
+var coordinatesKeysFile=Files.createFile(cacheDir.resolve("coordinates_keys"));var coordinatesValsFile=Files.createFile(cacheDir.resolve("coordinates_vals"));var coordinateMap=new MonotonicDataMap<>(new MemoryAlignedDataList<>(new PairDataType<>(new LongDataType(),new LongDataType()),new MemoryMappedFile(coordinatesKeysFile)),new AppendOnlyBuffer<>(new LonLatDataType(),new MemoryMappedFile(coordinatesValsFile)));
+
+var referencesKeysFile=Files.createFile(cacheDir.resolve("references_keys"));var referencesValuesFile=Files.createFile(cacheDir.resolve("references_vals"));var referenceMap=new MonotonicDataMap<>(new MemoryAlignedDataList<>(new PairDataType<>(new LongDataType(),new LongDataType()),new MemoryMappedFile(referencesKeysFile)),new AppendOnlyBuffer<>(new LongListDataType(),new MemoryMappedFile(referencesValuesFile)));
+
+var collection=new AppendOnlyBuffer<>(new GeometryDataType(),new OffHeapMemory());
+
+var projectionTransform=new ProjectionTransformer(4326,databaseSrid);
+
+new PbfEntityReader(new PbfBlockReader().geometries(true).coordinateMap(coordinateMap).referenceMap(referenceMap)).stream(Files.newInputStream(path)).filter(Element.class::isInstance).map(Element.class::cast).filter(element->element.getTags().containsKey("building")).map(Element::getGeometry).filter(Predicates.notNull()).map(projectionTransform::transform).forEach(collection::add);
+
+var unionedGeometry=new CascadedPolygonUnion(collection).union();
+
+var dataSource=context.getDataSource(database);var postgresDatabase=new PostgresDatabase(dataSource);
+
+var featureType=new FeatureType("buildings",Map.of("geom",new PropertyType("geom",Geometry.class)));Stream<Feature>stream=IntStream.range(0,unionedGeometry.getNumGeometries()).mapToObj(unionedGeometry::getGeometryN).map(geometry->new FeatureImpl(featureType,Map.of("geom",geometry)));
+
+postgresDatabase.write(new ReadableFeatureSet(){@Override public FeatureType getType()throws IOException{return featureType;}
+
+@Override public Stream<Feature>read()throws IOException{return stream;}});
+
+FileUtils.deleteRecursively(cacheDir);
+
+logger.info("Finished importing {} into {}",file,database);}
+
+public static class PolygonUnionConsumer implements Consumer<Element> {
 
         private final Map<Map<String, Object>, Collection<Element>> groups = new ConcurrentHashMap<>();
 
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/UpdateOpenStreetMap.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/UpdateOpenStreetMap.java
index e4c37f22..6746165f 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/UpdateOpenStreetMap.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/UpdateOpenStreetMap.java
@@ -12,25 +12,34 @@
 
 package org.apache.baremaps.workflow.tasks;
 
+import static org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
+
+import java.io.BufferedInputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.List;
+import java.util.zip.GZIPInputStream;
 import org.apache.baremaps.collection.DataMap;
-import org.apache.baremaps.database.UpdateService;
+import org.apache.baremaps.database.ChangeImporter;
 import org.apache.baremaps.database.collection.PostgresCoordinateMap;
 import org.apache.baremaps.database.collection.PostgresReferenceMap;
 import org.apache.baremaps.database.repository.*;
+import org.apache.baremaps.openstreetmap.function.ChangeEntitiesHandler;
+import org.apache.baremaps.openstreetmap.function.EntityGeometryBuilder;
+import org.apache.baremaps.openstreetmap.function.EntityProjectionTransformer;
+import org.apache.baremaps.openstreetmap.model.Header;
 import org.apache.baremaps.openstreetmap.model.Node;
 import org.apache.baremaps.openstreetmap.model.Relation;
 import org.apache.baremaps.openstreetmap.model.Way;
+import org.apache.baremaps.openstreetmap.state.StateReader;
+import org.apache.baremaps.openstreetmap.xml.XmlChangeReader;
 import org.apache.baremaps.workflow.Task;
 import org.apache.baremaps.workflow.WorkflowContext;
 import org.locationtech.jts.geom.Coordinate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-
 public record UpdateOpenStreetMap(String database, Integer databaseSrid) implements Task {
 
   private static final Logger logger = LoggerFactory.getLogger(UpdateOpenStreetMap.class);
@@ -45,8 +54,7 @@ public record UpdateOpenStreetMap(String database, Integer databaseSrid) impleme
     Repository<Long, Node> nodeRepository = new PostgresNodeRepository(datasource);
     Repository<Long, Way> wayRepository = new PostgresWayRepository(datasource);
     Repository<Long, Relation> relationRepository = new PostgresRelationRepository(datasource);
-    var action =
-      new UpdateService(
+    execute(
         coordinateMap,
         referenceMap,
         headerRepository,
@@ -55,18 +63,42 @@ public record UpdateOpenStreetMap(String database, Integer databaseSrid) impleme
         relationRepository,
         databaseSrid
       );
-    action.call();
     logger.info("Finished updating {}", database);
   }
 
-  public URL resolve(String replicationUrl, Long sequenceNumber, String extension)
-    throws MalformedURLException {
-    String s = String.format("%09d", sequenceNumber);
-    String uri =
-      String.format(
-        "%s/%s/%s/%s.%s",
-        replicationUrl, s.substring(0, 3), s.substring(3, 6), s.substring(6, 9), extension
-      );
+  public static void execute(DataMap<Coordinate> coordinateMap, DataMap<List<Long>> referenceMap,
+                          HeaderRepository headerRepository, Repository<Long, Node> nodeRepository,
+                          Repository<Long, Way> wayRepository, Repository<Long, Relation> relationRepository,
+                          int srid) throws Exception {
+    var header = headerRepository.selectLatest();
+    var replicationUrl = header.getReplicationUrl();
+    var sequenceNumber = header.getReplicationSequenceNumber() + 1;
+
+    var createGeometry = new EntityGeometryBuilder(coordinateMap, referenceMap);
+    var reprojectGeometry = new EntityProjectionTransformer(4326, srid);
+    var prepareGeometries = new ChangeEntitiesHandler(createGeometry.andThen(reprojectGeometry));
+    var prepareChange = consumeThenReturn(prepareGeometries);
+    var saveChange = new ChangeImporter(nodeRepository, wayRepository, relationRepository);
+
+    var changeUrl = resolve(replicationUrl, sequenceNumber, "osc.gz");
+    try (var changeInputStream =
+                 new GZIPInputStream(new BufferedInputStream(changeUrl.openStream()))) {
+      new XmlChangeReader().stream(changeInputStream).map(prepareChange).forEach(saveChange);
+    }
+
+    var stateUrl = resolve(replicationUrl, sequenceNumber, "state.txt");
+    try (var stateInputStream = new BufferedInputStream(stateUrl.openStream())) {
+      var state = new StateReader().state(stateInputStream);
+      headerRepository.put(new Header(state.getSequenceNumber(), state.getTimestamp(),
+              header.getReplicationUrl(), header.getSource(), header.getWritingProgram()));
+    }
+  }
+
+  public static URL resolve(String replicationUrl, Long sequenceNumber, String extension)
+          throws MalformedURLException {
+    var s = String.format("%09d", sequenceNumber);
+    var uri = String.format("%s/%s/%s/%s.%s", replicationUrl, s.substring(0, 3), s.substring(3, 6),
+            s.substring(6, 9), extension);
     return URI.create(uri).toURL();
   }
 }
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateDataTest.java b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateDataTest.java
index 90ef2c56..fb43b195 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateDataTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateDataTest.java
@@ -25,8 +25,6 @@ import org.apache.baremaps.collection.IndexedDataMap;
 import org.apache.baremaps.collection.memory.OnHeapMemory;
 import org.apache.baremaps.collection.type.CoordinateDataType;
 import org.apache.baremaps.collection.type.LongListDataType;
-import org.apache.baremaps.database.ImportService;
-import org.apache.baremaps.database.UpdateService;
 import org.apache.baremaps.database.collection.PostgresCoordinateMap;
 import org.apache.baremaps.database.collection.PostgresReferenceMap;
 import org.apache.baremaps.database.repository.PostgresHeaderRepository;
@@ -36,6 +34,8 @@ import org.apache.baremaps.database.repository.PostgresWayRepository;
 import org.apache.baremaps.openstreetmap.model.Header;
 import org.apache.baremaps.openstreetmap.model.Node;
 import org.apache.baremaps.openstreetmap.model.Way;
+import org.apache.baremaps.workflow.tasks.ImportOpenStreetMap;
+import org.apache.baremaps.workflow.tasks.UpdateOpenStreetMap;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
@@ -57,8 +57,8 @@ class ImportUpdateDataTest extends DatabaseContainerTest {
         new IndexedDataMap<>(new AppendOnlyBuffer<>(new LongListDataType(), new OnHeapMemory()));
 
     // Import data
-    new ImportService(SIMPLE_DATA_OSM_PBF, coordinateMap, referenceMap, headerRepository,
-        nodeRepository, wayRepository, relationRepository, 3857).call();
+    ImportOpenStreetMap.execute(SIMPLE_DATA_OSM_PBF, coordinateMap, referenceMap, headerRepository,
+        nodeRepository, wayRepository, relationRepository, 3857);
 
     headerRepository.put(new Header(0l, LocalDateTime.of(2020, 1, 1, 0, 0, 0, 0),
         "file:///" + SIMPLE_DATA_DIR, "", ""));
@@ -90,9 +90,9 @@ class ImportUpdateDataTest extends DatabaseContainerTest {
     assertNotNull(way);
 
     // Update the database
-    new UpdateService(new PostgresCoordinateMap(dataSource()),
+    UpdateOpenStreetMap.execute(new PostgresCoordinateMap(dataSource()),
         new PostgresReferenceMap(dataSource()), headerRepository, nodeRepository, wayRepository,
-        relationRepository, 3857).call();
+        relationRepository, 3857);
 
     // Check deletions
     assertNull(nodeRepository.get(0l));
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateLiechtensteinTest.java b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateLiechtensteinTest.java
index 3c59ef46..10f653f5 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateLiechtensteinTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateLiechtensteinTest.java
@@ -25,8 +25,6 @@ import org.apache.baremaps.collection.memory.OnHeapMemory;
 import org.apache.baremaps.collection.type.CoordinateDataType;
 import org.apache.baremaps.collection.type.LongListDataType;
 import org.apache.baremaps.database.DiffService;
-import org.apache.baremaps.database.ImportService;
-import org.apache.baremaps.database.UpdateService;
 import org.apache.baremaps.database.collection.PostgresCoordinateMap;
 import org.apache.baremaps.database.collection.PostgresReferenceMap;
 import org.apache.baremaps.database.repository.PostgresHeaderRepository;
@@ -34,6 +32,8 @@ import org.apache.baremaps.database.repository.PostgresNodeRepository;
 import org.apache.baremaps.database.repository.PostgresRelationRepository;
 import org.apache.baremaps.database.repository.PostgresWayRepository;
 import org.apache.baremaps.openstreetmap.model.Header;
+import org.apache.baremaps.workflow.tasks.ImportOpenStreetMap;
+import org.apache.baremaps.workflow.tasks.UpdateOpenStreetMap;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.locationtech.jts.geom.Coordinate;
@@ -54,8 +54,10 @@ class ImportUpdateLiechtensteinTest extends DatabaseContainerTest {
         new IndexedDataMap<>(new AppendOnlyBuffer<>(new LongListDataType(), new OnHeapMemory()));
 
     // Import data
-    new ImportService(LIECHTENSTEIN_OSM_PBF, coordinateMap, referenceMap, headerRepository,
-        nodeRepository, wayRepository, relationRepository, 3857).call();
+    ImportOpenStreetMap.execute(LIECHTENSTEIN_OSM_PBF, coordinateMap, referenceMap,
+        headerRepository,
+        nodeRepository, wayRepository, relationRepository, 3857);
+
     assertEquals(2434l, headerRepository.selectLatest().getReplicationSequenceNumber());
 
     // Fix the replicationUrl so that we can update the database with local files
@@ -69,22 +71,25 @@ class ImportUpdateLiechtensteinTest extends DatabaseContainerTest {
         wayRepository, relationRepository, 3857, 14).call().size());
 
     // Update the database
-    new UpdateService(coordinateMap, referenceMap, headerRepository, nodeRepository, wayRepository,
-        relationRepository, 3857).call();
+    UpdateOpenStreetMap.execute(coordinateMap, referenceMap, headerRepository, nodeRepository,
+        wayRepository,
+        relationRepository, 3857);
     assertEquals(2435l, headerRepository.selectLatest().getReplicationSequenceNumber());
 
     assertEquals(2, new DiffService(coordinateMap, referenceMap, headerRepository, nodeRepository,
         wayRepository, relationRepository, 3857, 14).call().size());
 
-    new UpdateService(coordinateMap, referenceMap, headerRepository, nodeRepository, wayRepository,
-        relationRepository, 3857).call();
+    UpdateOpenStreetMap.execute(coordinateMap, referenceMap, headerRepository, nodeRepository,
+        wayRepository,
+        relationRepository, 3857);
     assertEquals(2436l, headerRepository.selectLatest().getReplicationSequenceNumber());
 
     assertEquals(0, new DiffService(coordinateMap, referenceMap, headerRepository, nodeRepository,
         wayRepository, relationRepository, 3857, 14).call().size());
 
-    new UpdateService(coordinateMap, referenceMap, headerRepository, nodeRepository, wayRepository,
-        relationRepository, 3857).call();
+    UpdateOpenStreetMap.execute(coordinateMap, referenceMap, headerRepository, nodeRepository,
+        wayRepository,
+        relationRepository, 3857);
     assertEquals(2437l, headerRepository.selectLatest().getReplicationSequenceNumber());
   }
 }
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateMonacoTest.java b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateMonacoTest.java
index 1ee51db2..de1fe368 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateMonacoTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/database/database/ImportUpdateMonacoTest.java
@@ -23,8 +23,6 @@ import org.apache.baremaps.collection.memory.OnHeapMemory;
 import org.apache.baremaps.collection.type.CoordinateDataType;
 import org.apache.baremaps.collection.type.LongListDataType;
 import org.apache.baremaps.database.DiffService;
-import org.apache.baremaps.database.ImportService;
-import org.apache.baremaps.database.UpdateService;
 import org.apache.baremaps.database.collection.PostgresCoordinateMap;
 import org.apache.baremaps.database.collection.PostgresReferenceMap;
 import org.apache.baremaps.database.repository.PostgresHeaderRepository;
@@ -33,6 +31,8 @@ import org.apache.baremaps.database.repository.PostgresRelationRepository;
 import org.apache.baremaps.database.repository.PostgresWayRepository;
 import org.apache.baremaps.openstreetmap.model.Header;
 import org.apache.baremaps.testing.TestFiles;
+import org.apache.baremaps.workflow.tasks.ImportOpenStreetMap;
+import org.apache.baremaps.workflow.tasks.UpdateOpenStreetMap;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.locationtech.jts.geom.Coordinate;
@@ -53,9 +53,8 @@ class ImportUpdateMonacoTest extends DatabaseContainerTest {
         new IndexedDataMap<>(new AppendOnlyBuffer<>(new LongListDataType(), new OnHeapMemory()));
 
     // Import data
-    new ImportService(TestFiles.resolve("monaco/monaco-210801.osm.pbf"), coordinateMap,
-        referenceMap, headerRepository, nodeRepository, wayRepository, relationRepository, 3857)
-            .call();
+    ImportOpenStreetMap.execute(TestFiles.resolve("monaco/monaco-210801.osm.pbf"), coordinateMap,
+        referenceMap, headerRepository, nodeRepository, wayRepository, relationRepository, 3857);
 
     assertEquals(3047l, headerRepository.selectLatest().getReplicationSequenceNumber());
 
@@ -72,8 +71,8 @@ class ImportUpdateMonacoTest extends DatabaseContainerTest {
     while (replicationSequenceNumber < 3075) {
       new DiffService(coordinateMap, referenceMap, headerRepository, nodeRepository, wayRepository,
           relationRepository, 3857, 14).call();
-      new UpdateService(coordinateMap, referenceMap, headerRepository, nodeRepository,
-          wayRepository, relationRepository, 3857).call();
+      UpdateOpenStreetMap.execute(coordinateMap, referenceMap, headerRepository, nodeRepository,
+          wayRepository, relationRepository, 3857);
       long nextReplicationSequenceNumber =
           headerRepository.selectLatest().getReplicationSequenceNumber();
       assertEquals(replicationSequenceNumber + 1, nextReplicationSequenceNumber);
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMapTest.java b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMapTest.java
index 668e721b..a3cb4803 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMapTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/SimplifyOpenStreetMapTest.java
@@ -23,7 +23,7 @@ class SimplifyOpenStreetMapTest {
   @Test
   void execute() throws Exception {
     var task = new SimplifyOpenStreetMap(TestFiles.resolve("liechtenstein/liechtenstein.osm.pbf"),
-        "jdbcUrl()", 3857);
+        "jdbc:postgresql://localhost:5432/baremaps?user=baremaps&password=baremaps", 3857);
     task.execute(new WorkflowContext());
   }
 }