Exemple #1
0
        public override IQueryable <TEntity> Query()
        {
            var entityName        = typeof(TEntity).Name;
            var queryableCacheKey = $"{entityName}_QueryAll";
            var enumCacheValue    = (CacheGroup)Enum.Parse(typeof(CacheGroup), entityName);

            _cache.TryGetValue(enumCacheValue, queryableCacheKey, out IQueryable <TEntity> queryAll);

            if (queryAll == null)
            {
                queryAll = base.Query().ToList().AsQueryable();
                _cache.Set(enumCacheValue, queryableCacheKey, queryAll);
            }

            var attachedEntities = _dbContext.ChangeTracker.Entries <TEntity>().Select(e => e.Property("Id").CurrentValue);

            foreach (var item in queryAll)
            {
                var itemId = typeof(TEntity).GetProperty("Id").GetValue(item);
                if (!attachedEntities.Contains(itemId))
                {
                    _dbContext.Attach(item);
                }
            }
            return(queryAll);
        }
Exemple #2
0
        /// <summary>
        /// Se encarga de verificar si un objeto o lista de objetos se encuentran cacheados, dada una key
        /// </summary>
        /// <typeparam name="T">Tipo alojado en la cache</typeparam>
        /// <param name="key">Key a buscar en la cache</param>
        /// <param name="action">Funcion a invocar si los valores no se encuentran en la cache</param>
        /// <returns></returns>
        private IEnumerable <T> TryToGetFromCache <T>(string key, Func <IEnumerable <T> > action)
        {
            var found = _cache.TryGetValue(CACHE_GROUP, key, out IEnumerable <T> values);

            if (!found)
            {
                values = action();
                _cache.Set(CACHE_GROUP, key, values, new ExpirationSettings {
                    AbsoluteExpiration = CACHE_LEVEL
                });
            }

            return(values);
        }
