コード例 #1
0
        public void BaseTest()
        {
            Xtensive.Tuples.Tuple t1 = Xtensive.Tuples.Tuple.Create(1, "2");
            Xtensive.Tuples.Tuple t2 = Xtensive.Tuples.Tuple.Create(3, 4.0, "5");
            TestLog.Info("Originals: {0}, {1}", t1, t2);

            CombineTransform mt   = new CombineTransform(false, t1.Descriptor, t2.Descriptor);
            CombineTransform mtro = new CombineTransform(true, t1.Descriptor, t2.Descriptor);

            Xtensive.Tuples.Tuple wt1 = mt.Apply(TupleTransformType.TransformedTuple, t1, t2);
            TestLog.Info("Wrapper:   {0}", wt1);
            Xtensive.Tuples.Tuple ct1 = mt.Apply(TupleTransformType.Tuple, t1, t2);
            TestLog.Info("Copy:      {0}", ct1);
            Xtensive.Tuples.Tuple wt2 = mt.Apply(TupleTransformType.TransformedTuple, t1, t2);
            Xtensive.Tuples.Tuple ct2 = mt.Apply(TupleTransformType.Tuple, t1, t2);

            Assert.AreEqual(wt1, wt2);
            Assert.AreEqual(wt2, ct1);
            Assert.AreEqual(ct1, ct2);

            wt1.SetValue(2, 0);
            Assert.AreEqual(t2.GetValue(0), wt1.GetValue(2));
            Assert.AreEqual(wt1, wt2);
            Assert.AreNotEqual(wt2, ct1);
            Assert.AreEqual(ct1, ct2);

            ct1.SetValue(2, 0);
            Assert.AreEqual(t2.GetValue(0), ct1.GetValue(2));
            Assert.AreEqual(wt1, wt2);
            Assert.AreEqual(wt2, ct1);
            Assert.AreNotEqual(ct1, ct2);

            Xtensive.Tuples.Tuple wtro = mtro.Apply(TupleTransformType.TransformedTuple, t1, t2);
            AssertEx.Throws <NotSupportedException>(delegate {
                wtro.SetValue(2, 0);
            });

            CombineTransform mt3 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor);

            Xtensive.Tuples.Tuple wt3 = mt3.Apply(TupleTransformType.TransformedTuple, t1, t1, t1);
            TestLog.Info("Wrapper:   {0}", wt3);
            Xtensive.Tuples.Tuple ct3 = mt3.Apply(TupleTransformType.Tuple, t1, t1, t1);
            TestLog.Info("Copy:      {0}", ct3);
            t1.SetValue(0, 0);
            Assert.AreEqual(wt3.GetValue(4), t1.GetValue(0));
            t1.SetValue(0, 1);

            CombineTransform mt4 = new CombineTransform(false, t1.Descriptor, t1.Descriptor, t1.Descriptor, t1.Descriptor);

            Xtensive.Tuples.Tuple wt4 = mt4.Apply(TupleTransformType.TransformedTuple, t1, t1, t1, t1);
            TestLog.Info("Wrapper:   {0}", wt4);
            Xtensive.Tuples.Tuple ct4 = mt4.Apply(TupleTransformType.Tuple, t1, t1, t1, t1);
            TestLog.Info("Copy:      {0}", ct4);
            t1.SetValue(0, 0);
            Assert.AreEqual(wt4.GetValue(6), t1.GetValue(0));
            t1.SetValue(0, 1);
        }
