From 782904a9711268448533e5174051d441b34c07ed Mon Sep 17 00:00:00 2001 From: proto <34919827+protoniuman@users.noreply.github.com> Date: Tue, 22 Feb 2022 17:54:08 +0100 Subject: [PATCH] improvement to the search on hosted resources 1) use the cached version instead of rescanning all the files 2) separating the loading (which include files scanning) and listing logic --- .../api/resource/ArbitraryResource.java | 2 +- .../ArbitraryDataStorageManager.java | 62 +++++++++---------- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index f67423dd..d6eb71ff 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -443,7 +443,7 @@ public class ArbitraryResource { List transactionDataList; - if(query.equals("")){ + if(query==null || query.equals("")){ transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset); }else{ transactionDataList = ArbitraryDataStorageManager.getInstance().searchHostedTransactions(repository,query, limit, offset); diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java index 75e37692..fc97fdf8 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java @@ -261,14 +261,8 @@ public class ArbitraryDataStorageManager extends Thread { } - // Hosted data - - public List listAllHostedTransactions(Repository repository, Integer limit, Integer offset) { - // Load from cache if we can, to avoid disk reads - if (this.hostedTransactions != null) { - return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset); - } - + public List loadAllHostedTransactions(Repository repository){ + List arbitraryTransactionDataList = new ArrayList<>(); // Find all hosted paths @@ -299,10 +293,21 @@ public class ArbitraryDataStorageManager extends Thread { // Sort by newest first arbitraryTransactionDataList.sort(Comparator.comparingLong(ArbitraryTransactionData::getTimestamp).reversed()); - // Update cache - this.hostedTransactions = arbitraryTransactionDataList; - return ArbitraryTransactionUtils.limitOffsetTransactions(arbitraryTransactionDataList, limit, offset); + return arbitraryTransactionDataList; + } + // Hosted data + + public List listAllHostedTransactions(Repository repository, Integer limit, Integer offset) { + // Load from cache if we can, to avoid disk reads + + if (this.hostedTransactions != null) { + return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset); + } + + this.hostedTransactions = this.loadAllHostedTransactions(repository); + + return ArbitraryTransactionUtils.limitOffsetTransactions(this.hostedTransactions, limit, offset); } /** @@ -316,37 +321,28 @@ public class ArbitraryDataStorageManager extends Thread { */ public List searchHostedTransactions(Repository repository, String query, Integer limit, Integer offset) { - // Load from cache if we can (results that exists for the same query), to avoid disk reads + // Load from results cache if we can (results that exists for the same query), to avoid disk reads if (this.searchResultsTransactions != null && this.searchQuery.equals(query.toLowerCase())) { return ArbitraryTransactionUtils.limitOffsetTransactions(this.searchResultsTransactions, limit, offset); } + + // Using cache if we can, to avoid disk reads + if (this.hostedTransactions == null) { + this.hostedTransactions = this.loadAllHostedTransactions(repository); + } + this.searchQuery=query.toLowerCase();//set the searchQuery so that it can be checked on the next call List searchResultsList = new ArrayList<>(); - // Find all hosted paths - List allPaths = this.findAllHostedPaths(); - - // Loop through each path and attempt to match it to a signature, and check if it's a match with our search query - for (Path path : allPaths) { + // Loop through cached hostedTransactions + for (ArbitraryTransactionData atd : this.hostedTransactions) { try { - String[] contents = path.toFile().list(); - if (contents == null || contents.length == 0) { - // Ignore empty directories - continue; - } + + if(atd.getName().toLowerCase().contains(this.searchQuery) || atd.getIdentifier().toLowerCase().contains(this.searchQuery)) + searchResultsList.add(atd); - String signature58 = path.getFileName().toString(); - byte[] signature = Base58.decode(signature58); - TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); - if (transactionData == null || transactionData.getType() != Transaction.TransactionType.ARBITRARY) { - continue; - } - ArbitraryTransactionData arbitraryTransactionData =(ArbitraryTransactionData) transactionData; - if(arbitraryTransactionData.getName().toLowerCase().contains(this.searchQuery) || arbitraryTransactionData.getIdentifier().toLowerCase().contains(this.searchQuery)) - searchResultsList.add(arbitraryTransactionData); - - } catch (DataException e) { + } catch (Exception e) { continue; } }