Re: [GNC-dev] Convert Imap to Flat

2018-11-07 Thread John Ralls


> On Nov 7, 2018, at 5:14 PM, Geert Janssens  wrote:
> 
> Op woensdag 7 november 2018 01:10:03 CET schreef John Ralls:
>>> On Nov 7, 2018, at 5:52 AM, Geert Janssens 
>>> wrote:> 
>>> Op maandag 5 november 2018 23:27:31 CET schreef John Ralls:
 That’s not to say that we shouldn’t also do everything we can to speed up
 the code--it’s really slow--and certainly suspending UI events while
 computing the import matches is a good idea.
 
 There’s something else going wrong, though: convert_imap_bayes_to_flat
 calls xaccAccountBeginEdit at the start and xaccAccountCommitEdit at the
 end. That should raise the edit level and prevent any interior calls to
 xaccAccountCommitEdit from doing anything.
>>> 
>>> This doesn't look wrong per se to me.
>>> convert_imap_account_bayes_to_flat is run once for each account. So there
>>> will still be the same number of gui refreshes as there are accounts. I
>>> don't think we can reduce this further on the account begin/commit level.
>>> A complete gui refresh suspend may do better.
>> 
>> Each account has its own import map and any particular import affects only
>> one account’s map, so there should be exactly one effective, i.e. with
>> edit_level == 1, commit and exactly one UI refresh.
> 
> The new CSV importer can handle imports into multiple accounts (on both 
> sides), but that's tangential to this issue.
> 
> The conversion as you describe it would be a lazy conversion: only convert 
> maps on an as needed basis. An interesting idea which hadn't occurred to me 
> and also different from how it's implemented.
> Right now the conversion of *all* import maps of all accounts is initiated 
> the 
> first time any import map (bayes of course) is needed. So even if the import 
> requires only one account's maps, all maps will be converted in one go. Hence 
> the iteration over all accounts.
> 
> I don't know how 2.6.21 would handle partly converted bayes import maps. I do 
> know as it is now the conversion is designed to be run as long as the feature 
> flag is not set. That would also have to change if we would like to go for 
> the 
> lazy conversion.
> 
> The advantage of such lazy conversion is the time required to convert is 
> spread over several import runs, so each conversion is likely to take less 
> time. The disadvantage is we risk ending up with books that carry 
> hierarchical 
> bayes data for an eternity and hence gnucash has to keep code around to 
> handle 
> with it. In a full conversion in one go scenario we can at some point 2 major 
> releases from now declare this unsupported as we only guarantee backwards 
> compatibility for 1 major release series.
> 
> What *is* a problem with the one-shot-convert-all scenario is that it takes 
> noticable time (in some cases even horribly long) and we don't inform the 
> user 
> of what's happening. The conversion should really have been initiated from 
> the 
> gui with a progress bar showing something is going on and indicating how far 
> the process has run.

Sorry, I’d forgotten that it’s an all-at-once. Given that it’s controlled by a 
feature-flag that’s a reasonable design decision. It points to another possible 
slow-down: Even if convert_imap_account_bayes() takes negligible time on an 
empty map, walking a large account tree looking for maps won’t. We can fix that 
and speed up the eventual conversion a bit by constructing a list or vector of 
accounts while loading the book: The SQL backends can use a single query, 
SELECT guid FROM accounts WHERE guid = (SELECT DISTINCT a.guid FROM accounts = 
a, slots = k WHERE a.guid = s.obj_guid AND s.name = 'import-map-bayes’);[not 
tested, might need a tweak or two]. The XML backend would just add the account 
guid to the list. 

While working with imaps we should see if we can combine the flatting and the 
transfer account name->guid conversion so that they need only one pass through 
the map to accomplish both in cases where both are needed.

I agree that a dialog box informing the user of what’s going on would be good. 
Given the performance problems with progress bars on Windows with HiDPI 
displays I’m not so sure about that part, especially since generating a useful 
progress measure is a problem for most of our progress bars.

