Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / QueryOperators / Inlined / LongSumAggregationOperator.cs / 1305376 / LongSumAggregationOperator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // LongSumAggregationOperator.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for longs. /// internal sealed class LongSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal LongSumAggregationOperator(IEnumerable child) : base(child) { } //--------------------------------------------------------------------------------------- // Executes the entire query tree, and aggregates the intermediate results into the // final result based on the binary operators and final reduction. // // Return Value: // The single result of aggregation. // protected override long InternalAggregate(ref Exception singularExceptionToThrow) { // Because the final reduction is typically much cheaper than the intermediate // reductions over the individual partitions, and because each parallel partition // will do a lot of work to produce a single output element, we prefer to turn off // pipelining, and process the final reductions serially. using (IEnumerator enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true)) { // We just reduce the elements in each output partition. long sum = 0L; while (enumerator.MoveNext()) { checked { sum += enumerator.Current; } } return sum; } } //--------------------------------------------------------------------------------------- // Creates an enumerator that is used internally for the final aggregation step. // protected override QueryOperatorEnumerator CreateEnumerator ( int index, int count, QueryOperatorEnumerator source, object sharedData, CancellationToken cancellationToken) { return new LongSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class LongSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal LongSumAggregationOperatorEnumerator(QueryOperatorEnumerator source, int partitionIndex, CancellationToken cancellationToken) : base(partitionIndex, cancellationToken) { Contract.Assert(source != null); m_source = source; } //--------------------------------------------------------------------------------------- // Tallies up the sum of the underlying data source, walking the entire thing the first // time MoveNext is called on this object. // protected override bool MoveNextCore(ref long currentElement) { long element = default(long); TKey keyUnused = default(TKey); QueryOperatorEnumerator source = m_source; if (source.MoveNext(ref element, ref keyUnused)) { // We just scroll through the enumerator and accumulate the sum. long tempSum = 0L; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); checked { tempSum += element; } } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = tempSum; return true; } return false; } //---------------------------------------------------------------------------------------- // Dispose of resources associated with the underlying enumerator. // protected override void Dispose(bool disposing) { Contract.Assert(m_source != null); m_source.Dispose(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // LongSumAggregationOperator.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for longs. /// internal sealed class LongSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal LongSumAggregationOperator(IEnumerable child) : base(child) { } //--------------------------------------------------------------------------------------- // Executes the entire query tree, and aggregates the intermediate results into the // final result based on the binary operators and final reduction. // // Return Value: // The single result of aggregation. // protected override long InternalAggregate(ref Exception singularExceptionToThrow) { // Because the final reduction is typically much cheaper than the intermediate // reductions over the individual partitions, and because each parallel partition // will do a lot of work to produce a single output element, we prefer to turn off // pipelining, and process the final reductions serially. using (IEnumerator enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true)) { // We just reduce the elements in each output partition. long sum = 0L; while (enumerator.MoveNext()) { checked { sum += enumerator.Current; } } return sum; } } //--------------------------------------------------------------------------------------- // Creates an enumerator that is used internally for the final aggregation step. // protected override QueryOperatorEnumerator CreateEnumerator ( int index, int count, QueryOperatorEnumerator source, object sharedData, CancellationToken cancellationToken) { return new LongSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class LongSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal LongSumAggregationOperatorEnumerator(QueryOperatorEnumerator source, int partitionIndex, CancellationToken cancellationToken) : base(partitionIndex, cancellationToken) { Contract.Assert(source != null); m_source = source; } //--------------------------------------------------------------------------------------- // Tallies up the sum of the underlying data source, walking the entire thing the first // time MoveNext is called on this object. // protected override bool MoveNextCore(ref long currentElement) { long element = default(long); TKey keyUnused = default(TKey); QueryOperatorEnumerator source = m_source; if (source.MoveNext(ref element, ref keyUnused)) { // We just scroll through the enumerator and accumulate the sum. long tempSum = 0L; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); checked { tempSum += element; } } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = tempSum; return true; } return false; } //---------------------------------------------------------------------------------------- // Dispose of resources associated with the underlying enumerator. // protected override void Dispose(bool disposing) { Contract.Assert(m_source != null); m_source.Dispose(); } } } } // 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
- DBDataPermissionAttribute.cs
- CommandDesigner.cs
- SQLBinaryStorage.cs
- SessionStateSection.cs
- NavigationService.cs
- MultiPageTextView.cs
- BaseComponentEditor.cs
- ColumnResizeAdorner.cs
- ComboBox.cs
- UnitySerializationHolder.cs
- ObjectPersistData.cs
- CssTextWriter.cs
- ThreadInterruptedException.cs
- ProcessHostConfigUtils.cs
- ObjectIDGenerator.cs
- SafeMemoryMappedFileHandle.cs
- SByteStorage.cs
- StylusPointDescription.cs
- TrackBarRenderer.cs
- PolicyStatement.cs
- ElementHostAutomationPeer.cs
- TransactionTraceIdentifier.cs
- DataServiceSaveChangesEventArgs.cs
- LinqDataSourceUpdateEventArgs.cs
- DataGrid.cs
- XslTransform.cs
- ConstructorExpr.cs
- ToolStripGrip.cs
- NonVisualControlAttribute.cs
- ListViewItemSelectionChangedEvent.cs
- MultiView.cs
- ControlType.cs
- DashStyles.cs
- RecordsAffectedEventArgs.cs
- MenuDesigner.cs
- CommandSet.cs
- DescendantOverDescendantQuery.cs
- XmlSchemaSimpleTypeRestriction.cs
- ResourceCategoryAttribute.cs
- EventLogPermission.cs
- ChangeNode.cs
- ClusterRegistryConfigurationProvider.cs
- wgx_sdk_version.cs
- CreateParams.cs
- SharedPersonalizationStateInfo.cs
- AbstractSvcMapFileLoader.cs
- WebHttpSecurityElement.cs
- XmlSchemaObject.cs
- JsonCollectionDataContract.cs
- Panel.cs
- ContainerActivationHelper.cs
- CommunicationObjectFaultedException.cs
- EntityContainerEmitter.cs
- WebServiceTypeData.cs
- StoreContentChangedEventArgs.cs
- WindowsSysHeader.cs
- SendAgentStatusRequest.cs
- Brushes.cs
- XamlPathDataSerializer.cs
- GridViewUpdatedEventArgs.cs
- webbrowsersite.cs
- DSASignatureFormatter.cs
- UiaCoreApi.cs
- base64Transforms.cs
- RectangleConverter.cs
- CssClassPropertyAttribute.cs
- AncillaryOps.cs
- RoutedEventArgs.cs
- KerberosRequestorSecurityTokenAuthenticator.cs
- DynamicUpdateCommand.cs
- UriWriter.cs
- DataBindingCollection.cs
- ControlAdapter.cs
- BevelBitmapEffect.cs
- XMLUtil.cs
- IntegerValidatorAttribute.cs
- XmlCodeExporter.cs
- HighContrastHelper.cs
- AutomationElementCollection.cs
- MemoryStream.cs
- BooleanAnimationUsingKeyFrames.cs
- ServiceAuthorizationElement.cs
- OdbcConnectionOpen.cs
- CheckableControlBaseAdapter.cs
- CacheChildrenQuery.cs
- WebBrowserBase.cs
- CodeDefaultValueExpression.cs
- ImageField.cs
- PropertyEmitter.cs
- ExpressionParser.cs
- CodeDomSerializerException.cs
- BatchParser.cs
- EmptyReadOnlyDictionaryInternal.cs
- DocumentManager.cs
- TypeForwardedToAttribute.cs
- DetailsViewPagerRow.cs
- MessageQueueEnumerator.cs
- AdornedElementPlaceholder.cs
- SizeFConverter.cs
- ExpandCollapseProviderWrapper.cs