Beispiel #1
0
        public void Dequeue_ShouldBeFIFO_WhenMultipleQueriesAdded_ManyItems()
        {
            var queryQueue = new QueryQueue();
            var query1     = new TestQuery(1, QueryFunctionType.SingleQuote);
            var query2     = new TestQuery(2, QueryFunctionType.IntraDay);
            var query3     = new TestQuery(3, QueryFunctionType.Weekly);
            var query4     = new TestQuery(4, QueryFunctionType.Monthly);

            queryQueue.Enqueue(query1);
            queryQueue.Enqueue(query2);
            queryQueue.Enqueue(query3);
            queryQueue.Enqueue(query4);

            var queries = queryQueue.Dequeue(3).ToList();

            Assert.Equal(query1, queries[0]);
            Assert.Equal(query2, queries[1]);
            Assert.Equal(query3, queries[2]);
            Assert.Equal(1, queryQueue.Count);
        }
Beispiel #2
0
        /// <summary>
        /// Does query in background.
        /// </summary>
        /// <param name="state">The state.</param>
        /// <exception cref="NotImplementedException"></exception>
        private void DoQueryInBackground(object state)
        {
            do
            {
                if (!Monitor.TryEnter(this))
                {
                    return;
                }

                try
                {
                    this.cache.Clear();
                    this.view.Clear();
                    var maxThreads = Settings.Default.MaxThreads > 0 ? Settings.Default.MaxThreads : Environment.ProcessorCount;
                    var queue      = new QueryQueue(this.GetType().Name, maxThreads);
                    var dates      = Enumerable.Range(7, 30).Select(i => DateTime.Now.Date.AddDays(i)).ToList();

                    this.view.ShowProgress("Report Earning Calendar", "Querying...");
                    this.view.ShowProgress(0, dates.Count);
                    queue.Start(this.QueryCalendar, dates);

                    this.view.ShowProgress("Report Earning Calendar",
                                           $"Retrieved earning reports between [{dates.First().ToShortDateString()} - {dates.Last().ToShortDateString()}]");
                }
                catch (Exception ex)
                {
                    var error = $"Failed to get calendar from {this.db.GetType().Name}: {ex}";
                    this.view.Notify(error);
                }
                finally
                {
                    Monitor.Exit(this);
                }

                this.cache.Clear();
                Thread.Sleep(Convert.ToInt32(TimeSpan.FromHours(1).TotalMilliseconds));
            } while (true);
        }
        public MainWindowViewModel()
        {
            var dispatcher = Dispatcher.CurrentDispatcher;

            ProductManager.OnStockClear += () =>
            {
                ProductSet.Clear();
                _productNames.Clear();
            };

            ProductManager.OnProductAdd += product =>
            {
                if (_productNames.ContainsKey(product.Name))
                {
                    _productNames[product.Name].Number += product.Number;
                }
                else
                {
                    ProductSet.Add(product);
                    _productNames.Add(product.Name, product);
                }
            };

            ProductManager.OnQueryAdd += query =>
            {
                dispatcher.Invoke(() => QueryQueue.Enqueue(query));
            };

            ProductManager.OnQuerySent += () => { dispatcher.Invoke(() => QueryQueue.Dequeue()); };

            ProductManager.OnQueryDbFail += msg =>
            {
                MessageBox.Show(msg, "The Failed Query");
            };

            ProductManager.StartWork();
        }
Beispiel #4
0
        public async Task GetCurrentIntervalQueriesRanCount_ShouldResetOnNextInterval()
        {
            var queryQueue = new QueryQueue();

            queryQueue.SetIntervalKey(() => DateTime.UtcNow.Millisecond);

            var query1 = new TestQuery(1, QueryFunctionType.SingleQuote);
            var query2 = new TestQuery(2, QueryFunctionType.IntraDay);
            var query3 = new TestQuery(3, QueryFunctionType.Weekly);

            queryQueue.Enqueue(query1);
            queryQueue.Enqueue(query2);
            queryQueue.Enqueue(query3);

            queryQueue.Dequeue(2);
            queryQueue.MarkAsExecuted(query1);
            queryQueue.MarkAsExecuted(query2);

            Assert.Equal(2, queryQueue.GetCurrentIntervalQueriesRanCount());

            await Task.Delay(10);

            Assert.Equal(0, queryQueue.GetCurrentIntervalQueriesRanCount());
        }
        public QueryEventBusTests()
        {
            _querySubscriptions = new QuerySubscriptions();

            _queryQueue = new QueryQueue();

            // Will allow same queries to be queued again after a  millisecond
            _queryQueue.SetIntervalKey(() => DateTime.UtcNow.Millisecond);

            _mockContextFactory = new Mock <IQueryContextFactory>();

            var priorityRule = new QuerySubscriptionCountRule(
                contextFactory: _mockContextFactory.Object,
                _querySubscriptions,
                (new Mock <ILogger <QuerySubscriptionCountRule> >()).Object
                );

            _queryEventBus = new QueryEventBus(
                queryQueue: _queryQueue,
                queryContextFactory: _mockContextFactory.Object,
                queuePriorityRule: priorityRule,
                logger: (new Mock <ILogger <QueryEventBus> >()).Object
                );
        }
Beispiel #6
0
        public void IsEmpty_ShouldReturnTrue_WhenNoQueriesAdded()
        {
            var queryQueue = new QueryQueue();

            Assert.True(queryQueue.IsEmpty());
        }