コード例 #1
0
ファイル: Chart.cs プロジェクト: feloca/netchart
        /// <summary>
        /// Genera un modelo de datos formateados según la configuración indicada, estos datos son empleados
        /// por la parte javascript para dibujar el gráfico
        /// </summary>
        /// <param name="output"></param>
        /// <remarks>
        /// a) con solo variable principal si se agrupa no hacer nada (agregacion con un unico dato, luego siempre obtenemos el mismo dato)
        /// b) si existe segunda variable y agregacion en la principal, perfecto, caso facil agrupar por los distintos valores de la variable secundaria
        /// c) caso de z,
        ///   c1) si variable principal no agregada, => ¿creo que debe estar agregada siempre? => si no secundaria, poner el valor de z directamente, si secundaria hacer un grupo que cumpla x e y y hacer el agregado de z
        ///   c2) si variable principal agregada -> buscar todos los elementos de esa agregacion, la sera el valor de la agregacion de la var principal y la z sera el nuevo agregado de z
        ///
        /// </remarks>
        private void AddOutputData(Output output)
        {
            //aqui me he quedado, mirar lo de las series
            //y para cada serie llamar a una funcion que procese los datos como esto que esta aqui

            //aunque no exista serie definida devolveremos los datos en una serie
            //si serie definida agrupar datos por series sino todos los datos son la serie
            //para cada serie generar un output de serie

            //OutputSerie
            var results = new List <OutputSeries>();

            if (this.SerieProperty.IsDefined)
            {
                var seriesValues = DataHelper.GetPropertyValues <T>(this.SeriePropertyName, this.Data);
                var listSeries   = new List <OutputSeries>();

                for (int i = 0; i < seriesValues.Count; ++i)
                {
                    var seriesData   = DataHelper.GetGroupRows <T>(this.SeriePropertyName, seriesValues[i], this.Data);
                    var outputSeries = new OutputSeries();
                    outputSeries.Descriptor = seriesValues[i];
                    ProcessOutputSeries(outputSeries, seriesData);
                    results.Add(outputSeries);
                }
            }
            else
            {
                var outputSeries = new OutputSeries();
                outputSeries.Descriptor = "BASE";
                ProcessOutputSeries(outputSeries, this.Data);
                results.Add(outputSeries);
            }

            output.Series = results.ToArray();

            if (this.SerieProperty.IsDefined)
            {
                List <object> dimensions = new List <object>();

                for (int i = 0; i < output.Series.Length; ++i)
                {
                    dimensions.Add(output.Series[i].Descriptor);
                }
                //NO hay repetidos porque las dimensiones vienen del filtro por valor
                output.SeriesDimensions = dimensions.ToArray();
            }
        }
コード例 #2
0
ファイル: Chart.cs プロジェクト: feloca/netchart
        /// <summary>
        /// Esta funcion se encarga de ordenar los datos de salida segun la configuracion indicada a traves del
        /// objeto comparador
        /// </summary>
        /// <param name="output"></param>
        /// <param name="comparer"></param>
        private void SortOutputData(OutputSeries outputSeries, DataComparer comparer)
        {
            //var a1 =output.VariableData;
            //var a2 = output.DimensionData;
            //var a3 = output.ZVariableData;
            object auxVariable  = null;
            object auxDimension = null;
            object auxZVariable = null;

            //la z puede o no aparecer
            bool checkZ  = (outputSeries.ZVariableData != null && (outputSeries.DimensionData.Length == outputSeries.ZVariableData.Length));
            bool ordered = true;

            do
            {
                ordered = true;
                for (int i = 0; i < outputSeries.DimensionData.Length - 1; ++i)
                {
                    if (comparer.Compare(outputSeries.DimensionData[i], outputSeries.DimensionData[i + 1]) > 0)
                    {
                        ordered     = false;
                        auxVariable = outputSeries.VariableData[i];
                        outputSeries.VariableData[i]     = outputSeries.VariableData[i + 1];
                        outputSeries.VariableData[i + 1] = auxVariable;

                        auxDimension = outputSeries.DimensionData[i];
                        outputSeries.DimensionData[i]     = outputSeries.DimensionData[i + 1];
                        outputSeries.DimensionData[i + 1] = auxDimension;

                        if (checkZ)
                        {
                            auxZVariable = outputSeries.ZVariableData[i];
                            outputSeries.ZVariableData[i]     = outputSeries.ZVariableData[i + 1];
                            outputSeries.ZVariableData[i + 1] = outputSeries.ZVariableData[i];
                        }
                    }
                }
            } while (ordered == false);
        }
