Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / Xml / System / Xml / XPath / Internal / UnionExpr.cs / 1 / UnionExpr.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace MS.Internal.Xml.XPath {
using System;
using System.Xml;
using System.Xml.XPath;
using System.Diagnostics;
using System.Xml.Xsl;
internal sealed class UnionExpr : Query {
internal Query qy1, qy2;
private bool advance1, advance2;
private XPathNavigator currentNode;
private XPathNavigator nextNode;
public UnionExpr(Query query1, Query query2) {
this.qy1 = query1;
this.qy2 = query2;
this.advance1 = true;
this.advance2 = true;
}
private UnionExpr(UnionExpr other) : base(other) {
this.qy1 = Clone(other.qy1);
this.qy2 = Clone(other.qy2);
this.advance1 = other.advance1;
this.advance2 = other.advance2;
this.currentNode = Clone(other.currentNode);
this.nextNode = Clone(other.nextNode);
}
public override void Reset() {
qy1.Reset();
qy2.Reset();
advance1 = true;
advance2 = true;
nextNode = null;
}
public override void SetXsltContext(XsltContext xsltContext) {
qy1.SetXsltContext(xsltContext);
qy2.SetXsltContext(xsltContext);
}
public override object Evaluate(XPathNodeIterator context) {
qy1.Evaluate(context);
qy2.Evaluate(context);
advance1 = true;
advance2 = true;
nextNode = null;
base.ResetCount();
return this;
}
private XPathNavigator ProcessSamePosition(XPathNavigator result){
currentNode = result;
advance1 = advance2 = true;
return result;
}
private XPathNavigator ProcessBeforePosition(XPathNavigator res1, XPathNavigator res2){
nextNode = res2;
advance2 = false;
advance1 = true;
currentNode = res1;
return res1;
}
private XPathNavigator ProcessAfterPosition(XPathNavigator res1, XPathNavigator res2){
nextNode = res1;
advance1 = false;
advance2 = true;
currentNode = res2;
return res2;
}
public override XPathNavigator Advance() {
XPathNavigator res1, res2;
XmlNodeOrder order = 0;
if (advance1) {
res1 = qy1.Advance();
} else {
res1 = nextNode;
}
if (advance2) {
res2 = qy2.Advance();
} else {
res2 = nextNode;
}
if (res1 != null && res2 != null) {
order = CompareNodes(res1, res2);
} else if (res2 == null) {
advance1 = true;
advance2 = false;
currentNode = res1;
nextNode = null;
return res1;
} else {
advance1 = false;
advance2 = true;
currentNode = res2;
nextNode = null;
return res2;
}
if (order == XmlNodeOrder.Before) {
return ProcessBeforePosition(res1, res2);
} else if (order == XmlNodeOrder.After) {
return ProcessAfterPosition(res1, res2);
} else {
// BugBug. In case of Unknown we sorting as the same.
return ProcessSamePosition(res1);
}
}
public override XPathNavigator MatchNode(XPathNavigator xsltContext) {
if (xsltContext != null) {
XPathNavigator result = qy1.MatchNode(xsltContext);
if (result != null) {
return result;
}
return qy2.MatchNode(xsltContext);
}
return null;
}
public override XPathResultType StaticType { get { return XPathResultType.NodeSet; } }
public override XPathNodeIterator Clone() { return new UnionExpr(this); }
public override XPathNavigator Current { get { return currentNode; } }
public override int CurrentPosition { get { throw new InvalidOperationException(); } }
public override void PrintQuery(XmlWriter w) {
w.WriteStartElement(this.GetType().Name);
if (qy1 != null) {
qy1.PrintQuery(w);
}
if (qy2 != null) {
qy2.PrintQuery(w);
}
w.WriteEndElement();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- VisualTarget.cs
- MultiPageTextView.cs
- ForeignConstraint.cs
- ImageCreator.cs
- DataRow.cs
- CallbackValidator.cs
- CalendarDateRangeChangingEventArgs.cs
- GradientBrush.cs
- EdmItemError.cs
- DataViewSetting.cs
- ProfileSettingsCollection.cs
- ManagementNamedValueCollection.cs
- DialogResultConverter.cs
- CodeGotoStatement.cs
- TextContainer.cs
- ErrorInfoXmlDocument.cs
- WebHttpSecurityElement.cs
- Timeline.cs
- ZipArchive.cs
- WebPartConnectionsConnectVerb.cs
- COM2ICategorizePropertiesHandler.cs
- DropShadowEffect.cs
- DesignTimeVisibleAttribute.cs
- RuntimeWrappedException.cs
- SQLBinary.cs
- DirectoryObjectSecurity.cs
- AttachedPropertyBrowsableAttribute.cs
- EventDescriptorCollection.cs
- OleDbDataReader.cs
- CompilerGeneratedAttribute.cs
- InfoCardRSAPKCS1SignatureFormatter.cs
- WebPartConnectVerb.cs
- SqlDependencyUtils.cs
- IEnumerable.cs
- TextClipboardData.cs
- XappLauncher.cs
- EndpointReference.cs
- ExpressionEditor.cs
- SetterBaseCollection.cs
- FocusWithinProperty.cs
- MimeXmlImporter.cs
- OLEDB_Enum.cs
- OracleConnectionStringBuilder.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- CryptoKeySecurity.cs
- X509AsymmetricSecurityKey.cs
- Profiler.cs
- TokenBasedSet.cs
- ToolTipAutomationPeer.cs
- JoinGraph.cs
- UmAlQuraCalendar.cs
- HandlerElementCollection.cs
- TraceSection.cs
- CompoundFileIOPermission.cs
- ExeContext.cs
- CellRelation.cs
- SqlDataSource.cs
- TaskExceptionHolder.cs
- BehaviorEditorPart.cs
- XPathException.cs
- WindowPatternIdentifiers.cs
- DataGridDesigner.cs
- DynamicMethod.cs
- RandomNumberGenerator.cs
- DecimalMinMaxAggregationOperator.cs
- AttachedAnnotationChangedEventArgs.cs
- CodeGenerator.cs
- XmlSchemaObjectTable.cs
- OracleNumber.cs
- ZipArchive.cs
- ExtensionDataReader.cs
- ListBoxDesigner.cs
- FacetChecker.cs
- DefaultMergeHelper.cs
- EditorPartChrome.cs
- XPathNodeList.cs
- PreviewPrintController.cs
- HtmlInputSubmit.cs
- ProxyWebPartManagerDesigner.cs
- DeclarativeConditionsCollection.cs
- HashAlgorithm.cs
- PriorityRange.cs
- RC2.cs
- WeakReadOnlyCollection.cs
- DocumentGridPage.cs
- TreeNodeCollectionEditor.cs
- WriteableBitmap.cs
- XmlNamespaceManager.cs
- WebPartTransformerCollection.cs
- xsdvalidator.cs
- HttpServerUtilityBase.cs
- ResizeBehavior.cs
- TimeoutException.cs
- SessionSwitchEventArgs.cs
- EditingContext.cs
- RectangleF.cs
- TargetPerspective.cs
- XPathBuilder.cs
- ZipPackagePart.cs
- Color.cs