Regards,
John Ralls
___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-07 Thread Geert Janssens
Op woensdag 7 november 2018 01:10:03 CET schreef John Ralls:
> > On Nov 7, 2018, at 5:52 AM, Geert Janssens 
> > wrote:> 
> > Op maandag 5 november 2018 23:27:31 CET schreef John Ralls:
> >> That’s not to say that we shouldn’t also do everything we can to speed up
> >> the code--it’s really slow--and certainly suspending UI events while
> >> computing the import matches is a good idea.
> >> 
> >> There’s something else going wrong, though: convert_imap_bayes_to_flat
> >> calls xaccAccountBeginEdit at the start and xaccAccountCommitEdit at the
> >> end. That should raise the edit level and prevent any interior calls to
> >> xaccAccountCommitEdit from doing anything.
> > 
> > This doesn't look wrong per se to me.
> > convert_imap_account_bayes_to_flat is run once for each account. So there
> > will still be the same number of gui refreshes as there are accounts. I
> > don't think we can reduce this further on the account begin/commit level.
> > A complete gui refresh suspend may do better.
> 
> Each account has its own import map and any particular import affects only
> one account’s map, so there should be exactly one effective, i.e. with
> edit_level == 1, commit and exactly one UI refresh.

The new CSV importer can handle imports into multiple accounts (on both 
sides), but that's tangential to this issue.

The conversion as you describe it would be a lazy conversion: only convert 
maps on an as needed basis. An interesting idea which hadn't occurred to me 
and also different from how it's implemented.
Right now the conversion of *all* import maps of all accounts is initiated the 
first time any import map (bayes of course) is needed. So even if the import 
requires only one account's maps, all maps will be converted in one go. Hence 
the iteration over all accounts.

I don't know how 2.6.21 would handle partly converted bayes import maps. I do 
know as it is now the conversion is designed to be run as long as the feature 
flag is not set. That would also have to change if we would like to go for the 
lazy conversion.

The advantage of such lazy conversion is the time required to convert is 
spread over several import runs, so each conversion is likely to take less 
time. The disadvantage is we risk ending up with books that carry hierarchical 
bayes data for an eternity and hence gnucash has to keep code around to handle 
with it. In a full conversion in one go scenario we can at some point 2 major 
releases from now declare this unsupported as we only guarantee backwards 
compatibility for 1 major release series.

What *is* a problem with the one-shot-convert-all scenario is that it takes 
noticable time (in some cases even horribly long) and we don't inform the user 
of what's happening. The conversion should really have been initiated from the 
gui with a progress bar showing something is going on and indicating how far 
the process has run.

> If there’s more than
> one of either inside a call to convert_imap_account_bayes() then
> something’s broken at the QofInstance level. If we’re calling
> convert_imap_account_bayes() on a particular account more than once in a
> session then there’s something wrong with the decision logic that calls it.
> Bob’s printf-profile suggests at least the latter and  your
> "imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit
> and xaccAccountCommitEdit at some point” suggests the former.
> 
> I suppose Aaron thought that running it on an empty or non-existent map
> would take negligible time; if that’s not the case then we can simply check
> for that and quit, but it should be checked in the profiler before we add
> any code.

Agreed

Geert


___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-06 Thread John Ralls


> On Nov 7, 2018, at 5:52 AM, Geert Janssens  wrote:
> 
> Op maandag 5 november 2018 23:27:31 CET schreef John Ralls:
>>> On Nov 6, 2018, at 2:50 AM, Geert Janssens 
>>> wrote:> 
>>> Op maandag 5 november 2018 17:07:25 CET schreef Robert Fewell:
 Hi,
 I was poking around with the CSV importer and I noticed the following,
 this
 may also be an issue with other importers on first use after creating a
 new
 file...
 With a new empty xml file, I used a one line transaction csv file with
 appropriate settings and the 'Account' set to 'Assets:Current
 Assets:Checking Account' and observed the following when I got to the
 match
 page...
 
 With the 'Checking Account' register open it would partly show the
 imported
 transactions, (this can be fixed by suspending GUI changes which I was
 going to propose in a PR) and the register would reload seven times.
 This reloading is caused by the triggering of the
 'imap_convert_bayes_to_flat' function and as it is a new file you would
 not
 expect it to do any thing but it does. Adding a few print statements I
 get
 the following...
 
 matchmap_find_destination
 imap_convert_bayes_to_flat
 convert_imap_account_bayes_to_flat 'Assets'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Current Assets'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Checking Account'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Liabilities'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Income'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Expenses'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Equity'
 
 gnc_split_register_load called for account 'Assets:Current
 
 Assets:Checking Account' with list of 1
 
 As you can see, seven accounts get updated forcing the register reload
 seven times, (not sure why those other accounts force a reload either),
 and
 this gets even worse if this first import is 100 transactions which would
 equate to 700 reloads. I have not worked out why all these accounts are
 updated or why after the first pass the converted flag is not set/noticed
 there by eliminating the convert for the rest of the transactions, it
 only
 seems to be noticed on subsequent imports.
 
 You also get this behaviour if you start the 'Import Map Dialogue' which
 may be the source of a report about that dialogue freezing but that needs
 more investigating.
