protected Query prepareQuery()

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