public override object Execute(IContextProvider provider, object[] args, MemoryPool pool) { object[] keys = new object[m_params.Count + 1]; keys[0] = provider.Context; for (int k = 0; k < m_params.Count; k++) keys[k + 1] = pool.GetData(m_params[k]); Key key = new Key(QueryContext.Engine, keys); object res; lock (m_cache) { if (m_cache.TryGetValue(key, out res)) return res.CloneObject(); } res = m_body.Execute(provider, args, pool); lock (m_cache) { if (!m_cache.ContainsKey(key)) { key.CloneKeys(); m_cache.Add(key, res); } } return res.CloneObject(); }
public override object Execute(IContextProvider provider, object[] args, MemoryPool pool) { XQueryNodeIterator res = (XQueryNodeIterator)pool.GetData(_cache); if (res != null) return res.Clone(); #if PF PerfMonitor.Global.Begin(this); #endif XQueryNodeIterator rootIter = XQueryNodeIterator.Create(_path[0].Execute(provider, args, pool)).CreateBufferedIterator(); bool orderedSet = _isOrderedSet && rootIter.IsSingleIterator; res = new ResultIterator(this, provider, orderedSet, !orderedSet & QueryContext.EnableHPC, rootIter, args, pool); if (EnableCaching) { res = res.CreateBufferedIterator(); pool.SetData(_cache, res.Clone()); } #if PF PerfMonitor.Global.End(this); #endif return res; }
public override object Execute(IContextProvider provider, object[] args, MemoryPool pool) { if (value == null) return args[arg_index]; return pool.GetData(value); }