Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import de.ii.xtraplatform.base.domain.LogContext;
import de.ii.xtraplatform.base.domain.LogContext.MARKER;
import de.ii.xtraplatform.base.domain.LogContext.MdcCloseable;
import de.ii.xtraplatform.base.domain.MapStreams;
import de.ii.xtraplatform.base.domain.resiliency.OptionalVolatileCapability;
import de.ii.xtraplatform.base.domain.resiliency.VolatileRegistry;
import de.ii.xtraplatform.base.domain.util.Tuple;
Expand Down Expand Up @@ -52,6 +53,7 @@
import de.ii.xtraplatform.tiles.domain.TileGenerationParameters;
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
import de.ii.xtraplatform.tiles.domain.TileGenerator;
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
Expand Down Expand Up @@ -91,7 +93,6 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
Expand Down Expand Up @@ -333,10 +334,10 @@ private TileStore getTileStore(
.computeIfAbsent(
cache.getStorage(),
storage -> {
Optional<TileStorePartitions> partitions =
Optional<TileMatrixPartitions> partitions =
cache.getStorage() == Storage.PER_JOB
? Optional.of(
new TileStorePartitions(
new TileMatrixPartitions(
seeding().get().getOptions().getEffectiveJobSize()))
: Optional.empty();

Expand Down Expand Up @@ -480,20 +481,6 @@ private Map<String, Range<Integer>> capCacheRanges(
.collect(MapStreams.toMap());
}

interface MapStreams {
static <T, U> Collector<Map.Entry<T, U>, ?, Map<T, U>> toMap() {
return Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue);
}

static <T, U> Collector<Map.Entry<T, U>, ?, Map<T, U>> toUnmodifiableMap() {
return Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue);
}

static <T, U> Collector<Map.Entry<T, U>, ?, ImmutableMap<T, U>> toImmutableMap() {
return ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue);
}
}

static String clean(String id) {
return id.replace("-tiles", "").replace("tiles-", "");
}
Expand Down Expand Up @@ -648,14 +635,14 @@ public Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
if (!sourcedTilesets.isEmpty()) {
for (TileCache cache : generatorCaches) {
if (cache.isSeeded()) {
mergeCoverageInto(cache.getCoverage(sourcedTilesets), coverage);
TileSeeding.mergeCoverageInto(cache.getCoverage(sourcedTilesets), coverage);
}
}
}
if (!combinedTilesets.isEmpty()) {
for (TileCache cache : combinerCaches) {
if (cache.isSeeded()) {
mergeCoverageInto(cache.getCoverage(combinedTilesets), coverage);
TileSeeding.mergeCoverageInto(cache.getCoverage(combinedTilesets), coverage);
}
}
}
Expand All @@ -672,12 +659,12 @@ public Map<String, Map<String, Set<TileMatrixSetLimits>>> getRasterCoverage(

for (TileCache cache : generatorCaches) {
if (cache.isSeeded()) {
mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
TileSeeding.mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
}
}
for (TileCache cache : combinerCaches) {
if (cache.isSeeded()) {
mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
TileSeeding.mergeCoverageInto(cache.getRasterCoverage(validTilesets), coverage);
}
}

Expand Down Expand Up @@ -790,24 +777,6 @@ public Map<String, String> getRasterStorageInfo(
return result;
}

private static void mergeCoverageInto(
Map<String, Map<String, Set<TileMatrixSetLimits>>> source,
Map<String, Map<String, Set<TileMatrixSetLimits>>> target) {
source.forEach(
(tileset, tms) -> {
if (!target.containsKey(tileset)) {
target.put(tileset, new LinkedHashMap<>());
}
tms.forEach(
(tmsId, limits) -> {
if (!target.get(tileset).containsKey(tmsId)) {
target.get(tileset).put(tmsId, new LinkedHashSet<>());
}
target.get(tileset).get(tmsId).addAll(limits);
});
});
}

@Override
public void setupSeeding(TileSeedingJobSet jobSet) throws IOException {
for (Tuple<TileCache, String> cache : getCaches(jobSet)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import de.ii.xtraplatform.jobs.domain.JobResult;
import de.ii.xtraplatform.jobs.domain.JobSet;
import de.ii.xtraplatform.tiles.domain.TileGenerationParameters;
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
import de.ii.xtraplatform.tiles.domain.TileProvider;
import de.ii.xtraplatform.tiles.domain.TileSeedingJob;
Expand Down Expand Up @@ -136,8 +137,8 @@ public JobResult process(Job job, JobSet jobSet, Consumer<Job> pushJob) {
tileProvider.seeding().get().getCoverage(seedingJobSet.getTileSetParameters());
Map<String, Map<String, Set<TileMatrixSetLimits>>> rasterCoverage =
tileProvider.seeding().get().getRasterCoverage(seedingJobSet.getTileSetParameters());
TileStorePartitions tileStorePartitions =
new TileStorePartitions(
TileMatrixPartitions tileStorePartitions =
new TileMatrixPartitions(
tileProvider.seeding().get().getOptions().getEffectiveJobSize());

Map<String, List<String>> rasterForVector =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import de.ii.xtraplatform.tiles.domain.MbtilesMetadata;
import de.ii.xtraplatform.tiles.domain.MbtilesTileset;
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
Expand Down Expand Up @@ -64,7 +65,7 @@ static TileStore readWrite(
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
Map<String, Set<String>> tileMatrixSets,
Optional<TileMatrixSetRepository> tileMatrixSetRepository,
Optional<TileStorePartitions> partitions,
Optional<TileMatrixPartitions> partitions,
boolean seeded) {
Map<String, MbtilesTileset> tileSets = new ConcurrentHashMap<>();
try {
Expand Down Expand Up @@ -99,7 +100,7 @@ static TileStore readWrite(
private final ResourceStore rootStore;
private final Map<String, Map<String, TileGenerationSchema>> tileSchemas;
private final Map<String, MbtilesTileset> tileSets;
private final Optional<TileStorePartitions> partitions;
private final Optional<TileMatrixPartitions> partitions;
// the tile matrix set is only necessary for writable MBTiles files,
// i.e., caches that are used for seeding
private final Optional<TileMatrixSetRepository> tileMatrixSetRepository;
Expand All @@ -109,7 +110,7 @@ private TileStoreMbTiles(
ResourceStore rootStore,
Map<String, MbtilesTileset> tileSets,
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
Optional<TileStorePartitions> partitions,
Optional<TileMatrixPartitions> partitions,
Optional<TileMatrixSetRepository> tileMatrixSetRepository) {
this.providerId = providerId;
this.rootStore = rootStore;
Expand Down Expand Up @@ -433,7 +434,7 @@ private static MbtilesTileset createTileSet(
String tileset,
String tileMatrixSet,
List<VectorLayer> vectorLayers,
Optional<TileStorePartitions> partitions,
Optional<TileMatrixPartitions> partitions,
boolean isRaster,
boolean seeded)
throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import de.ii.xtraplatform.tiles.domain.Cache;
import de.ii.xtraplatform.tiles.domain.Cache.Storage;
import de.ii.xtraplatform.tiles.domain.TileGenerationSchema;
import de.ii.xtraplatform.tiles.domain.TileMatrixPartitions;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetBase;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetRepository;
Expand Down Expand Up @@ -55,7 +56,7 @@ public class TileStoreMulti implements TileStore, TileStore.Staging {
private final Map<String, Map<String, List<TileMatrixSetLimits>>> dirty;
private final Map<String, Set<String>> tileMatrixSets;
private final Optional<TileMatrixSetRepository> tileMatrixSetRepository;
private final Optional<TileStorePartitions> partitions;
private final Optional<TileMatrixPartitions> partitions;
private Tuple<TileStore, ResourceStore> staging;

public TileStoreMulti(
Expand All @@ -65,7 +66,7 @@ public TileStoreMulti(
Map<String, Map<String, TileGenerationSchema>> tileSchemas,
Map<String, Set<String>> tileMatrixSets,
Optional<TileMatrixSetRepository> tileMatrixSetRepository,
Optional<TileStorePartitions> partitions) {
Optional<TileMatrixPartitions> partitions) {
this.cacheStore = cacheStore;
this.storage = storage;
this.tileSetName = tileSetName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,29 @@ public void walkTilesetsAndLimits(
}
}

@Override
public void walkTilesetsAndLimits(
Set<String> tilesets,
Map<String, Map<String, Range<Integer>>> tmsRanges,
Map<String, Optional<BoundingBox>> boundingBoxes,
Map<String, Map<String, TileMatrixSetBase>> customTileMatrixSets,
LimitsVisitor limitsVisitor)
throws IOException {
for (Map.Entry<String, Map<String, Range<Integer>>> entry : tmsRanges.entrySet()) {
String tileset = entry.getKey();

if (tilesets.contains(tileset)) {
Map<String, Range<Integer>> ranges = entry.getValue();
Optional<BoundingBox> boundingBox = boundingBoxes.get(tileset);

if (boundingBox.isPresent()) {
walkLimits(
tileset, ranges, boundingBox.get(), customTileMatrixSets.get(tileset), limitsVisitor);
}
}
}
}

@Override
public void walkTileSeedingJob(
TileSeedingJob job,
Expand Down Expand Up @@ -176,6 +199,26 @@ private void walkLimits(
}
}

private void walkLimits(
String tileset,
Map<String, Range<Integer>> tmsRanges,
BoundingBox boundingBox,
Map<String, TileMatrixSetBase> customTileMatrixSets,
LimitsVisitor limitsVisitor)
throws IOException {
for (Map.Entry<String, Range<Integer>> entry : tmsRanges.entrySet()) {
TileMatrixSetBase tileMatrixSet = customTileMatrixSets.get(entry.getKey());
BoundingBox bbox = getBbox(boundingBox, tileMatrixSet);

List<? extends TileMatrixSetLimits> allLimits =
tileMatrixSet.getLimitsList(MinMax.of(entry.getValue()), bbox);

for (TileMatrixSetLimits limits : allLimits) {
limitsVisitor.visit(tileset, tileMatrixSet, limits);
}
}
}

private BoundingBox getBbox(BoundingBox boundingBox, TileMatrixSetBase tileMatrixSet) {
return Objects.equals(boundingBox.getEpsgCrs(), tileMatrixSet.getCrs())
? boundingBox
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import de.ii.xtraplatform.base.domain.LogContext;
import de.ii.xtraplatform.tiles.app.FeatureEncoderMVT;
import de.ii.xtraplatform.tiles.app.SqlHelper;
import de.ii.xtraplatform.tiles.app.TileStorePartitions;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -91,7 +90,7 @@ public void release() {}
private final Path tilesetPath;
private final Mutex mutex;
private final MbtilesMetadata metadata;
private final Optional<TileStorePartitions> partitions;
private final Optional<TileMatrixPartitions> partitions;
private final boolean numericTileIds;
private final String tileMapTable;
private final String tileBlobsTable;
Expand All @@ -103,7 +102,7 @@ public MbtilesTileset(Path tilesetPath, boolean isRaster) {
public MbtilesTileset(
Path tilesetPath,
MbtilesMetadata metadata,
Optional<TileStorePartitions> partitions,
Optional<TileMatrixPartitions> partitions,
boolean isRaster,
boolean seeded)
throws IOException {
Expand All @@ -119,7 +118,7 @@ public MbtilesTileset(
private MbtilesTileset(
Path tilesetPath,
MbtilesMetadata metadata,
Optional<TileStorePartitions> partitions,
Optional<TileMatrixPartitions> partitions,
boolean isRaster,
boolean mustExist,
Mutex mutex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ static MinMax of(Range<Integer> range) {
.build();
}

static MinMax of(int min, int max) {
return new ImmutableMinMax.Builder().min(min).max(max).build();
}

int getMin();

int getMax();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,33 @@ default Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
return coverage;
}

default Map<String, Map<String, Set<TileMatrixSetLimits>>> getCoverage(
Map<String, TileGenerationParameters> tilesets,
TileWalker tileWalker,
Map<String, Map<String, Range<Integer>>> tmsRanges,
Map<String, Map<String, TileMatrixSetBase>> customTileMatrixSets)
throws IOException {
Map<String, Optional<BoundingBox>> boundingBoxes = getBoundingBoxes(tilesets);
Map<String, Map<String, Set<TileMatrixSetLimits>>> coverage = new LinkedHashMap<>();

tileWalker.walkTilesetsAndLimits(
tilesets.keySet(),
tmsRanges,
boundingBoxes,
customTileMatrixSets,
(tileset, tms, limits) -> {
if (!coverage.containsKey(tileset)) {
coverage.put(tileset, new LinkedHashMap<>());
}
if (!coverage.get(tileset).containsKey(tms.getId())) {
coverage.get(tileset).put(tms.getId(), new LinkedHashSet<>());
}
coverage.get(tileset).get(tms.getId()).add(limits);
});

return coverage;
}

default Map<String, Optional<BoundingBox>> getBoundingBoxes(
Map<String, TileGenerationParameters> tilesets) {
return tilesets.entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,17 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package de.ii.xtraplatform.tiles.app;
package de.ii.xtraplatform.tiles.domain;

import de.ii.xtraplatform.tiles.domain.ImmutableTileSubMatrix;
import de.ii.xtraplatform.tiles.domain.TileMatrixSetLimits;
import de.ii.xtraplatform.tiles.domain.TileSubMatrix;
import java.util.LinkedHashSet;
import java.util.Set;

public class TileStorePartitions {
public class TileMatrixPartitions {
final int maxTilesPerPartition;
final int singlePartitionLevel;
final int singleRowCol;

public TileStorePartitions(int maxTilesPerPartition) {
public TileMatrixPartitions(int maxTilesPerPartition) {
this.maxTilesPerPartition = maxTilesPerPartition;
this.singleRowCol = (int) Math.sqrt(maxTilesPerPartition);
this.singlePartitionLevel = (int) (Math.log(singleRowCol) / Math.log(2));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import de.ii.xtraplatform.crs.domain.CrsTransformationException;
import de.ii.xtraplatform.crs.domain.CrsTransformerFactory;
import de.ii.xtraplatform.crs.domain.EpsgCrs;
import de.ii.xtraplatform.tiles.app.TileMatrixSetImpl;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URI;
Expand All @@ -24,6 +25,10 @@
/** This class provides derived information from a tile matrix set. */
public interface TileMatrixSet extends TileMatrixSetBase {

static TileMatrixSet custom(TileMatrixSetData data) {
return new TileMatrixSetImpl(data);
}

Logger LOGGER = LoggerFactory.getLogger(TileMatrixSet.class);

/**
Expand Down
Loading