>>> 
>>> This calls gnc_account_imap_get_info_bayes, which also calls
>>> imap_convert_bayes_to_flat so the it will trigger the same account
>>> refreshes.> 
 Any idea why these accounts are updated and why it runs on every import
 transaction row ?
>>> 
>>> Why the accounts are updated: while only a run in the debugger will verify
>>> it, this is what I have gathered from reading the code:
>>> 
>>> imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit
>>> and xaccAccountCommitEdit at some point. This happens because it changes
>>> the account's kvp frames that store the import maps.
>>> 
>>> On the other side, the register code has set a watch on the register's
>>> account(s) via the component manager. So each time the account signals a
>>> change (or more precisely a successful run of xaccAccountCommitEdit) the
>>> component manager will tell the register to refresh itself.
>>> 
>>> As you suggest you can probably disable this by a call to
>>> gnc_suspend_gui_refresh.
>>> 
>>> Why it runs on every import transaction row ? I suspect this is because
>>> there are no imap records stored yet and hence the feature flag that
>>> blocks the conversion is not set yet. So for each transaction it will try
>>> to do the conversion, find there's no converted imap record to store and
>>> skip setting the feature flag. This will probably continue forever if the
>>> user doesn't use bayesian matching at all.
>>> This is a difficult issue to solve. We don't want to set the flat_bayes
>>> conversion flag if there are no bayes maps because that would needlessly
>>> break backwards compatibility. We could make the conversion code more
>>> careful and have it only commit to accounts if there really are changes
>>> to commit. And add a run time flag that signals the conversion 

Re: [GNC-dev] Convert Imap to Flat

