Esempio n. 1
0
        private ORDictionary <TKey, TValue> DryMerge(ORDictionary <TKey, TValue> other, ORSet <TKey> mergedKeys, IEnumerator <TKey> valueKeysEnumerator)
        {
            var mergedValues = ImmutableDictionary <TKey, TValue> .Empty.ToBuilder();

            while (valueKeysEnumerator.MoveNext())
            {
                var    key = valueKeysEnumerator.Current;
                TValue value2;
                if (ValueMap.TryGetValue(key, out var value1))
                {
                    if (other.ValueMap.TryGetValue(key, out value2))
                    {
                        var merged = value1.Merge(value2);
                        mergedValues[key] = merged;
                    }
                    else
                    {
                        mergedValues[key] = value1;
                    }
                }
                else
                {
                    if (other.ValueMap.TryGetValue(key, out value2))
                    {
                        mergedValues[key] = value2;
                    }
                    else
                    {
                        throw new IllegalStateException($"Missing value for {key}");
                    }
                }
            }

            return(new ORDictionary <TKey, TValue>(mergedKeys, mergedValues.ToImmutable()));
        }
Esempio n. 2
0
        public void ORDictionary_must_not_have_anomalies_for_remove_with_update_scenario_and_deltas_8()
        {
            var m1 = ORDictionary.Create(_node1, "a", GSet.Create("A"))
                     .SetItem(_node1, "b", GSet.Create("B"))
                     .SetItem(_node2, "b", GSet.Create("B"));
            var m2 = ORDictionary.Create(_node2, "c", GSet.Create("C"));

            var merged1 = m1.Merge(m2);

            var m3 = merged1.ResetDelta().Remove(_node1, "b").Remove(_node2, "b");
            var m4 = merged1.ResetDelta()
                     .SetItem(_node2, "b", GSet.Create("B2"))
                     .SetItem(_node2, "b", GSet.Create("B3"));

            var merged2 = m3.Merge(m4);

            merged2.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged2.Entries["b"].Elements.Should().BeEquivalentTo("B3");
            merged2.Entries["c"].Elements.Should().BeEquivalentTo("C");

            var merged3 = merged1.MergeDelta(m3.Delta).MergeDelta(m4.Delta);

            merged3.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged3.Entries["b"].Elements.Should().BeEquivalentTo("B3");
            merged3.Entries["c"].Elements.Should().BeEquivalentTo("C");
        }
Esempio n. 3
0
        public void ORDictionary_must_work_with_deltas_and_Add_for_GSet_elements_type()
        {
            var m1 = ORDictionary.Create(_node1, "a", GSet.Create("A"));
            var m2 = m1.ResetDelta().AddOrUpdate(_node1, "a", GSet <string> .Empty, x => x.Add("B"));
            var m3 = ORDictionary <string, GSet <string> > .Empty.MergeDelta(m1.Delta).MergeDelta(m2.Delta);

            m3.Entries["a"].Should().BeEquivalentTo("A", "B");
        }
Esempio n. 4
0
 public CommandService()
 {
     this.dbManager = DataBaseManager.GetInstance();
     if (this.dbManager != null)
     {
         this.mapping    = this.dbManager.Mapping;
         this.connection = this.dbManager.DataBaseConnection;
     }
 }
Esempio n. 5
0
        public LWWDictionary <TKey, TValue> MergeDelta(ORDictionary <TKey, LWWRegister <TValue> > .IDeltaOperation delta)
        {
            if (delta is LWWDictionaryDelta lwwd)
            {
                delta = lwwd.Underlying;
            }

            return(new LWWDictionary <TKey, TValue>(Underlying.MergeDelta(delta)));
        }
Esempio n. 6
0
        public void ORDictionary_must_work_with_deltas_and_updates_for_Flag_elements_type()
        {
            var m1 = ORDictionary.Create(_node1, "a", Flag.False);
            var m2 = m1.ResetDelta().AddOrUpdate(_node1, "a", Flag.False, x => x.SwitchOn());
            var m3 = ORDictionary <string, Flag> .Empty
                     .MergeDelta(m1.Delta)
                     .MergeDelta(m2.Delta);

            m3.Entries["a"].Enabled.Should().BeTrue();
        }
