public virtual Filter GetFilter(XmlElement e) { UninterruptableMonitor.Enter(this); try { XmlElement childElement = DOMUtils.GetFirstChildOrFail(e); if (filterCache is null) { filterCache = new LurchTable <object, Filter>(LurchTableOrder.Access, cacheSize); } // Test to see if child Element is a query or filter that needs to be // cached IQueryBuilder qb = queryFactory.GetQueryBuilder(childElement.Name); object cacheKey = null; Query q = null; Filter f = null; if (qb != null) { q = qb.GetQuery(childElement); cacheKey = q; } else { f = filterFactory.GetFilter(childElement); cacheKey = f; } if (filterCache.TryGetValue(cacheKey, out Filter cachedFilter) && cachedFilter != null) { return(cachedFilter); // cache hit } //cache miss if (qb != null) { cachedFilter = new QueryWrapperFilter(q); } else { cachedFilter = new CachingWrapperFilter(f); } filterCache[cacheKey] = cachedFilter; return(cachedFilter); } finally { UninterruptableMonitor.Exit(this); } }