Exemple #3
0
        public PointsDatabase(IMemCache memCache, IList <MapPoint> points)
        {
            _memCache = memCache;

            Points = _memCache.Get <IList <MapPoint> >(CacheKeys.PointsDatabase);
            if (Points != null)
            {
                return;                 // cache hit
            }
            lock (_threadsafe)
            {
                //Points = _memCache.Get<IList<MapPoint>>(CacheKeys.PointsDatabase);
                //if (Points != null) return;

                Points = new List <MapPoint>();

                // Not important, can be deleted, only for ensuring visual randomness of marker display
                // when not all can be displayed on screen
                //
                // Randomize order, when limit take is used for max marker display
                // random locations are selected
                // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
                var rnd   = new Random();
                var count = points.Count;
                for (var i = 0; i < count; i++)
                {
                    MapPoint tmp = points[i];
                    int      r   = rnd.Next(count);
                    points[i] = points[r];
                    points[r] = tmp;
                }

                Points = points;

                _memCache.Set <IList <MapPoint> >(CacheKeys.PointsDatabase, Points, TimeSpan.FromHours(24));

                var data = _memCache.Get <IList <MapPoint> >(CacheKeys.PointsDatabase);
                if (data == null)
                {
                    throw new Exception("cache not working");
                }
            }
        }
        public PointsDatabase(IMemCache memCache, IList<MapPoint> points)
        {
            _memCache = memCache;

            Points = _memCache.Get<IList<MapPoint>>(CacheKeys.PointsDatabase);
            if (Points != null) return; // cache hit

            lock (_threadsafe)
            {
                //Points = _memCache.Get<IList<MapPoint>>(CacheKeys.PointsDatabase);
                //if (Points != null) return;

                Points = new List<MapPoint>();

                // Not important, can be deleted, only for ensuring visual randomness of marker display 
                // when not all can be displayed on screen
                //
                // Randomize order, when limit take is used for max marker display
                // random locations are selected
                // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
                var rnd = new Random();
                var count = points.Count;
                for (var i = 0; i < count; i++)
                {
                    MapPoint tmp = points[i];
                    int r = rnd.Next(count);
                    points[i] = points[r];
                    points[r] = tmp;
                }

                Points = points;

                _memCache.Set<IList<MapPoint>>(CacheKeys.PointsDatabase, Points, TimeSpan.FromHours(24));

                var data = _memCache.Get<IList<MapPoint>>(CacheKeys.PointsDatabase);
                if (data == null)
                {
                    throw new Exception("cache not working");
                }
            }
        }
        public void Set(IList <MapPoint> points, TimeSpan timespan, string pointType = null)
        {
            var key = GetPointKey(pointType);

            _memCache.Set(key, RandomizePointOrder(points), timespan);
        }
        /// <summary>
        /// Read Through Cache
        /// </summary>
        /// <param name="getParams"></param>
        /// <returns></returns>
        private ClusterMarkersResponse GetMarkersHelper(GetMarkersParams getParams)
        {
            try
            {
                var neLat     = getParams.NorthEastLatitude;
                var neLong    = getParams.NorthEastLongitude;
                var swLat     = getParams.SouthWestLatitude;
                var swLong    = getParams.SouthWestLongitude;
                var zoomLevel = getParams.ZoomLevel;
                var filter    = getParams.Filter ?? "";

                // values are validated there
                var markersInput = new MarkersInput(neLat, neLong, swLat, swLong, zoomLevel, filter);

                var grid           = GridCluster.GetBoundaryExtended(markersInput);
                var cacheKeyHelper = string.Format("{0}_{1}_{2}", markersInput.Zoomlevel, markersInput.FilterHashCode(), grid.GetHashCode());
                var cacheKey       = CacheKeys.GetMarkers(cacheKeyHelper.GetHashCode());

                var response = new ClusterMarkersResponse();

                markersInput.Viewport.ValidateLatLon(); // Validate google map viewport input (should be always valid)
                markersInput.Viewport.Normalize();

                // Get all points from memory
                IList <MapPoint> points = _pointCollection.Get(getParams.PointType); // _pointsDatabase.GetPoints();

                // Filter points
                points = FilterUtil.FilterByType(
                    points,
                    new FilterData {
                    TypeFilterExclude = markersInput.TypeFilterExclude
                }
                    );



                // Create new instance for every ajax request with input all points and json data
                var clusterAlgo = new GridCluster(points, markersInput);

                var clusteringEnabled = markersInput.IsClusteringEnabled ||
                                        GmcConfiguration.Get.AlwaysClusteringEnabledWhenZoomLevelLess > markersInput.Zoomlevel;

                // Clustering
                if (clusteringEnabled && markersInput.Zoomlevel < GmcConfiguration.Get.ZoomlevelClusterStop)
                {
                    IList <MapPoint> markers = clusterAlgo.RunCluster();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = markers,
                        Polylines = clusterAlgo.GetPolyLines()
                    };
                }
                else
                {
                    // If we are here then there are no clustering
                    // The number of items returned is restricted to avoid json data overflow
                    IList <MapPoint> filteredDataset          = FilterUtil.FilterDataByViewport(points, markersInput.Viewport);
                    IList <MapPoint> filteredDatasetMaxPoints = filteredDataset.Take(GmcConfiguration.Get.MaxMarkersReturned).ToList();

                    response = new ClusterMarkersResponse
                    {
                        Markers   = filteredDatasetMaxPoints,
                        Polylines = clusterAlgo.GetPolyLines(),
                        Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                    };
                }

                // if client ne and sw is inside a specific grid box then cache the grid box and the result
                // next time test if ne and sw is inside the grid box and return the cached result
                if (GmcConfiguration.Get.CacheServices)
                {
                    _memCache.Set(cacheKey, response, TimeSpan.FromMinutes(10)); // cache data
                }
                return(response);
            }
            catch (Exception ex)
            {
                return(new ClusterMarkersResponse
                {
                    OperationResult = "0",
                    ErrorMessage = string.Format("MapService says: exception {0}", ex.Message)
                });
            }
        }
		public PointsDatabase(IMemCache memCache, string filepath)
		{
			_memCache = memCache;

			Points = _memCache.Get<IList<P>>(CacheKeys.PointsDatabase);
			if (Points != null) return;	// cache hit

			lock (_threadsafe)
			{
				Points = _memCache.Get<IList<P>>(CacheKeys.PointsDatabase);
				if (Points != null) return;

				var sw = new Stopwatch();
				sw.Start();

				Points = new List<P>();
				FilePath = filepath;

				// Load from file
				List<P> points = Utility.Dataset.LoadDataset(FilePath);
				if (points.None())
				{
					throw new Exception(string.Format("Data was not loaded from file: {0}", FilePath));
				}

				if (points.Count > GmcSettings.Get.MaxPointsInCache)
				{
					points = points.Take(GmcSettings.Get.MaxPointsInCache).ToList();
				}

				// Not important, can be deleted, only for ensuring visual randomness of marker display 
				// when not all can be displayed on screen
				//
				// Randomize order, when limit take is used for max marker display
				// random locations are selected
				// http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
				var rand = new Random();
				var c = points.Count;
				for (var i = 0; i < c; i++)
				{
					P temp = points[i];
					int r = rand.Next(c);
					points[i] = points[r];
					points[r] = temp;
				}

				var linkedList = new LinkedList<P>();
				points.ForEach(p => linkedList.AddLast(p));

				Points = points;

				_memCache.Set<IList<P>>(Points, CacheKeys.PointsDatabase, TimeSpan.FromHours(24));

				var data = _memCache.Get<IList<P>>(CacheKeys.PointsDatabase);

				if (data == null)
				{
					throw new Exception("cache not working");
				}

				sw.Stop();
				LoadTime = sw.Elapsed;
			}
		}
