/// <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);
 }
Ejemplo n.º 4
0
        /// <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);
        }