Esempio n. 7
0
        public void ORDictionary_must_work_with_deltas_and_Increment_for_PNCounter_elements_type()
        {
            var m1 = ORDictionary.Create(_node1, "a", PNCounter.Empty);
            var m2 = m1.ResetDelta().AddOrUpdate(_node1, "a", PNCounter.Empty, x => x.Increment(_node1, 10));
            var m3 = m2.ResetDelta().AddOrUpdate(_node2, "a", PNCounter.Empty, x => x.Decrement(_node2, 10));
            var m4 = ORDictionary <string, PNCounter> .Empty
                     .MergeDelta(m1.Delta)
                     .MergeDelta(m2.Delta)
                     .MergeDelta(m3.Delta);

            m4.Entries["a"].Value.Should().Be(new BigInteger(0));
        }
Esempio n. 8
0
 public LWWDictionaryDelta(ORDictionary <TKey, LWWRegister <TValue> > .IDeltaOperation underlying)
 {
     Underlying = underlying;
     if (underlying is IReplicatedDeltaSize s)
     {
         DeltaSize = s.DeltaSize;
     }
     else
     {
         DeltaSize = 1;
     }
 }
Esempio n. 9
0
        public void ORDictionary_must_have_usual_anomalies_for_remove_with_update_scenario()
        {
            // please note that the current ORMultiMap has the same anomaly
            // because the condition of keeping global vvector is violated
            // by removal of the whole entry for the removed key "b" which results in removal of it's value's vvector
            var m1 = ORDictionary.Create(_node1, "a", ORSet.Create(_node1, "A")).SetItem(_node1, "b", ORSet.Create(_node1, "B"));
            var m2 = ORDictionary.Create(_node2, "c", ORSet.Create(_node2, "C"));

            // m1 - node1 gets the update from m2
            var merged1 = m1.Merge(m2);
            // m2 - node2 gets the update from m1
            var merged2 = m2.Merge(m1);

            // RACE CONDITION ahead!
            var m3 = merged1.ResetDelta().Remove(_node1, "b");
            // let's imagine that m3 (node1) update gets propagated here (full state or delta - doesn't matter)
            // and is in flight, but in the meantime, an element is being added somewhere else (m4 - node2)
            // and the update is propagated before the update from node1 is merged
            var m4 = merged2.ResetDelta().AddOrUpdate(_node2, "b", ORSet <string> .Empty, x => x.Add(_node2, "B2"));
            // and later merged on node1
            var merged3 = m3.Merge(m4);
            // and the other way round...
            var merged4 = m4.Merge(m3);

            // result -  the element "B" is kept on both sides...
            merged3.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged3.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2");
            merged3.Entries["c"].Elements.Should().BeEquivalentTo("C");

            merged4.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged4.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2");
            merged4.Entries["c"].Elements.Should().BeEquivalentTo("C");

            // but if the timing was slightly different, so that the update from node1
            // would get merged just before update on node2:
            var merged5 = m2.Merge(m3)
                          .ResetDelta()
                          .AddOrUpdate(_node2, "b", ORSet <string> .Empty, x => x.Add(_node2, "B2"));
            // the update propagated ... and merged on node1:
            var merged6 = m3.Merge(merged5);

            // then the outcome is different... because the vvector of value("b") was lost...
            merged5.Entries["a"].Elements.Should().BeEquivalentTo("A");
            // this time it's different...
            merged5.Entries["b"].Elements.Should().BeEquivalentTo("B2");
            merged5.Entries["c"].Elements.Should().BeEquivalentTo("C");

            merged6.Entries["a"].Elements.Should().BeEquivalentTo("A");
            // this time it's different...
            merged6.Entries["b"].Elements.Should().BeEquivalentTo("B2");
            merged6.Entries["c"].Elements.Should().BeEquivalentTo("C");
        }
Esempio n. 10
0
        public void ORDictionary_must_not_have_anomalies_for_remove_with_update_scenario_and_deltas_11()
        {
            var m1 = ORDictionary.Create(_node1, "a", GSet.Create("A"));
            var m2 = ORDictionary.Create(_node2, "a", GSet <string> .Empty).Remove(_node2, "a");

            var merged1 = m1.Merge(m2);

            merged1.Entries["a"].Elements.Should().BeEquivalentTo("A");

            var merged2 = m1.MergeDelta(m2.Delta);

            merged2.Entries["a"].Elements.Should().BeEquivalentTo("A");
        }