2018-11-06 Thread Geert Janssens
Op maandag 5 november 2018 23:27:31 CET schreef John Ralls:
> > On Nov 6, 2018, at 2:50 AM, Geert Janssens 
> > wrote:> 
> > Op maandag 5 november 2018 17:07:25 CET schreef Robert Fewell:
> >> Hi,
> >> I was poking around with the CSV importer and I noticed the following,
> >> this
> >> may also be an issue with other importers on first use after creating a
> >> new
> >> file...
> >> With a new empty xml file, I used a one line transaction csv file with
> >> appropriate settings and the 'Account' set to 'Assets:Current
> >> Assets:Checking Account' and observed the following when I got to the
> >> match
> >> page...
> >> 
> >> With the 'Checking Account' register open it would partly show the
> >> imported
> >> transactions, (this can be fixed by suspending GUI changes which I was
> >> going to propose in a PR) and the register would reload seven times.
> >> This reloading is caused by the triggering of the
> >> 'imap_convert_bayes_to_flat' function and as it is a new file you would
> >> not
> >> expect it to do any thing but it does. Adding a few print statements I
> >> get
> >> the following...
> >> 
> >> matchmap_find_destination
> >> imap_convert_bayes_to_flat
> >> convert_imap_account_bayes_to_flat 'Assets'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Current Assets'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Checking Account'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Liabilities'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Income'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Expenses'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> convert_imap_account_bayes_to_flat 'Equity'
> >> 
> >>  gnc_split_register_load called for account 'Assets:Current
> >> 
> >> Assets:Checking Account' with list of 1
> >> 
> >> As you can see, seven accounts get updated forcing the register reload
> >> seven times, (not sure why those other accounts force a reload either),
> >> and
> >> this gets even worse if this first import is 100 transactions which would
> >> equate to 700 reloads. I have not worked out why all these accounts are
> >> updated or why after the first pass the converted flag is not set/noticed
> >> there by eliminating the convert for the rest of the transactions, it
> >> only
> >> seems to be noticed on subsequent imports.
> >> 
> >> You also get this behaviour if you start the 'Import Map Dialogue' which
> >> may be the source of a report about that dialogue freezing but that needs
> >> more investigating.
> > 
> > This calls gnc_account_imap_get_info_bayes, which also calls
> > imap_convert_bayes_to_flat so the it will trigger the same account
> > refreshes.> 
> >> Any idea why these accounts are updated and why it runs on every import
> >> transaction row ?
> > 
> > Why the accounts are updated: while only a run in the debugger will verify
> > it, this is what I have gathered from reading the code:
> > 
> > imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit
> > and xaccAccountCommitEdit at some point. This happens because it changes
> > the account's kvp frames that store the import maps.
> > 
> > On the other side, the register code has set a watch on the register's
> > account(s) via the component manager. So each time the account signals a
> > change (or more precisely a successful run of xaccAccountCommitEdit) the
> > component manager will tell the register to refresh itself.
> > 
> > As you suggest you can probably disable this by a call to
> > gnc_suspend_gui_refresh.
> > 
> > Why it runs on every import transaction row ? I suspect this is because
> > there are no imap records stored yet and hence the feature flag that
> > blocks the conversion is not set yet. So for each transaction it will try
> > to do the conversion, find there's no converted imap record to store and
> > skip setting the feature flag. This will probably continue forever if the
> > user doesn't use bayesian matching at all.
> > This is a difficult issue to solve. We don't want to set the flat_bayes
> > conversion flag if there are no bayes maps because that would needlessly
> > break backwards compatibility. We could make the conversion code more
> > careful and have it only commit to accounts if there really are changes
> > to commit. And add a run time flag that signals the conversion has run
> > already once. With that conversion 

Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread John Ralls


