private IConvertible DoStatus(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { if (args_count != 1) { throw new Exception("Функция СтатусЗначенияНедостоверные должна иметь один входящий аргумент"); } var firstOrDefault = args.OfType <IFunctionArgumnet>().FirstOrDefault <IFunctionArgumnet>(); if (firstOrDefault == null) { throw new Exception("Должен быть передан хотя бы один аргумент"); } if (firstOrDefault != null && firstOrDefault.Flag == null) { throw new Exception("Нет статуса у значения"); } if ((firstOrDefault.Flag.Value & VALUES_FLAG_DB.AllAlarmStatuses) != 0) { return(1); } return(0); }
private IConvertible DoMacroIf(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { // 0 аргумент - первое число для сравнения // 1 аргумент - оператор сравнения (1 это >, 2 это <, 3 это >=, 4 это <=, 5 это ==, 6 это !=) // 2 аргумент - второе число для сравнения // 3 аргумент - результат, если условие выполнено // 4 аргумент - результат, если условие ложно return(CompareExact(args[arg_index].ArgumentValue, args[arg_index + 2].ArgumentValue, (EOperatorType)args[arg_index + 1].ArgumentValue, args[arg_index + 3].ArgumentValue, args[arg_index + 4].ArgumentValue)); }
private IConvertible DoMax(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { var result = args[arg_index + --args_count].ArgumentValue; while (args_count-- > 0) { if (args[arg_index + args_count].ArgumentValue > result) { result = args[arg_index + args_count].ArgumentValue; } } return(result); }
public void GetValueAndCumulateFlag(ref VALUES_FLAG_DB _flag, ref FunctionArgumentList _value, ref int index) { if (StringValue != null) { _flag = _flag.CompareAndReturnMostBadStatus(flag); _value[index] = new StringFunctionArgument() { ArgumentValue = StringValue, flag = _flag }; } else { _flag = _flag.CompareAndReturnMostBadStatus(flag); _value[index] = new DoubleFunctionArgumnet() { ArgumentValue = m_value, flag = _flag }; } }
private IConvertible DoCSharp(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { var firstOrDefault = args.OfType <IFunctionArgumnet>().FirstOrDefault <IFunctionArgumnet>(); if (firstOrDefault == null) { throw new Exception("Должен быть передан хотя бы один аргумент"); } if (firstOrDefault != null && firstOrDefault.ArgumentType != FunctionArgumentArgsTypeEnum.String) { throw new Exception("Первым аргументом должен быть С# код"); } throw new NotImplementedException("Работа с C# выражениями на текущий момент отключена"); //var res = Proryv.Servers.Calculation.Parser.ProryvParsersFactory.ParseTextToString( // "{" + firstOrDefault.ArgumentValue.ToString() + "}", null); //return res; }
private IConvertible DoIf(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { // 0 аргумент - первое число для сравнения // 1 аргумент - второе число для сравнения // 2 аргумент - точность сравнения (число знаков после запятой, если -1, то как есть, без округления) // 3 аргумент - оператор сравнения (1 это >, 2 это <, 3 это >=, 4 это <=, 5 это ==, 6 это !=) // 4 аргумент - результат, если условие выполнено // 5 аргумент - результат, если условие ложно var points = (int)args[arg_index + 2].ArgumentValue; if (points >= 0) { return(CompareWithRound(args.OfType <IFunctionArgumnet <double> >().Select(i => i.Value).ToArray(), arg_index, args_count, points)); } return(CompareExact(args[arg_index].ArgumentValue, args[arg_index + 1].ArgumentValue, (EOperatorType)args[arg_index + 3].ArgumentValue, args[arg_index + 4].ArgumentValue, args[arg_index + 5].ArgumentValue)); }
private IConvertible DoStatus(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { if (args_count != 2) { throw new Exception("Функция СтатусЗначенияСодержитКод должна иметь два входящих аргумента"); } var firstOrDefault = args.OfType <IFunctionArgumnet>().FirstOrDefault <IFunctionArgumnet>(); if (firstOrDefault == null) { throw new Exception("Должен быть передан хотя бы один аргумент"); } if (firstOrDefault != null && firstOrDefault.Flag == null) { throw new Exception("Нет статуса у значения"); } var last = args.OfType <IFunctionArgumnet>().LastOrDefault <IFunctionArgumnet>(); if (last != null) { var code = (ulong)last.ArgumentValue; if ((firstOrDefault.Flag.Value & (VALUES_FLAG_DB)code) != 0) { return(1); } return(0); } throw new Exception("Неверный код статуса для проверки в значении"); // return firstOrDefault.Flag.Value; }
private IConvertible DoUDF(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { var currdate = args.StartDateTime.AddMinutes(30 * args.HalfHourIndex); var firstOrDefault = args.OfType <IFunctionArgumnet>().FirstOrDefault <IFunctionArgumnet>(); if (firstOrDefault == null) { throw new Exception("Должен быть передан хотя бы один аргумент"); } if (firstOrDefault != null && firstOrDefault.ArgumentType != FunctionArgumentArgsTypeEnum.String) { throw new Exception("Первым аргументом должен быть формат выводимого значения"); } //Вернуть время в формате Unix if (firstOrDefault.ArgumentValue == "u") { return((Int32)(currdate.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds); } var res = currdate.ToString(firstOrDefault.ArgumentValue); return(res); }
private void MakePrecalculateBooleanFunction(ref int eval_index, Function func, WorkedPeriodVariable precalcVariable, int halfHourIndx) { if (func == null) { throw new Exception("Ошибка обработки функции "); } int func_args_start_index = eval_index - 1; while (func_args_start_index >= 0 && OutEvalString[func_args_start_index].FunctionDevider == false) { func_args_start_index--; } if (func_args_start_index < 0) { throw new Exception("Ошибка обработки функции " + func.id); } int args_count = eval_index - func_args_start_index - 1; if (func.FuncArgsCount != int.MaxValue && args_count != func.FuncArgsCount) { throw new Exception(string.Format(" У функции {0} объявлено аргументов {1}, передано в формулу {2}.", func.id, func.FuncArgsCount, args_count)); } else if (func.FuncArgsCount == int.MaxValue && args_count == 0) { throw new Exception("Функция " + func.id + " объявлена без ограничения числа аргументов, передано в формулу 0."); } try { IConvertible arg1, arg2; if (args_count > FunctionArgs.Count) { FunctionArgs = new FunctionArgumentList(3); } VALUES_FLAG_DB flag = VALUES_FLAG_DB.None; for (int i = 0; i < args_count; i++) { OutEvalString[i + func_args_start_index + 1] .GetValueAndCumulateFlag(ref flag, ref FunctionArgs, ref i); } arg1 = FunctionArgs[0].ArgumentValue; arg2 = FunctionArgs[1].ArgumentValue; OutEvalString[func_args_start_index].SetValue(flag, (double) ((func.FuncDlgt == null) ? func.Value : func.FuncBoolDlgt(this, precalcVariable, arg1, arg2, halfHourIndx))); } catch (Exception exc) { throw new Exception("Ошибка обработки функции " + func.id, exc); } eval_index -= args_count; }
private void MakeFunction(ref int eval_index, Function func, DateTime startDateTime, DateTime endDateTime, int HalfHourIndex, enumTimeDiscreteType DiscreteType) { if (func == null) { throw new Exception("Ошибка обработки функции "); } int func_args_start_index = eval_index - 1; while (func_args_start_index >= 0 && OutEvalString[func_args_start_index].FunctionDevider == false) { func_args_start_index--; } if (func_args_start_index < 0) { throw new Exception("Ошибка обработки функции " + func.id); } int args_count = eval_index - func_args_start_index - 1; if (func.FuncArgsCount != int.MaxValue && args_count != func.FuncArgsCount) { throw new Exception(string.Format(" У функции {0} объявлено аргументов {1}, передано в формулу {2}.", func.id, func.FuncArgsCount, args_count)); } else if (func.FuncArgsCount == int.MaxValue && args_count == 0) { throw new Exception("Функция " + func.id + " объявлена без ограничения числа аргументов, передано в формулу 0."); } try { if (args_count > FunctionArgs.Count) { FunctionArgs = new FunctionArgumentList(args_count) { StartDateTime = startDateTime, EndDateTime = endDateTime, HalfHourIndex = HalfHourIndex } } ; FunctionArgs.HalfHourIndex = HalfHourIndex; FunctionArgs.DiscreteType = DiscreteType; VALUES_FLAG_DB flag = VALUES_FLAG_DB.None; for (int i = 0; i < args_count; i++) { OutEvalString[i + func_args_start_index + 1] .GetValueAndCumulateFlag(ref flag, ref FunctionArgs, ref i); } OutEvalString[func_args_start_index].SetValue(flag, ((func.FuncDlgt == null) ? func.Value : func.FuncDlgt(this, func, FunctionArgs, 0, args_count).ToDouble(null))); } catch (Exception exc) { if (exc.InnerException != null) { throw new Exception("Ошибка обработки функции " + func.id + ":" + exc.InnerException.ToString(), exc); } else { throw new Exception("Ошибка обработки функции " + func.id + ":" + exc.ToString(), exc); } } eval_index -= args_count; }
private IConvertible DoCos(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { return(Math.Cos(args[arg_index].ArgumentValue)); }
private IConvertible DoSql(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { Debug.WriteLine(args.StartDateTime); Debug.WriteLine(args.EndDateTime); Debug.WriteLine(args.HalfHourIndex); var firstOrDefault = args.OfType <IFunctionArgumnet>().FirstOrDefault <IFunctionArgumnet>(); if (firstOrDefault == null) { throw new Exception("Должен быть передан хотя бы один аргумент"); } if (firstOrDefault != null && firstOrDefault.ArgumentType != FunctionArgumentArgsTypeEnum.String) { throw new Exception("Первым аргументом должен быть SQL скрипт"); } using (var dbCon = _dbInterfaceAdapter.GetSqlConnection()) { var t = args.OfType <IFunctionArgumnet>().Skip(1).Select(h => h.ArgumentValue); var SQL = string.Format(firstOrDefault.ArgumentValue.ToString(), t.ToArray()); DbCommand cmd1 = new SqlCommand(); dbCon.Open(); cmd1.Connection = dbCon; cmd1.CommandText = SQL; var result = cmd1.ExecuteScalar(); return(result as IConvertible); } // Execution_Id++; // var firstOrDefault = args.OfType<IFunctionArgumnet>().FirstOrDefault<IFunctionArgumnet>(); // if (firstOrDefault == null) // { // throw new Exception("Должен быть передан хотя бы один аргумент"); // } // if (firstOrDefault != null && firstOrDefault.ArgumentType != FunctionArgumentArgsTypeEnum.String) // { // throw new Exception("Первым аргументом должен быть SQL скрипт"); // } // var t = args.OfType<IFunctionArgumnet>().Skip(1).Select(h => h.ArgumentValue); // var SQLText = string.Format(firstOrDefault.ArgumentValue.ToString(), t.ToArray()); // var SQLcommand = string.Format(@"declare @out table //( //out float //) //insert into @out //exec(@sql) //INSERT INTO {0} VALUES(@execution_id,@sql,(select * from @out))", _tempTablePrefix); // using (var cmd = new SqlCommand(SQLcommand)) // { // Debug.WriteLine("Execute "); // cmd.Connection = _connection; // cmd.Parameters.Add("@execution_id", Execution_Id); // cmd.Parameters.Add("@sql", SQLText); // cmd.ExecuteNonQuery(); // Debug.WriteLine("Execute formula SQL"); // return new SqlTemporatyTableResult(_tempTablePrefix, _connection, Execution_Id, ref temporaryResulTable); // } //using (DbCommand cmd1 = new SqlCommand(_connection)) //{ // cmd1.Connection.Open(); // var result = cmd1.ExecuteScalar(); // return result as IConvertible; //} }
private IConvertible DoUDF(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { return(args.HalfHourIndex); }
private IConvertible DoRound(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index, int args_count) { return(Math.Round(args[arg_index].ArgumentValue, (int)args[++arg_index].ArgumentValue, MidpointRounding.AwayFromZero)); }