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

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


The following commit(s) were added to refs/heads/745-daylight by this push:
     new 74241cb0 Assume that osm change files are standalone
74241cb0 is described below

commit 74241cb0b202bee95a2f794b3433098e6e654ee8
Author: Bertil Chapuis <[email protected]>
AuthorDate: Thu Sep 28 21:43:12 2023 +0200

    Assume that osm change files are standalone
---
 .../baremaps/workflow/tasks/ImportOsmChange.java   | 57 ++++++++++++++++++----
 .../baremaps/workflow/tasks/ImportOsmPbf.java      | 41 ++++------------
 2 files changed, 58 insertions(+), 40 deletions(-)

diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmChange.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmChange.java
index b6112682..5bc0c085 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmChange.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmChange.java
@@ -17,15 +17,22 @@ import static 
org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
 import java.io.BufferedInputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import org.apache.baremaps.openstreetmap.function.ChangeEntitiesHandler;
-import org.apache.baremaps.openstreetmap.function.EntityGeometryBuilder;
-import org.apache.baremaps.openstreetmap.function.EntityProjectionTransformer;
+import java.nio.file.Paths;
+
+import org.apache.baremaps.database.collection.*;
+import org.apache.baremaps.database.memory.MemoryMappedDirectory;
+import org.apache.baremaps.database.type.LongDataType;
+import org.apache.baremaps.database.type.LongListDataType;
+import org.apache.baremaps.database.type.PairDataType;
+import org.apache.baremaps.database.type.geometry.LonLatDataType;
+import org.apache.baremaps.openstreetmap.function.*;
 import org.apache.baremaps.openstreetmap.postgres.*;
 import org.apache.baremaps.openstreetmap.repository.ChangeImporter;
 import org.apache.baremaps.openstreetmap.xml.XmlChangeReader;
 import org.apache.baremaps.utils.Compression;
 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;
 
@@ -41,22 +48,54 @@ public record ImportOsmChange(Path file, String database, 
Integer srid,
   @Override
   public void execute(WorkflowContext context) throws Exception {
     var datasource = context.getDataSource(database);
+    var path = file.toAbsolutePath();
+
+    var cacheDir = Files.createTempDirectory(Paths.get("."), "cache_");
+
+    DataMap<Long, Coordinate> coordinateMap;
+    if (Files.size(path) > 1 << 30) {
+      var coordinateDir = 
Files.createDirectories(cacheDir.resolve("coordinate_keys"));
+      coordinateMap = new MemoryAlignedDataMap<>(
+              new LonLatDataType(),
+              new MemoryMappedDirectory(coordinateDir));
+    } else {
+      var coordinateKeysDir = 
Files.createDirectories(cacheDir.resolve("coordinate_keys"));
+      var coordinateValuesDir = 
Files.createDirectories(cacheDir.resolve("coordinate_vals"));
+      coordinateMap =
+              new MonotonicDataMap<>(
+                      new MemoryAlignedDataList<>(
+                              new PairDataType<>(new LongDataType(), new 
LongDataType()),
+                              new MemoryMappedDirectory(coordinateKeysDir)),
+                      new AppendOnlyBuffer<>(
+                              new LonLatDataType(),
+                              new MemoryMappedDirectory(coordinateValuesDir)));
+    }
 
-    var coordinateMap = new PostgresCoordinateMap(datasource);
-    var referenceMap = new PostgresReferenceMap(datasource);
+    var referenceKeysDir = 
Files.createDirectory(cacheDir.resolve("reference_keys"));
+    var referenceValuesDir = 
Files.createDirectory(cacheDir.resolve("reference_vals"));
+    var referenceMap =
+            new MonotonicDataMap<>(
+                    new MemoryAlignedDataList<>(
+                            new PairDataType<>(new LongDataType(), new 
LongDataType()),
+                            new MemoryMappedDirectory(referenceKeysDir)),
+                    new AppendOnlyBuffer<>(
+                            new LongListDataType(),
+                            new MemoryMappedDirectory(referenceValuesDir)));
 
     var nodeRepository = new PostgresNodeRepository(datasource);
     var wayRepository = new PostgresWayRepository(datasource);
     var relationRepository = new PostgresRelationRepository(datasource);
 
-    var createGeometry = new EntityGeometryBuilder(coordinateMap, 
referenceMap);
+    var coordinateMapBuilder = new CoordinateMapBuilder(coordinateMap);
+    var referenceMapBuilder = new ReferenceMapBuilder(referenceMap);
+    var buildGeometry = new EntityGeometryBuilder(coordinateMap, referenceMap);
     var reprojectGeometry = new EntityProjectionTransformer(4326, srid);
-    var prepareGeometries = new 
ChangeEntitiesHandler(createGeometry.andThen(reprojectGeometry));
-    var prepareChange = consumeThenReturn(prepareGeometries);
+    var prepareGeometries = 
coordinateMapBuilder.andThen(referenceMapBuilder).andThen(buildGeometry).andThen(reprojectGeometry);
+    var prepareChange = consumeThenReturn(new 
ChangeEntitiesHandler(prepareGeometries));
     var importChange = new ChangeImporter(nodeRepository, wayRepository, 
relationRepository);
 
     try (var changeInputStream =
-        new 
BufferedInputStream(compression.decompress(Files.newInputStream(file)))) {
+        new 
BufferedInputStream(compression.decompress(Files.newInputStream(path)))) {
       new 
XmlChangeReader().stream(changeInputStream).map(prepareChange).forEach(importChange);
     }
   }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmPbf.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmPbf.java
index 662cd7ca..5ec5c7b7 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmPbf.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportOsmPbf.java
@@ -99,46 +99,25 @@ public record ImportOsmPbf(Path file, Object database, 
Integer databaseSrid)
                 new LongListDataType(),
                 new MemoryMappedDirectory(referenceValuesDir)));
 
-    execute(
-        path,
-        coordinateMap,
-        referenceMap,
-        headerRepository,
-        nodeRepository,
-        wayRepository,
-        relationRepository,
-        databaseSrid);
-
-    FileUtils.deleteRecursively(cacheDir);
-  }
-
-  public static void execute(
-      Path path,
-      DataMap<Long, Coordinate> coordinateMap,
-      DataMap<Long, List<Long>> referenceMap,
-      HeaderRepository headerRepository,
-      Repository<Long, Node> nodeRepository,
-      Repository<Long, Way> wayRepository,
-      Repository<Long, Relation> relationRepository,
-      Integer databaseSrid) throws IOException {
-
     // configure the block reader
     var reader = new PbfBlockReader()
-        .geometries(true)
-        .projection(databaseSrid)
-        .coordinateMap(coordinateMap)
-        .referenceMap(referenceMap);
+            .geometries(true)
+            .projection(databaseSrid)
+            .coordinateMap(coordinateMap)
+            .referenceMap(referenceMap);
 
     // configure the block importer
     var importer = new BlockImporter(
-        headerRepository,
-        nodeRepository,
-        wayRepository,
-        relationRepository);
+            headerRepository,
+            nodeRepository,
+            wayRepository,
+            relationRepository);
 
     // Stream and process the blocks
     try (var input = Files.newInputStream(path)) {
       StreamUtils.batch(reader.stream(input)).forEach(importer);
     }
+
+    FileUtils.deleteRecursively(cacheDir);
   }
 }

Reply via email to