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