@@ -73,63 +73,95 @@ protected IMongoCollection<TDocument> WrappedCollection
7373 }
7474
7575 // public methods
76- public override Task < IAsyncCursor < TResult > > AggregateAsync < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
76+ public override IAsyncCursor < TResult > Aggregate < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
7777 {
78- const string matchOperatorName = "$match" ;
79-
80- var filterStage = new DelegatedPipelineStageDefinition < TDocument , TDocument > (
81- matchOperatorName ,
82- ( s , sr ) =>
83- {
84- var renderedFilter = _filter . Render ( s , sr ) ;
85- return new RenderedPipelineStageDefinition < TDocument > ( matchOperatorName , new BsonDocument ( matchOperatorName , renderedFilter ) , s ) ;
86- } ) ;
87-
88- var filterPipeline = new PipelineStagePipelineDefinition < TDocument , TDocument > ( new [ ] { filterStage } ) ;
89- var combinedPipeline = new CombinedPipelineDefinition < TDocument , TDocument , TResult > (
90- filterPipeline ,
91- pipeline ) ;
78+ var filteredPipeline = CreateFilteredPipeline ( pipeline ) ;
79+ return _wrappedCollection . Aggregate ( filteredPipeline , options , cancellationToken ) ;
80+ }
9281
93- var optimizedPipeline = new OptimizingPipelineDefinition < TDocument , TResult > ( combinedPipeline ) ;
82+ public override Task < IAsyncCursor < TResult > > AggregateAsync < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
83+ {
84+ var filteredPipeline = CreateFilteredPipeline ( pipeline ) ;
85+ return _wrappedCollection . AggregateAsync ( filteredPipeline , options , cancellationToken ) ;
86+ }
9487
95- return _wrappedCollection . AggregateAsync ( optimizedPipeline , options , cancellationToken ) ;
88+ public override BulkWriteResult < TDocument > BulkWrite ( IEnumerable < WriteModel < TDocument > > requests , BulkWriteOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
89+ {
90+ return _wrappedCollection . BulkWrite ( CombineModelFilters ( requests ) , options , cancellationToken ) ;
9691 }
9792
9893 public override Task < BulkWriteResult < TDocument > > BulkWriteAsync ( IEnumerable < WriteModel < TDocument > > requests , BulkWriteOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
9994 {
10095 return _wrappedCollection . BulkWriteAsync ( CombineModelFilters ( requests ) , options , cancellationToken ) ;
10196 }
10297
98+ public override long Count ( FilterDefinition < TDocument > filter , CountOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
99+ {
100+ return _wrappedCollection . Count ( CombineFilters ( filter ) , options , cancellationToken ) ;
101+ }
102+
103103 public override Task < long > CountAsync ( FilterDefinition < TDocument > filter , CountOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
104104 {
105105 return _wrappedCollection . CountAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
106106 }
107107
108+ public override IAsyncCursor < TField > Distinct < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
109+ {
110+ return _wrappedCollection . Distinct ( field , CombineFilters ( filter ) , options , cancellationToken ) ;
111+ }
112+
108113 public override Task < IAsyncCursor < TField > > DistinctAsync < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
109114 {
110115 return _wrappedCollection . DistinctAsync ( field , CombineFilters ( filter ) , options , cancellationToken ) ;
111116 }
112117
118+ public override IAsyncCursor < TProjection > FindSync < TProjection > ( FilterDefinition < TDocument > filter , FindOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
119+ {
120+ return _wrappedCollection . FindSync ( CombineFilters ( filter ) , options , cancellationToken ) ;
121+ }
122+
113123 public override Task < IAsyncCursor < TProjection > > FindAsync < TProjection > ( FilterDefinition < TDocument > filter , FindOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
114124 {
115125 return _wrappedCollection . FindAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
116126 }
117127
128+ public override TProjection FindOneAndDelete < TProjection > ( FilterDefinition < TDocument > filter , FindOneAndDeleteOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
129+ {
130+ return _wrappedCollection . FindOneAndDelete ( CombineFilters ( filter ) , options , cancellationToken ) ;
131+ }
132+
118133 public override Task < TProjection > FindOneAndDeleteAsync < TProjection > ( FilterDefinition < TDocument > filter , FindOneAndDeleteOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
119134 {
120135 return _wrappedCollection . FindOneAndDeleteAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
121136 }
122137
138+ public override TProjection FindOneAndReplace < TProjection > ( FilterDefinition < TDocument > filter , TDocument replacement , FindOneAndReplaceOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
139+ {
140+ return _wrappedCollection . FindOneAndReplace ( CombineFilters ( filter ) , replacement , options , cancellationToken ) ;
141+ }
142+
123143 public override Task < TProjection > FindOneAndReplaceAsync < TProjection > ( FilterDefinition < TDocument > filter , TDocument replacement , FindOneAndReplaceOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
124144 {
125145 return _wrappedCollection . FindOneAndReplaceAsync ( CombineFilters ( filter ) , replacement , options , cancellationToken ) ;
126146 }
127147
148+ public override TProjection FindOneAndUpdate < TProjection > ( FilterDefinition < TDocument > filter , UpdateDefinition < TDocument > update , FindOneAndUpdateOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
149+ {
150+ return _wrappedCollection . FindOneAndUpdate ( CombineFilters ( filter ) , update , options , cancellationToken ) ;
151+ }
152+
128153 public override Task < TProjection > FindOneAndUpdateAsync < TProjection > ( FilterDefinition < TDocument > filter , UpdateDefinition < TDocument > update , FindOneAndUpdateOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
129154 {
130155 return _wrappedCollection . FindOneAndUpdateAsync ( CombineFilters ( filter ) , update , options , cancellationToken ) ;
131156 }
132157
158+ public override IAsyncCursor < TResult > MapReduce < TResult > ( BsonJavaScript map , BsonJavaScript reduce , MapReduceOptions < TDocument , TResult > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
159+ {
160+ options = options ?? new MapReduceOptions < TDocument , TResult > ( ) ;
161+ options . Filter = CombineFilters ( options . Filter ) ;
162+ return _wrappedCollection . MapReduce ( map , reduce , options , cancellationToken ) ;
163+ }
164+
133165 public override Task < IAsyncCursor < TResult > > MapReduceAsync < TResult > ( BsonJavaScript map , BsonJavaScript reduce , MapReduceOptions < TDocument , TResult > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
134166 {
135167 options = options ?? new MapReduceOptions < TDocument , TResult > ( ) ;
@@ -181,5 +213,25 @@ private IEnumerable<WriteModel<TDocument>> CombineModelFilters(IEnumerable<Write
181213 }
182214 } ) ;
183215 }
216+
217+ private PipelineDefinition < TDocument , TResult > CreateFilteredPipeline < TResult > ( PipelineDefinition < TDocument , TResult > pipeline )
218+ {
219+ const string matchOperatorName = "$match" ;
220+
221+ var filterStage = new DelegatedPipelineStageDefinition < TDocument , TDocument > (
222+ matchOperatorName ,
223+ ( s , sr ) =>
224+ {
225+ var renderedFilter = _filter . Render ( s , sr ) ;
226+ return new RenderedPipelineStageDefinition < TDocument > ( matchOperatorName , new BsonDocument ( matchOperatorName , renderedFilter ) , s ) ;
227+ } ) ;
228+
229+ var filterPipeline = new PipelineStagePipelineDefinition < TDocument , TDocument > ( new [ ] { filterStage } ) ;
230+ var combinedPipeline = new CombinedPipelineDefinition < TDocument , TDocument , TResult > (
231+ filterPipeline ,
232+ pipeline ) ;
233+
234+ return new OptimizingPipelineDefinition < TDocument , TResult > ( combinedPipeline ) ;
235+ }
184236 }
185237}
0 commit comments