anchor.diff:      FList : TObjectList;
   
       FMustRebuildIndex : boolean;
  +    FMainIndex : TmStringDictionary;
  +    FIndexes : TmStringDictionary;
  +    FIndexedFieldNames : TStringList;
  +    procedure ClearIndexes;
     protected
  -    FMap : TmStringDictionary;
  +    procedure AddIndex (const aFieldName : String);
       procedure InternalAdd(aDatum : TObject);
       procedure InternalRemove(aDatum : TObject);
       procedure InternalDelete(const aIndex: integer);
  
positive.code: 
  procedure TmDataProvider.RebuildIndex;
  var
    i : integer;
  begin
    FMap.Clear;
    for i := 0 to Self.Count -1 do
    begin
      if FMap.Contains(Self.GetDatum(i).GetDatumKey.AsString) then
        raise Exception.Create('Duplicate key: ' + Self.GetDatum(i).GetDatumKey.AsString);
      FMap.Add(Self.GetDatum(i).GetDatumKey.AsString, Self.InternalGetDatum(i));
    end;
    FMustRebuildIndex:= false;
  end;
  
negative.code:     function GetDatum(const aIndex : integer) : IVDDatum;
      function FindDatumByKey (const aKey : IVDDatumKey) : IVDDatum;
      function FindDatumByStringKey (const aStringKey : string): IVDDatum;
      function FindDatumByIndexedField (const aIndexedFieldName, aValue : String): IVDDatum;
      procedure RebuildIndex;
  
      procedure FillVirtualFieldDefs (aFieldDefs : TmVirtualFieldDefs; const aPrefix : String); virtual; abstract;
  