rectify graph node tracing and cycles detection
authorDenis Ovsienko <denis@ovsienko.info>
Fri, 15 Jan 2016 17:20:18 +0000 (17:20 +0000)
committerDenis Ovsienko <denis@ovsienko.info>
Fri, 15 Jan 2016 17:20:18 +0000 (17:20 +0000)
commita04b65ce85195335099eec270bb7881f43eea10b
treec69c50fb59d50efc423b8b76e7b81a308d060717
parent7941b2e140f423e3b6b7112280ef37bbd7b45b4e
rectify graph node tracing and cycles detection

Commit 3a94b7a made it unnecessary to call treeFromList() to have the
'trace' key calculated for $taglist elements, though the trace
calculation code it introduced into getTagList() had no graph cycles
detection and would OOM on inconsistent input. That change made the
pre-existing similar code in treeFromList(), which did have such
detection, effectively useless and doing duplicate work.

Another issue was, the database consistency report used its own
procedure to detect the same anomalies using a series of SELECTs and
an exception.

This change leaves only the exact original version of the procedure in
the code, now as a standalone function, and amends associated code to
interface with it properly.

* class GetChildrenListTest
  * setUpBeforeClass(): amend to re-process the modified data
  * testGetTagChildrenList(): use the in-memory function
* class TagTreeCircularReferenceTest
  * testCreateCircularReference(): use a more specific exception class
* getTagSelectAJAX(): ignore any odd tags to suppress a PHP warning
* getTagChildrenList(): mark as deprecated
* getTagList(): return the original data only and allow for extra SQL
* commitUpdateTag(): use a transaction, let a dedicated function verify
  consistency and add some comments
* addTraceToNodes(): a new function with the code from treeFromList()
* treeFromList(): do exactly one job: don't trace the nodes and always
  return the forest structure; update comments
* getOrphanedTags(): filtering is now simpler and can be done in place
* assertValidParentId(): new constraint validation function based on the
  checks previously performed in commitUpdateTag()
* getTagDescendents(): skip odd nodes
* init.php: call addTraceToNodes() explicitly
* renderTagTreeEditor(): use the same terminology as in the report
* renderDataIntegrityReport(): use getOrphanedTags()
* updateTag(): add exception conversion and repack more uniformly
tests/GetChildrenListTest.php
tests/TagTreeCircularReferenceTest.php
wwwroot/inc/ajax-interface.php
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/init.php
wwwroot/inc/interface-config.php
wwwroot/inc/interface-reports.php
wwwroot/inc/ophandlers.php