From: Damyan Ivanov Date: Wed, 9 Jan 2019 20:53:20 +0000 (+0000) Subject: gap-fill missing parent accounts in the hierarchy X-Git-Tag: v0.3~86 X-Git-Url: https://git.ktnx.net/?a=commitdiff_plain;h=771759a4a8c5b064526de1b4681ad38e47ef4b40;p=mobile-ledger.git gap-fill missing parent accounts in the hierarchy --- diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java index 7b898593..5f241f4f 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -44,6 +44,8 @@ import java.net.MalformedURLException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; +import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -112,6 +114,7 @@ public class RetrieveTransactionsTask success = false; ArrayList accountList = new ArrayList<>(); ArrayList transactionList = new ArrayList<>(); + HashMap accountNames = new HashMap<>(); LedgerAccount lastAccount = null; Data.backgroundTaskCount.incrementAndGet(); try { @@ -169,7 +172,30 @@ public class RetrieveTransactionsTask profile.storeAccount(acct_name); lastAccount = new LedgerAccount(acct_name); + + // make sure the parent account(s) are present, + // synthesising them if necessary + String parentName = lastAccount.getParentName(); + if (parentName != null) { + Stack toAppend = new Stack<>(); + while (parentName != null) { + if (accountNames.containsKey(parentName)) break; + toAppend.push(parentName); + parentName = new LedgerAccount(parentName) + .getParentName(); + } + while (!toAppend.isEmpty()) { + String aName = toAppend.pop(); + LedgerAccount acc = new LedgerAccount(aName); + accountList.add(acc); + L(String.format("gap-filling with %s", aName)); + accountNames.put(aName, null); + profile.storeAccount(aName); + } + } + accountList.add(lastAccount); + accountNames.put(acct_name, null); state = ParserState.EXPECTING_ACCOUNT_AMOUNT; L("→ expecting account amount");