示例#1
0
        public static Result <List <ExternalEntity> > PushList(this ExternalEntity src, ExternalEntity to)
        {
            var result = new Result <List <ExternalEntity> >();

            if (src.EntityType != to.EntityType)
            {
                return(result.Fail("cannot derive a push list on different entity types."));
            }

            if (src.ExternalSystemId == to.ExternalSystemId)
            {
                return(result.Fail("cannot derive a push list from the same system."));
            }

            try
            {
                using (var db = new RSMDB.RSMDataModelDataContext())
                {
                    var type = Enum.GetName(typeof(EntityType), src.EntityType);

                    var toQuery  = db.ExternalApplicationKeys.Where(k => k.EntityType == type && k.SystemId == to.ExternalSystemId);
                    var srcQuery = db.ExternalApplicationKeys.Where(k => k.EntityType == type && k.SystemId == src.ExternalSystemId);
                    var rows     = srcQuery.Where(s => !toQuery.Any(t => t.ExternalId == s.ExternalId));

                    result.Entity = rows.Select(x => x.ToModel <ExternalEntity>(null)).ToList();
                }
            }
            catch (Exception e)
            {
                return(result.Set(ResultType.TechnicalError, e, "Get push list failed. {0}", e.ToString()));
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Adds keys for an external entity to the database.  No existence check is performed prior to inserting.
        /// </summary>
        /// <param name="from">Entity to add</param>
        /// <returns></returns>
        public static Result <ExternalEntity> Add(this ExternalEntity from)
        {
            var result = Result <ExternalEntity> .Success();

            try
            {
                using (var db = new RSMDB.RSMDataModelDataContext())
                {
                    using (var transaction = new TransactionScope(TransactionScopeOption.Required, TransactionTimeout))
                    {
                        if (from.KeysAdded == DateTime.MinValue)
                        {
                            from.KeysAdded = DateTime.Now;
                        }

                        var row = from.InsertKeys(db);
                        if (row == null)
                        {
                            return(result.Fail("Add external entity keys failed"));
                        }

                        result.Entity = new ExternalEntity();
                        result.Entity = row.ToModel(result.Entity);

                        transaction.Complete();
                    }
                }
            }
            catch (Exception e)
            {
                return(result.Set(ResultType.TechnicalError, e, "Add external entity keys failed {0}", e.ToString()));
            }

            return(result);
        }
示例#3
0
        /// <summary>
        /// Search by specific criteria and optional date range on when Added.
        /// </summary>
        /// <param name="criteria">Fields considered: ExternalSystemId, EntityType</param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        public static Result <List <ExternalEntity> > SearchKeys(this ExternalEntity criteria, DateTime?from = null, DateTime?to = null)
        {
            var result = new Result <List <ExternalEntity> >();

            try
            {
                using (var db = new RSMDB.RSMDataModelDataContext())
                {
                    var type = Enum.GetName(typeof(EntityType), criteria.EntityType);

                    var rows = criteria.SearchKeys(db, x => x.SystemId == criteria.ExternalSystemId &&
                                                   x.EntityType == type &&
                                                   (from == null || x.Added > from) &&
                                                   (to == null || x.Added < to));

                    result.Entity = rows.Select(x => x.ToModel <ExternalEntity>()).ToList();
                }
            }
            catch (Exception e)
            {
                return(result.Set(ResultType.TechnicalError, e, "Get AccessLog failed. {0}", e.ToString()));
            }

            return(result);
        }
示例#4
0
        public static Result <ExternalEntity> MostRecent(this ExternalEntity criteria, DateTime?from = null, DateTime?to = null)
        {
            var result = new Result <ExternalEntity>();

            try
            {
                using (var db = new RSMDB.RSMDataModelDataContext())
                {
                    var type = Enum.GetName(typeof(EntityType), criteria.EntityType);

                    var rows = criteria.SearchKeys(db, x => x.SystemId == criteria.ExternalSystemId &&
                                                   x.EntityType == type &&
                                                   (from == null || x.Added > from) &&
                                                   (to == null || x.Added < to)).OrderByDescending(o => o.Added);

                    result.Entity = rows.Select(x => x.ToModel <ExternalEntity>()).FirstOrDefault();

                    if (result.Entity == null)
                    {
                        return(result.Fail("most recent external entity not found."));
                    }
                }
            }
            catch (Exception e)
            {
                return(result.Set(ResultType.TechnicalError, e, "Get AccessLog failed. {0}", e.ToString()));
            }

            return(result);
        }
示例#5
0
        /// <summary>
        /// Get External entity keys.
        /// </summary>
        /// <param name="from"></param>
        /// <param name="keyType"><typeparamref name="SelectKeys"/></param>
        /// <param name="replace">If true, criteria entity will be replaced with values retrieved.</param>
        /// <returns></returns>
        public static Result <ExternalEntity> GetKeys(this ExternalEntity from, SelectKeys keyType = SelectKeys.External, bool replace = false)
        {
            var result = Result <ExternalEntity> .Success();

            try
            {
                using (var db = new RSMDB.RSMDataModelDataContext())
                {
                    var row = keyType == SelectKeys.External
                                                ? from.SelectExternal(db)
                                                : from.Select(db);

                    if (row == null)
                    {
                        return(result.Fail("ExternalEntity not found", "NotFound"));
                    }

                    Debug.Assert(row.ExternalSystem != null, "ExternalSystem instance was not fetched!");

                    result.Entity = row.ToModel <ExternalEntity>(replace ? from : null);
                }
            }
            catch (Exception e)
            {
                return(result.Set(ResultType.TechnicalError, e, "Get ExternalEntity failed. {0}", e.ToString()));
            }

            return(result);
        }
示例#6
0
        public void ExternalEntity_Get_Internal()
        {
            var externalId = "50";
            var id         = 1;
            var keys       = DataFactory.CreateExternalApplicationKey(EntityType.Person, externalId, S2In.Id, id);

            using (var context = new RSMDB.RSMDataModelDataContext())
            {
                context.ExternalApplicationKeys.InsertOnSubmit(keys);
                context.SubmitChanges();
            }

            var criteria = new ExternalEntity
            {
                EntityType       = EntityType.Person,
                ExternalSystemId = S2In.Id,
                InternalId       = id
            };

            var result = criteria.GetKeys(SelectKeys.Internal);

            Assert.IsNotNull(result, "Missing results");
            Assert.IsTrue(result.Succeeded, result.ToString());
            Assert.IsNotNull(result.Entity, "Missing entity");
            Assert.IsNotNull(result.Entity.ExternalSystem, "Missing ExternalSystem entity");
            Assert.IsTrue(result.Entity.EntityType == EntityType.Person, "EntityType mismatch");
        }
示例#7
0
        public static RSMDB.ExternalApplicationKey SelectExternal(this ExternalEntity entity, RSMDB.RSMDataModelDataContext context)
        {
            var type = Enum.GetName(typeof(EntityType), entity.EntityType);

            return(context.ExternalApplicationKeys.FirstOrDefault(x =>
                                                                  x.EntityType == type &&
                                                                  x.SystemId == entity.ExternalSystemId &&
                                                                  x.ExternalId == entity.ExternalId));
        }
示例#8
0
        public List <ExternalEntity> InitializeData()
        {
            var rnd = new Random();

            if (false)
            {
                const int amountOfDataPoints = 550200; //rnd.Next(25000, 31000);

                data = new List <ExternalEntity>(amountOfDataPoints);

                for (var i = 0; i < amountOfDataPoints; i++)
                {
                    var point = new ExternalEntity();
                    point.Data.Add("x", rnd.Next(-BoundX, BoundX + 1));
                    point.Data.Add("y", rnd.Next(-BoundY, BoundY + 1));

                    data.Add(point);
                }

                return(data);
            }
            else if (true)
            {
                const int amountOfData = BoundX * BoundY * 4;
                data = new List <ExternalEntity>(amountOfData);
                for (var i = -BoundX; i <= BoundX; i++)
                {
                    for (var j = -BoundY; j <= BoundY; j++)
                    {
                        var point = new ExternalEntity();
                        point.Data.Add("x", i);
                        point.Data.Add("y", j);

                        data.Add(point);
                    }
                }

                return(data);
            }
            else
            {
                data = new List <ExternalEntity>();
                for (var i = -BoundX; i <= BoundX; i += 8)
                {
                    for (var j = -BoundY; j <= BoundY; j += 8)
                    {
                        var point = new ExternalEntity();
                        point.Data.Add("x", i);
                        point.Data.Add("y", j);

                        data.Add(point);
                    }
                }

                return(data);
            }
        }
示例#9
0
        public static ExternalEntity MapKeys(this ExternalEntity from, ExternalEntity to)
        {
            Debug.Assert(from.EntityType == to.EntityType, "Attempting to map keys between different entity types!!");

            to.InternalId       = from.InternalId;
            to.ExternalId       = from.ExternalId;
            to.ExternalSystemId = from.ExternalSystemId;

            if (from.ExternalSystem != null)
            {
                to.ExternalSystem = from.ExternalSystem;
            }

            return(to);
        }
示例#10
0
        public static RSMDB.ExternalApplicationKey Insert(this ExternalEntity entity, RSMDB.RSMDataModelDataContext context)
        {
            var row = new RSMDB.ExternalApplicationKey
            {
                InternalId = entity.InternalId,
                SystemId   = entity.ExternalSystemId,
                EntityType = Enum.GetName(typeof(EntityType), entity.EntityType),
                ExternalId = entity.ExternalId,
                Added      = entity.KeysAdded
            };

            context.ExternalApplicationKeys.InsertOnSubmit(row);

            context.SubmitChanges();

            return(row);
        }
示例#11
0
        public void ExternalEntity_Update()
        {
            var externalId = "50";
            var id         = 1;
            var keys       = DataFactory.CreateExternalApplicationKey(EntityType.Person, externalId, S2In.Id, id);

            using (var context = new RSMDB.RSMDataModelDataContext())
            {
                context.ExternalApplicationKeys.InsertOnSubmit(keys);
                context.SubmitChanges();
            }

            var lastUpdated = DateTime.Now;
            var criteria    = new ExternalEntity
            {
                EntityType       = EntityType.Person,
                ExternalSystemId = S2In.Id,
                InternalId       = id,
                ExternalUpdated  = lastUpdated
            };

            using (var context = new RSMDB.RSMDataModelDataContext())
            {
                criteria.UpdateKeys(context);
                context.SubmitChanges();
            }

            using (var context = new RSMDB.RSMDataModelDataContext())
            {
                keys = context.ExternalApplicationKeys.FirstOrDefault(x => x.InternalId == criteria.InternalId &&
                                                                      x.SystemId == criteria.ExternalSystemId &&
                                                                      x.EntityType == Enum.GetName(typeof(EntityType), criteria.EntityType));

                Assert.IsNotNull(keys, "Keys not created");
                Assert.IsTrue(keys.ExternalEntityLastUpdated != null, "LastUpdated value not updated");

                //NOTE: it is possible for conversion into the db to cause millisecond differences
                Assert.IsTrue(keys.ExternalEntityLastUpdated.ToString() == lastUpdated.ToString(), "LastUpdated value not the same");
            }
        }
示例#12
0
        public static RSMDB.ExternalApplicationKey UpdateKeys(this ExternalEntity entity, RSMDB.RSMDataModelDataContext context)
        {
            var row = DataExtensions.Select(entity, context);

            if (row == null)
            {
                return(row);
            }

            if (entity.ExternalUpdated == default(DateTime))
            {
                row.ExternalEntityLastUpdated = null;
            }
            else
            {
                row.ExternalEntityLastUpdated = entity.ExternalUpdated;
            }

            context.SubmitChanges();

            return(row);
        }
示例#13
0
        public static RSMDB.ExternalApplicationKey InsertKeys(this ExternalEntity entity, RSMDB.RSMDataModelDataContext context)
        {
            var row = new RSMDB.ExternalApplicationKey
            {
                InternalId = entity.InternalId,
                SystemId   = entity.ExternalSystemId,
                EntityType = Enum.GetName(typeof(EntityType), entity.EntityType),
                ExternalId = entity.ExternalId,
                Added      = entity.KeysAdded
            };

            if (entity.ExternalUpdated != default(DateTime))
            {
                row.ExternalEntityLastUpdated = entity.ExternalUpdated;
            }

            context.ExternalApplicationKeys.InsertOnSubmit(row);

            context.SubmitChanges();

            return(row);
        }
示例#14
0
 public static bool KeysExist(this ExternalEntity from, SelectKeys keyType = SelectKeys.External)
 {
     return(from.GetKeys(keyType).Succeeded);
 }
示例#15
0
 public static IEnumerable <RSMDB.ExternalApplicationKey> SearchKeys(this ExternalEntity entity, RSMDB.RSMDataModelDataContext context,
                                                                     Expression <Func <RSMDB.ExternalApplicationKey, bool> > filterExpression)
 {
     return(context.ExternalApplicationKeys.Where(filterExpression.Compile()));
 }