public bool PassFilter(StationYear stationYear)
        {
            GetObservable();
            if (_task.IsCompleted)
            {
                DateTime now = DateTime.Now;
                if (_task.Result.LastUpdated.HasValue)
                {
                    if (_task.Result.LastUpdated.Value.Year < stationYear.Year)
                    {
                        return(true);
                    }
                }
                else
                {
                    if (stationYear.Year == now.Year)
                    {
                        return(true);
                    }
                }

                return(_task.Result.StationYearBloom.ContainsKey(stationYear));
            }

            return(true);
        }
        private Tuple <StationYear, int> ParseLine(string line)
        {
            if (!line.StartsWith("\"") || !line.EndsWith("\""))
            {
                throw new NotSupportedException("station inventory csv bad");
            }

            line = line.Substring(1, line.Length - 2);

            string[] lineElements = line.Split(new[] { "\",\"" }, StringSplitOptions.None);

            if (lineElements.Length != 15)
            {
                throw new NotSupportedException("station inventory csv bad");
            }

            var stationYear = new StationYear
            {
                StationIdentifier = new StationIdentifier {
                    UsafId = int.Parse(lineElements[0]), WbanId = int.Parse(lineElements[1])
                },
                Year = int.Parse(lineElements[2])
            };

            int count = 0;

            for (int i = 3; i < 15; i++)
            {
                count += int.Parse(lineElements[i]);
            }

            return(new Tuple <StationYear, int>(stationYear, count));
        }
Exemplo n.º 3
0
        private Task <WeatherCollection> GetObservable(StationYear stationYear, int priority)
        {
            Task <WeatherCollection> retval;

            lock (_collectionLock)
            {
                StationYearRequest stationYearRequest;
                TaskCompletionSource <WeatherCollection> weatherCollection;
                if (_cache.TryGetValue(stationYear, out weatherCollection))
                {
                    retval = weatherCollection.Task;

                    if (retval.IsCompleted && retval.Result.NeedsToRevalidate())
                    {
                        stationYearRequest             = new StationYearRequest();
                        stationYearRequest.Priority    = priority;
                        stationYearRequest.RequestTime = DateTime.Now;
                        stationYearRequest.StationYear = stationYear;
                        stationYearRequest.LastRun     = retval.Result;

                        var subject = new TaskCompletionSource <WeatherCollection>();

                        _cache[stationYear] = subject;
                        _queue.Add(stationYearRequest);
                        _queueIndex[stationYear] = stationYearRequest;

                        retval = subject.Task;
                    }
                    else
                    {
                        if (_queueIndex.TryGetValue(stationYear, out stationYearRequest) &&
                            stationYearRequest.Priority > priority)
                        {
                            _queue.Remove(stationYearRequest);
                            stationYearRequest.Priority = priority;
                            _queue.Add(stationYearRequest);
                            _queueIndex[stationYear] = stationYearRequest;
                        }
                    }
                }
                else
                {
                    stationYearRequest             = new StationYearRequest();
                    stationYearRequest.Priority    = priority;
                    stationYearRequest.RequestTime = DateTime.Now;
                    stationYearRequest.StationYear = stationYear;

                    var subject = new TaskCompletionSource <WeatherCollection>();

                    _cache[stationYear] = subject;
                    _queue.Add(stationYearRequest);
                    _queueIndex[stationYear] = stationYearRequest;

                    retval = subject.Task;
                }
            }
            _readyEvent.Set();
            return(retval);
        }
Exemplo n.º 4
0
 public void Prefetch(StationYear stationYear, int priority)
 {
     GetObservable(stationYear, priority);
 }
Exemplo n.º 5
0
 public WeatherCollection Get(StationYear stationYear)
 {
     return(GetObservable(stationYear, -1).Result);
 }