|
15 | 15 | import net.coreprotect.config.Config; |
16 | 16 | import net.coreprotect.config.ConfigHandler; |
17 | 17 | import net.coreprotect.database.Database; |
| 18 | +import net.coreprotect.database.DuckDBLookupQuery; |
18 | 19 | import net.coreprotect.database.statement.UserStatement; |
19 | 20 | import net.coreprotect.utility.BlockUtils; |
20 | 21 | import net.coreprotect.utility.DatabaseUtils; |
@@ -72,7 +73,9 @@ public static List<String[]> performLookup(Block block, int offset) { |
72 | 73 | } |
73 | 74 |
|
74 | 75 | try (Statement statement = connection.createStatement()) { |
75 | | - String query = "SELECT time," + ConfigHandler.databaseType.getUserColumn() + ",action,type,data,blockdata,rolled_back FROM " + ConfigHandler.prefix + "block " + WorldUtils.getWidIndex("block") + "WHERE wid = " + worldId + " AND x = " + x + " AND z = " + z + " AND y = " + y + " AND time > " + checkTime + " ORDER BY rowid DESC"; |
| 76 | + String table = DuckDBLookupQuery.spatialTable(connection, "block", worldId, x, x, z, z, "spatial_rows"); |
| 77 | + String index = ConfigHandler.databaseType.isDuckDB() ? "" : WorldUtils.getWidIndex("block"); |
| 78 | + String query = "SELECT time," + ConfigHandler.databaseType.getUserColumn() + ",action,type,data,blockdata,rolled_back FROM " + table + " " + index + "WHERE wid = " + worldId + " AND x = " + x + " AND z = " + z + " AND y = " + y + " AND time > " + checkTime + " ORDER BY rowid DESC"; |
76 | 79 |
|
77 | 80 | try (ResultSet results = statement.executeQuery(query)) { |
78 | 81 | while (results.next()) { |
@@ -147,7 +150,10 @@ public static List<BlockResult> performLookup(Block block, LookupOptions options |
147 | 150 | int worldId = WorldUtils.getWorldId(worldName); |
148 | 151 |
|
149 | 152 | StringBuilder query = new StringBuilder("SELECT time," + ConfigHandler.databaseType.getUserColumn() + ",action,type,data,blockdata,rolled_back,wid,x,y,z FROM "); |
150 | | - query.append(ConfigHandler.prefix).append("block ").append(WorldUtils.getWidIndex("block")); |
| 153 | + query.append(DuckDBLookupQuery.spatialTable(connection, "block", worldId, x, x, z, z, "spatial_rows")).append(' '); |
| 154 | + if (!ConfigHandler.databaseType.isDuckDB()) { |
| 155 | + query.append(WorldUtils.getWidIndex("block")); |
| 156 | + } |
151 | 157 | query.append("WHERE wid = ? AND x = ? AND z = ? AND y = ? AND time > ?"); |
152 | 158 | if (userId != null) { |
153 | 159 | query.append(" AND ").append(ConfigHandler.databaseType.getUserColumn()).append(" = ?"); |
@@ -223,30 +229,36 @@ public static List<ContainerResult> performContainerLookup(LookupOptions options |
223 | 229 | return result; |
224 | 230 | } |
225 | 231 |
|
226 | | - StringBuilder containerWhere = new StringBuilder(); |
227 | | - filter.appendWhere(containerWhere, "container_rows"); |
228 | | - StringBuilder entityWhere = new StringBuilder(); |
229 | | - filter.appendEntityContainerWhere(entityWhere, "entity_rows"); |
230 | | - |
231 | | - StringBuilder query = new StringBuilder("SELECT * FROM ("); |
232 | | - query.append("SELECT 0 AS source,container_rows.rowid AS id,container_rows.time,container_rows.").append(ConfigHandler.databaseType.getUserColumn()).append(",container_rows.wid,container_rows.x,container_rows.y,container_rows.z,container_rows.action,container_rows.type,container_rows.data,container_rows.amount,container_rows.metadata,container_rows.rolled_back FROM ") |
233 | | - .append(ConfigHandler.prefix).append("container container_rows ").append(containerWhere); |
234 | | - query.append(" UNION ALL "); |
235 | | - query.append("SELECT 1 AS source,entity_rows.rowid AS id,entity_rows.time,entity_rows.").append(ConfigHandler.databaseType.getUserColumn()).append(",spawn_rows.current_wid AS wid,spawn_rows.x,spawn_rows.y,spawn_rows.z,entity_rows.action,entity_rows.type,entity_rows.data,entity_rows.amount,entity_rows.metadata,entity_rows.rolled_back FROM ") |
236 | | - .append(ConfigHandler.prefix).append("entity_container entity_rows JOIN ").append(ConfigHandler.prefix).append("entity_spawn spawn_rows ON spawn_rows.rowid=entity_rows.entity_spawn_rowid ").append(entityWhere); |
237 | | - query.append(") AS container_lookup ORDER BY time DESC,source DESC,id DESC"); |
238 | | - filter.appendLimit(query); |
239 | | - |
240 | | - try (PreparedStatement statement = connection.prepareStatement(query.toString())) { |
241 | | - int parameterIndex = filter.bind(statement); |
242 | | - filter.bindEntityContainer(statement, parameterIndex); |
243 | | - |
244 | | - try (ResultSet results = statement.executeQuery()) { |
245 | | - while (results.next()) { |
246 | | - result.add(parseContainerResult(connection, results)); |
| 232 | + boolean snapshot = filter.beginDuckDBSnapshot(connection); |
| 233 | + try { |
| 234 | + StringBuilder containerWhere = new StringBuilder(); |
| 235 | + filter.appendWhere(containerWhere, "container_rows"); |
| 236 | + StringBuilder entityWhere = new StringBuilder(); |
| 237 | + filter.appendEntityContainerWhere(entityWhere, "entity_rows", "spawn_rows"); |
| 238 | + |
| 239 | + StringBuilder query = new StringBuilder("SELECT * FROM ("); |
| 240 | + query.append("SELECT 0 AS source,container_rows.rowid AS id,container_rows.time,container_rows.").append(ConfigHandler.databaseType.getUserColumn()).append(",container_rows.wid,container_rows.x,container_rows.y,container_rows.z,container_rows.action,container_rows.type,container_rows.data,container_rows.amount,container_rows.metadata,container_rows.rolled_back FROM ") |
| 241 | + .append(filter.table(connection, "container", "container_rows")).append(' ').append(containerWhere); |
| 242 | + query.append(" UNION ALL "); |
| 243 | + query.append("SELECT 1 AS source,entity_rows.rowid AS id,entity_rows.time,entity_rows.").append(ConfigHandler.databaseType.getUserColumn()).append(",spawn_rows.current_wid AS wid,spawn_rows.x,spawn_rows.y,spawn_rows.z,entity_rows.action,entity_rows.type,entity_rows.data,entity_rows.amount,entity_rows.metadata,entity_rows.rolled_back FROM ") |
| 244 | + .append(filter.entityContainerTable(connection, "entity_rows")).append(" JOIN ").append(ConfigHandler.prefix).append("entity_spawn spawn_rows ON spawn_rows.rowid=entity_rows.entity_spawn_rowid ").append(entityWhere); |
| 245 | + query.append(") AS container_lookup ORDER BY time DESC,source DESC,id DESC"); |
| 246 | + filter.appendLimit(query); |
| 247 | + |
| 248 | + try (PreparedStatement statement = connection.prepareStatement(query.toString())) { |
| 249 | + int parameterIndex = filter.bind(statement); |
| 250 | + filter.bindEntityContainer(statement, parameterIndex); |
| 251 | + |
| 252 | + try (ResultSet results = statement.executeQuery()) { |
| 253 | + while (results.next()) { |
| 254 | + result.add(parseContainerResult(connection, results)); |
| 255 | + } |
247 | 256 | } |
248 | 257 | } |
249 | 258 | } |
| 259 | + finally { |
| 260 | + filter.endDuckDBSnapshot(connection, snapshot); |
| 261 | + } |
250 | 262 | } |
251 | 263 | catch (Exception e) { |
252 | 264 | ErrorReporter.report(e); |
|
0 commit comments