+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.
{\r
_key = key;\r
Reset();\r
+ RebuildIndex ();\r
}\r
\r
#endregion // Constructors\r
\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
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
}\r
}\r
\r
+ internal bool HasFilter\r
+ {\r
+ get { return _filter != null; }\r
+ }\r
+\r
#endregion // Properties\r
\r
#region Methods\r
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
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
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
+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
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);
}
}
}
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 ();
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
}\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
\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