public ChangeSet(ValueChange <TParentToken> parentToken, ValueChange <IEnumerable <TChildToken> > childTokens) { OldIds = Ids(childTokens.OldValue).ToArray(); NewIds = Ids(childTokens.NewValue).ToArray(); RemovedIds = Ids(ExceptIds(childTokens.OldValue, NewIds)).ToArray(); AddedIds = Ids(ExceptIds(childTokens.NewValue, OldIds)).ToArray(); PersistentIds = NewIds.Intersect(OldIds).ToArray(); var persistedOld = IntersectIds(childTokens.OldValue, PersistentIds).OrderBy(t => t.Id); var persistedNew = IntersectIds(childTokens.NewValue, PersistentIds).OrderBy(t => t.Id); var persistedPairs = persistedOld.Zip(persistedNew, ValueChange.Create); Diffs = persistedPairs.Where(vc => vc.IsChanged()).ToArray(); AddedChanges = AddedIds.Select(id => Change.Added(parentToken.NewValue.Id, id)).ToArray(); RemovedChanges = RemovedIds.Select(id => Change.Removed(parentToken.NewValue.Id, id)).ToArray(); }
/// <summary> /// Merges a <see cref="ModelValueChangeEvent"/> into the current event. /// </summary> /// <param name="e"></param> /// <returns></returns> protected override bool OnMerge(ModelEvent e) { // Ensure the events are for the same reference property var listChange = (ModelListChangeEvent)e; if (listChange.Property != Property) { return(false); } // Highly likely not to be right var mergeAdded = Added.ToList(); mergeAdded.RemoveAll(i => listChange.Removed.Contains(i)); var mergeRemoved = Removed.ToList(); mergeRemoved.RemoveAll(i => listChange.Added.Contains(i)); mergeAdded = mergeAdded.Union(listChange.Added.Where(i => !Removed.Contains(i))).ToList(); mergeRemoved = mergeRemoved.Union(listChange.Removed.Where(i => !Added.Contains(i))).ToList(); Added = mergeAdded.ToArray(); Removed = mergeRemoved.ToArray(); var mergeAddedIds = AddedIds.ToList(); mergeAddedIds.RemoveAll(i => listChange.RemovedIds.Contains(i)); var mergeRemovedIds = RemovedIds.ToList(); mergeRemovedIds.RemoveAll(i => listChange.AddedIds.Contains(i)); mergeAddedIds = mergeAddedIds.Union(listChange.AddedIds.Where(i => !RemovedIds.Contains(i))).ToList(); mergeRemovedIds = mergeRemovedIds.Union(listChange.RemovedIds.Where(i => !AddedIds.Contains(i))).ToList(); AddedIds = mergeAddedIds.ToArray(); RemovedIds = mergeRemovedIds.ToArray(); return(true); }
/// <summary> /// Gets real record identifier matching specified phantom one. /// </summary> /// <param name="table">Table name.</param> /// <param name="phantomId">Phantom identifier.</param> /// <returns>Real record identifier.</returns> public int?getIdByPhantom(String table, String phantomId) { if (!AddedIds.ContainsKey(table)) { return(null); } IDictionary <String, int> map = AddedIds[table]; if (map == null) { return(null); } // get real task Id if (phantomId != null && map.ContainsKey(phantomId)) { return(map[phantomId]); } return(null); }
public void AddChange(ChangeTableEvent dataRowToChangeTableEvent) { if (dataRowToChangeTableEvent.EventType == EventType.Add) { AddedIds.Add(dataRowToChangeTableEvent.PrimaryKeyId); } else if (dataRowToChangeTableEvent.EventType == EventType.Delete) { DeletedIds.Add(dataRowToChangeTableEvent.PrimaryKeyId); } else { throw new NotSupportedException( $"Datachange of type {dataRowToChangeTableEvent.EventType} is not supported"); } if (HighestVersionAdded < dataRowToChangeTableEvent.Version) { HighestVersionAdded = dataRowToChangeTableEvent.Version; } }