Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / QueryOperators / ScanQueryOperator.cs / 1305376 / ScanQueryOperator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // ScanQueryOperator.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// A scan is just a simple operator that is positioned directly on top of some /// real data source. It's really just a place holder used during execution and /// analysis -- it should never actually get opened. /// ///internal sealed class ScanQueryOperator : QueryOperator { private readonly IEnumerable m_data; // The actual data source to scan. //------------------------------------------------------------------------------------ // Constructs a new scan on top of the target data source. // internal ScanQueryOperator(IEnumerable data) : base(Scheduling.DefaultPreserveOrder, QuerySettings.Empty) { Contract.Assert(data != null); ParallelEnumerableWrapper wrapper = data as ParallelEnumerableWrapper ; if (wrapper != null) { data = wrapper.WrappedEnumerable; } m_data = data; } //----------------------------------------------------------------------------------- // Accesses the underlying data source. // public IEnumerable Data { get { return m_data; } } //----------------------------------------------------------------------------------- // Override of the query operator base class's Open method. It creates a partitioned // stream that reads scans the data source. // internal override QueryResults Open(QuerySettings settings, bool preferStriping) { Contract.Assert(settings.DegreeOfParallelism.HasValue); IList dataAsList = m_data as IList ; if (dataAsList != null) { return new ListQueryResults (dataAsList, settings.DegreeOfParallelism.GetValueOrDefault(), preferStriping); } else { return new ScanEnumerableQueryOperatorResults(m_data, settings); } } //----------------------------------------------------------------------------------- // IEnumerable data source represented as QueryResults . Typically, we would not // use ScanEnumerableQueryOperatorResults if the data source implements IList . // internal override IEnumerator GetEnumerator(ParallelMergeOptions? mergeOptions, bool suppressOrderPreservation) { return m_data.GetEnumerator(); } //---------------------------------------------------------------------------------------- // Returns an enumerable that represents the query executing sequentially. // internal override IEnumerable AsSequentialQuery(CancellationToken token) { return m_data; } //--------------------------------------------------------------------------------------- // The state of the order index of the results returned by this operator. // internal override OrdinalIndexState OrdinalIndexState { get { return m_data is IList ? OrdinalIndexState.Indexible : OrdinalIndexState.Correct; } } //---------------------------------------------------------------------------------------- // Whether this operator performs a premature merge. // internal override bool LimitsParallelism { get { return false; } } private class ScanEnumerableQueryOperatorResults : QueryResults { private IEnumerable m_data; // The data source for the query private QuerySettings m_settings; // Settings collected from the query internal ScanEnumerableQueryOperatorResults(IEnumerable data, QuerySettings settings) { m_data = data; m_settings = settings; } internal override void GivePartitionedStream(IPartitionedStreamRecipient recipient) { // Since we are not using m_data as an IList, we can pass useStriping = false. PartitionedStream partitionedStream = ExchangeUtilities.PartitionDataSource( m_data, m_settings.DegreeOfParallelism.Value, false); recipient.Receive (partitionedStream); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // ScanQueryOperator.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// A scan is just a simple operator that is positioned directly on top of some /// real data source. It's really just a place holder used during execution and /// analysis -- it should never actually get opened. /// ///internal sealed class ScanQueryOperator : QueryOperator { private readonly IEnumerable m_data; // The actual data source to scan. //------------------------------------------------------------------------------------ // Constructs a new scan on top of the target data source. // internal ScanQueryOperator(IEnumerable data) : base(Scheduling.DefaultPreserveOrder, QuerySettings.Empty) { Contract.Assert(data != null); ParallelEnumerableWrapper wrapper = data as ParallelEnumerableWrapper ; if (wrapper != null) { data = wrapper.WrappedEnumerable; } m_data = data; } //----------------------------------------------------------------------------------- // Accesses the underlying data source. // public IEnumerable Data { get { return m_data; } } //----------------------------------------------------------------------------------- // Override of the query operator base class's Open method. It creates a partitioned // stream that reads scans the data source. // internal override QueryResults Open(QuerySettings settings, bool preferStriping) { Contract.Assert(settings.DegreeOfParallelism.HasValue); IList dataAsList = m_data as IList ; if (dataAsList != null) { return new ListQueryResults (dataAsList, settings.DegreeOfParallelism.GetValueOrDefault(), preferStriping); } else { return new ScanEnumerableQueryOperatorResults(m_data, settings); } } //----------------------------------------------------------------------------------- // IEnumerable data source represented as QueryResults . Typically, we would not // use ScanEnumerableQueryOperatorResults if the data source implements IList . // internal override IEnumerator GetEnumerator(ParallelMergeOptions? mergeOptions, bool suppressOrderPreservation) { return m_data.GetEnumerator(); } //---------------------------------------------------------------------------------------- // Returns an enumerable that represents the query executing sequentially. // internal override IEnumerable AsSequentialQuery(CancellationToken token) { return m_data; } //--------------------------------------------------------------------------------------- // The state of the order index of the results returned by this operator. // internal override OrdinalIndexState OrdinalIndexState { get { return m_data is IList ? OrdinalIndexState.Indexible : OrdinalIndexState.Correct; } } //---------------------------------------------------------------------------------------- // Whether this operator performs a premature merge. // internal override bool LimitsParallelism { get { return false; } } private class ScanEnumerableQueryOperatorResults : QueryResults { private IEnumerable m_data; // The data source for the query private QuerySettings m_settings; // Settings collected from the query internal ScanEnumerableQueryOperatorResults(IEnumerable data, QuerySettings settings) { m_data = data; m_settings = settings; } internal override void GivePartitionedStream(IPartitionedStreamRecipient recipient) { // Since we are not using m_data as an IList, we can pass useStriping = false. PartitionedStream partitionedStream = ExchangeUtilities.PartitionDataSource( m_data, m_settings.DegreeOfParallelism.Value, false); recipient.Receive (partitionedStream); } } } } // 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
- SystemColors.cs
- FileIOPermission.cs
- DataGridViewImageColumn.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- TextContainerChangedEventArgs.cs
- BaseCodePageEncoding.cs
- StringInfo.cs
- OdbcError.cs
- LinkArea.cs
- MoveSizeWinEventHandler.cs
- ReversePositionQuery.cs
- RequestCachingSection.cs
- ToolStripOverflowButton.cs
- CodeIdentifiers.cs
- RelationshipManager.cs
- MissingMemberException.cs
- ProcessHostConfigUtils.cs
- HashHelper.cs
- WebBrowsableAttribute.cs
- LiteralControl.cs
- ServiceOperationHelpers.cs
- SoapFault.cs
- SqlUserDefinedTypeAttribute.cs
- OracleBFile.cs
- ObjectResult.cs
- BindingCollection.cs
- ProfileSection.cs
- WindowsFormsHostAutomationPeer.cs
- DataList.cs
- XmlBaseWriter.cs
- DataGridHyperlinkColumn.cs
- UnSafeCharBuffer.cs
- FlowchartDesigner.Helpers.cs
- TypeUsageBuilder.cs
- AspNetPartialTrustHelpers.cs
- Overlapped.cs
- TrackingValidationObjectDictionary.cs
- cryptoapiTransform.cs
- PerformanceCounterPermissionAttribute.cs
- PasswordPropertyTextAttribute.cs
- CodeExporter.cs
- WebPartDisplayModeCancelEventArgs.cs
- TrailingSpaceComparer.cs
- CreateDataSourceDialog.cs
- AttributeEmitter.cs
- WebPermission.cs
- UserPreferenceChangingEventArgs.cs
- DataServiceException.cs
- MetabaseReader.cs
- CaseInsensitiveHashCodeProvider.cs
- DataControlImageButton.cs
- storepermissionattribute.cs
- ArgumentOutOfRangeException.cs
- GridViewUpdateEventArgs.cs
- XmlSchemaSimpleContentRestriction.cs
- Size3D.cs
- VariableQuery.cs
- CryptoApi.cs
- Constants.cs
- PasswordDeriveBytes.cs
- PrintEvent.cs
- UserMapPath.cs
- MailMessage.cs
- HttpListenerResponse.cs
- ServiceBusyException.cs
- Transform.cs
- InvalidPropValue.cs
- ServiceDescriptions.cs
- SeekableReadStream.cs
- ClrProviderManifest.cs
- AdobeCFFWrapper.cs
- WindowsTooltip.cs
- DesignerVerb.cs
- ConditionCollection.cs
- MimeTypeMapper.cs
- StateWorkerRequest.cs
- SocketException.cs
- LinkUtilities.cs
- DateTimeConverter.cs
- ConditionCollection.cs
- InvalidDataException.cs
- BevelBitmapEffect.cs
- HtmlInputButton.cs
- AssemblyName.cs
- HtmlFormWrapper.cs
- CodeTypeMember.cs
- KnownBoxes.cs
- Crypto.cs
- FocusChangedEventArgs.cs
- SessionState.cs
- OraclePermission.cs
- CodeVariableReferenceExpression.cs
- DBAsyncResult.cs
- Vector3DConverter.cs
- ProofTokenCryptoHandle.cs
- CryptoConfig.cs
- WebPartZone.cs
- AttachedAnnotation.cs
- DateTimeEditor.cs
- ToolStripItem.cs