Esempio n. 11
0
        public void A_ORDictionary_should_be_able_to_add_entries()
        {
            var m = ORDictionary.Create(
                Tuple.Create(_node1, "a", GSet.Create("A")),
                Tuple.Create(_node1, "b", GSet.Create("B")));

            Assert.Equal(ImmutableHashSet.Create("A"), m["a"].Elements);
            Assert.Equal(ImmutableHashSet.Create("B"), m["b"].Elements);

            var m2 = m.SetItem(_node1, "a", GSet.Create("C"));

            Assert.Equal(ImmutableHashSet.Create("C"), m2.Entries["a"].Elements);
        }
Esempio n. 12
0
        public void ORDictionary_must_be_able_to_add_entries()
        {
            var m = ORDictionary.Create(
                Tuple.Create(_node1, "a", GSet.Create("A")),
                Tuple.Create(_node1, "b", GSet.Create("B")));

            m["a"].Elements.Should().BeEquivalentTo("A");
            m["b"].Elements.Should().BeEquivalentTo("B");

            var m2 = m.SetItem(_node1, "a", GSet.Create("C"));

            m2.Entries["a"].Elements.Should().BeEquivalentTo("C");
        }
Esempio n. 13
0
        public void ORDictionary_must_be_able_to_add_entries_with_delta()
        {
            var m = ORDictionary.Create(
                Tuple.Create(_node1, "a", GSet.Create("A")),
                Tuple.Create(_node1, "b", GSet.Create("B")));
            var md = m.Delta;

            var m1 = ORDictionary <string, GSet <string> > .Empty.MergeDelta(md);

            m1.Entries["a"].Should().BeEquivalentTo("A");
            m1.Entries["b"].Should().BeEquivalentTo("B");

            var m2 = m1.SetItem(_node1, "a", GSet.Create("C"));

            m2.Entries["a"].Should().BeEquivalentTo("C");
        }
Esempio n. 14
0
            public bool Equals(ORDictionary <TKey, LWWRegister <TValue> > .IDeltaOperation other)
            {
                if (other is ORDictionary <TKey, LWWRegister <TValue> > .DeltaGroup group)
                {
                    if (Underlying is ORDictionary <TKey, LWWRegister <TValue> > .DeltaGroup ourGroup)
                    {
                        return(ourGroup.Operations.SequenceEqual(group.Operations));
                    }

                    if (group.Operations.Length == 1)
                    {
                        return(Underlying.Equals(group.Operations.First()));
                    }

                    return(false);
                }
                return(Underlying.Equals(other));
            }
Esempio n. 15
0
        public void ORDictionary_must_not_have_anomalies_for_remove_with_update_scenario_and_deltas_7()
        {
            var m1 = ORDictionary.Create(_node1, "a", ORSet.Create(_node1, "A"))
                     .SetItem(_node1, "b", ORSet.Create(_node1, "B1"))
                     .Remove(_node1, "b");
            var m2 = ORDictionary.Create(_node1, "a", ORSet.Create(_node1, "A"))
                     .SetItem(_node1, "b", ORSet.Create(_node1, "B2"));
            var m2d = m2.ResetDelta().Remove(_node1, "b");
            var m2u = m2.ResetDelta()
                      .AddOrUpdate(_node1, "b", ORSet <string> .Empty, x => x.Add(_node1, "B3"))
                      .AddOrUpdate(_node2, "b", ORSet <string> .Empty, x => x.Add(_node2, "B4"));

            var merged1 = m1.Merge(m2d).MergeDelta(m2u.Delta);

            merged1.Entries["a"].Elements.Should().BeEquivalentTo("A");
            // note that B1 is lost as it was added and removed earlier in timeline than B2
            merged1.Entries["b"].Elements.Should().BeEquivalentTo("B2", "B3", "B4");
        }