コード例 #2
0
        public void PerformanceTest2()
        {
            AdvancedComparerStruct <Xtensive.Tuples.Tuple> comparer = AdvancedComparerStruct <Xtensive.Tuples.Tuple> .Default;

            Xtensive.Tuples.Tuple t  = Xtensive.Tuples.Tuple.Create(1);
            CombineTransform      mt = new CombineTransform(false, t.Descriptor, t.Descriptor, t.Descriptor, t.Descriptor);
            SegmentTransform      st = new SegmentTransform(false, mt.Descriptor, new Segment <int>(1, 2));

            Xtensive.Tuples.Tuple wt1 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t));
            Xtensive.Tuples.Tuple wt2 = st.Apply(TupleTransformType.TransformedTuple, mt.Apply(TupleTransformType.TransformedTuple, t, t, t, t));
            Xtensive.Tuples.Tuple ct1 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t));
            Xtensive.Tuples.Tuple ct2 = st.Apply(TupleTransformType.Tuple, mt.Apply(TupleTransformType.Tuple, t, t, t, t));
            int count = IterationCount;

            comparer.Equals(ct1, ct2);
            comparer.Equals(ct1, wt1);
            comparer.Equals(wt1, wt2);

            TestHelper.CollectGarbage();
            using (new Measurement("O&O", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(ct1, ct2);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("O&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(ct1, wt1);
                }

            TestHelper.CollectGarbage();
            using (new Measurement("W&W", MeasurementOptions.Log, count))
                for (int i = 0; i < count; i++)
                {
                    comparer.Equals(wt1, wt2);
                }
        }
コード例 #3
0
        private void RemapEntitySetReference(RemapContext context, ReferenceFieldChangeInfo info)
        {
            var fieldAssociation = info.Field.GetAssociation(info.FieldValue.TypeInfo);

            if (!fieldAssociation.IsMaster && fieldAssociation.IsPaired)
            {
                return;
            }

            var oldCombinedKey = info.AuxiliaryEntity;

            var fieldOwnerKey = context.TryRemapKey(info.FieldOwner);
            var fieldValueKey = context.TryRemapKey(info.FieldValue);

            var transformer   = new CombineTransform(false, fieldOwnerKey.Value.Descriptor, fieldValueKey.Value.Descriptor);
            var combinedTuple = transformer.Apply(TupleTransformType.Tuple, fieldOwnerKey.Value, fieldValueKey.Value);

            var newCombinedKey = Key.Create(Session.Domain, Session.StorageNodeId, fieldAssociation.AuxiliaryType, TypeReferenceAccuracy.ExactType, combinedTuple);

            context.RegisterKeyMap(oldCombinedKey, newCombinedKey);
        }
コード例 #4
0
        /// <summary>
        /// Combines the <paramref name="left"/> with <paramref name="right"/>.
        /// </summary>
        /// <param name="left">The first <see cref="Tuple"/> to combine.</param>
        /// <param name="right">The second <see cref="Tuple"/> to combine.</param>
        /// <returns></returns>
        public static Tuple Combine(this Tuple left, Tuple right)
        {
            var transform = new CombineTransform(false, new[] { left.Descriptor, right.Descriptor });

            return(transform.Apply(TupleTransformType.TransformedTuple, left, right));
        }
コード例 #5
0
        internal bool Add(Entity item, SyncContext syncContext, RemovalContext removalContext)
        {
            if (Contains(item))
            {
                return(false);
            }

            try {
                var operations = Session.Operations;
                using (var scope = operations.BeginRegistration(Operations.OperationType.System)) {
                    var itemKey = item.Key;
                    if (operations.CanRegisterOperation)
                    {
                        operations.RegisterOperation(new EntitySetItemAddOperation(Owner.Key, Field, itemKey));
                    }

                    SystemBeforeAdd(item);

                    int?   index       = null;
                    var    association = Field.GetAssociation(item.TypeInfo);
                    Action finalizer   = () => {
                        var auxiliaryType = association.AuxiliaryType;
                        if (auxiliaryType != null && association.IsMaster)
                        {
                            var combinedTuple = auxilaryTypeKeyTransform.Apply(
                                TupleTransformType.Tuple,
                                Owner.Key.Value,
                                itemKey.Value);

                            var combinedKey = Key.Create(
                                Session.Domain,
                                Session.StorageNodeId,
                                auxiliaryType,
                                TypeReferenceAccuracy.ExactType,
                                combinedTuple);

                            Session.CreateOrInitializeExistingEntity(auxiliaryType.UnderlyingType, combinedKey);
                            Session.ReferenceFieldsChangesRegistry.Register(Owner.Key, itemKey, combinedKey, Field);
                        }

                        var state = State;
                        state.Add(itemKey);
                        Session.EntitySetChangeRegistry.Register(state);
                        index = GetItemIndex(state, itemKey);
                    };

                    operations.NotifyOperationStarting();
                    if (association.IsPaired)
                    {
                        Session.PairSyncManager.ProcessRecursively(syncContext, removalContext,
                                                                   OperationType.Add, association, Owner, item, finalizer);
                    }
                    else
                    {
                        finalizer.Invoke();
                    }

                    // removalContext is unused here, since Add is never
                    // invoked in reference cleanup process directly

                    if (!skipOwnerVersionChange)
                    {
                        Owner.UpdateVersionInfo(Owner, Field);
                    }
                    SystemAdd(item, index);
                    SystemAddCompleted(item, null);
                    scope.Complete();
                    return(true);
                }
            }
            catch (Exception e) {
                SystemAddCompleted(item, e);
                throw;
            }
        }