From cbed6418e714e84ac274b5b56140e3c5fa40c22a Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 31 Oct 2021 21:07:14 +0000 Subject: [PATCH] Added ability to filter arbitrary transactions by name when searching. --- .../qortal/api/resource/ArbitraryResource.java | 6 ++++-- .../api/resource/TransactionsResource.java | 2 +- .../arbitrary/ArbitraryDataCleanupManager.java | 2 +- .../arbitrary/ArbitraryDataManager.java | 2 +- .../repository/NamesDatabaseIntegrityCheck.java | 2 +- .../qortal/repository/TransactionRepository.java | 2 +- .../repository/hsqldb/HSQLDBDatabaseUpdates.java | 4 +++- .../transaction/HSQLDBTransactionRepository.java | 11 ++++++++--- .../org/qortal/test/api/ArbitraryApiTests.java | 16 +++++++++------- 9 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 55358430..3867a81f 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -89,7 +89,9 @@ public class ArbitraryResource { }) public List searchTransactions(@QueryParam("startBlock") Integer startBlock, @QueryParam("blockLimit") Integer blockLimit, @QueryParam("txGroupId") Integer txGroupId, - @QueryParam("service") Integer service, @QueryParam("address") String address, @Parameter( + @QueryParam("service") Integer service, + @QueryParam("name") String name, + @QueryParam("address") String address, @Parameter( description = "whether to include confirmed, unconfirmed or both", required = true ) @QueryParam("confirmationStatus") ConfirmationStatus confirmationStatus, @Parameter( @@ -112,7 +114,7 @@ public class ArbitraryResource { try (final Repository repository = RepositoryManager.getRepository()) { List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(startBlock, blockLimit, txGroupId, txTypes, - service, address, confirmationStatus, limit, offset, reverse); + service, name, address, confirmationStatus, limit, offset, reverse); // Expand signatures to transactions List transactions = new ArrayList(signatures.size()); diff --git a/src/main/java/org/qortal/api/resource/TransactionsResource.java b/src/main/java/org/qortal/api/resource/TransactionsResource.java index 585dac0b..d2ec8aa4 100644 --- a/src/main/java/org/qortal/api/resource/TransactionsResource.java +++ b/src/main/java/org/qortal/api/resource/TransactionsResource.java @@ -348,7 +348,7 @@ public class TransactionsResource { try (final Repository repository = RepositoryManager.getRepository()) { List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(startBlock, blockLimit, txGroupId, - txTypes, null, address, confirmationStatus, limit, offset, reverse); + txTypes, null, null, address, confirmationStatus, limit, offset, reverse); // Expand signatures to transactions List transactions = new ArrayList<>(signatures.size()); diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index 7e1a3256..cad574ea 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -90,7 +90,7 @@ public class ArbitraryDataCleanupManager extends Thread { // Any arbitrary transactions we want to fetch data for? try (final Repository repository = RepositoryManager.getRepository()) { - List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(null, null, null, ARBITRARY_TX_TYPE, null, null, ConfirmationStatus.BOTH, limit, offset, true); + List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(null, null, null, ARBITRARY_TX_TYPE, null, null, null, ConfirmationStatus.BOTH, limit, offset, true); // LOGGER.info("Found {} arbitrary transactions at offset: {}, limit: {}", signatures.size(), offset, limit); if (signatures == null || signatures.isEmpty()) { offset = 0; diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java index f4ed4f3e..b1d1e8c3 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java @@ -128,7 +128,7 @@ public class ArbitraryDataManager extends Thread { // Any arbitrary transactions we want to fetch data for? try (final Repository repository = RepositoryManager.getRepository()) { - List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(null, null, null, ARBITRARY_TX_TYPE, null, null, ConfirmationStatus.BOTH, limit, offset, true); + List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria(null, null, null, ARBITRARY_TX_TYPE, null, null, null, ConfirmationStatus.BOTH, limit, offset, true); // LOGGER.info("Found {} arbitrary transactions at offset: {}, limit: {}", signatures.size(), offset, limit); if (signatures == null || signatures.isEmpty()) { offset = 0; diff --git a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java index f12bd14a..12d6c3bc 100644 --- a/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java +++ b/src/main/java/org/qortal/controller/repository/NamesDatabaseIntegrityCheck.java @@ -305,7 +305,7 @@ public class NamesDatabaseIntegrityCheck { // Fetch all the confirmed REGISTER_NAME transaction signatures List signatures = repository.getTransactionRepository().getSignaturesMatchingCriteria( null, null, null, ALL_NAME_TX_TYPE, null, null, - ConfirmationStatus.CONFIRMED, null, null, false); + null, ConfirmationStatus.CONFIRMED, null, null, false); for (byte[] signature : signatures) { TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); diff --git a/src/main/java/org/qortal/repository/TransactionRepository.java b/src/main/java/org/qortal/repository/TransactionRepository.java index 4e5999eb..093309a4 100644 --- a/src/main/java/org/qortal/repository/TransactionRepository.java +++ b/src/main/java/org/qortal/repository/TransactionRepository.java @@ -70,7 +70,7 @@ public interface TransactionRepository { * @throws DataException */ public List getSignaturesMatchingCriteria(Integer startBlock, Integer blockLimit, Integer txGroupId, - List txTypes, Integer service, String address, + List txTypes, Integer service, String name, String address, ConfirmationStatus confirmationStatus, Integer limit, Integer offset, Boolean reverse) throws DataException; /** diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java index 1cc3e7f9..1202225a 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java @@ -907,8 +907,10 @@ public class HSQLDBDatabaseUpdates { stmt.execute("ALTER TABLE ArbitraryTransactions ADD size INT NOT NULL DEFAULT 0"); // Larger data files need to be split into chunks, for easier transmission and greater decentralization stmt.execute("ALTER TABLE ArbitraryTransactions ADD chunk_hashes ArbitraryDataHashes"); - // For finding data files by hash + // For finding transactions by file hash stmt.execute("CREATE INDEX ArbitraryDataIndex ON ArbitraryTransactions (is_data_raw, data)"); + // For finding transactions by registered name + stmt.execute("CREATE INDEX ArbitraryNameIndex ON ArbitraryTransactions (name)"); break; case 38: diff --git a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java index a8062e2d..17664ddc 100644 --- a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java @@ -386,7 +386,7 @@ public class HSQLDBTransactionRepository implements TransactionRepository { @Override public List getSignaturesMatchingCriteria(Integer startBlock, Integer blockLimit, Integer txGroupId, - List txTypes, Integer service, String address, + List txTypes, Integer service, String name, String address, ConfirmationStatus confirmationStatus, Integer limit, Integer offset, Boolean reverse) throws DataException { List signatures = new ArrayList<>(); @@ -412,8 +412,8 @@ public class HSQLDBTransactionRepository implements TransactionRepository { signatureColumn = "TransactionParticipants.signature"; } - if (service != null) { - // This is for ARBITRARY transactions + if (service != null || name != null) { + // These are for ARBITRARY transactions tables.append(" LEFT OUTER JOIN ArbitraryTransactions ON ArbitraryTransactions.signature = Transactions.signature"); } @@ -469,6 +469,11 @@ public class HSQLDBTransactionRepository implements TransactionRepository { bindParams.add(service); } + if (name != null) { + whereClauses.add("ArbitraryTransactions.name = ?"); + bindParams.add(name); + } + if (hasAddress) { whereClauses.add("TransactionParticipants.participant = ?"); bindParams.add(address); diff --git a/src/test/java/org/qortal/test/api/ArbitraryApiTests.java b/src/test/java/org/qortal/test/api/ArbitraryApiTests.java index 2b80fb51..5cf141b4 100644 --- a/src/test/java/org/qortal/test/api/ArbitraryApiTests.java +++ b/src/test/java/org/qortal/test/api/ArbitraryApiTests.java @@ -23,6 +23,7 @@ public class ArbitraryApiTests extends ApiCommon { Integer[] blockLimits = new Integer[] { null, 0, 1, 999999999 }; Integer[] txGroupIds = new Integer[] { null, 0, 1, 999999999 }; Integer[] services = new Integer[] { null, 0, 1, 999999999 }; + String[] names = new String[] { null, "Test" }; String[] addresses = new String[] { null, this.aliceAddress }; ConfirmationStatus[] confirmationStatuses = new ConfirmationStatus[] { ConfirmationStatus.UNCONFIRMED, ConfirmationStatus.CONFIRMED, ConfirmationStatus.BOTH }; @@ -30,14 +31,15 @@ public class ArbitraryApiTests extends ApiCommon { for (Integer blockLimit : blockLimits) for (Integer txGroupId : txGroupIds) for (Integer service : services) - for (String address : addresses) - for (ConfirmationStatus confirmationStatus : confirmationStatuses) { - if (confirmationStatus != ConfirmationStatus.CONFIRMED && (startBlock != null || blockLimit != null)) - continue; + for (String name : names) + for (String address : addresses) + for (ConfirmationStatus confirmationStatus : confirmationStatuses) { + if (confirmationStatus != ConfirmationStatus.CONFIRMED && (startBlock != null || blockLimit != null)) + continue; - assertNotNull(this.arbitraryResource.searchTransactions(startBlock, blockLimit, txGroupId, service, address, confirmationStatus, 20, null, null)); - assertNotNull(this.arbitraryResource.searchTransactions(startBlock, blockLimit, txGroupId, service, address, confirmationStatus, 1, 1, true)); - } + assertNotNull(this.arbitraryResource.searchTransactions(startBlock, blockLimit, txGroupId, service, name, address, confirmationStatus, 20, null, null)); + assertNotNull(this.arbitraryResource.searchTransactions(startBlock, blockLimit, txGroupId, service, name, address, confirmationStatus, 1, 1, true)); + } } }