From f1efae79c8774064ebe2052e563dbd185b6c8d5c Mon Sep 17 00:00:00 2001 From: catbref Date: Fri, 14 Aug 2020 11:54:33 +0100 Subject: [PATCH] Speed-ups for some AT-related SQL queries --- .../api/websocket/TradeOffersWebSocket.java | 2 +- .../repository/hsqldb/HSQLDBATRepository.java | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java index 78f2ce2a..0de31972 100644 --- a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java @@ -76,7 +76,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener { List crossChainOfferSummaries; try (final Repository repository = RepositoryManager.getRepository()) { - // Find any new trade ATs since this block + // Find any new/changed trade ATs since this block final Boolean isFinished = null; final Integer dataByteOffset = null; final Long expectedValue = null; diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBATRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBATRepository.java index c107f7bb..833137a2 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBATRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBATRepository.java @@ -10,6 +10,8 @@ import org.qortal.data.at.ATStateData; import org.qortal.repository.ATRepository; import org.qortal.repository.DataException; +import com.google.common.primitives.Longs; + public class HSQLDBATRepository implements ATRepository { protected HSQLDBRepository repository; @@ -298,8 +300,14 @@ public class HSQLDBATRepository implements ATRepository { + "CROSS JOIN LATERAL(" + "SELECT height, created_when, state_data, state_hash, fees, is_initial " + "FROM ATStates " - + "WHERE ATStates.AT_address = ATs.AT_address " - + "ORDER BY height DESC " + + "WHERE ATStates.AT_address = ATs.AT_address "); + + if (minimumFinalHeight != null) { + sql.append("AND height >= "); + sql.append(minimumFinalHeight); + } + + sql.append( "ORDER BY height DESC " + "LIMIT 1 " + ") AS FinalATStates " + "WHERE code_hash = ? "); @@ -313,19 +321,14 @@ public class HSQLDBATRepository implements ATRepository { } if (dataByteOffset != null && expectedValue != null) { - sql.append("AND RAWTOHEX(SUBSTRING(state_data FROM ? FOR 8)) = ? "); + sql.append("AND SUBSTRING(state_data FROM ? FOR 8) = ? "); - // We convert our long to hex Java-side to control endian - String expectedHexValue = String.format("%016x", expectedValue); // left-zero-padding and conversion + // We convert our long on Java-side to control endian + byte[] rawExpectedValue = Longs.toByteArray(expectedValue); // SQL binary data offsets start at 1 bindParams.add(dataByteOffset + 1); - bindParams.add(expectedHexValue); - } - - if (minimumFinalHeight != null) { - sql.append("AND height >= "); - sql.append(minimumFinalHeight); + bindParams.add(rawExpectedValue); } sql.append(" ORDER BY height ");