BlueMap/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java

355 lines
8.7 KiB
Java

/*
* This file is part of BlueMap, licensed under the MIT License (MIT).
*
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package de.bluecolored.bluemap.core.storage.sql.commandset;
import de.bluecolored.bluemap.core.storage.sql.Database;
import org.intellij.lang.annotations.Language;
public class PostgreSQLCommandSet extends AbstractCommandSet {
public PostgreSQLCommandSet(Database db) {
super(db);
}
@Override
@Language("postgresql")
public String createMapTableStatement() {
return """
CREATE TABLE IF NOT EXISTS bluemap_map (
id SMALLSERIAL PRIMARY KEY,
map_id VARCHAR(190) UNIQUE NOT NULL
)
""";
}
@Override
@Language("postgresql")
public String createCompressionTableStatement() {
return """
CREATE TABLE IF NOT EXISTS bluemap_map_tile_compression (
id SMALLSERIAL PRIMARY KEY,
compression VARCHAR(190) UNIQUE NOT NULL
)
""";
}
@Override
@Language("postgresql")
public String createMapMetaTableStatement() {
return """
CREATE TABLE IF NOT EXISTS bluemap_map_meta (
map SMALLINT NOT NULL
REFERENCES bluemap_map(id)
ON UPDATE RESTRICT
ON DELETE CASCADE,
key VARCHAR(190) NOT NULL,
value BYTEA NOT NULL,
PRIMARY KEY (map, key)
)
""";
}
@Override
@Language("postgresql")
public String createMapTileTableStatement() {
return """
CREATE TABLE IF NOT EXISTS bluemap_map_tile (
map SMALLINT NOT NULL
REFERENCES bluemap_map (id)
ON UPDATE RESTRICT
ON DELETE CASCADE,
lod SMALLINT NOT NULL,
x INT NOT NULL,
z INT NOT NULL,
compression SMALLINT NOT NULL
REFERENCES bluemap_map_tile_compression (id)
ON UPDATE RESTRICT
ON DELETE CASCADE,
data BYTEA NOT NULL,
PRIMARY KEY (map, lod, x, z)
)
""";
}
@Override
@Language("postgresql")
public String fixLegacyCompressionIdsStatement() {
return """
UPDATE bluemap_map_tile_compression
SET compression = CONCAT('bluemap:', compression)
WHERE NOT compression LIKE '%:%'
""";
}
@Override
@Language("postgresql")
public String writeMapTileStatement() {
return """
INSERT
INTO bluemap_map_tile (map, lod, x, z, compression, data)
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT (map, lod, x, z)
DO UPDATE SET
compression = excluded.compression,
data = excluded.data
""";
}
@Override
@Language("postgresql")
public String readMapTileStatement() {
return """
SELECT t.data
FROM bluemap_map_tile t
INNER JOIN bluemap_map m
ON t.map = m.id
INNER JOIN bluemap_map_tile_compression c
ON t.compression = c.id
WHERE m.map_id = ?
AND t.lod = ?
AND t.x = ?
AND t.z = ?
AND c.compression = ?
""";
}
@Override
@Language("postgresql")
public String deleteMapTileStatement() {
return """
DELETE
FROM bluemap_map_tile
WHERE map = ?
AND lod = ?
AND x = ?
AND z = ?
AND compression = ?
""";
}
@Override
@Language("postgresql")
public String hasMapTileStatement() {
return """
SELECT COUNT(*) > 0
FROM bluemap_map_tile t
INNER JOIN bluemap_map m
ON t.map = m.id
INNER JOIN bluemap_map_tile_compression c
ON t.compression = c.id
WHERE m.map_id = ?
AND t.lod = ?
AND t.x = ?
AND t.z = ?
AND c.compression = ?
""";
}
@Override
@Language("postgresql")
public String countAllMapTilesStatement() {
return """
SELECT COUNT(*)
FROM bluemap_map_tile t
INNER JOIN bluemap_map m
ON t.map = m.id
WHERE m.map_id = ?
""";
}
@Override
@Language("postgresql")
public String purgeMapTilesStatement() {
return """
DELETE
FROM bluemap_map_tile
WHERE CTID IN (
SELECT CTID
FROM bluemap_map_tile t
WHERE t.map = ?
LIMIT ?
)
""";
}
@Override
@Language("postgresql")
public String listMapTilesStatement() {
return """
SELECT t.x, t.z
FROM bluemap_map_tile t
INNER JOIN bluemap_map m
ON t.map = m.id
INNER JOIN bluemap_map_tile_compression c
ON t.compression = c.id
WHERE m.map_id = ?
AND t.lod = ?
AND c.compression = ?
LIMIT ? OFFSET ?
""";
}
@Override
@Language("postgresql")
public String writeMapMetaStatement() {
return """
INSERT
INTO bluemap_map_meta (map, key, value)
VALUES (?, ?, ?)
ON CONFLICT (map, key)
DO UPDATE SET
value = excluded.value
""";
}
@Override
@Language("postgresql")
public String readMapMetaStatement() {
return """
SELECT t.value
FROM bluemap_map_meta t
INNER JOIN bluemap_map m
ON t.map = m.id
WHERE m.map_id = ?
AND t.key = ?
""";
}
@Override
@Language("postgresql")
public String deleteMapMetaStatement() {
return """
DELETE
FROM bluemap_map_meta
WHERE map = ?
AND key = ?
""";
}
@Override
@Language("postgresql")
public String hasMapMetaStatement() {
return """
SELECT COUNT(*) > 0
FROM bluemap_map_meta t
INNER JOIN bluemap_map m
ON t.map = m.id
WHERE m.map_id = ?
AND t.key = ?
""";
}
@Override
@Language("postgresql")
public String purgeMapTileTableStatement() {
return """
DELETE
FROM bluemap_map_tile
WHERE map = ?
""";
}
@Override
@Language("postgresql")
public String purgeMapMetaTableStatement() {
return """
DELETE
FROM bluemap_map_meta
WHERE map = ?
""";
}
@Override
@Language("postgresql")
public String deleteMapStatement() {
return """
DELETE
FROM bluemap_map
WHERE map = ?
""";
}
@Override
@Language("postgresql")
public String hasMapStatement() {
return """
SELECT COUNT(*) > 0
FROM bluemap_map m
WHERE m.map_id = ?
""";
}
@Override
@Language("postgresql")
public String listMapIdsStatement() {
return """
SELECT map_id
FROM bluemap_map m
LIMIT ? OFFSET ?
""";
}
@Override
@Language("postgresql")
public String findMapKeyStatement() {
return """
SELECT id
FROM bluemap_map
WHERE map_id = ?
""";
}
@Override
@Language("postgresql")
public String createMapKeyStatement() {
return """
INSERT
INTO bluemap_map (map_id)
VALUES (?)
""";
}
@Override
@Language("postgresql")
public String findCompressionKeyStatement() {
return """
SELECT id
FROM bluemap_map_tile_compression
WHERE compression = ?
""";
}
@Override
@Language("postgresql")
public String createCompressionKeyStatement() {
return """
INSERT
INTO bluemap_map_tile_compression (compression)
VALUES (?)
""";
}
}