* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Data / System.Data / RelatedDataView.cs
1 //\r
2 // System.Data.RelatedDataView\r
3 //\r
4 // Author:\r
5 //   Konstantin Triger (kostat@mainsoft.com)\r
6 //\r
7 \r
8 using System;\r
9 using System.Collections;\r
10 using Mono.Data.SqlExpressions;\r
11 using System.Data.Common;\r
12 \r
13 namespace System.Data\r
14 {\r
15         /// <summary>\r
16         /// Summary description for RelatedDataView.\r
17         /// </summary>\r
18         internal class RelatedDataView : DataView, IExpression\r
19         {\r
20                 #region Fields\r
21                 \r
22                 object[] _keyValues;\r
23                 DataColumn[] _columns;\r
24 \r
25                 #endregion // Fields\r
26 \r
27                 #region Constructors\r
28                 internal RelatedDataView(DataColumn[] relatedColumns,object[] keyValues)\r
29                 {\r
30                         dataTable = relatedColumns[0].Table;\r
31                         rowState = DataViewRowState.CurrentRows;\r
32                         _columns = relatedColumns;\r
33                         _keyValues = keyValues;\r
34 \r
35                         Open();\r
36                 }\r
37 \r
38                 #endregion // Constructors\r
39 \r
40                 #region Methods\r
41 \r
42                 internal override IExpression FilterExpression {\r
43                         get {\r
44                                 return this;\r
45                         }\r
46                 }\r
47 \r
48 \r
49                 #endregion // Methods\r
50 \r
51                 public override bool Equals(object obj)\r
52                 {\r
53                         if (!(obj is RelatedDataView)) {\r
54                                 if (base.FilterExpression == null)\r
55                                         return false;\r
56                                 return base.FilterExpression.Equals (obj);\r
57                         }\r
58 \r
59                         RelatedDataView other = (RelatedDataView) obj;\r
60                         if (_columns.Length != other._columns.Length)\r
61                                 return false;\r
62             \r
63                         for (int i = 0; i < _columns.Length; i++)\r
64                                 if (!_columns[i].Equals(other._columns [i]) ||\r
65                     !_keyValues[i].Equals(other._keyValues [i]))\r
66                                         return false;\r
67                         \r
68                         if (!other.FilterExpression.Equals (base.FilterExpression))\r
69                                 return false;\r
70 \r
71                         return true;\r
72                 }\r
73 \r
74                 public override int GetHashCode()\r
75                 {\r
76                         int hashCode = 0;\r
77                         for (int i = 0; i < _columns.Length; i++) {\r
78                                 hashCode ^= _columns [i].GetHashCode ();\r
79                                 hashCode ^= _keyValues [i].GetHashCode ();\r
80                         }\r
81 \r
82                         if (base.FilterExpression != null)\r
83                                 hashCode ^= base.FilterExpression.GetHashCode ();\r
84 \r
85                         return hashCode;\r
86                 }\r
87 \r
88                 #region IExpression Members\r
89 \r
90                 public object Eval(DataRow row) {\r
91                         return EvalBoolean(row);\r
92                 }\r
93 \r
94                 public bool EvalBoolean(DataRow row) {\r
95                         for (int i = 0; i < _columns.Length; i++)\r
96                                 if (!row[_columns[i]].Equals(_keyValues[i]))\r
97                                         return false;\r
98 \r
99                         IExpression filter = base.FilterExpression;\r
100                         return filter != null ? filter.EvalBoolean(row) : true;\r
101                 }\r
102 \r
103                 public bool DependsOn(DataColumn other) {\r
104                         for (int i = 0; i < _columns.Length; i++)\r
105                                 if (_columns[i] == other)\r
106                                         return true;\r
107 \r
108                         IExpression filter = base.FilterExpression;\r
109                         return filter != null ? filter.DependsOn(other) : false;\r
110                 }\r
111                 \r
112                 void IExpression.ResetExpression()
113                 {
114                 }\r
115 \r
116                 #endregion\r
117         }\r
118 }\r