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