2009-06-12 Bill Holmes <billholmes54@gmail.com>
[mono.git] / mcs / class / System.Data.Linq / src / DbLinq / Data / Linq / Sugar / Expressions / SelectExpression.cs
1 #region MIT license\r
2 // \r
3 // MIT license\r
4 //\r
5 // Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne\r
6 // \r
7 // Permission is hereby granted, free of charge, to any person obtaining a copy\r
8 // of this software and associated documentation files (the "Software"), to deal\r
9 // in the Software without restriction, including without limitation the rights\r
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
11 // copies of the Software, and to permit persons to whom the Software is\r
12 // furnished to do so, subject to the following conditions:\r
13 // \r
14 // The above copyright notice and this permission notice shall be included in\r
15 // all copies or substantial portions of the Software.\r
16 // \r
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
23 // THE SOFTWARE.\r
24 // \r
25 #endregion\r
26 \r
27 using System;\r
28 using System.Collections.Generic;\r
29 using System.Linq.Expressions;\r
30 #if MONO_STRICT\r
31 using System.Data.Linq.Sugar.Expressions;\r
32 #else\r
33 using DbLinq.Data.Linq.Sugar.Expressions;\r
34 #endif\r
35 \r
36 #if MONO_STRICT\r
37 namespace System.Data.Linq.Sugar.Expressions\r
38 #else\r
39 namespace DbLinq.Data.Linq.Sugar.Expressions\r
40 #endif\r
41 {\r
42     /// <summary>\r
43     /// ScopeExpression describes a selection.\r
44     /// It can be present at top-level or as subexpressions\r
45     /// </summary>\r
46 #if !MONO_STRICT\r
47     public\r
48 #endif\r
49     class SelectExpression : OperandsMutableExpression\r
50     {\r
51         public const ExpressionType ExpressionType = (ExpressionType)CustomExpressionType.Scope;\r
52 \r
53         // Involved entities\r
54         public IList<TableExpression> Tables { get; private set; }\r
55         public IList<ColumnExpression> Columns { get; private set; }\r
56 \r
57         // Clauses\r
58         public string ExecuteMethodName { get; set; } // for Execute<> calls, this member is filled with the method name\r
59         public LambdaExpression Reader { get; set; } // Func<IDataRecord,DataMapper,T> --> creates an object from data record\r
60         public IList<Expression> Where { get; private set; }\r
61         public IList<OrderByExpression> OrderBy { get; private set; }\r
62         public IList<GroupExpression> Group { get; private set; }\r
63 \r
64         public Expression Offset { get; set; }\r
65         public Expression Limit { get; set; }\r
66         public Expression OffsetAndLimit { get; set; }\r
67 \r
68         // the following two clauses are used by expressions of same level, linked by a special operation (like "union")\r
69         public SelectExpression NextSelectExpression;\r
70         public SelectOperatorType NextSelectExpressionOperator;\r
71 \r
72         // Parent scope: we will climb up to find if we don't find the request table in the current scope\r
73         public SelectExpression Parent { get; private set; }\r
74 \r
75         public SelectExpression()\r
76             : base(ExpressionType, null, null)\r
77         {\r
78             Tables = new List<TableExpression>();\r
79             Columns = new List<ColumnExpression>();\r
80             // Local clauses\r
81             Where = new List<Expression>();\r
82             OrderBy = new List<OrderByExpression>();\r
83             Group = new List<GroupExpression>();\r
84         }\r
85 \r
86         public SelectExpression(SelectExpression parentSelectExpression)\r
87             : base(ExpressionType, null, null)\r
88         {\r
89             Parent = parentSelectExpression;\r
90             // Tables and columns are empty, since the table/column lookup recurses to parentScopePiece\r
91             Tables = new List<TableExpression>();\r
92             Columns = new List<ColumnExpression>();\r
93             // Local clauses\r
94             Where = new List<Expression>();\r
95             OrderBy = new List<OrderByExpression>();\r
96             Group = new List<GroupExpression>();\r
97         }\r
98 \r
99         private SelectExpression(Type type, IList<Expression> operands)\r
100             : base(ExpressionType, type, operands)\r
101         {\r
102         }\r
103 \r
104         protected override Expression Mutate2(IList<Expression> newOperands)\r
105         {\r
106             Type type;\r
107             if (newOperands.Count > 0)\r
108                 type = newOperands[0].Type;\r
109             else\r
110                 type = Type;\r
111             var scopeExpression = new SelectExpression(type, newOperands);\r
112             scopeExpression.Tables = Tables;\r
113             scopeExpression.Columns = Columns;\r
114             scopeExpression.Where = Where;\r
115             scopeExpression.OrderBy = OrderBy;\r
116             scopeExpression.Group = Group;\r
117             scopeExpression.Parent = Parent;\r
118             scopeExpression.ExecuteMethodName = ExecuteMethodName;\r
119             scopeExpression.Reader = Reader;\r
120             scopeExpression.Limit = Limit;\r
121             scopeExpression.Offset = Offset;\r
122             scopeExpression.OffsetAndLimit = OffsetAndLimit;\r
123             scopeExpression.NextSelectExpression = NextSelectExpression;\r
124             scopeExpression.NextSelectExpressionOperator = NextSelectExpressionOperator;\r
125             return scopeExpression;\r
126         }\r
127     }\r
128 }