2004-08-31 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 31 Aug 2004 17:34:24 +0000 (17:34 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 31 Aug 2004 17:34:24 +0000 (17:34 -0000)
* 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

mcs/class/System.XML/System.Xml.Query/ChangeLog
mcs/class/System.XML/System.Xml.Query/XPath2Expression.cs
mcs/class/System.XML/System.Xml.Query/XPathSequence.cs
mcs/class/System.XML/System.Xml.Query/XQueryExpression.cs
mcs/class/System.XML/System.Xml.Query/XQueryFunction.cs
mcs/class/System.XML/System.Xml.Query/XQueryFunctionCliImpl.cs
mcs/class/System.XML/System.Xml.Query/XmlQueryException.cs

index 00f35dc18fca322e27b78031e1e867aa6955577e..3c4d5d58ad0a40ea4e52d9b4448edc992d2c7a37 100644 (file)
@@ -1,3 +1,18 @@
+2004-08-31  Atsushi Enomoto <atsushi@ximian.com>
+
+       * 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 <atsushi@ximian.com>
 
        * XPath2Expression.cs :
index 9c74c728468c8bd6e2572e7bff1855506eea9a94..c258c527333833af6be305d2b4ff57e057e32781 100755 (executable)
@@ -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
        }
index 84e10c02531c49f392520ac12a2d56b0fcd39d9b..4de841517b326eeefc1b6bbc44be5a570679b37f 100755 (executable)
@@ -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;
index 1427a280ee34bf0a33f1202217586bd8adc90876..f8bf5758f7453d06a6270140884b7649371cfe65 100755 (executable)
@@ -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
index 4c7dba61c5f602f4e45d0e7114546cf1da60aeaf..773fdbe1dab06d9d4f1c12ff783ff97f42320bf6 100755 (executable)
@@ -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)
index 8011cc963e1dc133e27bf7d5940785a18cbf7d47..2f4e5eaae13c92c48d12f0301c0dd6deac77ed85 100755 (executable)
@@ -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)
index 9e264822e951482b593b45f3479477cfbaae987e..00e967cc32d62569eb37c538d4f7ccb3ff418354 100755 (executable)
@@ -35,6 +35,7 @@ using System.Runtime.Serialization;
 \r
 namespace System.Xml.Query\r
 {\r
+       [Serializable]\r
        public class XmlQueryException : SystemException\r
        {\r
                #region Constructors\r