/// <summary> /// Obtiene las columnas de las dimensiones solicitadas /// </summary> private List <DimensionRequestModel> GetRequestDimensions(ObservableCollection <IHierarchicalViewModel> nodes) { List <DimensionRequestModel> dimensions = new List <DimensionRequestModel>(); // Obtiene las columnas seleccionadas de los nodos foreach (IHierarchicalViewModel baseNodeRoot in nodes) { if (baseNodeRoot is NodeColumnViewModel root && root.ColumnNodeType == NodeColumnViewModel.NodeColumnType.DimensionsRoot) { foreach (IHierarchicalViewModel baseNodeDimension in root.Children) { if (baseNodeDimension is NodeColumnViewModel nodeDimension && nodeDimension.ColumnNodeType == NodeColumnViewModel.NodeColumnType.Dimension) { DimensionRequestModel dimension = GetRequestDimension(nodeDimension); if (dimension != null) { dimensions.Add(dimension); } } } } } // Devuelve las columnas de dimensión return(dimensions); }
/// <summary> /// Obtiene la consulta de una dimensión /// </summary> private QueryModel GetChildQuery(DimensionRequestModel dimensionRequest) { DimensionModel dimension = GetDimension(dimensionRequest); QueryModel query = new QueryModel(dimensionRequest.DimensionId, QueryModel.QueryType.Dimension, dimension.Id); // Prepara la consulta query.Prepare(dimension.DataSource); // Añade los campos clave foreach (DataSourceColumnModel column in dimension.DataSource.Columns.EnumerateValues()) { if (column.IsPrimaryKey) { query.AddPrimaryKey(dimensionRequest.GetRequestColumn(column.Id), column.Id, CheckIsColumnAtColumnRequested(column, dimensionRequest.Columns)); } } // Asigna los campos foreach (DimensionColumnRequestModel columnRequest in dimensionRequest.Columns) { DataSourceColumnModel column = dimension.DataSource.Columns[columnRequest.ColumnId]; if (column != null && !column.IsPrimaryKey) { query.AddColumn(columnRequest.ColumnId, columnRequest); } } // Devuelve la consulta return(query); }
public DimensionRequestBuilder(ReportRequestBuilder builder, DimensionRequestModel dimension) { // Obtiene los objetos Builder = builder; Column = column; // Agrega la columna al generador Builder.ReportRequest.Columns.Add(column); }
/// <summary> /// Obtiene la dimensión /// </summary> protected DimensionModel GetDimension(DimensionRequestModel dimensionRequest) { DimensionModel dimension = Generator.Report.DataWarehouse.Dimensions[dimensionRequest.DimensionId]; // Devuelve la dimensión localizada o lanza una excepción if (dimension == null) { throw new LibReporting.Models.Exceptions.ReportingException($"Cant find the dimension {dimensionRequest.DimensionId}"); } else { return(dimension); } }
/// <summary> /// Obtiene la dimensión asociada a un nodo /// </summary> private DimensionRequestModel GetRequestDimension(NodeColumnViewModel root) { DimensionRequestModel dimension = null; // Obtiene los datos de la dimensión if (MustIncludeAtQuery(root)) { // Crea la dimensión dimension = new DimensionRequestModel { DimensionId = root.DimensionId, }; // Añade las columnas y dimensiones hija foreach (IHierarchicalViewModel baseChild in root.Children) { if (baseChild is NodeColumnViewModel node && MustIncludeAtQuery(node)) { switch (node.ColumnNodeType) { case NodeColumnViewModel.NodeColumnType.DimensionColumn: DimensionColumnRequestModel column = new DimensionColumnRequestModel { ColumnId = node.Column.Id, Visible = node.IsChecked }; // Asigna las propiedades adicionales a la columna: filtros, ordenación .... AssignProperties(column, node, !string.IsNullOrWhiteSpace(root.DataSourceId)); // Añade la columna a las dimensiones dimension.Columns.Add(column); break; case NodeColumnViewModel.NodeColumnType.Dimension: DimensionRequestModel child = GetRequestDimension(node); if (child != null) { dimension.Childs.Add(child); } break; } } } } // Devuelve la dimensión return(dimension); }
/// <summary> /// Obtiene la consulta para una dimensión del informe /// </summary> internal QueryModel GetQuery(DimensionRequestModel dimensionRequest) { List <QueryModel> childsQueries = new List <QueryModel>(); DimensionModel dimension = GetDimension(dimensionRequest); QueryModel query = GetChildQuery(dimensionRequest); // Obtiene las consultas de las dimensiones hija: si hay algún campo solicitado de alguna dimensión hija, // necesitaremos también la consulta de esta dimensión para poder hacer el JOIN posterior, por eso las // calculamos antes que la consulta de esta dimensión foreach (DimensionRequestModel childDimension in dimensionRequest.Childs) { QueryModel childQuery = GetQuery(childDimension); // Añade la query si realmente hay algo que añadir if (childQuery != null) { childsQueries.Add(childQuery); } } // Añade las consultas con las dimensiones hija if (childsQueries.Count > 0) { foreach (QueryModel childQuery in childsQueries) { QueryJoinModel join = new QueryJoinModel(QueryJoinModel.JoinType.Inner, childQuery, $"child_{childQuery.Alias}"); // Asigna las relaciones foreach (DimensionRelationModel relation in dimension.Relations) { if (relation.Dimension.Id.Equals(childQuery.SourceId, StringComparison.CurrentCultureIgnoreCase)) { foreach (RelationForeignKey foreignKey in relation.ForeignKeys) { join.Relations.Add(new QueryRelationModel(foreignKey.ColumnId, childQuery.FromAlias, foreignKey.TargetColumnId)); } } } // Añade la unión query.Joins.Add(join); } } // Devuelve la consulta return(query); }