コード例 #1
0
        public void FindEndOfOndemandPeriodTest()
        {
            var tierResolver = CreatTierResolver();
            var helper       = new ApiTaskHelper(tierResolver);

            // for fixed tier range, return null
            // quarter
            var tierRange = PeriodRange <IComparablePeriod> .Create(fixedOldestQuarter, fixedLatestQuarter);

            Assert.IsNull(helper.FindEndOfOndemandPeriod(DataTypeConfig.Quarter, ticker, tierRange, true, true, true) as FiscalQuarterPeriod);
            Assert.IsNull(helper.FindEndOfOndemandPeriod(DataTypeConfig.Quarter, ticker, tierRange, false, true, true) as FiscalQuarterPeriod);
            // daily
            tierRange = PeriodRange <IComparablePeriod> .Create(fixedTierOldestDay, fixedTierLatestDay);

            Assert.IsNull(helper.FindEndOfOndemandPeriod(DataTypeConfig.Daily, ticker, tierRange, true, true, true) as DayPeriod);
            Assert.IsNull(helper.FindEndOfOndemandPeriod(DataTypeConfig.Daily, ticker, tierRange, false, true, true) as DayPeriod);

            // for ondemand range
            // quarter
            tierRange
                = PeriodRange <IComparablePeriod> .Create(ondemandOldestQuarter, ondemandLatestQuarter);

            Assert.AreEqual(ondemandLatestQuarter, helper.FindEndOfOndemandPeriod(DataTypeConfig.Quarter, ticker, tierRange, true, true, true) as FiscalQuarterPeriod);
            Assert.ThrowsException <NotSupportedTierException>(() => helper.FindEndOfOndemandPeriod(DataTypeConfig.Quarter, ticker, tierRange, false, true, true));

            tierRange
                = PeriodRange <IComparablePeriod> .Create(ondemandOldestDay, ondemandLatestDay);

            Assert.AreEqual(ondemandLatestDay, helper.FindEndOfOndemandPeriod(DataTypeConfig.Daily, ticker, tierRange, true, true, true) as DayPeriod);
            Assert.ThrowsException <NotSupportedTierException>(() => helper.FindEndOfOndemandPeriod(DataTypeConfig.Daily, ticker, tierRange, false, true, true));
        }
        public static CsvDownloadParameters Create(string ticker, FiscalQuarterPeriod from, FiscalQuarterPeriod to, CsvDownloadOutputSettings outputSettings)
        {
            JpTickerValidator.Validate(ticker);
            var range = PeriodRange <FiscalQuarterPeriod> .Create(from, to);

            return(new CsvDownloadParameters(ticker, range, outputSettings));
        }
コード例 #3
0
        public void FixedTierRengeLengthTest()
        {
            var from  = FiscalQuarterPeriod.Create(2020, 1);
            var to    = FiscalQuarterPeriod.Create(2021, 2);
            var range = PeriodRange <FiscalQuarterPeriod> .Create(from, to);

            var supportedTierRange = new SupportedTierRange <FiscalQuarterPeriod>(range, null);

            Assert.AreEqual((uint)5, supportedTierRange.FixedTierRengeLength());
        }
コード例 #4
0
        public void CreateForDayPeriodTest()
        {
            var from    = DayPeriod.Create(2020, 1, 1);
            var to      = DayPeriod.Create(2020, 1, 2);
            var fqRange = PeriodRange <DayPeriod> .Create(from, to);

            Assert.AreEqual(from, fqRange.From);
            Assert.AreEqual(to, fqRange.To);
            Assert.ThrowsException <ValidationError>(() => PeriodRange <DayPeriod> .Create(to, from));
        }
コード例 #5
0
        public IEnumerable <Quarter> GetQuarters(CsvDownloadParameters parameters)
        {
            // set isConfigureAwait for performance
            // https://devblogs.microsoft.com/dotnet/configureawait-faq/#why-would-i-want-to-use-configureawaitfalse
            var quarters = PeriodRange <FiscalQuarterPeriod> .Slice(parameters.Range, 4)
                           .SelectMany
                               (r => processor.GetApiResources(DataTypeConfig.Quarter, parameters.Ticker, r.From, r.To, false, true)
                               ).Cast <Quarter>();

            return(quarters.Distinct().OrderBy(q => q.Period));
        }
