@@ -62,9 +62,13 @@ public TupleDescriptor OrderTupleDescriptor {
6262 get {
6363 if ( Order . Count == 0 )
6464 return null ;
65- if ( orderTupleDescriptor == null ) lock ( this ) if ( orderTupleDescriptor == null ) {
66- var fieldTypes = Order . Select ( p => Columns [ p . Key ] . Type ) . ToArray ( Order . Count ) ;
67- orderTupleDescriptor = TupleDescriptor . Create ( fieldTypes ) ;
65+ if ( orderTupleDescriptor == null ) {
66+ lock ( this ) {
67+ if ( orderTupleDescriptor == null ) {
68+ var fieldTypes = Order . SelectToArray ( p => Columns [ p . Key ] . Type ) ;
69+ orderTupleDescriptor = TupleDescriptor . Create ( fieldTypes ) ;
70+ }
71+ }
6872 }
6973
7074 return orderTupleDescriptor ;
@@ -141,15 +145,21 @@ public RecordSetHeader Join(RecordSetHeader joined)
141145 var groups = new List < ColumnGroup > ( columnGroupCount + joined . ColumnGroups . Count ) ;
142146 groups . AddRange ( ColumnGroups ) ;
143147 foreach ( var g in joined . ColumnGroups ) {
144- var keys = new List < int > ( g . Keys . Count ) ;
148+ //var keys = new List<int>(g.Keys.Count);
149+ var keys1 = new int [ g . Keys . Count ] ;
150+ var ai = 0 ;
145151 foreach ( var i in g . Keys ) {
146- keys . Add ( columnCount + i ) ;
152+ keys1 [ ai ++ ] = columnCount + i ;
153+ //keys.Add(columnCount + i);
147154 }
148- var columns = new List < int > ( g . Columns . Count ) ;
155+ //var columns = new List<int>(g.Columns.Count);
156+ var columns1 = new int [ g . Columns . Count ] ;
157+ ai = 0 ;
149158 foreach ( var i in g . Columns ) {
150- columns . Add ( columnCount + i ) ;
159+ columns1 [ ai ++ ] = columnCount + i ;
160+ //columns.Add(columnCount + i);
151161 }
152- groups . Add ( new ColumnGroup ( g . TypeInfoRef , keys , columns ) ) ;
162+ groups . Add ( new ColumnGroup ( g . TypeInfoRef , keys1 , columns1 ) ) ;
153163 }
154164
155165 return new RecordSetHeader (
@@ -167,8 +177,11 @@ public RecordSetHeader Join(RecordSetHeader joined)
167177 /// <returns>A new header containing only specified columns.</returns>
168178 public RecordSetHeader Select ( IEnumerable < int > selectedColumns )
169179 {
170- var columns = new List < int > ( selectedColumns ) ;
171- var columnsMap = new List < int > ( Enumerable . Repeat ( - 1 , Columns . Count ) ) ;
180+ var columns = ( selectedColumns is IReadOnlyList < int > rList ) ? rList : new List < int > ( selectedColumns ) ;
181+
182+ var columnsMap = new int [ Columns . Count ] ;
183+ Array . Fill ( columnsMap , - 1 ) ;
184+
172185 for ( int newIndex = 0 ; newIndex < columns . Count ; newIndex ++ ) {
173186 var oldIndex = columns [ newIndex ] ;
174187 columnsMap [ oldIndex ] = newIndex ;
@@ -179,9 +192,9 @@ public RecordSetHeader Select(IEnumerable<int> selectedColumns)
179192 var resultOrder = new DirectionCollection < int > (
180193 Order
181194 . Select ( o => new KeyValuePair < int , Direction > ( columnsMap [ o . Key ] , o . Value ) )
182- . TakeWhile ( o => o . Key >= 0 ) ) ;
195+ . TakeWhile ( static o => o . Key >= 0 ) ) ;
183196
184- var resultColumns = columns . Select ( ( oldIndex , newIndex ) => Columns [ oldIndex ] . Clone ( newIndex ) ) ;
197+ var resultColumns = columns . Select ( ( oldIndex , newIndex ) => Columns [ oldIndex ] . Clone ( newIndex ) ) . ToList ( columns . Count ) ;
185198
186199 var resultGroups = ColumnGroups
187200 . Where ( g => g . Keys . All ( k => columnsMap [ k ] >= 0 ) )
@@ -190,7 +203,7 @@ public RecordSetHeader Select(IEnumerable<int> selectedColumns)
190203 g . Keys . Select ( k => columnsMap [ k ] ) ,
191204 g . Columns
192205 . Select ( c => columnsMap [ c ] )
193- . Where ( c => c >= 0 ) ) ) ;
206+ . Where ( static c => c >= 0 ) ) ) ;
194207
195208 return new RecordSetHeader (
196209 resultTupleDescriptor ,
@@ -231,27 +244,38 @@ private static RecordSetHeader CreateHeader(IndexInfo indexInfo)
231244 var indexInfoColumns = indexInfo . Columns ;
232245 var indexInfoKeyColumns = indexInfo . KeyColumns ;
233246
234- var resultFieldTypes = indexInfoColumns . Select ( columnInfo => columnInfo . ValueType ) . ToArray ( indexInfoColumns . Count ) ;
247+ var resultFieldTypes = indexInfoColumns . SelectToArray ( columnInfo => columnInfo . ValueType ) ;
235248 var resultTupleDescriptor = TupleDescriptor . Create ( resultFieldTypes ) ;
236249
237- var keyOrder = new List < KeyValuePair < int , Direction > > (
238- indexInfoKeyColumns . Select ( ( p , i ) => new KeyValuePair < int , Direction > ( i , p . Value ) ) ) ;
250+ //var keyOrder = new List<KeyValuePair<int, Direction>>(
251+ // indexInfoKeyColumns.Select((p, i) => new KeyValuePair<int, Direction>(i, p.Value)));
252+
253+ var keyOrderEnumerable = indexInfoKeyColumns . Select ( static ( p , i ) => new KeyValuePair < int , Direction > ( i , p . Value ) ) ;
239254 if ( ! indexInfo . IsPrimary ) {
240255 var pkKeys = indexInfo . ReflectedType . Indexes . PrimaryIndex . KeyColumns ;
241- keyOrder . AddRange (
242- indexInfo . ValueColumns
243- . Select ( ( c , i ) => new Pair < ColumnInfo , int > ( c , i + indexInfoKeyColumns . Count ) )
244- . Where ( pair => pair . First . IsPrimaryKey )
256+ var offset = indexInfoKeyColumns . Count ;
257+ keyOrderEnumerable = keyOrderEnumerable
258+ . Concat ( indexInfo . ValueColumns
259+ . Select ( ( c , i ) => new Pair < ColumnInfo , int > ( c , i + offset ) )
260+ . Where ( static pair => pair . First . IsPrimaryKey )
245261 . Select ( pair => new KeyValuePair < int , Direction > ( pair . Second , pkKeys [ pair . First ] ) ) ) ;
246262 }
247- var order = new DirectionCollection < int > ( keyOrder ) ;
263+
264+ //if (!indexInfo.IsPrimary) {
265+ // var pkKeys = indexInfo.ReflectedType.Indexes.PrimaryIndex.KeyColumns;
266+ // keyOrder.AddRange(
267+ // indexInfo.ValueColumns
268+ // .Select((c, i) => new Pair<ColumnInfo, int>(c, i + indexInfoKeyColumns.Count))
269+ // .Where(pair => pair.First.IsPrimaryKey)
270+ // .Select(pair => new KeyValuePair<int, Direction>(pair.Second, pkKeys[pair.First])));
271+ //}
272+ var order = new DirectionCollection < int > ( keyOrderEnumerable ) ;
248273
249274 var keyFieldTypes = indexInfoKeyColumns
250- . Select ( columnInfo => columnInfo . Key . ValueType )
251- . ToArray ( indexInfoKeyColumns . Count ) ;
275+ . SelectToArray ( static columnInfo => columnInfo . Key . ValueType ) ;
252276 var keyDescriptor = TupleDescriptor . Create ( keyFieldTypes ) ;
253277
254- var resultColumns = indexInfoColumns . Select ( ( c , i ) => ( Column ) new MappedColumn ( c , i , c . ValueType ) ) ;
278+ var resultColumns = indexInfoColumns . Select ( static ( c , i ) => ( Column ) new MappedColumn ( c , i , c . ValueType ) ) ;
255279 var resultGroups = new [ ] { indexInfo . Group } ;
256280
257281 return new RecordSetHeader (
0 commit comments