コード例 #1
0
        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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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,
                });
            })
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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));
        }
コード例 #8
0
ファイル: FindFilter.cs プロジェクト: incountry/sdk-csharp
 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);
 }
コード例 #9
0
 public DefenseFilter(
     RangeFilter ar = null,
     RangeFilter es = null,
     RangeFilter ev = null,
     RangeFilter b  = null
     )
 {
     Armor        = ar;
     EnergyShield = es;
     Evasion      = ev;
     Block        = b;
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        /// <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);
                    }
                }
            }
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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));
        }
コード例 #18
0
        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
            });
        }
コード例 #19
0
        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);
        }
コード例 #21
0
        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();
            }
        }
コード例 #22
0
        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();
        }
コード例 #23
0
        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());
        }
コード例 #24
0
        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());
        }
コード例 #25
0
 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;
 }
コード例 #26
0
        /// <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);
                    }
                }
            }
        }
コード例 #27
0
        /// <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);
        }
コード例 #28
0
        /// <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));
        }
コード例 #29
0
        /// <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);
                }
            }
        }
コード例 #30
0
        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);
        }
コード例 #31
0
ファイル: ArtifactService.cs プロジェクト: cobianwae/Pear
        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;
        }
コード例 #32
0
ファイル: ArtifactService.cs プロジェクト: cobianwae/Pear
        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};
        }
コード例 #33
0
ファイル: KpiTargetService.cs プロジェクト: fazar/Pear
        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;
        }
コード例 #34
0
ファイル: KpiTargetService.cs プロジェクト: fazar/Pear
        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;
        }
コード例 #35
0
ファイル: ArtifactService.cs プロジェクト: irhamkarim/Pear
        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;
        }
コード例 #36
0
ファイル: ArtifactService.cs プロジェクト: irhamkarim/Pear
        //, 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();
        }
コード例 #37
0
ファイル: ArtifactService.cs プロジェクト: cobianwae/Pear
        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;
        }
コード例 #38
0
        /// <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;
                }
            }
        }