Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / QueryOperators / Inlined / NullableDoubleSumAggregationOperator.cs / 1305376 / NullableDoubleSumAggregationOperator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // NullableDoubleSumAggregationOperator.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for nullable doubles. /// internal sealed class NullableDoubleSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal NullableDoubleSumAggregationOperator(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 double? 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. double sum = 0.0; while (enumerator.MoveNext()) { sum += enumerator.Current.GetValueOrDefault(); } 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 NullableDoubleSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class NullableDoubleSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal NullableDoubleSumAggregationOperatorEnumerator(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 double? currentElement) { double? element = default(double?); 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. double tempSum = 0.0; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); tempSum += element.GetValueOrDefault(); } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = new double?(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. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // NullableDoubleSumAggregationOperator.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for nullable doubles. /// internal sealed class NullableDoubleSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal NullableDoubleSumAggregationOperator(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 double? 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. double sum = 0.0; while (enumerator.MoveNext()) { sum += enumerator.Current.GetValueOrDefault(); } 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 NullableDoubleSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class NullableDoubleSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal NullableDoubleSumAggregationOperatorEnumerator(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 double? currentElement) { double? element = default(double?); 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. double tempSum = 0.0; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); tempSum += element.GetValueOrDefault(); } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = new double?(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
- WorkflowItemsPresenter.cs
- SymbolEqualComparer.cs
- DecoderReplacementFallback.cs
- _HTTPDateParse.cs
- InstanceKeyView.cs
- AliasExpr.cs
- MediaTimeline.cs
- StrokeCollectionDefaultValueFactory.cs
- QilTypeChecker.cs
- OleDbConnectionInternal.cs
- XmlKeywords.cs
- ShadowGlyph.cs
- SqlCacheDependency.cs
- InkCanvasSelection.cs
- ExtensibleClassFactory.cs
- GatewayDefinition.cs
- DesignerImageAdapter.cs
- TagPrefixAttribute.cs
- LayoutEngine.cs
- XmlSerializerAssemblyAttribute.cs
- MethodSignatureGenerator.cs
- UriWriter.cs
- XmlSchemaDatatype.cs
- XmlNullResolver.cs
- EventArgs.cs
- ThemeConfigurationDialog.cs
- PersistenceIOParticipant.cs
- MultiSelector.cs
- SecurityTokenSerializer.cs
- XmlQualifiedNameTest.cs
- RawStylusInputCustomDataList.cs
- EdmError.cs
- CollectionConverter.cs
- TransactionException.cs
- DrawToolTipEventArgs.cs
- XPathAxisIterator.cs
- Types.cs
- CounterSet.cs
- figurelength.cs
- ManagedFilter.cs
- Button.cs
- WmpBitmapDecoder.cs
- XmlCustomFormatter.cs
- DrawListViewColumnHeaderEventArgs.cs
- RemotingService.cs
- Hyperlink.cs
- PropertyItem.cs
- ValidationSummary.cs
- XslNumber.cs
- XmlValidatingReaderImpl.cs
- ControlsConfig.cs
- CodeDomLoader.cs
- DesignTimeParseData.cs
- ScriptingJsonSerializationSection.cs
- ExtensionFile.cs
- TagNameToTypeMapper.cs
- DbConnectionOptions.cs
- OutOfProcStateClientManager.cs
- NativeMethods.cs
- RawStylusInputCustomData.cs
- XpsFilter.cs
- ApplicationId.cs
- PermissionSet.cs
- ExceptionUtil.cs
- FlowLayoutSettings.cs
- RtfControls.cs
- NavigationPropertyEmitter.cs
- UpdateManifestForBrowserApplication.cs
- CodeTypeReferenceCollection.cs
- _RequestLifetimeSetter.cs
- Stylus.cs
- SecurityContextKeyIdentifierClause.cs
- SqlConnectionString.cs
- SafeHandle.cs
- PassportIdentity.cs
- Decimal.cs
- SecurityHeader.cs
- PlatformCulture.cs
- OpenFileDialog.cs
- MasterPageParser.cs
- SqlBinder.cs
- BookmarkResumptionRecord.cs
- MarshalDirectiveException.cs
- XmlStreamStore.cs
- translator.cs
- ToolStripItemGlyph.cs
- NullableDecimalSumAggregationOperator.cs
- Models.cs
- ToggleButtonAutomationPeer.cs
- FormsAuthenticationConfiguration.cs
- XMLSchema.cs
- BaseParaClient.cs
- ConfigXmlAttribute.cs
- Registry.cs
- UnSafeCharBuffer.cs
- ReaderWriterLock.cs
- Point3DCollection.cs
- SequentialWorkflowRootDesigner.cs
- RangeValidator.cs
- AsyncCompletedEventArgs.cs