public DrilldownGraphDto GetDrilldownGraph(DimensionTree allDimensionsTree, TreeDimensionDto xDimension,
                                                   Measure measure, List <FlatDimensionDto> filters, bool requireDrilldownChart)
        {
            var graph = new DrilldownGraphDto
            {
                DimensionName = xDimension.Name,
                Name          = $"Drilldown graph of {measure.Name} by {xDimension.Name}",
                Roots         = new List <GraphXAxisRootDto>()
            };
            var xDimIsRoot = allDimensionsTree.IsRoot(xDimension.Id);

            // if x-dimension is root dimension, there is no point for showing drilldown graph
            if (xDimIsRoot && !requireDrilldownChart)
            {
                return(null);
            }
            // otherwise values of x dimension will be root and its parents values will be leaves
            else if (!xDimIsRoot)
            {
                var filteredXValues = GetFilteredValues(allDimensionsTree, xDimension, filters);
                foreach (var xValue in filteredXValues)
                {
                    graph.Roots.Add(GetParentRoot(allDimensionsTree, xDimension, measure, xValue, filters));
                }
            }
            else
            {
                var filteredXValues = GetFilteredValues(allDimensionsTree, xDimension, filters).ToList();
                foreach (var xValue in filteredXValues)
                {
                    graph.Roots.Add(GetRoot(allDimensionsTree, xDimension, measure, filteredXValues, filters, xValue));
                }
            }
            return(graph);
        }
        public GroupedGraphDto GetGroupedGraph(DimensionTree allDimensionsTree, TreeDimensionDto xDimension,
                                               DimensionDto legendDimension, Measure measure, List <FlatDimensionDto> filterDimensions, bool group)
        {
            var graph = new GroupedGraphDto
            {
                Name  = $"Grouped graph of {measure.Name} by {xDimension.Name} and {legendDimension.Name}",
                Roots = new List <GraphXAxisRootDto>()
            };
            var xDimIsRoot      = allDimensionsTree.IsRoot(xDimension.Id);
            var filteredXValues = GetFilteredValues(allDimensionsTree, xDimension, filterDimensions);

            // if x-dimension is root dimension, its values will be leaves
            // x-dim values will be also leaves if graph should not be grouped
            if (xDimIsRoot || !group)
            {
                graph.Roots.Add(GetRoot(allDimensionsTree, xDimension, measure, filteredXValues, filterDimensions, null, legendDimension));
            }
            // otherwise its values will be root and its parents values will be leaves
            else
            {
                foreach (var xValue in filteredXValues)
                {
                    graph.Roots.Add(GetParentRoot(allDimensionsTree, xDimension, measure, xValue, filterDimensions, legendDimension));
                }
            }
            return(graph);
        }
        public Tuple <int, int> GetXAndLegendDimensionsId(AssociationRule rule, DimensionTree tree)
        {
            int xDimId, legendDimId;

            switch (rule.AntecedentValues.Count)
            {
            case 1:
                xDimId      = rule.AntecedentValues.Single().Dimension.Id;
                legendDimId = rule.ConditionValues.Any() ? rule.ConditionValues.First().Dimension.Id : 0;
                break;

            case 2:
                var firstDimension  = rule.AntecedentValues.ToList()[0].Dimension;
                var secondDimension = rule.AntecedentValues.ToList()[1].Dimension;
                var firstIsRoot     = tree.IsRoot(firstDimension.Id);
                var secondIsRoot    = tree.IsRoot(secondDimension.Id);
                if (firstIsRoot != secondIsRoot)
                {
                    if (firstIsRoot)
                    {
                        xDimId      = firstDimension.Id;
                        legendDimId = secondDimension.Id;
                    }
                    else
                    {
                        xDimId      = secondDimension.Id;
                        legendDimId = firstDimension.Id;
                    }
                }
                else
                {
                    xDimId      = firstDimension.Id;
                    legendDimId = secondDimension.Id;
                }
                break;

            default:
                throw new InvalidDataException($"Wrong count of antecedent values in rule {rule.Id}.");
            }
            return(Tuple.Create(xDimId, legendDimId));
        }
Exemple #4
0
        // Returns root dimension and list of its ids for concrete non-root dimension
        private DimensionValueIds GetRootDimensionIds(DimensionTree tree, int dimensionId, int valueId)
        {
            var isRoot         = tree.IsRoot(dimensionId);
            var childDimension = tree.GetDimensionDto(dimensionId);
            var oldIds         = new List <int> {
                valueId
            };
            var newIds = new List <int> {
                valueId
            };

            while (!isRoot)
            {
                var parentDimension = tree.GetDimensionDto((int)childDimension.ParentId);
                var selectors       = new List <List <Column> >
                {
                    oldIds.Select(childId => new Column {
                        Name = childDimension.IdName, Value = childId.ToString()
                    })
                    .ToList()
                };
                oldIds = newIds;

                var currentIds = QueryBuilder.Select(parentDimension.TableName, selectors);
                newIds.Clear();
                newIds.AddRange(from DataRow currentId in currentIds.Rows select Convert.ToInt32(currentId[Constants.String.Id]));
                childDimension = parentDimension;
                if (childDimension.ParentId == null)
                {
                    isRoot = true;
                }
            }
            return(new DimensionValueIds
            {
                DimensionId = childDimension.Id,
                ValueIds = new HashSet <int>(newIds)
            });
        }