Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        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;
            }
        }