public void Add(XPathItem item) { XQueryNavigator nav = item as XQueryNavigator; if (nav != null && nav.NodeType == XPathNodeType.Element) { if (current == null || current.document != nav.Document) { current = new ElementsSegment(nav.Document); segments.Add(current); } current.Add(nav.Position); } else { if (current == null || current.document != null) { current = new DataSegment(); segments.Add(current); } current.Add(item.Clone()); } count++; }
public XQueryWrappedValue(XPathItem inner, object[] annotation) { Inner = inner.Clone(); Annotation = annotation; }
private Task<Object> BeginMoveNext(IContextProvider provider, object[] args, MemoryPool pool, XPathItem curr, Integer index) { object value; if (curr.IsNode) value = curr.Clone(); else value = curr.TypedValue; if (m_varType != XQuerySequenceType.Item && m_convert) { if (m_varType.IsNode && !Core.InstanceOf(QueryContext.Engine, value, m_varType)) throw new XQueryException(Properties.Resources.XPTY0004, new XQuerySequenceType(curr.XmlType.TypeCode), m_varType); value = XQueryConvert.TreatValueAs(value, m_varType); if (m_varType.Cardinality == XmlTypeCardinality.ZeroOrMore || m_varType.Cardinality == XmlTypeCardinality.OneOrMore) value = XQueryNodeIterator.Create(value); } pool.SetData(m_value, value); if (m_pos != null) pool.SetData(m_posValue, index); if (m_conditionExpr == null || Core.BooleanValue(QueryContext.Engine.Apply(null, null, ConditionExpr, args, m_conditionExpr, pool))) { MemoryPool taskPool = pool.Clone(); return Task<Object>.Factory.StartNew(() => { object res = m_bodyExpr.Execute(provider, args, taskPool); XQueryNodeIterator iter = res as XQueryNodeIterator; if (iter != null) { BufferedNodeIterator resIter = new BufferedNodeIterator(iter, false); resIter.Fill(); return resIter; } return res; }, QueryContext.Token); } return null; }