> On Nov 6, 2018, at 2:50 AM, Geert Janssens  wrote:
> 
> Op maandag 5 november 2018 17:07:25 CET schreef Robert Fewell:
>> Hi,
>> I was poking around with the CSV importer and I noticed the following, this
>> may also be an issue with other importers on first use after creating a new
>> file...
>> With a new empty xml file, I used a one line transaction csv file with
>> appropriate settings and the 'Account' set to 'Assets:Current
>> Assets:Checking Account' and observed the following when I got to the match
>> page...
>> 
>> With the 'Checking Account' register open it would partly show the imported
>> transactions, (this can be fixed by suspending GUI changes which I was
>> going to propose in a PR) and the register would reload seven times.
>> This reloading is caused by the triggering of the
>> 'imap_convert_bayes_to_flat' function and as it is a new file you would not
>> expect it to do any thing but it does. Adding a few print statements I get
>> the following...
>> 
>> matchmap_find_destination
>> imap_convert_bayes_to_flat
>> convert_imap_account_bayes_to_flat 'Assets'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Current Assets'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Checking Account'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Liabilities'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Income'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Expenses'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> convert_imap_account_bayes_to_flat 'Equity'
>>  gnc_split_register_load called for account 'Assets:Current
>> Assets:Checking Account' with list of 1
>> 
>> As you can see, seven accounts get updated forcing the register reload
>> seven times, (not sure why those other accounts force a reload either), and
>> this gets even worse if this first import is 100 transactions which would
>> equate to 700 reloads. I have not worked out why all these accounts are
>> updated or why after the first pass the converted flag is not set/noticed
>> there by eliminating the convert for the rest of the transactions, it only
>> seems to be noticed on subsequent imports.
>> 
>> You also get this behaviour if you start the 'Import Map Dialogue' which
>> may be the source of a report about that dialogue freezing but that needs
>> more investigating.
>> 
> This calls gnc_account_imap_get_info_bayes, which also calls 
> imap_convert_bayes_to_flat so the it will trigger the same account refreshes.
> 
>> Any idea why these accounts are updated and why it runs on every import
>> transaction row ?
> 
> Why the accounts are updated: while only a run in the debugger will verify 
> it, 
> this is what I have gathered from reading the code:
> 
> imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit and 
> xaccAccountCommitEdit at some point. This happens because it changes the 
> account's kvp frames that store the import maps.
> 
> On the other side, the register code has set a watch on the register's 
> account(s) via the component manager. So each time the account signals a 
> change (or more precisely a successful run of xaccAccountCommitEdit) the 
> component manager will tell the register to refresh itself.
> 
> As you suggest you can probably disable this by a call to 
> gnc_suspend_gui_refresh.
> 
> Why it runs on every import transaction row ? I suspect this is because there 
> are no imap records stored yet and hence the feature flag that blocks the 
> conversion is not set yet. So for each transaction it will try to do the 
> conversion, find there's no converted imap record to store and skip setting 
> the feature flag. This will probably continue forever if the user doesn't use 
> bayesian matching at all.
> This is a difficult issue to solve. We don't want to set the flat_bayes 
> conversion flag if there are no bayes maps because that would needlessly 
> break 
> backwards compatibility. We could make the conversion code more careful and 
> have it only commit to accounts if there really are changes to commit. And 
> add 
> a run time flag that signals the conversion has run already once. With that 
> conversion should only start if this flag is false AND the feature flag is 
> false.
> However it may all be unnecessary and perhaps just blocking register updates 
> while the transaction matching (or the whole import code) is running may 
> eliminate the performance bottleneck already.
> So I would start with that: block gui updates.
> Then 

Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread Geert Janssens
Op maandag 5 november 2018 20:23:40 CET schreef Wm via gnucash-devel:
> On 05/11/2018 16:07, Robert Fewell wrote:
> > Hi,
> > I was poking around with the CSV importer and I noticed the following,
> > this
> > may also be an issue with other importers on first use after creating a
> > new
> > file...
> > With a new empty xml file, I used a one line transaction csv file with
> > appropriate settings and the 'Account' set to 'Assets:Current
> > Assets:Checking Account' and observed the following when I got to the
> > match
> > page...
> > 
> > With the 'Checking Account' register open it would partly show the
> > imported
> > transactions, (this can be fixed by suspending GUI changes which I was
> > going to propose in a PR) and the register would reload seven times.
> > This reloading is caused by the triggering of the
> > 'imap_convert_bayes_to_flat' function and as it is a new file you would
> > not
> > expect it to do any thing but it does. Adding a few print statements I get
> > the following...
> > 
> > matchmap_find_destination
> > imap_convert_bayes_to_flat
> > 
> >   convert_imap_account_bayes_to_flat 'Assets'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Current Assets'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Checking Account'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Liabilities'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Income'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Expenses'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> >   convert_imap_account_bayes_to_flat 'Equity'
> >   
> >gnc_split_register_load called for account 'Assets:Current
> > 
> > Assets:Checking Account' with list of 1
> > 
> > As you can see, seven accounts get updated forcing the register reload
> > seven times, (not sure why those other accounts force a reload either),
> > and
> > this gets even worse if this first import is 100 transactions which would
> > equate to 700 reloads. I have not worked out why all these accounts are
> > updated or why after the first pass the converted flag is not set/noticed
> > there by eliminating the convert for the rest of the transactions, it only
> > seems to be noticed on subsequent imports.
> > 
> > You also get this behaviour if you start the 'Import Map Dialogue' which
> > may be the source of a report about that dialogue freezing but that needs
> > more investigating.
> > 
> > Any idea why these accounts are updated and why it runs on every import
> > transaction row ?
> 
> It is apparently a "good thing" because it prevents stupid people from
> doing multiple imports from their bank accounts and actually believing
> they have more or less money than they actually have.
> 
> That was the explanation given to me, grrr

We seem to be talking at different levels here. Bob question refers to a 
screen refresh that happens even when accounts don't change.

