796548170c06fc655ce98c8b32e3e9d75f280881
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / Common / Internal / Materialization / RecordStateScratchpad.cs
1 //------------------------------------------------------------------------------
2 // <copyright file="RecordStateScratchpad.cs" company="Microsoft">
3 //     Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
7
8 using System.Collections.Generic;
9 using System.Data.Metadata.Edm;
10 using System.Linq;
11 using System.Linq.Expressions;
12 using System.Runtime.CompilerServices;
13
14 namespace System.Data.Common.Internal.Materialization
15 {
16     /// <summary>
17     /// Used in the Translator to aggregate information about a (nested) record
18     /// state.  After the translator visits the columnMaps, it will compile
19     /// the recordState(s) which produces an immutable RecordStateFactory that 
20     /// can be shared amongst many query instances.
21     /// </summary>
22     internal class RecordStateScratchpad
23     {
24         private int _stateSlotNumber;
25         internal int StateSlotNumber
26         {
27             get { return _stateSlotNumber; }
28             set { _stateSlotNumber = value; }
29         }
30
31         private int _columnCount;
32         internal int ColumnCount
33         {
34             get { return _columnCount; }
35             set { _columnCount = value; }
36         }
37
38         private DataRecordInfo _dataRecordInfo;
39         internal DataRecordInfo DataRecordInfo
40         {
41             get { return _dataRecordInfo; }
42             set { _dataRecordInfo = value; }
43         }
44
45         private Expression _gatherData;
46         internal Expression GatherData
47         {
48             get { return _gatherData; }
49             set { _gatherData = value; }
50         }
51
52         private string[] _propertyNames;
53         internal string[] PropertyNames
54         {
55             get { return _propertyNames; }
56             set { _propertyNames = value; }
57         }
58         private TypeUsage[] _typeUsages;
59         internal TypeUsage[] TypeUsages
60         {
61             get { return _typeUsages; }
62             set { _typeUsages = value; }
63         }
64
65         private List<RecordStateScratchpad> _nestedRecordStateScratchpads = new List<RecordStateScratchpad>();
66
67         [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
68         internal RecordStateFactory Compile()
69         {
70             RecordStateFactory[] nestedRecordStateFactories = new RecordStateFactory[_nestedRecordStateScratchpads.Count];
71             for (int i = 0; i < nestedRecordStateFactories.Length; i++)
72             {
73                 nestedRecordStateFactories[i] = _nestedRecordStateScratchpads[i].Compile();
74             }
75
76             RecordStateFactory result = (RecordStateFactory)Activator.CreateInstance(typeof(RecordStateFactory), new object[] {
77                                                             this.StateSlotNumber, 
78                                                             this.ColumnCount,
79                                                             nestedRecordStateFactories,
80                                                             this.DataRecordInfo,
81                                                             this.GatherData,
82                                                             this.PropertyNames,
83                                                             this.TypeUsages
84                                                             });
85             return result;
86         }
87     }
88 }