// the map is: invalidated id -> invalidators static DependentCache> ai_invalidatedWebs_cache = new DependentCache(f ai_invalidatedWebs_calc, f cachedNodeIndex /*_changeCount*/); static Set ai_invalidatedWebs() { ret keys(ai_invalidatedWebs_cache!); } static MultiMap ai_invalidatedWebs_calc() { //print("ai_invalidatedWebs_calc"); ai_onNewOrRemovedWeb(f ai_invalidatedWebs_onNewWeb, f ai_invalidatedWebs_onRemovedWeb); ai_invalidatedWebs_cache.set(new MultiMap); // old method //Collection webs = allWebsFromCachedNodeIndex_uncached(); //print("Have " + nWebs(webs)); //for (Web web : webs) // ai_invalidatedWebs_onNewWeb(web); // new method new Matches m; for (WebNode n : indexedNodes_withInvalids("invalid")) for (WebRelation r : web_backwardRelations(n)) if (web_hasLabelIC(r, "is") && web_match("Web *", r.a, m) && isGlobalID($1)) ai_invalidatedWebs_cache->put(asGlobalID($1), r.web.globalIDObj()); print("ai_invalidatedWebs calc done with " + n2(ai_invalidatedWebs_cache->keysSize(), "invalidated web", "invalidated webs")); ret ai_invalidatedWebs_cache!; } svoid ai_invalidatedWebs_onNewWeb(Web web) { if (web.unverified) ret; lock ai_invalidatedWebs_cache.lock; new Matches m; for (WebNode n : web_search_dollarX(webFromTriple("$X", "is", "invalid"), web)) if (web_match("Web *", n, m) && isGlobalID($1)) ai_invalidatedWebs_cache->put(asGlobalID($1), web.globalIDObj()); } svoid ai_invalidatedWebs_onRemovedWeb(Web web) { if (web.unverified) ret; lock ai_invalidatedWebs_cache.lock; new Matches m; for (WebNode n : web_search_dollarX(webFromTriple("$X", "is", "invalid"), web)) if (web_match("Web *", n, m) && isGlobalID($1)) ai_invalidatedWebs_cache->remove(asGlobalID($1), web.globalIDObj()); } svoid ai_invalidatedWebs_cache_put(GlobalID a, GlobalID b) { ai_invalidatedWebs_cache->put(a, b); }