public static string CreateStratificationColumn(IHost host, ref IDataView data, string stratificationColumn = null) { host.CheckValue(data, nameof(data)); host.CheckValueOrNull(stratificationColumn); // Pick a unique name for the stratificationColumn. const string stratColName = "StratificationKey"; string stratCol = data.Schema.GetTempColumnName(stratColName); // Construct the stratification column. If user-provided stratification column exists, use HashJoin // of it to construct the strat column, otherwise generate a random number and use it. if (stratificationColumn == null) { data = new GenerateNumberTransform(host, new GenerateNumberTransform.Options { Columns = new[] { new GenerateNumberTransform.Column { Name = stratCol } } }, data); } else { var col = data.Schema.GetColumnOrNull(stratificationColumn); if (col == null) { throw host.ExceptSchemaMismatch(nameof(stratificationColumn), "Stratification", stratificationColumn); } var type = col.Value.Type; if (!RangeFilter.IsValidRangeFilterColumnType(host, type)) { // HashingEstimator currently handles all primitive types except for DateTime, DateTimeOffset and TimeSpan. var itemType = type.GetItemType(); if (itemType is DateTimeDataViewType || itemType is DateTimeOffsetDataViewType || itemType is TimeSpanDataViewType) { data = new TypeConvertingTransformer(host, stratificationColumn, DataKind.Int64, stratificationColumn).Transform(data); } var columnOptions = new HashingEstimator.ColumnOptions(stratCol, stratificationColumn, 30, combine: true); data = new HashingEstimator(host, columnOptions).Fit(data).Transform(data); } else { if (data.Schema[stratificationColumn].IsNormalized() || (type != NumberDataViewType.Single && type != NumberDataViewType.Double)) { return(stratificationColumn); } data = new NormalizingEstimator(host, new NormalizingEstimator.MinMaxColumnOptions(stratCol, stratificationColumn, ensureZeroUntouched: true)) .Fit(data).Transform(data); } } return(stratCol); }
private IEnumerable <EPiServer.Find.Api.Querying.Filter> GetFilters(Commerce.Models.Blocks.ProductSearchBlock productSearchBlock) { var filters = new List <EPiServer.Find.Api.Querying.Filter>(); if (productSearchBlock.Nodes?.FilteredItems != null && productSearchBlock.Nodes.FilteredItems.Any()) { var nodes = productSearchBlock.Nodes.FilteredItems.Select(x => x.GetContent()).OfType <NodeContent>().ToList(); var outlines = nodes.Select(x => _searchService.GetOutline(x.Code)).ToList(); var outlineFilters = outlines.Select(s => new PrefixFilter("Outline$$string.lowercase", s.ToLowerInvariant())) .ToList(); if (outlineFilters.Count == 1) { filters.Add(outlineFilters.First()); } else { filters.Add(new OrFilter(outlineFilters.ToArray())); } } if (productSearchBlock.MinPrice > 0 || productSearchBlock.MaxPrice > 0) { var rangeFilter = RangeFilter.Create("DefaultPrice$$number", productSearchBlock.MinPrice.ToString(), productSearchBlock.MaxPrice == 0 ? double.MaxValue.ToString() : productSearchBlock.MaxPrice.ToString()); rangeFilter.IncludeUpper = true; filters.Add(rangeFilter); } if (productSearchBlock.BrandFilter != null) { var brands = productSearchBlock.BrandFilter.Split(','); var brandFilters = brands.Select(s => new PrefixFilter("Brand$$string.lowercase", s.ToLowerInvariant())).ToList(); if (brandFilters.Count == 1) { filters.Add(brandFilters.First()); } else { filters.Add(new OrFilter(brandFilters.ToArray())); } } if (productSearchBlock.Filters == null) { return(filters); } foreach (var item in productSearchBlock.Filters.FilteredItems) { if (item.GetContent() is FilterBaseBlock filter) { filters.Add(filter.GetFilter()); } } return(filters); }
/// <summary> /// Based on ticks in a second. This is the closest I can find in setting the last moment of a day: /// https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.8#remarks /// </summary> /// <param name="dateRange">The dateRange element</param> /// <returns></returns> public static DateTime ToDateRangeDate(this RangeFilter <DateTime> dateRange) { if (dateRange.To.HasValue) { return(dateRange.To.Value.Date.AddDays(1).AddTicks(-1)); } return(DateTime.MaxValue); }
public IndexSearchRequestBuilder ParseFacets(ISearchPhraseParser phraseParser, string facetPhrase, IList <AggregationRequest> predefinedAggregations = null) { if (phraseParser == null) { throw new ArgumentNullException(nameof(phraseParser)); } SearchRequest.Aggregations = predefinedAggregations ?? new List <AggregationRequest>(); if (string.IsNullOrEmpty(facetPhrase)) { return(this); } //TODO: Support aliases for Facet expressions e.g price.usd[TO 200) as price_below_200 //TODO: Need to create a new Antlr file with g4-lexer rules and generate parser especially for facets expression that will return proper AggregationRequests objects var parseResult = phraseParser.Parse(facetPhrase); //Term facets if (!string.IsNullOrEmpty(parseResult.Keyword)) { var termFacetExpressions = parseResult.Keyword.Split(" "); parseResult.Filters.AddRange(termFacetExpressions.Select(x => new TermFilter { FieldName = x, Values = new List <string>() })); } SearchRequest.Aggregations = parseResult.Filters .Select <IFilter, AggregationRequest>(filter => { FilterSyntaxMapper.MapFilterAdditionalSyntax(filter); return(filter switch { RangeFilter rangeFilter => new RangeAggregationRequest { Id = filter.Stringify(), FieldName = rangeFilter.FieldName, Values = rangeFilter.Values.Select(x => new RangeAggregationRequestValue { Id = x.Stringify(), Lower = x.Lower, Upper = x.Upper, IncludeLower = x.IncludeLower, IncludeUpper = x.IncludeUpper }).ToList() }, TermFilter termFilter => new TermAggregationRequest { FieldName = termFilter.FieldName, Id = filter.Stringify(), Filter = termFilter }, _ => null, }); })
/// <summary> /// Gets the very start of the day. /// </summary> /// <param name="dateRange"></param> /// <returns></returns> public static DateTime FromDateRangeDate(this RangeFilter <DateTime> dateRange) { if (dateRange.From.HasValue) { return(dateRange.From.Value.Date); } return(DateTime.MinValue); }
public void Test() { var filter = new RangeFilter(new LogFileSection(42, 101)); filter.PassesFilter(CreateLine(0)).Should().BeTrue(); filter.PassesFilter(CreateLine(41)).Should().BeTrue(); filter.PassesFilter(CreateLine(42)).Should().BeFalse(); filter.PassesFilter(CreateLine(142)).Should().BeFalse(); filter.PassesFilter(CreateLine(143)).Should().BeTrue(); }
public void BetweenNumberRangeTest() { const long value1 = 123L; const long value2 = 456L; var filter = new RangeFilter(value1, Filter.OperatorGreaterOrEquals, value2, Filter.OperatorLessOrEquals); Assert.NotNull(filter); Assert.AreEqual("{\"$gte\":123,\"$lte\":456}", JsonConvert.SerializeObject(filter.ToTransferObject(), s_jsonSettings)); }
public FindFilter KeyBetween(NumberField field, long fromValue, long toValue, bool includeFrom = true, bool includeTo = true) { _numberFilters[field] = new RangeFilter(fromValue, includeFrom ? Filter.OperatorGreaterOrEquals : Filter.OperatorGreater, toValue, includeTo ? Filter.OperatorLessOrEquals : Filter.OperatorLess ); return(this); }
public DefenseFilter( RangeFilter ar = null, RangeFilter es = null, RangeFilter ev = null, RangeFilter b = null ) { Armor = ar; EnergyShield = es; Evasion = ev; Block = b; }
public void FromDateRangeDate_ShouldReturnMidnightDateTime_WhenNotNull() { var dateRange = new RangeFilter <DateTime> { From = new DateTime(2019, 01, 13, 14, 30, 32) }; var extFromDate = dateRange.FromDateRangeDate(); var timeOfDayTicks = extFromDate.TimeOfDay.Ticks; Assert.Equal(0, timeOfDayTicks); }
public void Validator_ShouldHaveErrorForDouble_WhenFromIsGreaterThanTo() { var validator = new RangeFilterValidator <double>(); var model = new RangeFilter <double> { From = 59.293840, To = 23.445 }; validator.ShouldHaveValidationErrorFor(x => x.To, model); }
public void Validator_ShouldHaveErrorForInt_WhenFromIsGreaterThanTo() { var validator = new RangeFilterValidator <int>(); var model = new RangeFilter <int> { From = 10, To = 5 }; validator.ShouldHaveValidationErrorFor(x => x.To, model); }
public void Validator_ShouldHaveErrorForDateTimes_WhenFromIsGreaterThanTo() { var validator = new RangeFilterValidator <DateTime>(); var model = new RangeFilter <DateTime> { From = DateTime.Now, To = DateTime.Now.AddDays(-2) }; validator.ShouldHaveValidationErrorFor(x => x.To, model); }
/// <summary> /// Ensures the provided <paramref name="samplingKeyColumn"/> is valid for <see cref="RangeFilter"/>, hashing it if necessary, or creates a new column <paramref name="samplingKeyColumn"/> is null. /// </summary> internal static void EnsureGroupPreservationColumn(IHostEnvironment env, ref IDataView data, ref string samplingKeyColumn, int?seed = null) { Contracts.CheckValue(env, nameof(env)); // We need to handle two cases: if samplingKeyColumn is provided, we use hashJoin to // build a single hash of it. If it is not, we generate a random number. if (samplingKeyColumn == null) { samplingKeyColumn = data.Schema.GetTempColumnName("SamplingKeyColumn"); data = new GenerateNumberTransform(env, data, samplingKeyColumn, (uint?)(seed ?? ((ISeededEnvironment)env).Seed)); } else { if (!data.Schema.TryGetColumnIndex(samplingKeyColumn, out int stratCol)) { throw env.ExceptSchemaMismatch(nameof(samplingKeyColumn), "SamplingKeyColumn", samplingKeyColumn); } var type = data.Schema[stratCol].Type; if (!RangeFilter.IsValidRangeFilterColumnType(env, type)) { // Hash the samplingKeyColumn. // REVIEW: this could currently crash, since Hash only accepts a limited set // of column types. It used to be HashJoin, but we should probably extend Hash // instead of having two hash transformations. var origStratCol = samplingKeyColumn; samplingKeyColumn = data.Schema.GetTempColumnName(samplingKeyColumn); HashingEstimator.ColumnOptionsInternal columnOptions; if (seed.HasValue) { columnOptions = new HashingEstimator.ColumnOptionsInternal(samplingKeyColumn, origStratCol, 30, (uint)seed.Value); } else if (((ISeededEnvironment)env).Seed.HasValue) { columnOptions = new HashingEstimator.ColumnOptionsInternal(samplingKeyColumn, origStratCol, 30, (uint)((ISeededEnvironment)env).Seed.Value); } else { columnOptions = new HashingEstimator.ColumnOptionsInternal(samplingKeyColumn, origStratCol, 30); } data = new HashingEstimator(env, columnOptions).Fit(data).Transform(data); } else { if (!data.Schema[samplingKeyColumn].IsNormalized() && (type == NumberDataViewType.Single || type == NumberDataViewType.Double)) { var origStratCol = samplingKeyColumn; samplingKeyColumn = data.Schema.GetTempColumnName(samplingKeyColumn); data = new NormalizingEstimator(env, new NormalizingEstimator.MinMaxColumnOptions(samplingKeyColumn, origStratCol, ensureZeroUntouched: true)).Fit(data).Transform(data); } } } }
private static QueryContainer CreateRangeFilter(RangeFilter rangeFilter) { QueryContainer result = null; var fieldName = ElasticSearchHelper.ToElasticFieldName(rangeFilter.FieldName); foreach (var value in rangeFilter.Values) { result |= CreateTermRangeQuery(fieldName, value); } return(result); }
public void ToDateRangeDate_ShouldReturnLeastTick_WhenToDateIsNotNull() { var dateRange = new RangeFilter <DateTime> { From = new DateTime(2019, 01, 13, 14, 30, 32) }; var extToDate = dateRange.ToDateRangeDate(); var timeOfDayTicks = extToDate.TimeOfDay.Ticks; const long totalMillSeconds = 24 * 60 * 60 * 1000; Assert.Equal(totalMillSeconds * 10000 - 1L, timeOfDayTicks); }
private JProperty GetSingleRangeQuery(RangeFilter elem) { var content = new JObject(); if (elem.Floor != "") { content.Add("gte", elem.Floor); } if (elem.Ceiling != "") { content.Add("lte", elem.Ceiling); } return(new JProperty(elem.Name, content)); }
public static CommonOutputs.TransformOutput FilterByRange(IHostEnvironment env, RangeFilter.Options input) { Contracts.CheckValue(env, nameof(env)); var host = env.Register(RangeFilter.LoaderSignature); host.CheckValue(input, nameof(input)); EntryPointUtils.CheckInputArgs(host, input); var xf = new RangeFilter(host, input, input.Data); return(new CommonOutputs.TransformOutput { Model = new TransformModelImpl(env, xf, input.Data), OutputData = xf }); }
public static JObject ParseRange(RangeFilter range) { JObject obj = new JObject(); if (range.Min.HasValue) { obj["min"] = range.Min; } if (range.Max.HasValue) { obj["max"] = range.Max; } return(obj); }
public static ISearchFilter Convert(this ISearchFilterService helper, ISearchFilter filter, string[] keys) { // get values that we have filters set for var values = from v in filter.GetValues() where keys.Contains(v.Id) select v; var attributeFilter = filter as AttributeFilter; if (attributeFilter != null) { var newFilter = new AttributeFilter(); newFilter.InjectFrom(filter); newFilter.Values = values.OfType <AttributeFilterValue>().ToArray(); return(newFilter); } var rangeFilter = filter as RangeFilter; if (rangeFilter != null) { var newFilter = new RangeFilter(); newFilter.InjectFrom(filter); newFilter.Values = values.OfType <RangeFilterValue>().ToArray(); return(newFilter); } var priceRangeFilter = filter as PriceRangeFilter; if (priceRangeFilter != null) { var newFilter = new PriceRangeFilter(); newFilter.InjectFrom(filter); newFilter.Values = values.OfType <RangeFilterValue>().ToArray(); return(newFilter); } var categoryFilter = filter as CategoryFilter; if (categoryFilter != null) { var newFilter = new CategoryFilter(); newFilter.InjectFrom(filter); newFilter.Values = values.OfType <CategoryFilterValue>().ToArray(); return(newFilter); } return(null); }
public IEnumerable <Batch> GetBatches(IRandom rand) { Host.Assert(Data != null, "Must call Initialize first!"); Host.AssertValue(rand); using (var ch = Host.Start("Getting batches")) { RoleMappedData dataTest; RoleMappedData dataTrain; // Split the data, if needed. if (!(ValidationDatasetProportion > 0)) { dataTest = dataTrain = Data; } else { // Split the data into train and test sets. string name = Data.Data.Schema.GetTempColumnName(); var args = new GenerateNumberTransform.Arguments(); args.Column = new[] { new GenerateNumberTransform.Column() { Name = name } }; args.Seed = (uint)rand.Next(); var view = new GenerateNumberTransform(Host, args, Data.Data); var viewTest = new RangeFilter(Host, new RangeFilter.Arguments() { Column = name, Max = ValidationDatasetProportion }, view); var viewTrain = new RangeFilter(Host, new RangeFilter.Arguments() { Column = name, Max = ValidationDatasetProportion, Complement = true }, view); dataTest = new RoleMappedData(viewTest, Data.Schema.GetColumnRoleNames()); dataTrain = new RoleMappedData(viewTrain, Data.Schema.GetColumnRoleNames()); } if (BatchSize > 0) { // REVIEW: How should we carve the data into batches? ch.Warning("Batch support is temporarily disabled"); } yield return(new Batch(dataTrain, dataTest)); ch.Done(); } }
public void WriteRangeFilter(string tag, XmlWriter writer, RangeFilter filter) { writer.WriteStartElement(tag); if (filter.Min.HasValue) { writer.WriteAttributeString("min", filter.Min.Value.ToString()); } if (filter.Max.HasValue) { writer.WriteAttributeString("max", filter.Max.Value.ToString()); } writer.WriteEndElement(); }
public void IntFromTo() { //arrange var filter = new RangeFilter { IntValue = new Range <int> { From = 10, To = 15 } }; //act var filtered = RangeData.Items.AutoFilter(filter); //assert Assert.Equal(1, filtered.Count()); }
public void DateTimeNestedTo() { //arrange var filter = new RangeFilter { DateTimeValue = new Range <DateTime> { To = new DateTime(2021, 01, 01) } }; //act var filtered = RangeData.Items.AutoFilter(filter); //assert Assert.Equal(2, filtered.Count()); }
public OffenseFilter( RangeFilter damage = null, RangeFilter aps = null, RangeFilter dps = null, RangeFilter p_dps = null, RangeFilter e_dps = null, RangeFilter critChance = null ) { Damage = damage; APS = aps; DPS = dps; P_DPS = p_dps; E_DPS = e_dps; CritChance = critChance; }
/// <summary> /// Ensures the provided <paramref name="samplingKeyColumn"/> is valid for <see cref="RangeFilter"/>, hashing it if necessary, or creates a new column <paramref name="samplingKeyColumn"/> is null. /// </summary> internal static void EnsureGroupPreservationColumn(IHostEnvironment env, ref IDataView data, ref string samplingKeyColumn, int?seed = null) { Contracts.CheckValue(env, nameof(env)); // We need to handle two cases: if samplingKeyColumn is provided, we use hashJoin to // build a single hash of it. If it is not, we generate a random number. if (samplingKeyColumn == null) { samplingKeyColumn = data.Schema.GetTempColumnName("SamplingKeyColumn"); data = new GenerateNumberTransform(env, data, samplingKeyColumn, (uint?)(seed ?? ((ISeededEnvironment)env).Seed)); } else { if (!data.Schema.TryGetColumnIndex(samplingKeyColumn, out int stratCol)) { throw env.ExceptSchemaMismatch(nameof(samplingKeyColumn), "SamplingKeyColumn", samplingKeyColumn); } var type = data.Schema[stratCol].Type; if (!RangeFilter.IsValidRangeFilterColumnType(env, type)) { var origStratCol = samplingKeyColumn; samplingKeyColumn = data.Schema.GetTempColumnName(samplingKeyColumn); // HashingEstimator currently handles all primitive types except for DateTime, DateTimeOffset and TimeSpan. var itemType = type.GetItemType(); if (itemType is DateTimeDataViewType || itemType is DateTimeOffsetDataViewType || itemType is TimeSpanDataViewType) { data = new TypeConvertingTransformer(env, origStratCol, DataKind.Int64, origStratCol).Transform(data); } var localSeed = seed.HasValue ? seed : ((ISeededEnvironment)env).Seed.HasValue ? ((ISeededEnvironment)env).Seed : null; var columnOptions = localSeed.HasValue ? new HashingEstimator.ColumnOptions(samplingKeyColumn, origStratCol, 30, (uint)localSeed.Value, combine: true) : new HashingEstimator.ColumnOptions(samplingKeyColumn, origStratCol, 30, combine: true); data = new HashingEstimator(env, columnOptions).Fit(data).Transform(data); } else { if (!data.Schema[samplingKeyColumn].IsNormalized() && (type == NumberDataViewType.Single || type == NumberDataViewType.Double)) { var origStratCol = samplingKeyColumn; samplingKeyColumn = data.Schema.GetTempColumnName(samplingKeyColumn); data = new NormalizingEstimator(env, new NormalizingEstimator.MinMaxColumnOptions(samplingKeyColumn, origStratCol, ensureZeroUntouched: true)).Fit(data).Transform(data); } } } }
/// <summary> /// Creates the price range filter. /// </summary> /// <param name="criteria">The criteria.</param> /// <param name="field">The field.</param> /// <param name="value">The value.</param> /// <returns></returns> public static BoolFilter <ESDocument> CreatePriceRangeFilter(ISearchCriteria criteria, string field, RangeFilterValue value) { var query = new BoolFilter <ESDocument>(); var lowerbound = value.Lower; var upperbound = value.Upper; var lowerboundincluded = true; var upperboundincluded = false; var currency = criteria.Currency.ToLower(); // format is "fieldname_store_currency_pricelist" string[] pls = null; if (criteria is CatalogIndexedSearchCriteria) { pls = ((CatalogIndexedSearchCriteria)criteria).Pricelists; } var parentPriceList = String.Empty; // Create filter of type // price_USD_pricelist1:[100 TO 200} (-price_USD_pricelist1:[* TO *} +(price_USD_pricelist2:[100 TO 200} (-price_USD_pricelist2:[* TO *} (+price_USD_pricelist3[100 TO 200})))) if (pls == null || !pls.Any()) { return(null); } var priceListId = pls[0].ToLower(); var filter = new RangeFilter <ESDocument>(); filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceListId)).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded); //query.Should(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter)))); query.Should(q => q.Range(r => filter)); if (pls.Count() > 1) { var temp = CreatePriceRangeFilter(pls, 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded); query.Should(q => q.Bool(b => temp)); } //Query query = new ConstantScoreQuery(filter); return(query); }
/// <summary> /// Searches for data sorted by date. /// </summary> /// <param name="session">The session.</param> /// <param name="queryString">The query string.</param> /// <returns>Search result wrapper.</returns> public SearchResult SearchByDate(IUnitOfWork session, string queryString) { SearchContext searchContext = session.UnitOfWorkContext as SearchContext; if (searchContext == null) { throw new Exception("SearchContext not part of IUnitOfWork!"); } var queryParser = searchContext.GetQueryParser(new[] { "Text", "Title", "User" }); var query = queryParser.Parse(queryString); Filter filter = RangeFilter.Less("Published", DateTools.DateToString(DateTime.Now.AddSeconds(1), DateTools.Resolution.SECOND)); var topDocs = searchContext.IndexSearcher.Search(query, filter, MaximalSearchDepth, new Sort("Date", true)); return(new SearchResult(topDocs, searchContext.IndexSearcher)); }
/// <summary> /// Ensures the provided <paramref name="samplingKeyColumn"/> is valid for <see cref="RangeFilter"/>, hashing it if necessary, or creates a new column <paramref name="samplingKeyColumn"/> is null. /// </summary> private void EnsureGroupPreservationColumn(ref IDataView data, ref string samplingKeyColumn, uint?seed = null) { // We need to handle two cases: if samplingKeyColumn is provided, we use hashJoin to // build a single hash of it. If it is not, we generate a random number. if (samplingKeyColumn == null) { samplingKeyColumn = data.Schema.GetTempColumnName("IdPreservationColumn"); data = new GenerateNumberTransform(Environment, data, samplingKeyColumn, seed); } else { if (!data.Schema.TryGetColumnIndex(samplingKeyColumn, out int stratCol)) { throw Environment.ExceptSchemaMismatch(nameof(samplingKeyColumn), "GroupPreservationColumn", samplingKeyColumn); } var type = data.Schema[stratCol].Type; if (!RangeFilter.IsValidRangeFilterColumnType(Environment, type)) { // Hash the samplingKeyColumn. // REVIEW: this could currently crash, since Hash only accepts a limited set // of column types. It used to be HashJoin, but we should probably extend Hash // instead of having two hash transformations. var origStratCol = samplingKeyColumn; int tmp; int inc = 0; // Generate a new column with the hashed samplingKeyColumn. while (data.Schema.TryGetColumnIndex(samplingKeyColumn, out tmp)) { samplingKeyColumn = string.Format("{0}_{1:000}", origStratCol, ++inc); } HashingEstimator.ColumnInfo columnInfo; if (seed.HasValue) { columnInfo = new HashingEstimator.ColumnInfo(samplingKeyColumn, origStratCol, 30, seed.Value); } else { columnInfo = new HashingEstimator.ColumnInfo(samplingKeyColumn, origStratCol, 30); } data = new HashingEstimator(Environment, columnInfo).Fit(data).Transform(data); } } }
private static Filter CreateRangeFilter(RangeFilter rangeFilter) { Filter result = null; if (rangeFilter?.FieldName != null && rangeFilter.Values != null) { var fieldName = LuceneSearchHelper.ToLuceneFieldName(rangeFilter.FieldName); var childFilters = rangeFilter.Values.Select(v => CreateRangeFilterForValue(fieldName, v)) .Where(f => f != null) .ToArray(); result = JoinNonEmptyFilters(childFilters, Occur.SHOULD); } return(result); }
private string ChangeTimeInformationFromSpecificToInterval(DateTime? start, DateTime? end, RangeFilter rangeFilter) { string timeInformation = string.Empty; if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificYear)) { timeInformation = start.Value.ToString("yyyy", CultureInfo.InvariantCulture); } else if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificMonth)) { timeInformation = start.Value.ToString("MMM yy", CultureInfo.InvariantCulture); } else if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificDay)) { timeInformation = start.Value.ToString("dd MMM yy", CultureInfo.InvariantCulture); } return timeInformation; }
private DateTimeValue ChangeFromSpecificToInterval(/*GetPieDataRequest request,*/ DateTime? start, DateTime? end, RangeFilter rangeFilter) { if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificYear)) { rangeFilter = RangeFilter.Interval; start = new DateTime(start.Value.Year, 1, 1); end = new DateTime(end.Value.Year, 12, 31); } else if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificMonth)) { rangeFilter = RangeFilter.Interval; start = new DateTime(start.Value.Year, start.Value.Month, 1); end = new DateTime(end.Value.Year, end.Value.Month, DateTime.DaysInMonth(end.Value.Year, end.Value.Month)); } else if (start.HasValue && end.HasValue && rangeFilter.Equals(RangeFilter.SpecificDay)) { rangeFilter = RangeFilter.Interval; start = new DateTime(start.Value.Year, start.Value.Month, start.Value.Day); end = new DateTime(start.Value.Year, start.Value.Month, start.Value.Day); } return new DateTimeValue {Start = start, End = end, RangeFilter = rangeFilter}; }
public GetKpiTargetItemResponse GetKpiTarget(int kpiId, DateTime date, RangeFilter rangeFilter) { var response = new GetKpiTargetItemResponse(); try { switch (rangeFilter) { case RangeFilter.CurrentDay: case RangeFilter.CurrentMonth: case RangeFilter.CurrentYear: case RangeFilter.MTD: case RangeFilter.YTD: case RangeFilter.AllExistingYears: { var kpi = DataContext.Kpis .Include(x => x.Measurement) .Single(x => x.Id == kpiId); return GetKpiTarget(kpi.Id, date, rangeFilter, kpi.YtdFormula); } } } catch (Exception exception) { response.Message = exception.Message; } return response; }
public GetKpiTargetItemResponse GetKpiTarget(int kpiId, DateTime date, RangeFilter rangeFilter, YtdFormula ytdFormula) { var response = new GetKpiTargetItemResponse(); try { switch (rangeFilter) { case RangeFilter.CurrentDay: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi).FirstOrDefault(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Daily && x.Periode == date); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = (data != null) ? data.Value : null, Kpi = kpiResponse, IsSuccess = true }; } case RangeFilter.CurrentMonth: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi).FirstOrDefault(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Monthly && x.Periode.Month == date.Month && x.Periode.Year == date.Year); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = (data != null) ? data.Value : null, Kpi = kpiResponse, IsSuccess = true }; } case RangeFilter.CurrentYear: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi).FirstOrDefault(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Yearly && x.Periode.Year == date.Year); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = (data != null) ? data.Value : null, Kpi = kpiResponse, IsSuccess = true }; } case RangeFilter.MTD: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi) .Where(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Daily && (x.Periode.Day >= 1 && x.Periode.Day <= date.Day && x.Periode.Month == date.Month && x.Periode.Year == date.Year)).AsQueryable(); double? kpiAchievement = ytdFormula == YtdFormula.Average ? data.Average(x => x.Value) : data.Sum(x => x.Value); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = kpiAchievement, Kpi = kpiResponse, IsSuccess = true }; } case RangeFilter.YTD: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi) .Where(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Monthly && x.Value.HasValue && (x.Periode.Month >= 1 && x.Periode.Month <= date.Month && x.Periode.Year == date.Year)).AsQueryable(); double? kpiAchievement = ytdFormula == YtdFormula.Average ? data.Average(x => x.Value) : data.Sum(x => x.Value); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = kpiAchievement, Kpi = kpiResponse, IsSuccess = true }; } case RangeFilter.AllExistingYears: { var kpi = DataContext.Kpis.Include(x => x.Measurement).Single(x => x.Id == kpiId); var data = DataContext.KpiTargets.Include(x => x.Kpi) .Where(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue && (x.Periode.Year >= 2011 && x.Periode.Year <= date.Year)).AsQueryable(); double? kpiAchievement = ytdFormula == YtdFormula.Average ? data.Average(x => x.Value) : data.Sum(x => x.Value); var kpiResponse = new GetKpiTargetItemResponse.KpiResponse { Id = kpi.Id, Measurement = kpi.Measurement.Name, Name = kpi.Name, Remark = kpi.Remark, }; return new GetKpiTargetItemResponse { Value = kpiAchievement, Kpi = kpiResponse, IsSuccess = true }; } } } catch (Exception exception) { response.Message = exception.Message; } return response; }
private IList<GetCartesianChartDataResponse.SeriesResponse> _getKpiActualSeries(IList<GetCartesianChartDataRequest.SeriesRequest> configSeries, PeriodeType periodeType, IList<DateTime> dateTimePeriodes, string seriesType, RangeFilter rangeFilter, string graphicType,out string newTimeInformation, out IList<DateTime> newDatetimePeriodes, bool comparison = false) { var seriesResponse = new List<GetCartesianChartDataResponse.SeriesResponse>(); var start = dateTimePeriodes[0]; var end = dateTimePeriodes[dateTimePeriodes.Count - 1]; newTimeInformation = null; newDatetimePeriodes = new List<DateTime>(); foreach (var series in configSeries) { if (series.Stacks.Count == 0) { var kpiActuals = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiActual = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == series.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiActual != null) { kpiActuals = new List<KpiAchievement> { kpiActual }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiActual.Periode.ToString("MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiActual.Periode.ToString("yyyy", CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiActual.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped" && graphicType == "baraccumulative") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Stack = series.Label, Color = series.Color }; if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Stack = series.Label }; for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); seriesResponse.Add(aSeries); } else if (seriesType == "multi-stacks" && graphicType == "baraccumulative") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, }; if (comparison) { previousSeries.Stack = "KpiActual"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); seriesResponse.Add(aSeries); } else if ((seriesType == "multi-stacks" || seriesType == "multi-stacks-grouped") && graphicType == "barachievement") { var kpiTargets = DataContext.KpiTargets.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { if (kpiActuals.Count > 0) { var periode = kpiActuals.First().Periode; kpiTargets = DataContext.KpiTargets.Where(x => x.PeriodeType == periodeType && x.Periode == periode && x.Kpi.Id == series.KpiId) .OrderBy(x => x.Periode).ToList(); } } var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = string.IsNullOrEmpty(series.Color) ? "blue" : series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } var remainSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Remain", Color = "red" }; if (comparison) { remainSeries.Stack = "KpiActual"; } var exceedSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Exceed", Color = "green" }; if (seriesType == "multi-stacks-grouped") { aSeries.Stack = series.Label; remainSeries.Stack = series.Label; exceedSeries.Stack = series.Label; } if (comparison) { exceedSeries.Stack = "KpiActual"; } foreach (var periode in dateTimePeriodes) { if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { var actual = kpiActuals.Where(x => x.Periode <= periode) .GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); var target = kpiTargets.Where(x => x.Periode <= periode) .GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (!actual.HasValue) { if (!target.HasValue) { exceedSeries.Data.Add(0); remainSeries.Data.Add(0); aSeries.Data.Add(0); } else { aSeries.Data.Add(0); remainSeries.Data.Add(target.Value); exceedSeries.Data.Add(0); } } else { if (!target.HasValue) { aSeries.Data.Add(target.Value); remainSeries.Data.Add(0); exceedSeries.Data.Add(actual.Value); } else { var remain = target.Value - actual.Value; if (remain > 0) { aSeries.Data.Add(actual.Value); remainSeries.Data.Add(remain); exceedSeries.Data.Add(0); } else { aSeries.Data.Add(target.Value); exceedSeries.Data.Add(-remain); remainSeries.Data.Add(0); } } } } else { var actual = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); var target = kpiTargets.Where(x => x.Periode == periode).FirstOrDefault(); if (actual == null || !actual.Value.HasValue) { if (target == null || !target.Value.HasValue) { exceedSeries.Data.Add(0); remainSeries.Data.Add(0); aSeries.Data.Add(0); } else { aSeries.Data.Add(0); remainSeries.Data.Add(target.Value.Value); exceedSeries.Data.Add(0); } } else { if (target == null || !target.Value.HasValue) { aSeries.Data.Add(target.Value.Value); remainSeries.Data.Add(0); exceedSeries.Data.Add(actual.Value.Value); } else { var remain = target.Value.Value - actual.Value.Value; if (remain > 0) { aSeries.Data.Add(actual.Value.Value); remainSeries.Data.Add(remain); exceedSeries.Data.Add(0); } else { aSeries.Data.Add(target.Value.Value); exceedSeries.Data.Add(-remain); remainSeries.Data.Add(0); } } } } } seriesResponse.Add(remainSeries); seriesResponse.Add(exceedSeries); seriesResponse.Add(aSeries); } else { //var kpiTargets = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && // x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId) // .OrderBy(x => x.Periode).ToList(); var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, }; if (comparison) { previousSeries.Stack = "KpiActual"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); } } else { foreach (var stack in series.Stacks) { var kpiActuals = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == stack.KpiId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiActual = DataContext.KpiAchievements.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == stack.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiActual != null) { kpiActuals = new List<KpiAchievement> { kpiActual }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiActual.Periode.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiActual.Periode.ToString("MMM/yyyy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiActual.Periode.ToString("yyyy", CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiActual.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Stack = series.Label, Color = stack.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } seriesResponse.Add(aSeries); } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Color = stack.Color }; if (comparison) { aSeries.Stack = "KpiActual"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiActuals.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiActuals.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } seriesResponse.Add(aSeries); } } } } return seriesResponse; }
//, out string timeInformation private string[] _getPeriodes(PeriodeType periodeType, RangeFilter rangeFilter, DateTime? Start, DateTime? End, out IList<DateTime> dateTimePeriodes, out string timeInformation) { //var ci = new CultureInfo("en-GB"); var periodes = new List<string>(); dateTimePeriodes = new List<DateTime>(); switch (periodeType) { case PeriodeType.Hourly: var hourlyFormat = "hh tt"; switch (rangeFilter) { case RangeFilter.CurrentHour: { var currentHour = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0); dateTimePeriodes.Add(currentHour); periodes.Add(currentHour.ToString(hourlyFormat)); timeInformation = currentHour.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); } break; case RangeFilter.CurrentDay: { var startHour = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); periodes.Add(startHour.ToString(hourlyFormat)); dateTimePeriodes.Add(startHour); for (double i = 1; i < 24; i++) { startHour = startHour.AddHours(1); periodes.Add(startHour.ToString(hourlyFormat)); dateTimePeriodes.Add(startHour); } timeInformation = startHour.AddHours(-1).ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); } break; case RangeFilter.DTD: { //var currentDay = DateTime.Now.Day; var startHour = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); var currentHour = DateTime.Now.Hour; timeInformation = startHour.ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); while (startHour.Hour <= currentHour) { periodes.Add(startHour.ToString(hourlyFormat)); dateTimePeriodes.Add(startHour); startHour = startHour.AddHours(1); } timeInformation += " - " + startHour.AddHours(-1).ToString("dd/MMM/yyyy hh tt", CultureInfo.InvariantCulture); } break; default: timeInformation = Start.Value.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture) + " - " + End.Value.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); while (Start.Value <= End.Value) { periodes.Add(Start.Value.ToString(hourlyFormat)); dateTimePeriodes.Add(Start.Value); Start = Start.Value.AddHours(1); } break; } break; case PeriodeType.Daily: var dailyFormat = "dd"; switch (rangeFilter) { case RangeFilter.CurrentDay: { var currentDay = DateTime.Now.Date; periodes.Add(currentDay.ToString(dailyFormat)); dateTimePeriodes.Add(currentDay); timeInformation = currentDay.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); } break; case RangeFilter.CurrentMonth: { var currentMonth = DateTime.Now.Month; var startDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); while (currentMonth == startDay.Month) { periodes.Add(startDay.ToString(dailyFormat)); dateTimePeriodes.Add(startDay); startDay = startDay.AddDays(1); } timeInformation = startDay.AddDays(-1).ToString("MMM/yyyy", CultureInfo.InvariantCulture); } break; case RangeFilter.MTD: { var currentMonth = DateTime.Now.Month; var startDay = new DateTime(DateTime.Now.Year, currentMonth, 1); var currentDay = DateTime.Now.Day; timeInformation = startDay.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); while (startDay.Day <= currentDay) { periodes.Add(startDay.ToString(dailyFormat)); dateTimePeriodes.Add(startDay); startDay = startDay.AddDays(1); } timeInformation += " - " + startDay.AddDays(-1).ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); } break; default: timeInformation = Start.Value.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture) + " - " + End.Value.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture); while (Start.Value <= End.Value) { periodes.Add(Start.Value.ToString(dailyFormat)); dateTimePeriodes.Add(Start.Value); Start = Start.Value.AddDays(1); } break; } break; case PeriodeType.Monthly: var monthlyFormat = "MMM"; switch (rangeFilter) { case RangeFilter.CurrentMonth: { var currentMonth = DateTime.Now.Date; dateTimePeriodes.Add(currentMonth); periodes.Add(currentMonth.ToString(monthlyFormat, CultureInfo.InvariantCulture)); timeInformation = currentMonth.ToString("MMM/yyyy", CultureInfo.InvariantCulture); } break; case RangeFilter.CurrentYear: { var currentYear = DateTime.Now.Year; var startMonth = new DateTime(DateTime.Now.Year, 1, 1); timeInformation = currentYear.ToString(); while (currentYear == startMonth.Year) { periodes.Add(startMonth.ToString(monthlyFormat)); dateTimePeriodes.Add(startMonth); startMonth = startMonth.AddMonths(1); } } break; case RangeFilter.YTD: { var currentYear = DateTime.Now.Year; var startMonth = new DateTime(DateTime.Now.Year, 1, 1); var currentMont = DateTime.Now.Month; timeInformation = startMonth.ToString("MMM/yyyy", CultureInfo.InvariantCulture); while (startMonth.Month <= currentMont) { periodes.Add(startMonth.ToString(monthlyFormat)); dateTimePeriodes.Add(startMonth); startMonth = startMonth.AddMonths(1); } timeInformation += " - " + startMonth.AddMonths(-1).ToString("MMM/yyyy", CultureInfo.InvariantCulture); } break; default: timeInformation = Start.Value.ToString("MMM/yyyy", CultureInfo.InvariantCulture) + " - " + End.Value.ToString("MMM/yyyy", CultureInfo.InvariantCulture); while (Start.Value <= End.Value) { dateTimePeriodes.Add(Start.Value); periodes.Add(Start.Value.ToString(monthlyFormat)); Start = Start.Value.AddMonths(1); } break; } break; default: var yearlyFormat = "yyyy"; switch (rangeFilter) { case RangeFilter.CurrentYear: periodes.Add(DateTime.Now.Year.ToString()); dateTimePeriodes.Add(new DateTime(DateTime.Now.Year, 1, 1)); timeInformation = DateTime.Now.Year.ToString(); break; default: timeInformation = Start.Value.ToString("yyyy", CultureInfo.InvariantCulture) + " - " + End.Value.ToString("yyyy", CultureInfo.InvariantCulture); while (Start.Value <= End.Value) { periodes.Add(Start.Value.ToString(yearlyFormat)); dateTimePeriodes.Add(Start.Value); Start = Start.Value.AddYears(1); } break; } break; } return periodes.ToArray(); }
private IList<GetCartesianChartDataResponse.SeriesResponse> _getKpiEconomicSeries(IList<GetCartesianChartDataRequest.SeriesRequest> configSeries, PeriodeType periodeType, IList<DateTime> dateTimePeriodes, string seriesType, RangeFilter rangeFilter, string graphicType, out string newTimeInformation, out IList<DateTime> newDatetimePeriodes, bool comparison = false, bool asNetbackChart = false) { var seriesResponse = new List<GetCartesianChartDataResponse.SeriesResponse>(); var start = rangeFilter == RangeFilter.AllExistingYears ? DateTime.Now : dateTimePeriodes[0]; var end = rangeFilter == RangeFilter.AllExistingYears ? DateTime.Now : dateTimePeriodes[dateTimePeriodes.Count - 1]; var scenarioId = 0; var scenario = DataContext.Scenarios.FirstOrDefault(x => x.IsDashboard == true); if (scenario != null) { scenarioId = scenario.Id; } newTimeInformation = null; newDatetimePeriodes = new List<DateTime>(); foreach (var series in configSeries) { if (series.Stacks.Count == 0) { IList<KeyOperationData> kpiEconomics = new List<KeyOperationData>(); if (rangeFilter == RangeFilter.AllExistingYears) { kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Kpi.Id == series.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); } else { kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == series.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); } if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiEconomic = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == series.KpiId && (x.Value != null && x.Value.Value != 0) && x.Scenario.Id == scenarioId) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiEconomic != null) { kpiEconomics = new List<KeyOperationData> { kpiEconomic }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiEconomic.Periode.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiEconomic.Periode.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiEconomic.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Stack = series.Label, Color = series.Color, Order = series.Order }; if (asNetbackChart) { var sumValue = kpiEconomics.Sum(x => x.Value); aSeries.BorderColor = "transparent"; aSeries.Data.Add(sumValue); if (newTimeInformation == null && newDatetimePeriodes.Count == 0) { if (rangeFilter == RangeFilter.AllExistingYears) { newTimeInformation = "2011 - 2030"; newDatetimePeriodes = new List<DateTime> { new DateTime(2011, 1, 1, 0, 0, 0), new DateTime(2030, 1, 1, 0, 0, 0) }; } else { switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = start.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture) + " - " + end.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = start.ToString("dd MMM yy", CultureInfo.InvariantCulture) + " - " + end.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = start.ToString("MMM yy", CultureInfo.InvariantCulture) + " - " + end.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = start.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture) + " - " + end.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { start, end }; newDatetimePeriodes = dateTimePeriodes; } } } else if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Stack = series.Label, Order = series.Order }; for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); if (asNetbackChart && seriesResponse.Count > 1) { var invicibleSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "invisible_" + series.Label, Stack = series.Label, Color = "transparent", BorderColor = "transparent", ShowInLegend = false }; invicibleSeries.Data.Add(seriesResponse[seriesResponse.Count - 2].Data[0] - seriesResponse[seriesResponse.Count - 1].Data[0]); seriesResponse.Add(invicibleSeries); } } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = series.Label, Color = series.Color, Order = series.Order }; if (comparison) { aSeries.Stack = "KpiTarget"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var targetValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (targetValue == null || !targetValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(targetValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var target = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (target == null || !target.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(target.Value.Value); } } } if (graphicType == "baraccumulative") { var previousSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = "Previous Accumulation", Color = string.IsNullOrEmpty(series.PreviousColor) ? "#004071" : series.PreviousColor, Order = series.Order }; if (comparison) { previousSeries.Stack = "KpiTarget"; } for (var i = 0; i < aSeries.Data.Count; i++) { double data = 0; for (var j = 0; j < i; j++) { data += aSeries.Data[j].HasValue ? aSeries.Data[j].Value : 0; } previousSeries.Data.Add(data); } seriesResponse.Add(previousSeries); } seriesResponse.Add(aSeries); } } else { foreach (var stack in series.Stacks) { var kpiEconomics = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode >= start && x.Periode <= end && x.Kpi.Id == stack.KpiId && x.Scenario.Id == scenarioId) .OrderBy(x => x.Periode).ToList(); if ((periodeType == PeriodeType.Hourly && rangeFilter == RangeFilter.CurrentHour) || (periodeType == PeriodeType.Daily && rangeFilter == RangeFilter.CurrentDay) || (periodeType == PeriodeType.Monthly && rangeFilter == RangeFilter.CurrentMonth) || (periodeType == PeriodeType.Yearly && rangeFilter == RangeFilter.CurrentYear)) { var kpiEconomic = DataContext.KeyOperationDatas.Where(x => x.PeriodeType == periodeType && x.Periode <= end && x.Kpi.Id == stack.KpiId && (x.Value != null && x.Value.Value != 0)) .OrderByDescending(x => x.Periode).FirstOrDefault(); if (kpiEconomic != null) { kpiEconomics = new List<KeyOperationData> { kpiEconomic }; switch (periodeType) { case PeriodeType.Hourly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Hourly, CultureInfo.InvariantCulture); break; case PeriodeType.Daily: newTimeInformation = kpiEconomic.Periode.ToString("dd MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Monthly: newTimeInformation = kpiEconomic.Periode.ToString("MMM yy", CultureInfo.InvariantCulture); break; case PeriodeType.Yearly: newTimeInformation = kpiEconomic.Periode.ToString(DateFormat.Yearly, CultureInfo.InvariantCulture); break; } dateTimePeriodes = new List<DateTime> { kpiEconomic.Periode }; newDatetimePeriodes = dateTimePeriodes; } } if (seriesType == "multi-stacks-grouped") { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Stack = series.Label, Color = stack.Color, Order = series.Order }; if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var economic = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (economic == null || !economic.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economic.Value.Value); } } } seriesResponse.Add(aSeries); } else { var aSeries = new GetCartesianChartDataResponse.SeriesResponse { Name = stack.Label, Color = stack.Color, Order = series.Order }; if (comparison) { aSeries.Stack = "KpiTarget"; } if (rangeFilter == RangeFilter.YTD || rangeFilter == RangeFilter.DTD || rangeFilter == RangeFilter.MTD) { foreach (var periode in dateTimePeriodes) { var economicValue = kpiEconomics.Where(x => x.Periode <= periode).GroupBy(x => x.Kpi) .Select(x => x.Sum(y => y.Value)).FirstOrDefault(); if (economicValue == null || !economicValue.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economicValue.Value); } } } else { foreach (var periode in dateTimePeriodes) { var economic = kpiEconomics.Where(x => x.Periode == periode).FirstOrDefault(); if (economic == null || !economic.Value.HasValue) { aSeries.Data.Add(null); } else { aSeries.Data.Add(economic.Value.Value); } } } seriesResponse.Add(aSeries); } } } } return seriesResponse; }
/// <summary> /// Expands this range out to the next parent shared by the start and end points /// if there there are no non-empty text elements between them. /// </summary> /// <returns></returns> public bool MoveOutwardIfNo(RangeFilter rangeFilter) { MarkupRange newRange = MarkupServices.CreateMarkupRange(); IHTMLElement sharedParent = GetSharedParent(Start, End); // If share a common parent, we will take the shared parent's parent so we can see if we want to grab // all the html inside of it, unless the shared parent is the body element, in which case we don't want to // epxand outward anymore if (Start.CurrentScope == sharedParent && End.CurrentScope == sharedParent && !(sharedParent is IHTMLBodyElement)) { sharedParent = sharedParent.parentElement; } //expand to the inside of the shared parent first. If this matches the current placement //of the pointers, then expand to the outside of the parent. This allows the outter selection //to grow incrementally in such a way as to allow the shared parent to be tested between //each iteration of this operation. newRange.Start.MoveAdjacentToElement(sharedParent, _ELEMENT_ADJACENCY.ELEM_ADJ_AfterBegin); newRange.End.MoveAdjacentToElement(sharedParent, _ELEMENT_ADJACENCY.ELEM_ADJ_BeforeEnd); if (newRange.IsEmpty() || newRange.Start.IsRightOf(Start) || newRange.End.IsLeftOf(End)) { newRange.Start.MoveAdjacentToElement(sharedParent, _ELEMENT_ADJACENCY.ELEM_ADJ_BeforeBegin); newRange.End.MoveAdjacentToElement(sharedParent, _ELEMENT_ADJACENCY.ELEM_ADJ_AfterEnd); } if (!rangeFilter(newRange.Start, Start) && !rangeFilter(End, newRange.End) && !(Start.IsEqualTo(newRange.Start) && End.IsEqualTo(newRange.End))) { Start.MoveToPointer(newRange.Start); End.MoveToPointer(newRange.End); return true; } else { //span the start and end pointers as siblings by finding the parents of start and end //pointers that are direct children of the sharedParent IHTMLElement child = GetOuterMostChildOfParent(Start, true, sharedParent); if (child != null) newRange.Start.MoveAdjacentToElement(child, _ELEMENT_ADJACENCY.ELEM_ADJ_BeforeBegin); else newRange.Start = Start; child = GetOuterMostChildOfParent(End, false, sharedParent); if (child != null) newRange.End.MoveAdjacentToElement(child, _ELEMENT_ADJACENCY.ELEM_ADJ_AfterEnd); else newRange.End = End; if (!rangeFilter(newRange.Start, Start) && !rangeFilter(End, newRange.End) && !(Start.IsEqualTo(newRange.Start) && End.IsEqualTo(newRange.End))) { Start.MoveToPointer(newRange.Start); End.MoveToPointer(newRange.End); return true; } else { //the range didn't change, so return false. return false; } } }