public static void loadNow(ZContenedor e) { List <NodoDeclararParametro> parametros = new List <NodoDeclararParametro>(); FuncionNativa f = new FuncionNativa(TiposPrimitivos.tipoDate, parametros, e, list => { return(new ZTiempo(DateTime.Now.ToString())); } ); e.declararFuncion("now", f); }
public static void cargarFuncionesNativas(ZContenedor e) { var countZFun = new FuncionNativa( TiposPrimitivos.tipoNumero, crearListaParametros(TiposPrimitivos.tipoResultadoQuery), e, args => { var resultadoQuery = (ZResultadoQuery)args[0]; return(new ZNumero(resultadoQuery.Resultado.Count)); } ); var sumZFun = new FuncionNativa( TiposPrimitivos.tipoDicimal, crearListaParametros(TiposPrimitivos.tipoResultadoQuery), e, args => { var resultado = ((ZResultadoQuery)args[0]).Resultado; if (resultado.Count == 0) { return(new ZDecimal(0)); } tieneUnaSolaColumna(resultado); double total = 0; foreach (var fila in resultado) { switch (fila[0]) { case ZNumero zNumero: total += zNumero.obtenerValor(); continue; case ZDecimal zDecimal: total += zDecimal.obtenerValor(); continue; default: throw new SemanticError($"Todos los valores deben de ser numericos en 'sum'. Encontrado '{fila[0].Origen.Nombre}'"); } } return(new ZDecimal(total)); } ); var avgZFun = new FuncionNativa( TiposPrimitivos.tipoDicimal, crearListaParametros(TiposPrimitivos.tipoResultadoQuery), e, args => { var resultado = ((ZResultadoQuery)args[0]).Resultado; if (resultado.Count == 0) { return(new ZDecimal(0)); } tieneUnaSolaColumna(resultado); double total = 0; foreach (var fila in resultado) { switch (fila[0]) { case ZNumero zNumero: total += zNumero.obtenerValor(); continue; case ZDecimal zDecimal: total += zDecimal.obtenerValor(); continue; default: throw new SemanticError($"Todos los valores deben de ser numericos en 'sum'. Encontrado '{fila[0].Origen.Nombre}'"); } } return(new ZDecimal(total / resultado.Count)); } ); var maxZFun = new FuncionNativa( TiposPrimitivos.tipoDicimal, crearListaParametros(TiposPrimitivos.tipoResultadoQuery), e, args => { var resultado = ((ZResultadoQuery)args[0]).Resultado; if (resultado.Count == 0) { return(new ZDecimal(0)); } tieneUnaSolaColumna(resultado); DateTime?maxTiempo = null; DateTime?maxDate = null; double?maximo = null; foreach (var fila in resultado) { switch (fila[0]) { case ZNumero zNumero: if (maximo == null) { maximo = zNumero.obtenerValor(); } else { if (zNumero.obtenerValor() > maximo) { maximo = zNumero.obtenerValor(); } } continue; case ZDecimal zDecimal: if (maximo == null) { maximo = zDecimal.obtenerValor(); } else { if (zDecimal.obtenerValor() > maximo) { maximo = zDecimal.obtenerValor(); } } continue; case ZDate zDate: if (maxDate == null) { maxDate = zDate.obtenerValor(); } else { if (zDate.obtenerValor() > maxDate) { maxDate = zDate.obtenerValor(); } } continue; case ZTiempo zTiempo: if (maxTiempo == null) { maxTiempo = zTiempo.obtenerValor(); } else { if (zTiempo.obtenerValor() > maxTiempo) { maxTiempo = zTiempo.obtenerValor(); } } continue; default: throw new SemanticError($"Tipo no valido para 'max'. Encontrado '{fila[0].Origen.Nombre}'"); } } if (maximo != null) { return(new ZDecimal(maximo.Value)); } if (maxDate != null) { return(new ZDate(maxDate.Value)); } if (maxTiempo != null) { return(new ZTiempo(maxTiempo.Value)); } return(TiposPrimitivos.instanicaNulo); } ); var minZFun = new FuncionNativa( TiposPrimitivos.tipoDicimal, crearListaParametros(TiposPrimitivos.tipoResultadoQuery), e, args => { var resultado = ((ZResultadoQuery)args[0]).Resultado; if (resultado.Count == 0) { return(new ZDecimal(0)); } tieneUnaSolaColumna(resultado); DateTime?maxTiempo = null; DateTime?maxDate = null; double?maximo = null; foreach (var fila in resultado) { switch (fila[0]) { case ZNumero zNumero: if (maximo == null) { maximo = zNumero.obtenerValor(); } else { if (zNumero.obtenerValor() < maximo) { maximo = zNumero.obtenerValor(); } } continue; case ZDecimal zDecimal: if (maximo == null) { maximo = zDecimal.obtenerValor(); } else { if (zDecimal.obtenerValor() < maximo) { maximo = zDecimal.obtenerValor(); } } continue; case ZDate zDate: if (maxDate == null) { maxDate = zDate.obtenerValor(); } else { if (zDate.obtenerValor() < maxDate) { maxDate = zDate.obtenerValor(); } } continue; case ZTiempo zTiempo: if (maxTiempo == null) { maxTiempo = zTiempo.obtenerValor(); } else { if (zTiempo.obtenerValor() < maxTiempo) { maxTiempo = zTiempo.obtenerValor(); } } continue; default: throw new SemanticError($"Tipo no valido para 'min'. Encontrado '{fila[0].Origen.Nombre}'"); } } if (maximo != null) { return(new ZDecimal(maximo.Value)); } if (maxDate != null) { return(new ZDate(maxDate.Value)); } if (maxTiempo != null) { return(new ZTiempo(maxTiempo.Value)); } return(TiposPrimitivos.instanicaNulo); } ); e.declararFuncion("count", countZFun); e.declararFuncion("sum", sumZFun); e.declararFuncion("avg", avgZFun); e.declararFuncion("max", maxZFun); e.declararFuncion("min", minZFun); }