@@ -164,24 +164,63 @@ protected IEnumerable<BsonDocument> Filter(IEnumerable<BsonDocument> source, Bso
164164 /// <summary>
165165 /// ORDER BY: Sort documents according orderby expression and order asc/desc
166166 /// </summary>
167- protected IEnumerable < BsonDocument > OrderBy ( IEnumerable < BsonDocument > source , BsonExpression expr , int order , int offset , int limit )
167+ protected IEnumerable < BsonDocument > OrderBy ( IEnumerable < BsonDocument > source , OrderBy orderBy , int offset , int limit )
168168 {
169- var keyValues = source
170- . Select ( x => new KeyValuePair < BsonValue , PageAddress > ( expr . ExecuteScalar ( x , _pragmas . Collation ) , x . RawId ) ) ;
169+ var segments = orderBy . Segments ;
171170
172- using ( var sorter = new SortService ( _tempDisk , order , _pragmas ) )
171+ if ( segments . Count == 1 )
173172 {
174- sorter . Insert ( keyValues ) ;
173+ var segment = segments [ 0 ] ;
174+ var keyValues = source
175+ . Select ( doc => new KeyValuePair < BsonValue , PageAddress > ( segment . Expression . ExecuteScalar ( doc , _pragmas . Collation ) , doc . RawId ) ) ;
175176
176- LOG ( $ "sort { sorter . Count } keys in { sorter . Containers . Count } containers", "SORT" ) ;
177+ using ( var sorter = new SortService ( _tempDisk , new [ ] { segment . Order } , _pragmas ) )
178+ {
179+ sorter . Insert ( keyValues ) ;
180+
181+ LOG ( $ "sort { sorter . Count } keys in { sorter . Containers . Count } containers", "SORT" ) ;
182+
183+ var result = sorter . Sort ( ) . Skip ( offset ) . Take ( limit ) ;
177184
178- var result = sorter . Sort ( ) . Skip ( offset ) . Take ( limit ) ;
185+ foreach ( var keyValue in result )
186+ {
187+ var doc = _lookup . Load ( keyValue . Value ) ;
188+
189+ yield return doc ;
190+ }
191+ }
192+ }
193+ else
194+ {
195+ var orders = segments . Select ( x => x . Order ) . ToArray ( ) ;
196+
197+ var keyValues = source
198+ . Select ( doc =>
199+ {
200+ var values = new BsonValue [ segments . Count ] ;
179201
180- foreach ( var keyValue in result )
202+ for ( var i = 0 ; i < segments . Count ; i ++ )
203+ {
204+ values [ i ] = segments [ i ] . Expression . ExecuteScalar ( doc , _pragmas . Collation ) ;
205+ }
206+
207+ return new KeyValuePair < BsonValue , PageAddress > ( SortKey . FromValues ( values , orders ) , doc . RawId ) ;
208+ } ) ;
209+
210+ using ( var sorter = new SortService ( _tempDisk , orders , _pragmas ) )
181211 {
182- var doc = _lookup . Load ( keyValue . Value ) ;
212+ sorter . Insert ( keyValues ) ;
183213
184- yield return doc ;
214+ LOG ( $ "sort { sorter . Count } keys in { sorter . Containers . Count } containers", "SORT" ) ;
215+
216+ var result = sorter . Sort ( ) . Skip ( offset ) . Take ( limit ) ;
217+
218+ foreach ( var keyValue in result )
219+ {
220+ var doc = _lookup . Load ( keyValue . Value ) ;
221+
222+ yield return doc ;
223+ }
185224 }
186225 }
187226 }
0 commit comments