You seem to be referring to the part of the importer that tries to match 
import data against existing transactions. In some circumstances gnucash 
freezes or crashes before this completes and the user is asked to review what 
is found. Obviously this should not happen.

Geert


___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread Geert Janssens
Op maandag 5 november 2018 21:03:15 CET schreef Wm via gnucash-devel:
> On 05/11/2018 17:50, Geert Janssens wrote:
> > Like you though I suspect this may be at least one cause of the import
> > issues we see. Thanks for poking at it!
> 
> this is a basic issue, people aren't allowed to decide if their tx are
> new or not

No, the bayesian matcher is only meant to suggest possible matches. The user 
is definitely allowed to correct the suggested results.

The issue Bob brings up happens earlier in the process and is a bug.

Regards,

Geert


___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread Wm via gnucash-devel

On 05/11/2018 17:50, Geert Janssens wrote:


Like you though I suspect this may be at least one cause of the import issues
we see. Thanks for poking at it!


this is a basic issue, people aren't allowed to decide if their tx are 
new or not

--
Wm



___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread Wm via gnucash-devel

On 05/11/2018 16:07, Robert Fewell wrote:

Hi,
I was poking around with the CSV importer and I noticed the following, this
may also be an issue with other importers on first use after creating a new
file...
With a new empty xml file, I used a one line transaction csv file with
appropriate settings and the 'Account' set to 'Assets:Current
Assets:Checking Account' and observed the following when I got to the match
page...

With the 'Checking Account' register open it would partly show the imported
transactions, (this can be fixed by suspending GUI changes which I was
going to propose in a PR) and the register would reload seven times.
This reloading is caused by the triggering of the
'imap_convert_bayes_to_flat' function and as it is a new file you would not
expect it to do any thing but it does. Adding a few print statements I get
the following...

matchmap_find_destination
imap_convert_bayes_to_flat
  convert_imap_account_bayes_to_flat 'Assets'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Current Assets'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Checking Account'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Liabilities'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Income'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Expenses'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
  convert_imap_account_bayes_to_flat 'Equity'
   gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1

As you can see, seven accounts get updated forcing the register reload
seven times, (not sure why those other accounts force a reload either), and
this gets even worse if this first import is 100 transactions which would
equate to 700 reloads. I have not worked out why all these accounts are
updated or why after the first pass the converted flag is not set/noticed
there by eliminating the convert for the rest of the transactions, it only
seems to be noticed on subsequent imports.

You also get this behaviour if you start the 'Import Map Dialogue' which
may be the source of a report about that dialogue freezing but that needs
more investigating.

Any idea why these accounts are updated and why it runs on every import
transaction row ?


It is apparently a "good thing" because it prevents stupid people from 
doing multiple imports from their bank accounts and actually believing 
they have more or less money than they actually have.


That was the explanation given to me, grrr
--
Wm


___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel


Re: [GNC-dev] Convert Imap to Flat

2018-11-05 Thread Geert Janssens
Op maandag 5 november 2018 17:07:25 CET schreef Robert Fewell:
> Hi,
> I was poking around with the CSV importer and I noticed the following, this
> may also be an issue with other importers on first use after creating a new
> file...
> With a new empty xml file, I used a one line transaction csv file with
> appropriate settings and the 'Account' set to 'Assets:Current
> Assets:Checking Account' and observed the following when I got to the match
> page...
> 
> With the 'Checking Account' register open it would partly show the imported
> transactions, (this can be fixed by suspending GUI changes which I was
> going to propose in a PR) and the register would reload seven times.
> This reloading is caused by the triggering of the
> 'imap_convert_bayes_to_flat' function and as it is a new file you would not
> expect it to do any thing but it does. Adding a few print statements I get
> the following...
> 
> matchmap_find_destination
> imap_convert_bayes_to_flat
>  convert_imap_account_bayes_to_flat 'Assets'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Current Assets'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Checking Account'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Liabilities'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Income'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Expenses'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
>  convert_imap_account_bayes_to_flat 'Equity'
>   gnc_split_register_load called for account 'Assets:Current
> Assets:Checking Account' with list of 1
> 
> As you can see, seven accounts get updated forcing the register reload
> seven times, (not sure why those other accounts force a reload either), and
> this gets even worse if this first import is 100 transactions which would
> equate to 700 reloads. I have not worked out why all these accounts are
> updated or why after the first pass the converted flag is not set/noticed
> there by eliminating the convert for the rest of the transactions, it only
> seems to be noticed on subsequent imports.
> 
> You also get this behaviour if you start the 'Import Map Dialogue' which
> may be the source of a report about that dialogue freezing but that needs
> more investigating.
> 
This calls gnc_account_imap_get_info_bayes, which also calls 
imap_convert_bayes_to_flat so the it will trigger the same account refreshes.

