Example #1
0
        /// <summary>
        /// WARNING: Per CvRDT definition, this operation must be COMMUTATIVE, ASSOCIATIVE, and IDEMPOTENT.
        /// Failure to comply with these requirements may result in an infinite inter-node rotary traffic pattern.
        /// </summary>
        /// <param name="others"></param>
        /// <returns>Object instance which results from merge, it can be one of the existing instances or a new one</returns>
        public (bool isnew, HeapObject obj) MergeCrdt(IEnumerable <HeapObject> others)
        {
            if (others == null)
            {
                return(false, this);
            }
            if (!others.Any())
            {
                return(false, this);
            }

            others.IsTrue(v => v.All(one => one.GetType() == this.GetType() && one.Sys_Id == this.Sys_Id), "Non empty version for the same Sys_Id");

            var versions = others.AddOneAtStart(this);

            var result = this;

            foreach (var ver in versions)
            {
                if (ver.Sys_VerState == State.Deleted)
                {
                    if (result.Sys_VerState != State.Deleted)
                    {
                        result = ver;
                        continue;
                    }
                }
                if (ver.Sys_VerUtc > result.Sys_VerUtc)
                {
                    result = ver;
                }
            }
            return(false, result);
        }
Example #2
0
        public void AddOneAtStartTest_2()
        {
            IEnumerable <int> orig = null;
            var seq = orig.AddOneAtStart(102).ToArray();

            Aver.AreEqual(1, seq.Length);
            Aver.AreEqual(102, seq[0]);
        }