Esempio n. 16
0
        public void ORDictionary_must_not_have_anomalies_for_remove_with_update_scenario_and_deltas_10()
        {
            var m1 = ORDictionary.Create(_node1, "a", GSet.Create("A"))
                     .SetItem(_node2, "b", GSet.Create("B"));
            var m3 = m1.ResetDelta().Remove(_node2, "b");
            var m4 = m3.ResetDelta()
                     .SetItem(_node2, "b", GSet.Create("B2"))
                     .AddOrUpdate(_node2, "b", GSet <string> .Empty, x => x.Add("B3"));

            var merged2 = m3.Merge(m4);

            merged2.Entries["a"].Should().BeEquivalentTo("A");
            merged2.Entries["b"].Should().BeEquivalentTo("B2", "B3");

            var merged3 = m3.MergeDelta(m4.Delta);

            merged3.Entries["a"].Should().BeEquivalentTo("A");
            merged3.Entries["b"].Should().BeEquivalentTo("B2", "B3");
        }
Esempio n. 17
0
        public void ORDictionary_must_not_have_anomalies_for_remove_with_update_scenario_and_deltas_6()
        {
            var m1 = ORDictionary.Create(_node1, "a", ORSet.Create(_node1, "A")).SetItem(_node1, "b", ORSet.Create(_node1, "B"));
            var m2 = ORDictionary.Create(_node2, "b", ORSet.Create(_node2, "B3"));

            var merged1 = m1.Merge(m2);

            var m3 = merged1.ResetDelta().Remove(_node1, "b");
            var m4 = merged1.ResetDelta().Remove(_node2, "b")
                     .AddOrUpdate(_node2, "b", ORSet <string> .Empty, x => x.Add(_node2, "B1"))
                     .AddOrUpdate(_node2, "b", ORSet <string> .Empty, x => x.Add(_node2, "B2"));

            var merged2 = m3.Merge(m4);

            merged2.Entries["a"].Elements.Should().BeEquivalentTo("A");
            // note that B is not included, because it was removed in both timelines
            merged2.Entries["b"].Elements.Should().BeEquivalentTo("B1", "B2");

            var merged3 = m3.MergeDelta(m4.Delta);

            merged3.Entries["a"].Elements.Should().BeEquivalentTo("A");
            // note that B is not included, because it was removed in both timelines
            merged3.Entries["b"].Elements.Should().BeEquivalentTo("B1", "B2");
        }
Esempio n. 18
0
 public QueryService()
 {
     this.connection = DataBaseManager.GetInstance().DataBaseConnection;
     this.mapping    = DataBaseManager.GetInstance().Mapping;
     this.rnd        = new Random();
 }
Esempio n. 19
0
 public LWWDictionary <TKey, TValue> MergeDelta(ORDictionary <TKey, LWWRegister <TValue> > .IDeltaOperation delta) =>
 new LWWDictionary <TKey, TValue>(Underlying.MergeDelta(delta));
Esempio n. 20
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="underlying">TBD</param>
 public LWWDictionary(ORDictionary <TKey, LWWRegister <TValue> > underlying)
 {
     Underlying = underlying;
 }
Esempio n. 21
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="cluster">TBD</param>
 /// <param name="crdt">TBD</param>
 public LocalORDictionary(Cluster.Cluster cluster, ORDictionary <TKey, TVal> crdt) : this(cluster.SelfUniqueAddress, crdt)
 {
 }
Esempio n. 22
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="currentNode">TBD</param>
 /// <param name="crdt">TBD</param>
 internal LocalORDictionary(UniqueAddress currentNode, ORDictionary <TKey, TVal> crdt) : this()
 {
     _currentNode = currentNode;
     _crdt        = crdt;
 }
Esempio n. 23
0
 /// <summary>
 /// TBD
 /// </summary>
 /// <param name="dictionary">TBD</param>
 public Surrogate(ORDictionary <TKey, TVal> dictionary)
 {
     _dictionary = dictionary;
 }
Esempio n. 24
0
 /// <summary>
 /// Merges data from provided <see cref="ORDictionary{TKey,TValue}"/> into current CRDT,
 /// creating new immutable instance in a result.
 /// </summary>
 /// <param name="dictionary">TBD</param>
 /// <returns>TBD</returns>
 public LocalORDictionary <TKey, TVal> Merge(ORDictionary <TKey, TVal> dictionary) =>
 new LocalORDictionary <TKey, TVal>(_currentNode, _crdt.Merge(dictionary));
