Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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
         };
     }
 }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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;
        }
Ejemplo n.º 11
0
 private IConvertible DoCos(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index,
                            int args_count)
 {
     return(Math.Cos(args[arg_index].ArgumentValue));
 }
Ejemplo n.º 12
0
        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;
            //}
        }
Ejemplo n.º 13
0
 private IConvertible DoUDF(IFormulaParser parser, Function func, FunctionArgumentList args, int arg_index,
                            int args_count)
 {
     return(args.HalfHourIndex);
 }
Ejemplo n.º 14
0
 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));
 }