コード例 #3
0
ファイル: Chart.cs プロジェクト: feloca/netchart
        /// <summary>
        /// Procesa los datos de una serie dandolos formato adaptado a la salida grafica
        /// </summary>
        /// <param name="outputSeries"></param>
        /// <param name="seriesData"></param>
        private void ProcessOutputSeries(OutputSeries outputSeries, List <T> seriesData)
        {
            var details  = new List <OutputDetail <T> >();
            var zDetails = new List <OutputDetail <T> >();

            //TODO: este if se puede refactorizar, los dos else internos son iguales
            if (this.VariableProperty.Aggregation != AggregateEnum.NoAggregate)
            {
                //primero trato de agregar por la dimension, si no esta definida trato de agregar por la serie
                if (this.DimensionProperty.IsDefined)
                {
                    //no es nula la dimension, para cada valor de dimension hacer un grupo, en dimension poner la llave del
                    //grupo, y en variable el valor del agregado. Poner todos los elementos del grupo en la propiedad outputdetail.DATA
                    var dimensionValues = DataHelper.GetPropertyValues <T>(this.DimensionPropertyName, seriesData);
                    for (int i = 0; i < dimensionValues.Count; ++i)
                    {
                        var groupRows     = DataHelper.GetGroupRows <T>(this.DimensionPropertyName, dimensionValues[i], seriesData);
                        var agregateValue = DataHelper.CalculateAggregate <T>(this.VariableProperty.Name, this.VariableProperty.Aggregation, groupRows);
                        details.Add(new OutputDetail <T>()
                        {
                            VariableDatum  = agregateValue,
                            DimensionDatum = dimensionValues[i],
                            Data           = groupRows
                        });
                    }
                }
                else if (this.SerieProperty.IsDefined)
                {
                    var serieValues = DataHelper.GetPropertyValues <T>(this.SeriePropertyName, seriesData);
                    for (int i = 0; i < serieValues.Count; ++i)
                    {
                        var groupRows     = DataHelper.GetGroupRows <T>(this.SeriePropertyName, serieValues[i], seriesData);
                        var agregateValue = DataHelper.CalculateAggregate <T>(this.VariableProperty.Name, this.VariableProperty.Aggregation, groupRows);
                        details.Add(new OutputDetail <T>()
                        {
                            VariableDatum  = agregateValue,
                            DimensionDatum = serieValues[i],
                            Data           = groupRows
                        });
                    }
                }
                else
                {
                    //es nula la dimension, en dimension 0, 1, 2, 3, etc.. en variable el valor de variable, y poner fila en data
                    var propertyInfo = DataHelper.GetProperty(this.WorkType, this.VariableProperty.Name);
                    for (int i = 0; i < seriesData.Count; ++i)
                    {
                        details.Add(new OutputDetail <T>()
                        {
                            VariableDatum  = propertyInfo.GetValue(seriesData[i]),
                            DimensionDatum = i,
                            Data           = new List <T>()
                            {
                                seriesData[i]
                            }
                        });
                    }
                }
            }
            else
            {
                //caso de no agregacion
                if (this.DimensionProperty.IsDefined)
                {
                    //no es nula la dimension, hace falta sacar los valores de dimension y de variable,
                    //Poner todos los elementos del grupo en la propiedad outputdetail.DATA
                    var propertyInfo          = DataHelper.GetProperty(this.WorkType, this.VariableProperty.Name);
                    var dimensionPropertyInfo = DataHelper.GetProperty(this.WorkType, this.DimensionPropertyName);
                    for (int i = 0; i < seriesData.Count; ++i)
                    {
                        details.Add(new OutputDetail <T>()
                        {
                            VariableDatum  = propertyInfo.GetValue(seriesData[i]),
                            DimensionDatum = dimensionPropertyInfo.GetValue(seriesData[i]),
                            Data           = new List <T>()
                            {
                                seriesData[i]
                            }
                        });
                    }
                }
                else
                {
                    //es nula la dimension, luego la dimension es 0, 1, 2, 3, etc.. usar el orden de los datos
                    //Poner la fila en DATA
                    var propertyInfo = DataHelper.GetProperty(this.WorkType, this.VariableProperty.Name);
                    for (int i = 0; i < seriesData.Count; ++i)
                    {
                        details.Add(new OutputDetail <T>()
                        {
                            VariableDatum  = propertyInfo.GetValue(seriesData[i]),
                            DimensionDatum = i,
                            Data           = new List <T>()
                            {
                                seriesData[i]
                            }
                        });
                    }
                }
            }

            //si z distinto de null
            //trabajamos sobre variableData
            //si agregado para cada x e y, hacer el agregado
            //si no agregado, poner el valor de la variable z del primer elemento de la coleccion outputdetail.DATA
            if (this.ZVariableProperty.IsDefined)
            {
                if (this.ZVariableProperty.Aggregation != AggregateEnum.NoAggregate)
                {
                    //caso de agregacion en z
                    //poner en z el valor de la agregacion de la coleccion de datos
                    outputSeries.VariableData  = new object[details.Count];
                    outputSeries.DimensionData = new object[details.Count];
                    outputSeries.ZVariableData = new object[details.Count];

                    for (int i = 0; i < details.Count; ++i)
                    {
                        outputSeries.VariableData[i]  = details[i].VariableDatum;
                        outputSeries.DimensionData[i] = details[i].DimensionDatum;
                        outputSeries.ZVariableData[i] = DataHelper.CalculateAggregate <T>(this.ZVariableProperty.Name, this.ZVariableProperty.Aggregation, details[i].Data);
                    }
                }
                else
                {
                    //caso de no agregacion en z
                    //poner el valor de z del primer elemento de la coleccion de datos
                    var zPropertyInfo = DataHelper.GetProperty(this.WorkType, this.ZVariableProperty.Name);

                    outputSeries.VariableData  = new object[details.Count];
                    outputSeries.DimensionData = new object[details.Count];
                    outputSeries.ZVariableData = new object[details.Count];

                    for (int i = 0; i < details.Count; ++i)
                    {
                        outputSeries.VariableData[i]  = details[i].VariableDatum;
                        outputSeries.DimensionData[i] = details[i].DimensionDatum;
                        outputSeries.ZVariableData[i] = zPropertyInfo.GetValue(details[i].Data.First());
                    }
                }
            }
            else
            {
                //caso, no hay z
                outputSeries.VariableData  = new object[details.Count];
                outputSeries.DimensionData = new object[details.Count];
                outputSeries.ZVariableData = null;
                for (int i = 0; i < details.Count; ++i)
                {
                    outputSeries.VariableData[i]  = details[i].VariableDatum;
                    outputSeries.DimensionData[i] = details[i].DimensionDatum;
                }
            }
        }