Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / 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
- ChooseAction.cs
- XmlDataProvider.cs
- DBCSCodePageEncoding.cs
- _DisconnectOverlappedAsyncResult.cs
- FixUp.cs
- Matrix3DValueSerializer.cs
- ViewManager.cs
- SurrogateDataContract.cs
- FormsAuthentication.cs
- safelinkcollection.cs
- LogicalExpr.cs
- CopyCodeAction.cs
- SizeConverter.cs
- BuildResultCache.cs
- ExpressionBuilder.cs
- ExtensibleClassFactory.cs
- MouseActionValueSerializer.cs
- IISUnsafeMethods.cs
- UIElementIsland.cs
- WebPartUserCapability.cs
- XamlPointCollectionSerializer.cs
- ToolStripGripRenderEventArgs.cs
- ClientSettingsSection.cs
- CodeSubDirectoriesCollection.cs
- ClientCultureInfo.cs
- HtmlHistory.cs
- GridViewRow.cs
- PathStreamGeometryContext.cs
- VirtualDirectoryMappingCollection.cs
- WebCodeGenerator.cs
- DomainConstraint.cs
- SettingsProperty.cs
- InkCanvasSelectionAdorner.cs
- CompiledXpathExpr.cs
- Thumb.cs
- CodeChecksumPragma.cs
- CodeDelegateCreateExpression.cs
- GridSplitterAutomationPeer.cs
- GcHandle.cs
- LoggedException.cs
- ButtonStandardAdapter.cs
- ControllableStoryboardAction.cs
- Rectangle.cs
- TypeCollectionDesigner.xaml.cs
- XmlTextAttribute.cs
- DelegateHelpers.cs
- MouseEvent.cs
- XmlSchemaValidationException.cs
- WebPartCloseVerb.cs
- OperationCanceledException.cs
- FontDriver.cs
- Utility.cs
- SqlDataSourceStatusEventArgs.cs
- ObjectItemConventionAssemblyLoader.cs
- EntityDataSourceViewSchema.cs
- WindowsToolbarAsMenu.cs
- NullableFloatMinMaxAggregationOperator.cs
- Viewport3DAutomationPeer.cs
- StoragePropertyMapping.cs
- CompilerGeneratedAttribute.cs
- MetadataPropertyvalue.cs
- GridViewAutomationPeer.cs
- TimeSpanMinutesConverter.cs
- HttpValueCollection.cs
- ManagementBaseObject.cs
- DataTemplateSelector.cs
- ByteAnimation.cs
- ConfigXmlText.cs
- BezierSegment.cs
- ThreadExceptionDialog.cs
- HttpDictionary.cs
- ExceptionHandlersDesigner.cs
- DocumentEventArgs.cs
- TagPrefixCollection.cs
- WebPartConnectVerb.cs
- RSAPKCS1SignatureFormatter.cs
- ProvideValueServiceProvider.cs
- XmlAttributeProperties.cs
- RoutedEvent.cs
- InternalConfigHost.cs
- SimpleHandlerFactory.cs
- UserThread.cs
- OleStrCAMarshaler.cs
- PointHitTestResult.cs
- ConfigurationManager.cs
- Composition.cs
- PageRanges.cs
- CipherData.cs
- Options.cs
- AppDomainFactory.cs
- ValidatorCollection.cs
- HtmlTableCellCollection.cs
- StrongNamePublicKeyBlob.cs
- Scalars.cs
- StagingAreaInputItem.cs
- QueryGenerator.cs
- ColorConvertedBitmap.cs
- ToolBarTray.cs
- OdbcTransaction.cs
- SoapServerMethod.cs