> Any idea why these accounts are updated and why it runs on every import
> transaction row ?

Why the accounts are updated: while only a run in the debugger will verify it, 
this is what I have gathered from reading the code:

imap_convert_bayes_to_flat's sub functions will call xaccAccountBeginEdit and 
xaccAccountCommitEdit at some point. This happens because it changes the 
account's kvp frames that store the import maps.

On the other side, the register code has set a watch on the register's 
account(s) via the component manager. So each time the account signals a 
change (or more precisely a successful run of xaccAccountCommitEdit) the 
component manager will tell the register to refresh itself.

As you suggest you can probably disable this by a call to 
gnc_suspend_gui_refresh.

Why it runs on every import transaction row ? I suspect this is because there 
are no imap records stored yet and hence the feature flag that blocks the 
conversion is not set yet. So for each transaction it will try to do the 
conversion, find there's no converted imap record to store and skip setting 
the feature flag. This will probably continue forever if the user doesn't use 
bayesian matching at all.
This is a difficult issue to solve. We don't want to set the flat_bayes 
conversion flag if there are no bayes maps because that would needlessly break 
backwards compatibility. We could make the conversion code more careful and 
have it only commit to accounts if there really are changes to commit. And add 
a run time flag that signals the conversion has run already once. With that 
conversion should only start if this flag is false AND the feature flag is 
false.
However it may all be unnecessary and perhaps just blocking register updates 
while the transaction matching (or the whole import code) is running may 
eliminate the performance bottleneck already.
So I would start with that: block gui updates.
Then secondly, make the imap code more careful not to do unnecessary account 
updates and lastly consider a run time flag.

Like you though I suspect this may be at least one cause of the import 

[GNC-dev] Convert Imap to Flat

2018-11-05 Thread Robert Fewell
Hi,
I was poking around with the CSV importer and I noticed the following, this
may also be an issue with other importers on first use after creating a new
file...
With a new empty xml file, I used a one line transaction csv file with
appropriate settings and the 'Account' set to 'Assets:Current
Assets:Checking Account' and observed the following when I got to the match
page...

With the 'Checking Account' register open it would partly show the imported
transactions, (this can be fixed by suspending GUI changes which I was
going to propose in a PR) and the register would reload seven times.
This reloading is caused by the triggering of the
'imap_convert_bayes_to_flat' function and as it is a new file you would not
expect it to do any thing but it does. Adding a few print statements I get
the following...

matchmap_find_destination
imap_convert_bayes_to_flat
 convert_imap_account_bayes_to_flat 'Assets'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Current Assets'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Checking Account'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Liabilities'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Income'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Expenses'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1
 convert_imap_account_bayes_to_flat 'Equity'
  gnc_split_register_load called for account 'Assets:Current
Assets:Checking Account' with list of 1

As you can see, seven accounts get updated forcing the register reload
seven times, (not sure why those other accounts force a reload either), and
this gets even worse if this first import is 100 transactions which would
equate to 700 reloads. I have not worked out why all these accounts are
updated or why after the first pass the converted flag is not set/noticed
there by eliminating the convert for the rest of the transactions, it only
seems to be noticed on subsequent imports.

You also get this behaviour if you start the 'Import Map Dialogue' which
may be the source of a report about that dialogue freezing but that needs
more investigating.

Any idea why these accounts are updated and why it runs on every import
transaction row ?

Regards,
   Bob
___
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel