// the map is: invalidated id -> invalidators static DependentCache> ai_invalidatedWebs_cache = new DependentCache(f ai_invalidatedWebs_calc, f cachedNodeIndex /*_changeCount*/); static MultiMap ai_invalidatedWebs() { ret ai_invalidatedWebs_cache!; } static MultiMap ai_invalidatedWebs_calc() { ai_onNewOrRemovedWeb(f ai_invalidatedWebs_onNewWeb, f ai_invalidatedWebs_onRemovedWeb); ai_invalidatedWebs_cache.set(new MultiMap); for (Web web : allWebsFromCachedNodeIndex_uncached()) ai_invalidatedWebs_onNewWeb(web); ret ai_invalidatedWebs_cache!; } svoid ai_invalidatedWebs_onNewWeb(Web web) { if (web.unverified) ret; lock ai_invalidatedWebs_cache.lock; new Matches m; for (WebRelation r : web_search_dollarX(webFromTriple("$X", "is", "unverified"), web)) if (web_match("Web *", r.a, m) && isGlobalID($1)) ai_invalidatedWebs_cache->put($1, web.globalID); } svoid ai_invalidatedWebs_onRemovedWeb(Web web) { if (web.unverified) ret; lock ai_invalidatedWebs_cache.lock; new Matches m; for (WebRelation r : web_search_dollarX(webFromTriple("$X", "is", "unverified"), web)) if (web_match("Web *", r.a, m) && isGlobalID($1)) ai_invalidatedWebs_cache->remove($1, web.globalID); }