Reusing indexes in DataTable.Select() and supporting fixes.
authorBoris Kirzner <borisk@mono-cvs.ximian.com>
Thu, 22 Sep 2005 11:52:30 +0000 (11:52 -0000)
committerBoris Kirzner <borisk@mono-cvs.ximian.com>
Thu, 22 Sep 2005 11:52:30 +0000 (11:52 -0000)
svn path=/trunk/mcs/; revision=50469

mcs/class/System.Data/System.Data.Common/ChangeLog
mcs/class/System.Data/System.Data.Common/Index.cs
mcs/class/System.Data/System.Data.Common/Key.cs
mcs/class/System.Data/System.Data/ChangeLog
mcs/class/System.Data/System.Data/DataRow.cs
mcs/class/System.Data/System.Data/DataTable.cs
mcs/class/System.Data/System.Data/RelatedDataView.cs

index a588789138b33a9acdfc6f4b724ca2476c33e625..326d5690d31c2821609f484f7c6dcf9a3b1e7264 100644 (file)
@@ -1,3 +1,12 @@
+2005-09-21 Boris Kirzner <borisk@mainsoft.com>
+       * Index.cs: 
+               - Rebuild index immediately after construction.
+               - Do not add records if they do not padd key filtration.
+               - Do not attempt to remove records if the are not in the index.
+       * Key.cs:
+               - Added HasFilter property, CanContain and DependsOn methods.
+               - Equals() uses filter expression comparison.           
+
 2005-09-07 Boris Kirzner <borisk@mainsoft.com>
        * DataContainer.cs: Do not convert value if container type 
        is System.Object.
index 3f351399016aad2f29a94217363dd4e371d47e86..cfe1170c96e605ad9baebfee22bc1b278326c482 100644 (file)
@@ -57,6 +57,7 @@ namespace System.Data.Common
                {\r
                        _key = key;\r
                        Reset();\r
+                       RebuildIndex ();\r
                }\r
 \r
                #endregion // Constructors\r
@@ -355,6 +356,9 @@ namespace System.Data.Common
 \r
                internal void Delete(int oldRecord)\r
                {\r
+                       if (oldRecord == -1)\r
+                               return;\r
+\r
                        int index = FindIndex(oldRecord);\r
                        if (index != -1) {\r
                                if ((_hasDuplicates == IndexDuplicatesState.True)) {\r
@@ -476,6 +480,10 @@ namespace System.Data.Common
                private void Add(DataRow row,int newRecord)\r
                {\r
                        int newIdx;\r
+\r
+                       if (!Key.CanContain (newRecord))\r
+                               return;\r
+\r
                        if (Size == 0) {\r
                                newIdx = 0;\r
                        }\r
index 8433277bc9510f344dd86c4927ddeccab03d766a..989e86316788303abecd4ff3ed727454341df033 100644 (file)
@@ -114,6 +114,11 @@ namespace System.Data.Common
                        }\r
                }\r
 \r
+               internal bool HasFilter\r
+               {\r
+                       get { return _filter != null; }\r
+               }\r
+\r
                #endregion // Properties\r
 \r
                #region Methods\r
@@ -146,8 +151,16 @@ namespace System.Data.Common
                        if (index < 0)\r
                                return index;\r
 \r
+                       return CanContain (index) ? index : -1;\r
+               }\r
+\r
+               internal bool CanContain (int index)\r
+               {\r
+                       if (_filter == null)\r
+                               return true;\r
+\r
                        _tmpRow._current = index;\r
-                       return _filter.EvalBoolean(_tmpRow) ? index : -1;\r
+                       return _filter.EvalBoolean(_tmpRow);\r
                }\r
 \r
                internal static int GetRecord(DataRow row, DataViewRowState rowStateFilter)\r
@@ -193,8 +206,12 @@ namespace System.Data.Common
                                return false;\r
                        }\r
 \r
-                       if (_filter != filter)\r
-                               return false;\r
+                       if (_filter != null) {\r
+                               if (!_filter.Equals (filter))\r
+                                       return false;\r
+                       }\r
+                       else if (filter != null)\r
+                                       return false;\r
 \r
                        if (Columns.Length != columns.Length) {\r
                                return false;\r
@@ -221,6 +238,14 @@ namespace System.Data.Common
                        return true;\r
                }\r
 \r
+               internal bool DependsOn (DataColumn column)\r
+               {\r
+                       if (_filter == null)\r
+                               return false;\r
+\r
+                       return _filter.DependsOn (column);\r
+               }\r
+\r
                #endregion // Methods\r
        }\r
 }\r
