forked from Qortal/qortal
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
This commit is contained in:
parent
a3753c01bc
commit
782904a971
@ -443,7 +443,7 @@ public class ArbitraryResource {
|
||||
|
||||
List<ArbitraryTransactionData> 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);
|
||||
|
@ -261,13 +261,7 @@ public class ArbitraryDataStorageManager extends Thread {
|
||||
}
|
||||
|
||||
|
||||
// Hosted data
|
||||
|
||||
public List<ArbitraryTransactionData> 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<ArbitraryTransactionData> loadAllHostedTransactions(Repository repository){
|
||||
|
||||
List<ArbitraryTransactionData> arbitraryTransactionDataList = new ArrayList<>();
|
||||
|
||||
@ -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<ArbitraryTransactionData> 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<ArbitraryTransactionData> 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<ArbitraryTransactionData> searchResultsList = new ArrayList<>();
|
||||
|
||||
// Find all hosted paths
|
||||
List<Path> 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;
|
||||
}
|
||||
|
||||
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);
|
||||
if(atd.getName().toLowerCase().contains(this.searchQuery) || atd.getIdentifier().toLowerCase().contains(this.searchQuery))
|
||||
searchResultsList.add(atd);
|
||||
|
||||
} catch (DataException e) {
|
||||
} catch (Exception e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user