Пример #1
0
        /// <summary>
        ///		Obtiene las relaciones
        /// </summary>
        internal List <DimensionRelationModel> GetRelations()
        {
            List <DimensionRelationModel> relations = new List <DimensionRelationModel>();

            // Añade las relaciones
            foreach (DimensionRelationViewModel dimensionRelation in ListRelations)
            {
                DimensionRelationModel relation = new DimensionRelationModel(DataSource.DataWarehouse);

                // Asigna las propiedades
                relation.DimensionId = dimensionRelation.GetDimension().Id;
                // Asigna las claves foráneas
                foreach (ListItemForeignKeyViewModel foreignKeyViewModel in dimensionRelation.ForeignKeys)
                {
                    DataSourceColumnModel relatedColumn = foreignKeyViewModel.GetRelatedColumn();

                    if (relatedColumn != null)
                    {
                        relation.ForeignKeys.Add(new RelationForeignKey
                        {
                            ColumnId       = foreignKeyViewModel.SourceColumn.Id,
                            TargetColumnId = relatedColumn.Id
                        }
                                                 );
                    }
                }
                // Añade la relación a la colección
                relations.Add(relation);
            }
            // Devuelve las relaciones
            return(relations);
        }
Пример #2
0
 public DimensionRelationViewModel(ReportingSolutionViewModel reportingSolutionViewModel, BaseDataSourceModel dataSource, DimensionRelationModel relation)
 {
     // Inicializa los objetos
     ReportingSolutionViewModel = reportingSolutionViewModel;
     DataSource = dataSource;
     Relation   = relation;
     // Inicializa las propiedades
     InitViewModel();
     // Inicializa el manejador de eventos sobre el combo
     ComboDimensions.PropertyChanged += (sender, args) => {
         if (args.PropertyName.Equals(nameof(ComboDimensions.SelectedItem)))
         {
             LoadListForeignKeys();
         }
     };
 }
        /// <summary>
        ///		Obtiene un nodo de relación
        /// </summary>
        private MLNode GetNodeRelation(DimensionRelationModel relation)
        {
            MLNode rootML = new MLNode(TagRelation);

            // Añade los atributos
            rootML.Attributes.Add(TagSourceId, relation.Dimension.Id);
            // Añade las claves foráneas
            foreach (RelationForeignKey foreignKey in relation.ForeignKeys)
            {
                MLNode nodeML = rootML.Nodes.Add(TagForeignKey);

                nodeML.Attributes.Add(TagColumn, foreignKey.ColumnId);
                nodeML.Attributes.Add(TagDimensionColumn, foreignKey.TargetColumnId);
            }
            // Devuelve el nodo
            return(rootML);
        }
        /// <summary>
        ///		Carga los datos de una dimension relacionada
        /// </summary>
        private DimensionRelationModel LoadRelatedDimension(MLNode rootML, DataWarehouseModel dataWarehouse)
        {
            DimensionRelationModel relation = new DimensionRelationModel(dataWarehouse);

            // Carga los datos de la dimensión
            relation.DimensionId = rootML.Attributes[TagSourceId].Value.TrimIgnoreNull();
            // Carga las columnas
            foreach (MLNode nodeML in rootML.Nodes)
            {
                if (nodeML.Name == TagForeignKey)
                {
                    relation.ForeignKeys.Add(new RelationForeignKey
                    {
                        ColumnId       = nodeML.Attributes[TagColumn].Value.TrimIgnoreNull(),
                        TargetColumnId = nodeML.Attributes[TagDimensionColumn].Value.TrimIgnoreNull()
                    }
                                             );
                }
            }
            // Devuelve la relación
            return(relation);
        }
        /// <summary>
        ///		Crea un JOIN con una dimensión
        /// </summary>
        private QueryJoinModel CreateJoin(DimensionModel dimension, DimensionRelationModel relation, List <QueryModel> dimensionQueries)
        {
            QueryModel     query        = new QueryModel(dimension.Id, QueryModel.QueryType.Dimension, dimension.Id);
            QueryJoinModel join         = new QueryJoinModel(QueryJoinModel.JoinType.Inner, query, dimension.Id);
            QueryModel     relatedQuery = dimensionQueries.FirstOrDefault(item => item.SourceId.Equals(dimension.Id, StringComparison.CurrentCultureIgnoreCase));

            // Asigna los datos apropiados a la consulta (sólo necesitamos los nombres de tabla)
            query.Prepare(dimension.Id, dimension.Id);
            // Añade las relaciones
            if (relatedQuery != null)
            {
                foreach (RelationForeignKey column in relation.ForeignKeys)
                {
                    QueryFieldModel relatedField = relatedQuery.Fields.FirstOrDefault(item => item.Field.Equals(column.TargetColumnId, StringComparison.CurrentCultureIgnoreCase));

                    if (relatedField != null)
                    {
                        join.Relations.Add(new QueryRelationModel(column.ColumnId, relatedQuery.Alias, relatedField.Alias));
                    }
                }
            }
            // Devuelve el join
            return(join);
        }