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)); }
// 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) }); }