moving GraphPathInfo into relationships-api and doing away with the stateful, impl-specific versions. Also, making GraphView, GraphWorkspace, GraphPathInfo, ProjectRelationshipFilter, and GraphMutator serializable so we can cache them in the graph to make tracking of membership in a view less expensive. Started working on view-membership tracking in neo4j driver, but I still need to hook it up to the getAll*() methods and determine how eagerly to explore view membership when a new relationship links a view into a whole pre-existing subgraph.
first pass at using the view-specific indexes from get* methods. view membership is calculated eagerly to avoid repeated need to do traverses in these query methods, which is fairly expensive up front, but the opportunity to lean more heavily on the view indexes will outweigh the calculation expense for any non-trivial graph usage.
Fine tuning view tracking. I'm down to 4 failing tests, and they're sort of edge cases. I'm going to @Ignore them in the next commit, then revert on my current workspace so that others can try this stuff out.
ignore failing tests for now, they're edge cases that need a bit more thought.
removing an intermediary check from my debugging efforts.
re-enable those edge-case tests to continue debugging.
Adding notion of a conversion cache to prevent explosion of instances through deserialization from nodes and relationships, and fixing cycle tracking.
Fixing view selection, but also restricting it to not overwrite previous selections and not allow clearing. This is a first step...maybe we can improve the registerSelectedVersion() implementation in the neo4j driver to support these eventually.
Fixing getMissingProjects and getVariableProjects
use ConversionCache more aggressively.
switch to visitor pattern for traversing relationships (for internal maintenance). This should save quite a lot of memory, since we're directly adding results to Lucene indexes rather than caching in memory during traverse, then pushing them down to the index.
fixing stupid mistake with cycle detection.
moving updater visitors into their own package, renaming the admin view to the neo4j driver, and delaying cycle detection until it's actually needed.
ignore intermittent transitive traverser problem for now.
don't do a full traverse when updating view caches on addRelationships, and use all available nodes (in view) as roots when scanning for cycles. If scanning for cycles, don't wait to build up the EProjectCycle set...do it during the traverse.
incrementally update cycles in ViewUpdater to avoid need for extensive traverse, implement (and use) a seen-path tracker that's cycle aware...potentially this should be the default option, since otherwise it exposes the driver to infinite looping
oops, had to deal with cycles being EMBEDDED in a larger path...in that case, the seen-key becomes the cycle key (normalized)...in the case of a view update, the cycle is dealt with and the rest of the path isn't cached (to keep the other cache indexes cycle-free).
make filters report whether they use managed info / concrete info, so the driver can cut out managed/concrete relationships before a traverse...cutting out managed info shrinks the normal graph size by TONS, for instance. Also, switch to using a single metadata relationship to track the paths to a particular relationship (representing a ProjectRelationship) in a view. Disabling the SeenTracker stuff, because this was a source of severe memory bloat (using relationship-global uniqueness everywhere in neo4j for now to compensate).
give up on trying to cache/track paths per view. That's killing our memory usage.
move selections into the view node, and away from a separate index. This should help memory performance greatly.