コード例 #6
0
 public static Company Create(
     string ticker,
     PeriodRange <FiscalQuarterPeriod> fixedTierQuarterRange,
     PeriodRange <FiscalQuarterPeriod> ondemandQuarterTierRange,
     PeriodRange <DayPeriod> fixedTierDayRange,
     PeriodRange <DayPeriod> ondemandTierDayRange,
     PropertyDictionary properties,
     PropertyDescriptionDictionary descriptions)
 {
     JpTickerValidator.Validate(ticker);
     return(new Company(ticker, fixedTierQuarterRange, ondemandQuarterTierRange, fixedTierDayRange, ondemandTierDayRange, properties, descriptions));
 }
コード例 #7
0
        public void IncludesTest()
        {
            var from  = FiscalQuarterPeriod.Create(2020, 1);
            var to    = FiscalQuarterPeriod.Create(2020, 3);
            var range = PeriodRange <FiscalQuarterPeriod> .Create(from, to);

            Assert.IsTrue(range.Includes(from));
            Assert.IsTrue(range.Includes(FiscalQuarterPeriod.Create(2020, 2)));
            Assert.IsTrue(range.Includes(to));
            Assert.IsFalse(range.Includes(FiscalQuarterPeriod.Create(2020, 4)));
            Assert.IsFalse(range.Includes(FiscalQuarterPeriod.Create(2019, 4)));
        }
コード例 #8
0
 private Company(string ticker,
                 PeriodRange <FiscalQuarterPeriod> fixedTierQuarterRange,
                 PeriodRange <FiscalQuarterPeriod> ondemandTierQuarterRange,
                 PeriodRange <DayPeriod> fixedTierDayRange,
                 PeriodRange <DayPeriod> ondemandTierDayRange,
                 PropertyDictionary properties,
                 PropertyDescriptionDictionary descriptions)
 {
     this.ticker = ticker;
     this.supportedQuarterRanges = new SupportedTierRange <FiscalQuarterPeriod>(fixedTierQuarterRange, ondemandTierQuarterRange);
     this.supportedDayRanges     = new SupportedTierRange <DayPeriod>(fixedTierDayRange, ondemandTierDayRange);
     this.properties             = properties;
     this.descriptions           = descriptions;
 }
コード例 #9
0
        public void TotalGapTest()
        {
            // quarter
            var fromFqp = FiscalQuarterPeriod.Create(2020, 1);
            var toFqp   = FiscalQuarterPeriod.Create(2021, 2);

            Assert.AreEqual((uint)5, PeriodRange <FiscalQuarterPeriod> .Create(fromFqp, toFqp).TotalGap());


            // day
            var fromDay = DayPeriod.Create(2016, 1, 1);
            var toDay   = DayPeriod.Create(2016, 2, 1);

            Assert.AreEqual((uint)31, PeriodRange <DayPeriod> .Create(fromDay, toDay).TotalGap());
        }