Exemple #8
0
        /// <summary>
        /// Read Through Cache
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public JsonMarkersReply GetMarkersHelper(JsonGetMarkersInput input)
        {
            try
            {
                var nelat     = Math.Round(input.nelat.ToDouble(), Numbers.Round);
                var nelon     = Math.Round(input.nelon.ToDouble(), Numbers.Round);
                var swlat     = Math.Round(input.swlat.ToDouble(), Numbers.Round);
                var swlon     = Math.Round(input.swlon.ToDouble(), Numbers.Round);
                var zoomLevel = int.Parse(input.zoomLevel);
                var filter    = input.filter ?? "";

                // values are validated there
                var inputValidated = new JsonGetMarkersReceive(nelat, nelon, swlat, swlon, zoomLevel, filter);

                var grid           = GridCluster.GetBoundaryExtended(inputValidated);
                var cacheKeyHelper = string.Format("{0}_{1}_{2}", inputValidated.Zoomlevel, inputValidated.FilterHashCode(), grid.GetHashCode());
                var cacheKey       = CacheKeys.GetMarkers(cacheKeyHelper.GetHashCode());

                var reply = _memCache.Get <JsonMarkersReply>(cacheKey);
                if (reply != null)
                {
                    // return cached data
                    reply.Cache = true;
                    return(reply);
                }

                inputValidated.Viewport.ValidateLatLon();                 // Validate google map viewport input (should be always valid)
                inputValidated.Viewport.Normalize();

                // Get all points from memory
                IList <P> points = _pointsDatabase.GetPoints();

                #region fiter

                // Filter points
                points = FilterUtil.FilterByType(
                    points,
                    new FilterData {
                    TypeFilterExclude = inputValidated.TypeFilterExclude
                }
                    );

                #endregion filter


                // Create new instance for every ajax request with input all points and json data
                ICluster clusterAlgo = new GridCluster(points, inputValidated);

                var clusteringEnabled = inputValidated.IsClusteringEnabled ||
                                        GmcSettings.Get.AlwaysClusteringEnabledWhenZoomLevelLess > inputValidated.Zoomlevel;

                // Clustering
                if (clusteringEnabled && inputValidated.Zoomlevel < GmcSettings.Get.ZoomlevelClusterStop)
                {
                    #region cluster

                    IList <P> markers = clusterAlgo.RunCluster();

                    #endregion cluster

                    reply = new JsonMarkersReply
                    {
                        Markers   = markers,
                        Polylines = clusterAlgo.GetPolyLines(),
                    };
                }
                else
                {
                    // If we are here then there are no clustering
                    // The number of items returned is restricted to avoid json data overflow
                    IList <P> filteredDataset          = FilterUtil.FilterDataByViewport(points, inputValidated.Viewport);
                    IList <P> filteredDatasetMaxPoints = filteredDataset.Take(GmcSettings.Get.MaxMarkersReturned).ToList();

                    reply = new JsonMarkersReply
                    {
                        Markers   = filteredDatasetMaxPoints,
                        Polylines = clusterAlgo.GetPolyLines(),
                        Mia       = filteredDataset.Count - filteredDatasetMaxPoints.Count,
                    };
                }

                // if client ne and sw is inside a specific grid box then cache the grid box and the result
                // next time test if ne and sw is inside the grid box and return the cached result
                if (GmcSettings.Get.CacheServices)
                {
                    _memCache.Set(reply, cacheKey, TimeSpan.FromMinutes(10));                                               // cache data
                }
                return(reply);
            }
            catch (Exception ex)
            {
                return(new JsonMarkersReply
                {
                    Ok = "0",
                    EMsg = string.Format("MapService says: exception {0}", ex.Message)
                });
            }
        }
        public PointsDatabase(IMemCache memCache, string filepath)
        {
            _memCache = memCache;

            Points = _memCache.Get <IList <P> >(CacheKeys.PointsDatabase);
            if (Points != null)
            {
                return;                                 // cache hit
            }
            lock (_threadsafe)
            {
                Points = _memCache.Get <IList <P> >(CacheKeys.PointsDatabase);
                if (Points != null)
                {
                    return;
                }

                var sw = new Stopwatch();
                sw.Start();

                Points   = new List <P>();
                FilePath = filepath;

                // Load from file
                List <P> points = Utility.Dataset.LoadDataset(FilePath);
                if (points.None())
                {
                    throw new Exception(string.Format("Data was not loaded from file: {0}", FilePath));
                }

                if (points.Count > GmcSettings.Get.MaxPointsInCache)
                {
                    points = points.Take(GmcSettings.Get.MaxPointsInCache).ToList();
                }

                // Not important, can be deleted, only for ensuring visual randomness of marker display
                // when not all can be displayed on screen
                //
                // Randomize order, when limit take is used for max marker display
                // random locations are selected
                // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
                var rand = new Random();
                var c    = points.Count;
                for (var i = 0; i < c; i++)
                {
                    P   temp = points[i];
                    int r    = rand.Next(c);
                    points[i] = points[r];
                    points[r] = temp;
                }

                var linkedList = new LinkedList <P>();
                points.ForEach(p => linkedList.AddLast(p));

                Points = points;

                _memCache.Set <IList <P> >(Points, CacheKeys.PointsDatabase, TimeSpan.FromHours(24));

                var data = _memCache.Get <IList <P> >(CacheKeys.PointsDatabase);

                if (data == null)
                {
                    throw new Exception("cache not working");
                }

                sw.Stop();
                LoadTime = sw.Elapsed;
            }
        }