From f8f7366994a9ffeed1ddf03a025f091c33140ced Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 10 Dec 2017 12:15:13 +0100 Subject: [PATCH] improved report tab performance (tags are now cached locally) (#243) --- .../budgetmaster/logic/tag/TagCache.java | 67 +++++++++++++++++++ .../budgetmaster/logic/tag/TagHandler.java | 9 +++ 2 files changed, 76 insertions(+) create mode 100644 BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java new file mode 100644 index 000000000..12638c224 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java @@ -0,0 +1,67 @@ +package de.deadlocker8.budgetmaster.logic.tag; + +import java.util.ArrayList; +import java.util.HashMap; + +import de.deadlocker8.budgetmaster.logic.payment.Payment; +import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; + +public class TagCache +{ + private HashMap<Integer, ArrayList<Tag>> normalPaymentTagCache; + private HashMap<Integer, ArrayList<Tag>> repeatingPaymentTagCache; + + public TagCache() + { + clear(); + } + + public void clear() + { + normalPaymentTagCache = new HashMap<>(); + repeatingPaymentTagCache = new HashMap<>(); + } + + public void addTags(Payment payment, ArrayList<Tag> tags) + { + if(payment instanceof RepeatingPaymentEntry) + { + repeatingPaymentTagCache.put(((RepeatingPaymentEntry)payment).getRepeatingPaymentID(), tags); + } + else + { + normalPaymentTagCache.put(payment.getID(), tags); + } + } + + public ArrayList<Tag> getTags(Payment payment) + { + if(payment instanceof RepeatingPaymentEntry) + { + RepeatingPaymentEntry repeatingPayment = (RepeatingPaymentEntry)payment; + if(repeatingPaymentTagCache.containsKey(repeatingPayment.getRepeatingPaymentID())) + { + return repeatingPaymentTagCache.get(repeatingPayment.getRepeatingPaymentID()); + } + } + else + { + if(normalPaymentTagCache.containsKey(payment.getID())) + { + return normalPaymentTagCache.get(payment.getID()); + } + } + + return null; + } + + public HashMap<Integer, ArrayList<Tag>> getNormalPaymentTagCache() + { + return normalPaymentTagCache; + } + + public HashMap<Integer, ArrayList<Tag>> getRepeatingPaymentTagCache() + { + return repeatingPaymentTagCache; + } +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java index d4f0f1731..a6fb9dfe3 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java @@ -11,15 +11,22 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection; public class TagHandler { private Settings settings; + private TagCache tagCache; public TagHandler(Settings settings) { this.settings = settings; + this.tagCache = new TagCache(); } public ArrayList<Tag> getTags(Payment payment) throws Exception { ArrayList<Tag> tags = new ArrayList<>(); + ArrayList<Tag> cachedTags = tagCache.getTags(payment); + if(cachedTags != null) + { + return cachedTags; + } ServerTagConnection connection = new ServerTagConnection(settings); @@ -32,6 +39,8 @@ public class TagHandler tags.addAll(connection.getAllTagsForRepeatingPayment(((RepeatingPaymentEntry)payment).getRepeatingPaymentID())); } + tagCache.addTags(payment, tags); + return tags; } -- GitLab