From: Atsushi Eno Date: Tue, 31 Aug 2004 17:34:24 +0000 (-0000) Subject: 2004-08-31 Atsushi Enomoto X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=66af161d9280edff8199f0c9b628a46f3ce5a0d2;p=mono.git 2004-08-31 Atsushi Enomoto * XPath2Expression.cs, XPathSequence.cs : Implemented GroupExpr.Evaluate() [union/intersect/except]. Fixed incorrect iterator input for DescendantExpr.Evaluate(). MinusExpr is (already) implemented not to be evaluated. * XQueryExpression.cs : PI name and nameExpr could be implemented. * XQueryFunction.cs : UserFunctionCallExpr.Invoke() should not be invoked. * XQueryFunctionCliImpl.cs : Implemented count(), doc(). Halfly implemented trace(). * XmlQueryException.cs : Serializable. svn path=/trunk/mcs/; revision=33111 --- diff --git a/mcs/class/System.XML/System.Xml.Query/ChangeLog b/mcs/class/System.XML/System.Xml.Query/ChangeLog index 00f35dc18fc..3c4d5d58ad0 100644 --- a/mcs/class/System.XML/System.Xml.Query/ChangeLog +++ b/mcs/class/System.XML/System.Xml.Query/ChangeLog @@ -1,3 +1,18 @@ +2004-08-31 Atsushi Enomoto + + * XPath2Expression.cs, + XPathSequence.cs : + Implemented GroupExpr.Evaluate() [union/intersect/except]. + Fixed incorrect iterator input for DescendantExpr.Evaluate(). + MinusExpr is (already) implemented not to be evaluated. + * XQueryExpression.cs : + PI name and nameExpr could be implemented. + * XQueryFunction.cs : + UserFunctionCallExpr.Invoke() should not be invoked. + * XQueryFunctionCliImpl.cs : + Implemented count(), doc(). Halfly implemented trace(). + * XmlQueryException.cs : Serializable. + 2004-08-31 Atsushi Enomoto * XPath2Expression.cs : diff --git a/mcs/class/System.XML/System.Xml.Query/XPath2Expression.cs b/mcs/class/System.XML/System.Xml.Query/XPath2Expression.cs index 9c74c728468..c258c527333 100755 --- a/mcs/class/System.XML/System.Xml.Query/XPath2Expression.cs +++ b/mcs/class/System.XML/System.Xml.Query/XPath2Expression.cs @@ -1485,7 +1485,7 @@ namespace Mono.Xml.XPath2 public override XPathSequence Evaluate (XPathSequence iter) { - throw new NotImplementedException (); + throw new SystemException ("XQuery internal error: should not happen."); } #endregion } @@ -1528,17 +1528,7 @@ namespace Mono.Xml.XPath2 // only applicable against node-sets public override XPathSequence Evaluate (XPathSequence iter) { - XPathSequence lvalue = Left.EvaluateOrdered (iter); - XPathSequence rvalue = Right.EvaluateOrdered (iter); - - /* - TBD (yield earlier node, skipping one of the same nodes) - - or - - TBD (yield earlier node, skipping non-intersection nodes) - - or - - TBD (yield earlier node, skipping both of the same nodes) - */ - throw new NotImplementedException (); + return new GroupIterator (iter, this); } #endregion } @@ -1705,7 +1695,7 @@ namespace Mono.Xml.XPath2 if (!seq.MoveNext ()) return new XPathEmptySequence (iter.Context); return new PathStepIterator ( - new DescendantOrSelfIterator (iter.Current as XPathNavigator, iter.Context), this); + new DescendantOrSelfIterator (seq.Current as XPathNavigator, seq.Context), this); } #endregion } diff --git a/mcs/class/System.XML/System.Xml.Query/XPathSequence.cs b/mcs/class/System.XML/System.Xml.Query/XPathSequence.cs index 84e10c02531..4de841517b3 100755 --- a/mcs/class/System.XML/System.Xml.Query/XPathSequence.cs +++ b/mcs/class/System.XML/System.Xml.Query/XPathSequence.cs @@ -1313,6 +1313,120 @@ EvaluateRemainingSingleItem (forLetClauses, singleBodies); } } + internal class GroupIterator : XPathSequence + { + GroupExpr expr; + XPathSequence lseq; + XPathSequence rseq; + bool started; + bool left; + bool leftFinished; + bool rightFinished; + + public GroupIterator (XPathSequence iter, GroupExpr expr) + : base (iter.Context) + { + this.expr = expr; + left = true; + lseq = expr.Left.EvaluateOrdered (iter); + rseq = expr.Right.EvaluateOrdered (iter); + } + + private GroupIterator (GroupIterator other) + : base (other) + { + this.expr = other.expr; + this.started = other.started; + this.left = other.left; + this.leftFinished = other.leftFinished; + this.rightFinished = other.rightFinished; + this.lseq = other.lseq.Clone (); + this.rseq = other.rseq.Clone (); + } + + public override XPathSequence Clone () + { + return new GroupIterator (this); + } + + protected override bool MoveNextCore () + { + if (leftFinished && rightFinished) + return false; + bool proceeded = false; + if (started) { + if (left) { + if (!leftFinished && lseq.MoveNext ()) + proceeded = true; + else + leftFinished = true; + } else { + if (rightFinished && rseq.MoveNext ()) + proceeded = true; + else + rightFinished = true; + } + } else { + started = true; + if (!lseq.MoveNext ()) { + leftFinished = true; + if (!rseq.MoveNext ()) { + rightFinished = true; + return false; + } + left = false; + return true; + } + proceeded = true; + if (!rseq.MoveNext ()) { + rightFinished = true; + return true; + } + } + if (!proceeded) { + if (expr.AggregationType == AggregationType.Intersect) + return false; + left = !leftFinished; + return !leftFinished || !rightFinished; + } + + XPathNavigator lnav = lseq.Current as XPathNavigator; + XPathNavigator rnav = rseq.Current as XPathNavigator; + if (lnav == null || rnav == null) + throw new XmlQueryException ("XP0006: Evaluation against union, intersect, except expressions must result in nodes."); + XmlNodeOrder order = lnav.ComparePosition (rnav); + switch (order) { + case XmlNodeOrder.Same: + switch (expr.AggregationType) { + case AggregationType.Union: + left = false; + if (!lseq.MoveNext ()) + leftFinished = true; + return true; + case AggregationType.Intersect: + return true; + case AggregationType.Except: + default: + return MoveNext (); + } + case XmlNodeOrder.Before: + left = true; + if (expr.AggregationType == AggregationType.Intersect) + return MoveNext (); + return true; + default: // After, Unknown + left = false; + if (expr.AggregationType == AggregationType.Intersect) + return MoveNext (); + return true; + } + } + + public override XPathItem CurrentCore { + get { return left ? lseq.Current : rseq.Current; } + } + } + internal class AtomizingIterator : XPathSequence { XPathSequence iter; diff --git a/mcs/class/System.XML/System.Xml.Query/XQueryExpression.cs b/mcs/class/System.XML/System.Xml.Query/XQueryExpression.cs index 1427a280ee3..f8bf5758f74 100755 --- a/mcs/class/System.XML/System.Xml.Query/XQueryExpression.cs +++ b/mcs/class/System.XML/System.Xml.Query/XQueryExpression.cs @@ -541,10 +541,11 @@ namespace Mono.Xml.XQuery } public string Name { - get { throw new NotImplementedException (); } + get { return name; } } + public ExprSequence NameExpr { - get { throw new NotImplementedException (); } + get { return nameExpr; } } // FIXME: can be optimized by checking all items in Expr diff --git a/mcs/class/System.XML/System.Xml.Query/XQueryFunction.cs b/mcs/class/System.XML/System.Xml.Query/XQueryFunction.cs index 4c7dba61c5f..773fdbe1dab 100755 --- a/mcs/class/System.XML/System.Xml.Query/XQueryFunction.cs +++ b/mcs/class/System.XML/System.Xml.Query/XQueryFunction.cs @@ -302,7 +302,7 @@ namespace Mono.Xml.XPath2 public override object Invoke (XQueryContext context, object [] args) { - throw new NotImplementedException ("Not supported"); + throw new SystemException ("XQuery internal error: should not happen."); } public override XPathSequence Evaluate (XPathSequence iter, ExprSequence args) diff --git a/mcs/class/System.XML/System.Xml.Query/XQueryFunctionCliImpl.cs b/mcs/class/System.XML/System.Xml.Query/XQueryFunctionCliImpl.cs index 8011cc963e1..2f4e5eaae13 100755 --- a/mcs/class/System.XML/System.Xml.Query/XQueryFunctionCliImpl.cs +++ b/mcs/class/System.XML/System.Xml.Query/XQueryFunctionCliImpl.cs @@ -36,6 +36,7 @@ using System; using System.Collections; using System.Globalization; +using System.IO; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Query; @@ -170,9 +171,26 @@ namespace Mono.Xml.XPath2 // Trace [MonoTODO] - public static object FnTrace (object arg) + public static object FnTrace (XQueryContext ctx, object value, string label) { - throw new NotImplementedException (); + if (value == null) + return new XPathEmptySequence (ctx); + XPathSequence seq = value as XPathSequence; + if (seq == null) { + IEnumerable list = value as IEnumerable; + if (list != null) + seq = new EnumeratorIterator (ctx, list); + else { + XPathAtomicValue av = value as XPathAtomicValue; + if (av == null) + av = new XPathAtomicValue (value, + XmlSchemaType.GetBuiltInType ( + XPathAtomicValue.XmlTypeCodeFromRuntimeType ( + value.GetType (), true))); + seq = new SingleItemIterator (av, ctx); + } + } + return new TracingIterator (seq, label); } // Numeric Operation @@ -704,10 +722,21 @@ namespace Mono.Xml.XPath2 throw new NotImplementedException (); } - [MonoTODO] - public static object FnCount (IEnumerable e) + public static int FnCount (IEnumerable e) { - throw new NotImplementedException (); + if (e == null) + return 0; + XPathSequence seq = e as XPathSequence; + if (seq != null) + return seq.Count; + ICollection col = e as ICollection; + if (col != null) + return col.Count; + int count = 0; + IEnumerator en = e.GetEnumerator (); + while (en.MoveNext ()) + count++; + return count; } [MonoTODO] @@ -775,10 +804,21 @@ namespace Mono.Xml.XPath2 throw new NotImplementedException (); } - [MonoTODO] - public static object FnDoc (XQueryContext ctx, string uri) + public static XPathNavigator FnDoc (XQueryContext ctx, string uri) { - throw new NotImplementedException (); + XmlResolver res = ctx.ContextManager.ExtDocResolver; + string baseUriString = ctx.StaticContext.BaseUri; + Uri baseUri = null; + if (baseUriString != null && baseUriString != String.Empty) + baseUri = new Uri (baseUriString); + Uri relUri = res.ResolveUri (baseUri, uri); + Stream s = res.GetEntity (relUri, null, typeof (Stream)) as Stream; + try { + XPathDocument doc = new XPathDocument (new XmlValidatingReader (new XmlTextReader (s)), XmlSpace.Preserve); + return doc.CreateNavigator (); + } finally { + s.Close (); + } } public static IEnumerable FnCollection (XQueryContext ctx, string name) diff --git a/mcs/class/System.XML/System.Xml.Query/XmlQueryException.cs b/mcs/class/System.XML/System.Xml.Query/XmlQueryException.cs index 9e264822e95..00e967cc32d 100755 --- a/mcs/class/System.XML/System.Xml.Query/XmlQueryException.cs +++ b/mcs/class/System.XML/System.Xml.Query/XmlQueryException.cs @@ -35,6 +35,7 @@ using System.Runtime.Serialization; namespace System.Xml.Query { + [Serializable] public class XmlQueryException : SystemException { #region Constructors