in baremaps-core/src/main/java/org/apache/baremaps/tilestore/postgres/PostgresTileStore.java [124:204]
protected Query prepareQuery(TileCoord tileCoord) {
// Initialize a builder for the tile sql
var tileSql = new StringBuilder();
tileSql.append("SELECT ");
// Iterate over the layers and keep track of the number of layers and parameters included in the
// final sql
var layers = tileset.getVectorLayers();
var layerCount = 0;
var paramCount = 0;
for (var layer : layers) {
// Initialize a builder for the layer sql
var layerSql = new StringBuilder();
var layerHead = String.format("(SELECT ST_AsMVT(mvtGeom.*, '%s') FROM (", layer.getId());
layerSql.append(layerHead);
// Iterate over the queries and keep track of the number of queries included in the final
// sql
var queries = layer.getQueries();
var queryCount = 0;
for (var query : queries) {
// Only include the sql if the zoom level is in the range
if (query.getMinzoom() <= tileCoord.z() && tileCoord.z() < query.getMaxzoom()) {
// Add a union between queries
if (queryCount > 0) {
layerSql.append("UNION ALL ");
}
// Add the sql to the layer sql
var querySql = query.getSql().trim()
.replaceAll("\\s+", " ")
.replace(";", "")
.replace("?", "??")
.replace("$zoom", String.valueOf(tileCoord.z()))
.replace("$z", String.valueOf(tileCoord.z()))
.replace("$x", String.valueOf(tileCoord.x()))
.replace("$y", String.valueOf(tileCoord.y()));
var querySqlWithParams =
postgresVersion >= 16 ? prepareNewQuery(querySql) : prepareLegacyQuery(querySql);
layerSql.append(querySqlWithParams);
// Increase the parameter count (e.g. ?) and sql count
paramCount += 6;
queryCount++;
}
}
// Add the tail of the layer sql
var layerQueryTail = ") AS mvtGeom)";
layerSql.append(layerQueryTail);
// Only include the layer sql if queries were included for this layer
if (queryCount > 0) {
// Add the concatenation between layer queries
if (layerCount > 0) {
tileSql.append(" || ");
}
// Add the layer sql to the mvt sql
tileSql.append(layerSql);
// Increase the layer count
layerCount++;
}
}
// Add the tail of the tile sql
var tileQueryTail = " AS mvtTile";
tileSql.append(tileQueryTail);
// Format the sql query
var sql = tileSql.toString().replaceAll("\\s+", " ");
return new Query(sql, paramCount);
}