コード例 #10
0
        public void SliceDayTest()
        {
            var from     = DayPeriod.Create(2016, 1, 1);
            var to       = DayPeriod.Create(2016, 2, 1);
            var dayRange = PeriodRange <DayPeriod> .Create(from, to);

            // size = 1
            var chunks = PeriodRange <DayPeriod> .Slice(dayRange, 1).ToArray();

            Assert.AreEqual(32, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from, chunks[0].To);
            Assert.AreEqual(from.Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[31].From);
            Assert.AreEqual(to, chunks[31].To);
            for (uint i = 0; i < chunks.Length; i++)
            {
                Assert.AreEqual(0, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }

            // size = 2
            chunks = PeriodRange <DayPeriod> .Slice(dayRange, 2).ToArray();

            Assert.AreEqual(16, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from.Next(), chunks[0].To);
            Assert.AreEqual(from.Next().Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[15].To);
            for (uint i = 0; i < chunks.Length; i++)
            {
                Assert.AreEqual(1, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }


            // size = 3
            chunks = PeriodRange <DayPeriod> .Slice(dayRange, 3).ToArray();

            Assert.AreEqual(11, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from.Next().Next(), chunks[0].To);
            Assert.AreEqual(from.Next().Next().Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[10].To);
            for (uint i = 0; i < chunks.Length - 1; i++)
            {
                Assert.AreEqual(2, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }
            Assert.AreEqual(1, ComparablePeriodUtil.GetGap(chunks.Last().From, chunks.Last().To));
        }
コード例 #11
0
 static string ConvertDateToPeriod(DateTime dt, PeriodRange p)
 {
     switch (p)
     {
         case PeriodRange.Year:
             return Convert.ToString(dt.Year);
         case PeriodRange.Semester:
             return string.Format("{0}_S{1}", dt.Year, dt.Month <= 6 ? "1" : "2");
         case PeriodRange.Trimester:
             return string.Format("{0}_Q{1}", dt.Year, dt.Month <= 3 ? "1" : dt.Month <= 6 ? "2" : dt.Month <= 9 ? "3" : "4");
         case PeriodRange.Month:
             return string.Format("{0}_M{1}", dt.Year, dt.Month);
         default:
             throw new ArgumentException();
     }
 }
コード例 #12
0
        public void SliceFiscalQuarterTest()
        {
            var from         = FiscalQuarterPeriod.Create(2016, 1);
            var to           = FiscalQuarterPeriod.Create(2020, 4);
            var quarterRange = PeriodRange <FiscalQuarterPeriod> .Create(from, to);

            // size = 1
            var chunks = PeriodRange <FiscalQuarterPeriod> .Slice(quarterRange, 1).ToArray();

            Assert.AreEqual(20, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from, chunks[0].To);
            Assert.AreEqual(from.Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[19].From);
            Assert.AreEqual(to, chunks[19].To);
            for (uint i = 0; i < chunks.Length; i++)
            {
                Assert.AreEqual(0, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }

            // size = 2
            chunks = PeriodRange <FiscalQuarterPeriod> .Slice(quarterRange, 2).ToArray();

            Assert.AreEqual(10, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from.Next(), chunks[0].To);
            Assert.AreEqual(from.Next().Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[9].To);
            for (uint i = 0; i < chunks.Length; i++)
            {
                Assert.AreEqual(1, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }

            // size = 3
            chunks = PeriodRange <FiscalQuarterPeriod> .Slice(quarterRange, 3).ToArray();

            Assert.AreEqual(7, chunks.Length);
            Assert.AreEqual(from, chunks[0].From);
            Assert.AreEqual(from.Next().Next(), chunks[0].To);
            Assert.AreEqual(from.Next().Next().Next(), chunks[1].From);
            Assert.AreEqual(to, chunks[6].To);
            for (uint i = 0; i < chunks.Length - 1; i++)
            {
                Assert.AreEqual(2, ComparablePeriodUtil.GetGap(chunks[i].From, chunks[i].To));
            }
            Assert.AreEqual(1, ComparablePeriodUtil.GetGap(chunks.Last().From, chunks.Last().To));
        }
        public static IEnumerable<TotalsByCountryByPeriod> TotalsByCountryByPeriodSortedByCountry(PeriodRange periodRange)
        {
            //var query =  from c in SampleData.LoadCustomersFromXML()
            //       group c by c.Country into g
            //       select 
            //       select new TotalsByCountryByPeriod { Country = g.Key, NumCustomers = g.Count(), TotalSales = g.SelectMany(c => c.Orders).Sum(o => o.Total) }

            return SampleData.LoadCustomersFromXML().GroupBy(c => c.Country).
                SelectMany(g => g.SelectMany(c => c.Orders, (c, o) => new {Customer = c, Order = o}).GroupBy(
                        co => ToPeriod(co.Order.OrderDate, periodRange))
                        ,(g, period) => new TotalsByCountryByPeriod {
                                  Country = g.Key,
                                  NumCustomers = period.Select(co => co.Customer).Distinct().Count(),
                                  PeriodRange = periodRange,
                                  Period = period.Key, 
                                  TotalSales = period.Sum(co => co.Order.Total)
                              }).OrderBy(cwc => cwc.Country).ThenBy(cwc => cwc.Period);
        }
コード例 #14
0
        private static Company ParseCompany(
            PropertyDictionary properties,
            PropertyDescriptionDictionary descriptions)
        {
            var fixedTierRangeJson = JObject.Parse(properties.Get(PropertyNames.FixedTierRange));
            var fixedTierRange     = FixedTierRangeParser.Parse(fixedTierRangeJson.Properties());

            var oldestFy = uint.Parse(properties.Get(PropertyNames.OldestFiscalYear));
            var oldestFq = uint.Parse(properties.Get(PropertyNames.OldestFiscalQuarter));

            var latestFy   = uint.Parse(properties.Get(PropertyNames.LatestFiscalYear));
            var latestFq   = uint.Parse(properties.Get(PropertyNames.LatestFiscalQuarter));
            var oldestDate = DayPeriod.Parse(properties.Get(PropertyNames.OldestDate));
            // use today as latest date
            var latestDate = DayPeriod.Create(DateTime.Today);

            var fixedTierQuarterRange = PeriodRange <FiscalQuarterPeriod> .Create(fixedTierRange.OldestQuarter, fixedTierRange.LatestQuarter);

            var fixedTierDayRange = PeriodRange <DayPeriod> .Create(fixedTierRange.OldestDate, fixedTierRange.LatestDate);

            var ondemandPeriodRange = PeriodRange <FiscalQuarterPeriod> .Create(
                FiscalQuarterPeriod.Create(oldestFy, oldestFq),
                FiscalQuarterPeriod.Create(latestFy, latestFq)
                );

            var ondemandTierDayRange = PeriodRange <DayPeriod> .Create(oldestDate, latestDate);

            return(Company.Create(
                       properties.Get(PropertyNames.Ticker),
                       fixedTierQuarterRange,
                       ondemandPeriodRange,
                       fixedTierDayRange,
                       ondemandTierDayRange,
                       properties,
                       descriptions
                       ));
        }
コード例 #15
0
 public SupportedTierRange(
     PeriodRange <T> fixedTierRange, PeriodRange <T> ondemandTierRange)
 {
     this.fixedTierRange    = fixedTierRange;
     this.ondemandTierRange = ondemandTierRange;
 }
コード例 #16
0
        public static IEnumerable<TotalsByCountryByPeriod> TotalsByCountryByPeriodSortedByCountry(PeriodRange periodRange)
        {
            var range = (int) periodRange;
            return SampleData.LoadCustomersFromXML()
                .SelectMany(s => s.Orders, (f, o) => new
                                                         {
                                                             f.Country,
                                                             f.CustomerID,
                                                             o.Total,
                                                             Range = o.OrderDate.Year.ToString()
                                                                     + f.Country
                                                                     + GetYearPart(o.OrderDate,periodRange),
                                                             periodRange,
                                                             o.OrderDate.Year,
                                                             YearPart = GetYearPart(o.OrderDate, periodRange)
                                                         })
                .GroupBy(z => z.Range)
                .Select(g => new TotalsByCountryByPeriod()
                                 {
                                     Country = g.Select(t => t.Country).First(),
                                     NumCustomers = g.Select(c => c.CustomerID).Distinct().Count(),
                                     PeriodRange = g.Select(p => p.periodRange).First(),
                                     TotalSales = g.Sum(x => x.Total),
                                     Year = g.Select(h=>h.Year).First(),
                                     YearPart = g.Select(h=>h.YearPart).First()
                                 })
                                 .OrderBy(k=>k.Country)
                                 .ThenBy(i=>i.Year)
                                 .ThenBy(z=>z.YearPart);

        }
コード例 #17
0
        public static int GetYearPart(DateTime date, PeriodRange range)
        {
            var i = 0;

            switch (range)
            {
                case PeriodRange.Year:
                    i = 0;
                    break;
                case PeriodRange.Semester:
                    i = date.Month/6;
                    break;
                case PeriodRange.Trimester:
                    i = date.Month/3;
                    break;
                case PeriodRange.Month:
                    i = date.Month;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("range");
            }

            return i;
        }
コード例 #18
0
        public static IEnumerable<TotalsByCountryByPeriod> TotalsByCountryByPeriodSortedByCountry(PeriodRange periodRange)
        {
            var list = SampleData.LoadCustomersFromXML();

            return list.SelectMany(c => c.Orders, (c, o) => new { Country = c.Country, CustName = c.Name, Order = o }).
                GroupBy(co => co.Country).SelectMany(gc => gc.
                GroupBy(o => ConvertDateToPeriod(o.Order.OrderDate, periodRange)).
                Select(g => new TotalsByCountryByPeriod
                {
                    NumCustomers = g.Select(co => co.CustName).Distinct().Count(),
                    TotalSales = g.Sum(o => o.Order.Total),
                    Country = gc.Key,
                    PeriodRange = g.Key
                }));
        }
 private CsvDownloadParameters(string ticker, PeriodRange <FiscalQuarterPeriod> range, CsvDownloadOutputSettings outputSettings)
 {
     Ticker         = ticker;
     Range          = range;
     OutputSettings = outputSettings;
 }
コード例 #20
0
 public static TickerPeriodRangeParameter Create(string ticker, IComparablePeriod from, IComparablePeriod to)
 {
     JpTickerValidator.Validate(ticker);
     return(new TickerPeriodRangeParameter(ticker, PeriodRange <IComparablePeriod> .Create(from, to)));
 }
コード例 #21
0
 public static TickerPeriodRangeParameter Create(string ticker, PeriodRange <IComparablePeriod> periodRange)
 {
     JpTickerValidator.Validate(ticker);
     return(new TickerPeriodRangeParameter(ticker, periodRange));
 }
コード例 #22
0
 private TickerPeriodRangeParameter(string ticker, PeriodRange <IComparablePeriod> periodRange)
 {
     this.ticker      = ticker;
     this.periodRange = periodRange;
 }
 private static string ToPeriod(DateTime d, PeriodRange p)
 {
     return  d.Year.ToString() + (d.Month-1) / (int)p; 
 }
コード例 #24
0
 public static IEnumerable<TotalsByCountryByPeriod> TotalsByCountryByPeriodSortedByCountry(PeriodRange periodRange)
 {
     // TODO
     throw new NotImplementedException();
 }
コード例 #25
0
        public IComparablePeriod FindEndOfOndemandPeriod(DataTypeConfig dataType, string ticker, PeriodRange <IComparablePeriod> periodRange, bool IsOndemandEndpointEnabled, bool isConfigureAwait, bool useCache)
        {
            var fromTier = FindAvailableTier(dataType, ticker, periodRange.From, IsOndemandEndpointEnabled, isConfigureAwait, useCache);
            var toTier   = FindAvailableTier(dataType, ticker, periodRange.To, IsOndemandEndpointEnabled, isConfigureAwait, useCache);

            if (fromTier.Equals(SupportedTier.FixedTier))
            {
                // use fixed tier endpoint for all
                return(null);
            }
            else if (toTier.Equals(SupportedTier.OndemandTier))
            {
                return(periodRange.To);
            }
            else
            {
                // find end of ondemand tier period
                var period = periodRange.From.Next();
                while (period.CompareTo(periodRange.To) < 0)
                {
                    var tier = FindAvailableTier(dataType, ticker, period.Next(), IsOndemandEndpointEnabled, isConfigureAwait, useCache);
                    if (tier.Equals(SupportedTier.FixedTier))
                    {
                        break;
                    }
                    else
                    {
                        period = period.Next();
                    }
                }
                return(period);
            }
        }
コード例 #26
0
        public IList <IApiResource> GetApiResources(DataTypeConfig dataType, string ticker, IComparablePeriod from, IComparablePeriod to, bool isConfigureAwait = true, bool useCache = true)
        {
            UpdateApiKeyIfNeeded();
            if (from.CompareTo(to) > 0)
            {
                throw new ArgumentException($"from={from} is more than to={to}");
            }
            var endOfOndemandPeriod = taskHelper.FindEndOfOndemandPeriod(dataType, ticker, PeriodRange <IComparablePeriod> .Create(from, to), config.IsOndemandEndpointEnabled, isConfigureAwait, useCache);

            // use fixed tier from all range
            if (endOfOndemandPeriod is null)
            {
                var parameter = TickerPeriodRangeParameter.Create(ticker, from, to);
                var json      = client.GetRange(dataType, parameter, false, isConfigureAwait, useCache);
                return(parser.ParseRange(dataType, json));
            }
            else
            {
                var ondemandParameter = TickerPeriodRangeParameter.Create(ticker, from, endOfOndemandPeriod);
                var fixedParameter    = TickerPeriodRangeParameter.Create(ticker, endOfOndemandPeriod.Next(), to);

                var ondemandTierJson = client.GetRange(dataType, ondemandParameter, true, isConfigureAwait, useCache);
                var fixedTierJson    = client.GetRange(dataType, fixedParameter, false, isConfigureAwait, useCache);

                var ondemandResources = parser.ParseRange(dataType, ondemandTierJson);
                var fixedTierResource = parser.ParseRange(dataType, fixedTierJson);

                return(ondemandResources.Concat(fixedTierResource).ToList());
            }
        }
コード例 #27
0
 public EventStatisticsViewModelBuilder(IMediator mediator) : base(mediator)
 {
     this.mediator = mediator;
     periodRange   = PeriodRange.AllTime;
 }
コード例 #28
0
        public IPageViewModelBuilder <EventStatisticsViewModel> WithPeriodRange(PeriodRange periodRange)
        {
            this.periodRange = periodRange;

            return(this);
        }