Esempio n. 25
0
        public ORDictionary <TKey, TValue> Merge(ORDictionary <TKey, TValue> other)
        {
            var mergedKeys = KeySet.Merge(other.KeySet);

            return(DryMerge(other, mergedKeys, mergedKeys.GetEnumerator()));
        }
 /// <summary>
 /// Creates an instance of an ORDictionary scoped to a current cluster.
 /// </summary>
 /// <typeparam name="TKey">TBD</typeparam>
 /// <typeparam name="TVal">TBD</typeparam>
 /// <param name="cluster">TBD</param>
 /// <param name="dictionary">TBD</param>
 /// <returns>TBD</returns>
 public static LocalORDictionary <TKey, TVal> ORDictionary <TKey, TVal>(this Cluster.Cluster cluster, ORDictionary <TKey, TVal> dictionary) where TVal : IReplicatedData =>
 new LocalORDictionary <TKey, TVal>(cluster, dictionary);
Esempio n. 27
0
        public void ORDictionary_must_work_with_delta_coalescing_scenario_1()
        {
            var m1 = ORDictionary.Create(_node1, "a", GSet.Create("A")).SetItem(_node1, "b", GSet.Create("B"));
            var m2 = m1.ResetDelta()
                     .SetItem(_node2, "b", GSet.Create("B2"))
                     .AddOrUpdate(_node2, "b", GSet <string> .Empty, x => x.Add("B3"));

            var merged1 = m1.Merge(m2);

            merged1.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged1.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2", "B3");

            var merged2 = m1.MergeDelta(m2.Delta);

            merged2.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged2.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2", "B3");

            var m3 = ORDictionary.Create(_node1, "a", GSet.Create("A")).SetItem(_node2, "b", GSet.Create("B"));
            var m4 = m3.ResetDelta().SetItem(_node2, "b", GSet.Create("B2")).SetItem(_node2, "b", GSet.Create("B3"));

            var merged3 = m3.Merge(m4);

            merged3.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged3.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");

            var merged4 = m3.MergeDelta(m4.Delta);

            merged4.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged4.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");

            var m5 = ORDictionary.Create(_node1, "a", GSet.Create("A")).SetItem(_node2, "b", GSet.Create("B"));
            var m6 = m5.ResetDelta()
                     .SetItem(_node2, "b", GSet.Create("B2"))
                     .AddOrUpdate(_node2, "b", GSet <string> .Empty, x => x.Add("B3"))
                     .AddOrUpdate(_node2, "b", GSet <string> .Empty, x => x.Add("B4"));

            var merged5 = m5.Merge(m6);

            merged5.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged5.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2", "B3", "B4");

            var merged6 = m5.MergeDelta(m6.Delta);

            merged6.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged6.Entries["b"].Elements.Should().BeEquivalentTo("B", "B2", "B3", "B4");

            var m7 = ORDictionary.Create(_node1, "a", GSet.Create("A")).SetItem(_node2, "b", GSet.Create("B"));
            var m8 = m7.ResetDelta()
                     .SetItem(_node2, "b", GSet.Create("B2"))
                     .SetItem(_node2, "d", GSet.Create("D"))
                     .SetItem(_node2, "b", GSet.Create("B3"));

            var merged7 = m7.Merge(m8);

            merged7.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged7.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");
            merged7.Entries["d"].Elements.Should().BeEquivalentTo("D");

            var merged8 = m7.MergeDelta(m8.Delta);

            merged8.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged8.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");
            merged8.Entries["d"].Elements.Should().BeEquivalentTo("D");

            var m9  = ORDictionary.Create(_node1, "a", GSet.Create("A")).SetItem(_node2, "b", GSet.Create("B"));
            var m10 = m9.ResetDelta()
                      .SetItem(_node2, "b", GSet.Create("B2"))
                      .SetItem(_node2, "d", GSet.Create("D"))
                      .Remove(_node2, "d")
                      .SetItem(_node2, "b", GSet.Create("B3"));

            var merged9 = m9.Merge(m10);

            merged9.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged9.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");

            var merged10 = m9.MergeDelta(m10.Delta);

            merged10.Entries["a"].Elements.Should().BeEquivalentTo("A");
            merged10.Entries["b"].Elements.Should().BeEquivalentTo("B", "B3");
        }