index 0e3301fef808a0cff089aaa1ca8152711dc23b99..b9d8529e5bbd70df63a987ce4abc82712e0e2f74 100644 (file)
@@ -1,3 +1,12 @@
+2005-09-21 Boris Kirzner <borisk@mainsoft.com>
+       * DataRow.cs: Fixes for index updating.
+       * DataTable.cs: 
+               - Reset case-sensitive indexes also if their filter contains columns 
+               of type string.
+               - Use GetIndex instead of FindIndex, so the indexes created in Select()
+               are reused. 
+       * RelatedDataView.cs: implement IExpression.Equals() and GetHashCode().
+       
 2005-09-20  Sureshkumar T  <tsureshkumar@novell.com>
 
        * DataView.cs (Sort): Apply default Sorting Order if Sort property
index 923b5e8a1d99d705c799f193d6db156988bc53c4..b7d2a55412438ca10fe39499c9421592d679ae02 100644 (file)
@@ -640,6 +640,10 @@ namespace System.Data {
                        if (HasVersion (DataRowVersion.Proposed)) {
                                Table.RecordCache.DisposeRecord(Proposed);
                                Proposed = -1;
+
+                               int newVersion = (HasVersion (DataRowVersion.Current)) ? Current : Original;                                    
+                               foreach(Index index in Table.Indexes)
+                                       index.Update(this,newVersion);                                  
                        }
                }
 
@@ -1299,7 +1303,13 @@ namespace System.Data {
                                }
                                CheckChildRows(DataRowAction.Rollback);
 
-                               Current = Original;
+                               if (Current != Original) {
+                                       foreach(Index index in Table.Indexes) {
+                                               index.Delete (this);
+                                               index.Update(this,Original);
+                                       }
+                                       Current = Original;
+                               }
                               
                                _table.ChangedDataRow (this, DataRowAction.Rollback);
                                CancelEdit ();
index 03f71f003a79eb166dcd3112bb460623fa898f01..147e910c572964a75dfa33f3762da3c6c9ab8625 100644 (file)
@@ -1487,9 +1487,7 @@ namespace System.Data {
                                filter = parser.Compile (filterExpression);\r
                        }\r
 \r
-                       Index index = FindIndex(columns, sorts, recordStates, filter);\r
-                       if (index == null)\r
-                               index = new Index(new Key(this,columns,sorts,recordStates,filter));\r
+                       Index index = GetIndex(columns, sorts, recordStates, filter, false);\r
 \r
                        int[] records = index.GetAll();\r
                        DataRow[] dataRows = NewRowArray(index.Size);\r
@@ -1570,6 +1568,13 @@ namespace System.Data {
                                        }\r
                                }\r
 \r
+                               if (!containsStringcolumns && index.Key.HasFilter)\r
+                                       foreach (DataColumn column in Columns)\r
+                                               if ((column.DataType == DbTypes.TypeOfString) && (index.Key.DependsOn (column))) {\r
+                                               containsStringcolumns = true;\r
+                                               break;\r
+                                       }\r
+\r
                                if (containsStringcolumns) {\r
                                        index.Reset();\r
                                }\r
index 1dd4981a727b0d292dd769e83db73dc4a017ed6b..5b8ddebefdc045d0c4a7db6ef85bf40149cc0c67 100644 (file)
@@ -48,6 +48,43 @@ namespace System.Data
 \r
                #endregion // Methods\r
 \r
+               public override bool Equals(object obj)\r
+               {\r
+                       if (!(obj is RelatedDataView)) {\r
+                               if (base.FilterExpression == null)\r
+                                       return false;\r
+                               return base.FilterExpression.Equals (obj);\r
+                       }\r
+\r
+                       RelatedDataView other = (RelatedDataView) obj;\r
+                       if (_columns.Length != other._columns.Length)\r
+                               return false;\r
+            \r
+                       for (int i = 0; i < _columns.Length; i++)\r
+                               if (!_columns[i].Equals(other._columns [i]) ||\r
+                    !_keyValues[i].Equals(other._keyValues [i]))\r
+                                       return false;\r
+                       \r
+                       if (!other.FilterExpression.Equals (base.FilterExpression))\r
+                               return false;\r
+\r
+                       return true;\r
+               }\r
+\r
+               public override int GetHashCode()\r
+               {\r
+                       int hashCode = 0;\r
+                       for (int i = 0; i < _columns.Length; i++) {\r
+                               hashCode ^= _columns [i].GetHashCode ();\r
+                               hashCode ^= _keyValues [i].GetHashCode ();\r
+                       }\r
+\r
+                       if (base.FilterExpression != null)\r
+                               hashCode ^= base.FilterExpression.GetHashCode ();\r
+\r
+                       return hashCode;\r
+               }\r
+\r
                #region IExpression Members\r
 \r
                public object Eval(DataRow row) {\r