Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Server / System / Data / Services / Internal / NeedSkipTokenVisitor.cs / 1305376 / NeedSkipTokenVisitor.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // //// Visitor to evaluate if skip tokens are needed for an expansion // // // @owner [....] //--------------------------------------------------------------------- namespace System.Data.Services.Internal { #region Namespaces using System.Collections.Generic; using System.Data.Services.Providers; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; #endregion ////// Visitor to evaluate if skip tokens are needed for a given internal sealed class NeedSkipTokenVisitor : ALinqExpressionVisitor { ////// Resource type for which we are evaluating ordering expressions private readonly ResourceType rt; ///Resource property to which the ordering expression corresponds private ResourceProperty property; ///Initializes a new private NeedSkipTokenVisitor() : this(null) { } ///instance. /// Initializes a new /// Resource type for which we are evaluating ordering expressions private NeedSkipTokenVisitor(ResourceType rt) { this.rt = rt; } ///instance. /// /// True of skiptoken is required for this instance, false otherwise /// private bool NeedSkipToken { get; set; } ////// Resource property to which the ordering expression corresponds /// private ResourceProperty Property { get { return this.rt != null ? this.property : null; } } ////// Finds out if the given /// Input orderingInfo. ///required a skip token /// expression in the expansion /// true if skip token expression is needed, false otherwise internal static bool IsSkipTokenRequired(OrderingInfo orderingInfo) { if (orderingInfo != null && orderingInfo.IsPaged) { foreach (OrderingExpression o in orderingInfo.OrderingExpressions) { LambdaExpression l = (LambdaExpression)o.Expression; NeedSkipTokenVisitor visitor = new NeedSkipTokenVisitor(); visitor.Visit(l.Body); if (visitor.NeedSkipToken) { return true; } } } return false; } ////// Obtains a collection of resource properties that are needed for skip token generation /// /// Input orderingInfo. /// Resource type for which to collect the skip token properties ///Collection of resource properties used in $skiptoken internal static ICollectionCollectSkipTokenProperties(OrderingInfo orderingInfo, ResourceType rt) { Debug.Assert(orderingInfo != null, "Must have valid ordering information to collect skip token properties"); Debug.Assert(orderingInfo.IsPaged, "Must have paging enabled to collection skip token properties"); List resourceProperties = new List (); foreach (OrderingExpression o in orderingInfo.OrderingExpressions) { LambdaExpression l = (LambdaExpression)o.Expression; NeedSkipTokenVisitor visitor = new NeedSkipTokenVisitor(rt); visitor.Visit(l.Body); if (visitor.NeedSkipToken) { return null; } else { Debug.Assert(visitor.Property != null, "Must have a valid property if skip token is not needed"); resourceProperties.Add(visitor.Property); } } return resourceProperties; } /// /// Override the /// Input expression ///method to decide if we need skip token expression in the expansion /// Output expression which is the same as input expression for this visitor internal override Expression Visit(Expression exp) { if (exp == null) { return exp; } switch (exp.NodeType) { case ExpressionType.MemberAccess: case ExpressionType.Parameter: return base.Visit(exp); default: this.NeedSkipToken = true; return exp; } } ////// Override for member access visitor /// /// Member access expression ///Same expressions as internal override Expression VisitMemberAccess(MemberExpression m) { if (m.Member.MemberType != MemberTypes.Property || m.Expression.NodeType != ExpressionType.Parameter) { this.NeedSkipToken = true; return m; } else { // Is this a visitor for collection of resource properties if (this.rt != null) { this.property = this.rt.TryResolvePropertyName(m.Member.Name); Debug.Assert( this.property != null && this.property.ResourceType.ResourceTypeKind == ResourceTypeKind.Primitive, "skip token should be made up of primitive properties."); } return base.VisitMemberAccess(m); } } ////// Override for parameter expression /// /// Parameter expression ///Same parameter as internal override Expression VisitParameter(ParameterExpression p) { if (this.rt != null && p.Type != this.rt.InstanceType) { this.NeedSkipToken = true; return p; } else { return base.VisitParameter(p); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // //// Visitor to evaluate if skip tokens are needed for an expansion // // // @owner [....] //--------------------------------------------------------------------- namespace System.Data.Services.Internal { #region Namespaces using System.Collections.Generic; using System.Data.Services.Providers; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; #endregion ////// Visitor to evaluate if skip tokens are needed for a given internal sealed class NeedSkipTokenVisitor : ALinqExpressionVisitor { ////// Resource type for which we are evaluating ordering expressions private readonly ResourceType rt; ///Resource property to which the ordering expression corresponds private ResourceProperty property; ///Initializes a new private NeedSkipTokenVisitor() : this(null) { } ///instance. /// Initializes a new /// Resource type for which we are evaluating ordering expressions private NeedSkipTokenVisitor(ResourceType rt) { this.rt = rt; } ///instance. /// /// True of skiptoken is required for this instance, false otherwise /// private bool NeedSkipToken { get; set; } ////// Resource property to which the ordering expression corresponds /// private ResourceProperty Property { get { return this.rt != null ? this.property : null; } } ////// Finds out if the given /// Input orderingInfo. ///required a skip token /// expression in the expansion /// true if skip token expression is needed, false otherwise internal static bool IsSkipTokenRequired(OrderingInfo orderingInfo) { if (orderingInfo != null && orderingInfo.IsPaged) { foreach (OrderingExpression o in orderingInfo.OrderingExpressions) { LambdaExpression l = (LambdaExpression)o.Expression; NeedSkipTokenVisitor visitor = new NeedSkipTokenVisitor(); visitor.Visit(l.Body); if (visitor.NeedSkipToken) { return true; } } } return false; } ////// Obtains a collection of resource properties that are needed for skip token generation /// /// Input orderingInfo. /// Resource type for which to collect the skip token properties ///Collection of resource properties used in $skiptoken internal static ICollectionCollectSkipTokenProperties(OrderingInfo orderingInfo, ResourceType rt) { Debug.Assert(orderingInfo != null, "Must have valid ordering information to collect skip token properties"); Debug.Assert(orderingInfo.IsPaged, "Must have paging enabled to collection skip token properties"); List resourceProperties = new List (); foreach (OrderingExpression o in orderingInfo.OrderingExpressions) { LambdaExpression l = (LambdaExpression)o.Expression; NeedSkipTokenVisitor visitor = new NeedSkipTokenVisitor(rt); visitor.Visit(l.Body); if (visitor.NeedSkipToken) { return null; } else { Debug.Assert(visitor.Property != null, "Must have a valid property if skip token is not needed"); resourceProperties.Add(visitor.Property); } } return resourceProperties; } /// /// Override the /// Input expression ///method to decide if we need skip token expression in the expansion /// Output expression which is the same as input expression for this visitor internal override Expression Visit(Expression exp) { if (exp == null) { return exp; } switch (exp.NodeType) { case ExpressionType.MemberAccess: case ExpressionType.Parameter: return base.Visit(exp); default: this.NeedSkipToken = true; return exp; } } ////// Override for member access visitor /// /// Member access expression ///Same expressions as internal override Expression VisitMemberAccess(MemberExpression m) { if (m.Member.MemberType != MemberTypes.Property || m.Expression.NodeType != ExpressionType.Parameter) { this.NeedSkipToken = true; return m; } else { // Is this a visitor for collection of resource properties if (this.rt != null) { this.property = this.rt.TryResolvePropertyName(m.Member.Name); Debug.Assert( this.property != null && this.property.ResourceType.ResourceTypeKind == ResourceTypeKind.Primitive, "skip token should be made up of primitive properties."); } return base.VisitMemberAccess(m); } } ////// Override for parameter expression /// /// Parameter expression ///Same parameter as internal override Expression VisitParameter(ParameterExpression p) { if (this.rt != null && p.Type != this.rt.InstanceType) { this.NeedSkipToken = true; return p; } else { return base.VisitParameter(p); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SecureUICommand.cs
- AnnotationObservableCollection.cs
- OracleSqlParser.cs
- WindowPattern.cs
- TransactionFormatter.cs
- NotImplementedException.cs
- DetailsView.cs
- DataGridToolTip.cs
- ColorContextHelper.cs
- ToolStripRenderer.cs
- BindableAttribute.cs
- PassportIdentity.cs
- Html32TextWriter.cs
- ContainerParagraph.cs
- IntranetCredentialPolicy.cs
- DataRecord.cs
- ContractReference.cs
- MetabaseSettings.cs
- SecurityHeaderLayout.cs
- ListMarkerSourceInfo.cs
- MessageSecurityTokenVersion.cs
- HyperlinkAutomationPeer.cs
- Configuration.cs
- SectionInput.cs
- SettingsPropertyWrongTypeException.cs
- ConsumerConnectionPoint.cs
- ResourceAssociationSetEnd.cs
- LineServicesRun.cs
- Rights.cs
- WindowsListViewItem.cs
- TypeListConverter.cs
- SkipStoryboardToFill.cs
- PaginationProgressEventArgs.cs
- XmlQueryCardinality.cs
- ValidatedControlConverter.cs
- ThrowHelper.cs
- COM2FontConverter.cs
- SignatureDescription.cs
- TransformConverter.cs
- SQLGuidStorage.cs
- PipelineModuleStepContainer.cs
- SystemSounds.cs
- ClonableStack.cs
- TransformValueSerializer.cs
- Number.cs
- DBBindings.cs
- PropertyDescriptorGridEntry.cs
- BindingCompleteEventArgs.cs
- BuildProvider.cs
- SqlComparer.cs
- CssTextWriter.cs
- BooleanConverter.cs
- Mutex.cs
- HierarchicalDataSourceDesigner.cs
- ImageDrawing.cs
- BitmapEffectInputData.cs
- DbProviderFactoriesConfigurationHandler.cs
- MemberCollection.cs
- CompilationLock.cs
- ValidationResult.cs
- SmiXetterAccessMap.cs
- DataGrid.cs
- RecognizedPhrase.cs
- VisualStateChangedEventArgs.cs
- MessageOperationFormatter.cs
- CodeAttributeArgument.cs
- XmlQuerySequence.cs
- UTF7Encoding.cs
- Geometry3D.cs
- SynchronizationContext.cs
- DebugTracing.cs
- GifBitmapDecoder.cs
- TypeConverters.cs
- PrePrepareMethodAttribute.cs
- TransformCollection.cs
- PathFigureCollectionConverter.cs
- ObjectManager.cs
- Semaphore.cs
- EventBuilder.cs
- StorageRoot.cs
- HtmlInputReset.cs
- BooleanFunctions.cs
- XmlSchemaAppInfo.cs
- AsyncStreamReader.cs
- TextFragmentEngine.cs
- XmlSchemaObjectTable.cs
- BuildProviderAppliesToAttribute.cs
- EncodingTable.cs
- ObjectSelectorEditor.cs
- ListDataBindEventArgs.cs
- IisTraceWebEventProvider.cs
- AuthenticationModuleElementCollection.cs
- ConfigurationValidatorBase.cs
- ResourceExpressionBuilder.cs
- PageContent.cs
- MulticastIPAddressInformationCollection.cs
- TemplateControl.cs
- OleDbEnumerator.cs
- SiteMapProvider.cs
- HttpInputStream.cs