Пример #1
0
        private static Object IntenalEval(ExpressionNode node, IDataResolver dataResolver)
        {
            switch (node.ActionType)
            {
                case ActionTypes.Function:
                    return FunctionEvaluator.Eval(node, dataResolver);
                case ActionTypes.Operator:
                    return OperatorEvaluator.Eval(node, dataResolver);
            }

            switch (node.ValueType)
            {
                case ValueTypes.Variable:
                    {
                        if (_ordinalComparer.Equals(node.Action, "e"))
                            return Math.E;

                        if (_ordinalComparer.Equals(node.Action, "pi"))
                            return Math.PI;

                        if (_ordinalComparer.Equals(node.Action, "true"))
                            return true;

                        if (_ordinalComparer.Equals(node.Action, "false"))
                            return false;

                        if (_ordinalComparer.Equals(node.Action, "null"))
                            return null;

                        return dataResolver.GetValue(node.Action);
                    }
            }

            return node.Value;
        }
Пример #2
0
 public MultipleDataReader(SqlDataReader reader, IDataResolver resolver = null)
 {
     _reader        = reader;
     _disposedValue = false;
     _resolver      = resolver == null ? new DefaultDataResolver() : resolver;
     HasNext        = true;
 }
Пример #3
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="ipAddress">服务IP</param>
        /// <param name="port">服务器端监听的端口号</param>
        /// <param name="headerResolver">报文头解析函数</param>
        /// <param name="maxClient">服务器最大容纳客户端数</param>
        /// <param name="recvBufSize">接收缓冲的大小</param>
        /// <param name="concurrentLevel">服务器并发度。主要体现在Listener的backlog以及sessionMap的并发级别</param>
        private void Initialize(IPAddress serverIP, ushort port, IDataResolver headerResolver,
                                int maxClient, int recvBufSize, int concurrentLevel)
        {
            if (headerResolver == null)
            {
                throw new ArgumentNullException("headerResolver");
            }

            if (port == 0)
            {
                throw new ArgumentNullException("port");
            }

            this.headerResolver    = headerResolver;
            this.serverIP          = serverIP;
            this.port              = port;
            this.receiveBufferSize = recvBufSize;
            this.concurrentLevel   = concurrentLevel;

            this.sessionManager  = new SessionManager(maxClient, recvBufSize);
            this.MaxEmptyMessage = DefaultMaxEmptyMessage;

            this.dataReceivedCallback       = new AsyncCallback(this.OnDataReceived);
            this.connectionAcceptedCallback = new AsyncCallback(this.OnConnectionAccepted);
            this.dataSentCallback           = new AsyncCallback(this.OnDataSent);
        }
Пример #4
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="ipAddress">服务IP</param>
 /// <param name="port">服务器端监听的端口号</param>
 /// <param name="headerResolver">报文头解析函数</param>
 /// <param name="maxClient">服务器最大容纳客户端数</param>
 /// <param name="headerSize">报文头长度</param>
 /// <param name="maxRecvBufSize">每次接收报文的最大大小</param>
 /// <param name="concurrentLevel">服务器并发度。主要体现在Listener的backlog以及sessionMap的并发级别</param>
 public TcpSvr(IPAddress ipAddress, ushort port, IDataResolver headerResolver,
               int maxClient       = DefaultMaxClient,
               int maxRecvBufSize  = DefaultBufferSize,
               int concurrentLevel = DefaultConcurrentLevel)
 {
     this.Initialize(ipAddress, port, headerResolver, maxClient, maxRecvBufSize, concurrentLevel);
 }
Пример #5
0
 /// <summary>
 /// Initialize the current CsvReader instance with provided information
 /// </summary>
 /// <param name="stream">A readable stream from which current reader will read data</param>
 /// <param name="settings">Configurable options customizing current CsvReader instance</param>
 /// <param name="dataResolver">A customer data resolver converting raw CSV values to objects</param>
 protected CsvReader(Stream stream, CsvReaderSettings settings, IDataResolver <T> dataResolver)
 {
     this.mDataResolver         = dataResolver;
     this.mCsvSettings          = settings = settings ?? new CsvReaderSettings();
     this.mCsvSettings.UseCache = settings.UseCache || settings.SkipDuplicates;
     EnsureParameters(stream, settings, dataResolver);
     settings.BufferSize = Math.Min(BUFFER_SZMAX, Math.Max(settings.BufferSize, BUFFER_SZMIN));
     this.mReader        = new StreamReader(stream, settings.Encoding, false, settings.BufferSize);
     this.mBuffer        = new Char[settings.BufferSize];
 }
Пример #6
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="ipAddress">服务IP</param>
        /// <param name="port">服务器端监听的端口号</param>
        /// <param name="headerResolver">报文头解析函数</param>
        /// <param name="maxClient">服务器最大容纳客户端数</param>
        /// <param name="headerSize">报文头长度</param>
        /// <param name="maxRecvBufSize">每次接收报文的最大大小</param>
        /// <param name="concurrentLevel">服务器并发度。主要体现在Listener的backlog以及sessionMap的并发级别</param>
        public TcpSvr(string ipAddress, ushort port, IDataResolver headerResolver,
                      int maxClient       = DefaultMaxClient,
                      int maxRecvBufSize  = DefaultBufferSize,
                      int concurrentLevel = DefaultConcurrentLevel)
        {
            IPAddress ip;

            if (!IPAddress.TryParse(ipAddress, out ip))
            {
                throw new ArgumentException("invalid ip address", "ipAddress");
            }

            this.Initialize(ip, port, headerResolver, maxClient, maxRecvBufSize, concurrentLevel);
        }
Пример #7
0
 public ET_Engine(IDataSourceFactory dataSourceFactory,
                  IDataResolver dataResolver,
                  IDataSinkFactory dataSinkFactory,
                  IEtLogger logger,
                  IDiskIOHandler diskIOHandler,
                  RuntimeArgs runtimeSettings)
 {
     this._dataSourceFactory      = dataSourceFactory;
     this._dataMapHandler         = dataResolver;
     this._dataSinkFactory        = dataSinkFactory;
     this._logger                 = logger;
     this._diskIOHandler          = diskIOHandler;
     this._runtimeSettings        = runtimeSettings;
     this._toSinkDataChainBuilder = new SourceToSinkDataChainBuilder(logger);
 }
Пример #8
0
        public static ExpressionResult TryEval(String expression, IDataResolver dataResolver)
        {
            var result = new ExpressionResult();

            try
            {
                result.Value = Eval(expression, dataResolver);
            }
            catch (Exception ex)
            {
                result.Error = ex;
            }

            return result;
        }
Пример #9
0
        public async Task DispatchAsync(Guid actionID, Guid idRegister)
        {
            var middlewareManager = new MiddlewareManager <Action>(new BaseRecordGeneralManager <Action>(), new ActionValidator());


            var action = (await middlewareManager
                          .FindByExpressionAsync(p => p.ID == actionID && p.Active == true, Guid.Empty, new string[]
                                                 { "ActionSubscriptions" })).FirstOrDefault();

            IDataResolver dataResolver = DataResolverFactory.GetResolver(action);

            var data = await dataResolver.ResolveDataAsync(action, idRegister);

            DisperseAsync(action.ActionSubscriptions, data);
        }
Пример #10
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="headerSize">约定的TCP Message头大小</param>
        /// <param name="headerResolver">报文头解析函数</param>
        public TcpCli(IDataResolver headerResolver, int receiveBufferSize = DefaultBufferSize)
        {
            if (headerResolver == null)
            {
                throw new ArgumentNullException("headerResolver");
            }

            this.MaxEmptyMessage = DefaultMaxEmptyMessage;

            this.receiveBuffer  = new byte[receiveBufferSize];
            this.headerResolver = headerResolver;

            this.dataReceivedCallback = new AsyncCallback(this.OnDataReceived);
            this.dataSentCallback     = new AsyncCallback(this.OnDataSent);
        }
Пример #11
0
        public static Object Eval(ExpressionNode node, IDataResolver dataResolver)
        {
            if (node == null)
                return null;

            if (!node.Container)
                return IntenalEval(node, dataResolver);

            if (node.Params == null || node.Params.Count == 0)
                return null;

            var result = (Object)null;

            foreach (var expNode in node.Params)
                result = IntenalEval(expNode, dataResolver);

            return result;
        }
Пример #12
0
        /// <summary>
        /// Forces task to use custom resolver.
        /// </summary>
        /// <returns>The custom resolver.</returns>
        /// <param name="resolver">Resolver.</param>
        public TaskParameter WithCustomDataResolver(IDataResolver resolver)
        {
            CustomDataResolver = resolver;

            var vectorResolver = resolver as IVectorDataResolver;

            if (vectorResolver != null && string.IsNullOrWhiteSpace(CustomCacheKey))
            {
                CacheKey(string.Format("{0};{4}(size={1}x{2},dip={3})",
                                       Path,
                                       vectorResolver.VectorWidth,
                                       vectorResolver.VectorHeight,
                                       vectorResolver.UseDipUnits,
                                       resolver.GetType()?.Name ?? "Vector"));
            }

            return(this);
        }
Пример #13
0
 /// <summary>
 /// Initialize the current CsvWriter instance with provided information
 /// </summary>
 /// <param name="stream">A writable stream to which current writer will write data</param>
 /// <param name="settings">Configurable options customizing current CsvWriter instance</param>
 /// <param name="dataResolver">A customer data resolver converting objects to raw CSV values</param>
 protected CsvWriter(Stream stream, CsvWriterSettings settings, IDataResolver <T> dataResolver)
 {
     this.mDataResolver = dataResolver;
     this.mCsvSettings  = settings = settings ?? new CsvWriterSettings();
     EnsureParameters(stream, settings, dataResolver);
     settings.BufferSize = Math.Min(BUFFER_SZMAX, Math.Max(settings.BufferSize, BUFFER_SZMIN));
     mNeedQuoteChars     = new Char[] { '\r', '\n', '\"', settings.Seperator };
     this.mWriter        = new StreamWriter(stream, settings.Encoding, settings.BufferSize);
     if (stream.CanSeek)
     {
         if (settings.AppendExisting)
         {
             stream.Seek(0, SeekOrigin.End);
         }
         if (settings.OverwriteExisting)
         {
             stream.SetLength(0);
         }
     }
 }
Пример #14
0
        public PlayerPrefsData(string key, IDataResolver dataResolver)
        {
            m_Key          = key;
            m_DataResolver = dataResolver;

            var s = PlayerPrefs.GetString(m_Key, "");

            if (m_DataResolver != null &&
                m_DataResolver.Resolve(s, out string rS))
            {
                Debug.Log($"Resolved from: {s} to: {rS}");
                s = rS;
            }
            if (string.IsNullOrEmpty(s))
            {
                m_Value = new T();
            }
            else
            {
                m_Value = JsonUtility.FromJson <PlayerPrefsData <T> >(s).m_Value;
            }
        }
Пример #15
0
 /// <summary>
 /// Create an instance of CsvWriter with a specified file path and a custom data resolver.
 /// If the path already exists, an exception will be thrown.
 /// </summary>
 /// <param name="filePath">The path of the CSV file to be written.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvWriter instance.</returns>
 public static CsvWriter <T> Create(String filePath, IDataResolver <T> dataResolver)
 {
     return(Create(filePath, new CsvWriterSettings(), dataResolver));
 }
Пример #16
0
 /// <summary>
 /// Create an instance of CsvWriter with a specified file path, a CsvWriterSettings object and a custom data resolver.
 /// If the path already exists and AppendExisting and OverwriteExisting of settings are both false, an exception will be thrown.
 /// </summary>
 /// <param name="filePath">The path of the CSV file to be written.</param>
 /// <param name="settings">Specify the options to control behavior of CsvWriter.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvWriter instance.</returns>
 public static CsvWriter <T> Create(String filePath, CsvWriterSettings settings, IDataResolver <T> dataResolver)
 {
     CheckFilePath(filePath, settings);
     return(Create(File.OpenWrite(filePath), settings, dataResolver));
 }
Пример #17
0
 public MultipleBulkDataReader(DataSet dataset, IDataResolver resolver = null)
 {
     _dataset       = dataset;
     _tables        = dataset.Tables.Cast <DataTable>().Select(table => new BulkDataReader(table, resolver)).ToArray();
     _disposedValue = false;
 }
Пример #18
0
        /// <summary>
        /// Создает экземпляр класса
        /// </summary>
        /// <param name="host">Хост Форинт-К</param>
        /// <param name="port">Порт службы обмена данными</param>
        /// <param name="dataResolver">Объект для поиска данных по коду</param>
        public SalesExplorer(String host, Int32 port, IDataResolver dataResolver)
        {
            Host = host;
            Port = port;
            
            _dataResolver = dataResolver;
            if (_dataResolver != null)
                _dataResolver.FillCache();

            _tableFunctions = new Dictionary<String, FuncGroup>();
            _tableFunctions.Add("ЗаголовкиСмен", new FuncGroup
            {
                Constructor = () => new ShiftSummary(),
                Persister = (obj) => _summary.NewShift((ShiftSummary)obj),
                PropertySetter = (obj, reader) => ProcessProperty((ShiftSummary)obj, reader)
            });
            _tableFunctions.Add("ЗаголовкиЧеков", new FuncGroup
            {
                Constructor = () => new ReceiptHeader(),
                Persister = (obj) =>
                {
                    var header = (ReceiptHeader)obj;
                    _summary[header.ShiftNo].NewReceipt(header);
                },
                PropertySetter = (obj, reader) => ProcessProperty((ReceiptHeader)obj, reader)
            });
            _tableFunctions.Add("ЧековаяЛента", new FuncGroup
            {
                Constructor = () => new ReceiptRow(),
                Persister = (obj) =>
                {
                    var row = (ReceiptRow)obj;
                    _summary[row.ShiftNo][row.ReceiptNo].NewRow(row);
                },
                PropertySetter = (obj, reader) => ProcessProperty((ReceiptRow)obj, reader)
            });
            _tableFunctions.Add("АвтоматическиеСкидки", new FuncGroup
            {
                Constructor = () => new Discount(),
                Persister = (obj) =>
                {
                    var discount = (Discount)obj;
                    var key = new ReceiptRowKey(discount.Article, discount.SeriesId);
                    _summary[discount.ShiftNo][discount.ReceiptNo][key].NewAutoDiscount(discount);
                },
                PropertySetter = (obj, reader) => ProcessProperty((Discount)obj, reader)
            });
            _tableFunctions.Add("ПерсональныеСкидки", new FuncGroup
            {
                Constructor = () => new Discount(),
                Persister = (obj) =>
                {
                    var discount = (Discount)obj;
                    var key = new ReceiptRowKey(discount.Article, discount.SeriesId);
                    _summary[discount.ShiftNo][discount.ReceiptNo][key].NewPersonalDiscount(discount);
                },
                PropertySetter = (obj, reader) => ProcessProperty((Discount)obj, reader)
            });
            _tableFunctions.Add("КредитныеКарты", new FuncGroup
            {
                Constructor = () => new PaymentCard(),
                Persister = (obj) =>
                {
                    var card = (PaymentCard)obj;
                    _summary[card.ShiftNo][card.ReceiptNo].NewCard(card);
                },
                PropertySetter = (obj, reader) => ProcessProperty((PaymentCard)obj, reader)
            });
            _tableFunctions.Add("Наличность", new FuncGroup
            {
                Constructor = () => new Cash(),
                Persister = (obj) =>
                {
                    var cash = (Cash)obj;
                    _summary[cash.ShiftNo].NewCash(cash);
                },
                PropertySetter = (obj, reader) => ProcessProperty((Cash)obj, reader)
            });
            _tableFunctions.Add("ЖурналОпераций", new FuncGroup
            {
                Constructor = () => new LoggedEvent(),
                Persister = (obj) => _summary.NewEvent((LoggedEvent)obj),
                PropertySetter = (obj, reader) => ProcessProperty((LoggedEvent)obj, reader)
            });
        }
Пример #19
0
        private static void EnsureParameters(Stream stream, CsvWriterSettings settings, IDataResolver <T> dataResolver)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            if (!stream.CanWrite)
            {
                throw new ArgumentException("stream is not writable", "stream");
            }

            if (settings.Encoding == null)
            {
                throw new ArgumentNullException("settings.Encoding");
            }

            if (dataResolver == null)
            {
                throw new ArgumentNullException("dataResolver");
            }
        }
Пример #20
0
 /// <summary>
 /// Forces task to use custom resolver for error placeholder.
 /// </summary>
 /// <returns>The TaskParameter instance for chaining the call.</returns>
 /// <param name="resolver">Resolver.</param>
 public TaskParameter WithCustomErrorPlaceholderDataResolver(IDataResolver resolver = null)
 {
     CustomErrorPlaceholderDataResolver = resolver;
     return(this);
 }
Пример #21
0
 /// <summary>
 /// Create an instance of CsvReader with a specified byte array and a custom data resolver.
 /// </summary>
 /// <param name="stream">A Byte array from which the CsvReader will read content.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvReader instance.</returns>
 public static CsvReader <T> Create(Byte[] stream, IDataResolver <T> dataResolver)
 {
     return(Create(stream, new CsvReaderSettings(), dataResolver));
 }
Пример #22
0
 /// <summary>
 /// Выполнение диалога
 /// </summary>
 /// <param name="summary">Результаты запроса</param>
 /// <param name="dataResolver">Объект для дополнительной загрузки данных</param>
 public void ShowDialog(RequestSummary summary, IDataResolver dataResolver)
 {
     _summary = summary;
     _dataResolver = dataResolver;
     BuildSalesView();
     base.ShowDialog();
 }
Пример #23
0
        /// <summary>
        /// Forces task to use custom resolver.
        /// </summary>
        /// <returns>The custom resolver.</returns>
        /// <param name="resolver">Resolver.</param>
        public TaskParameter WithCustomDataResolver(IDataResolver resolver)
        {
            CustomDataResolver = resolver;

            var vectorResolver = resolver as IVectorDataResolver;
            if (vectorResolver != null && string.IsNullOrWhiteSpace(CustomCacheKey))
            {
                CacheKey(string.Format("{0};{4}(size={1}x{2},dip={3})", 
                                       Path, 
                                       vectorResolver.VectorWidth, 
                                       vectorResolver.VectorHeight, 
                                       vectorResolver.UseDipUnits,
                                       resolver.GetType()?.Name ?? "Vector"));
            }

            return this;
        }
Пример #24
0
 /// <summary>
 /// Create an instance of CsvWriter with a specified writable stream and a custom data resolver.
 /// </summary>
 /// <param name="stream">A writable strem to be written into.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvWriter instance.</returns>
 public static CsvWriter <T> Create(Stream stream, IDataResolver <T> dataResolver)
 {
     return(Create(stream, new CsvWriterSettings(), dataResolver));
 }
Пример #25
0
 /// <summary>
 /// Create an instance of CsvWriter with a specified writable stream, a CsvWriterSettings object and a custom data resolver.
 /// </summary>
 /// <param name="stream">A writable strem to be written into.</param>
 /// <param name="settings">Specify the options to control behavior of CsvWriter.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvWriter instance.</returns>
 public static CsvWriter <T> Create(Stream stream, CsvWriterSettings settings, IDataResolver <T> dataResolver)
 {
     return(new CsvWriter <T>(stream, settings, dataResolver));
 }
Пример #26
0
 public DefaultDataResolver(IDictionary <String, Object> dictionary, IDataResolver parentResolver)
 {
     _dictionary     = dictionary;
     _parentResolver = parentResolver;
 }
Пример #27
0
 public DefaultDataResolver(IDataResolver parentResolver)
     : this(new Dictionary <String, Object>(), parentResolver)
 {
 }
Пример #28
0
 /// <summary>
 /// Create an instance of CsvReader with a specified byte array, a CsvReaderSettings object and a custom data resolver.
 /// </summary>
 /// <param name="stream">A Byte array from which the CsvReader will read content.</param>
 /// <param name="settings">Specify the options to control behavior of CsvReader.</param>
 /// <param name="dataResolver">A custom data resolver used to serialize and deserialize data.</param>
 /// <returns>A CsvReader instance.</returns>
 public static CsvReader <T> Create(Byte[] stream, CsvReaderSettings settings, IDataResolver <T> dataResolver)
 {
     return(Create(new MemoryStream(stream), settings, dataResolver));
 }
 public HomeController(IDataResolver dataResolver)
 {
     this.dataResolver = dataResolver;
 }
Пример #30
0
 public XMLContext(IDataResolver parenResolver)
     : base(parenResolver)
 {
 }
Пример #31
0
 /// <summary>
 /// Forces task to use custom resolver.
 /// </summary>
 /// <returns>The TaskParameter instance for chaining the call.</returns>
 /// <param name="resolver">Resolver.</param>
 public TaskParameter WithCustomDataResolver(IDataResolver resolver = null)
 {
     CustomDataResolver = resolver;
     return(this);
 }
Пример #32
0
 public BulkDataReader(DataTable table, IDataResolver resolver = null)
 {
     _table         = table;
     _resolver      = resolver == null ? new DefaultDataResolver() : resolver;
     _disposedValue = false;
 }
Пример #33
0
 public WrappedDataResolver(IDataResolver resolver)
 {
     _resolver = resolver;
 }
Пример #34
0
        public static Object Eval(ExpressionNode node, IDataResolver dataResolver)
        {
            var @params = new List <Object>();

            foreach (var paramNode in node.Params)
            {
                if (paramNode != null)
                {
                    var value = (Object)null;

                    if (@params.Count == 0)
                    {
                        value = ExpressionEvaluator.Eval(paramNode, dataResolver);
                    }
                    else if (lazyFuncs.Contains(node.Action))
                    {
                        value = paramNode;
                    }
                    else
                    {
                        value = ExpressionEvaluator.Eval(paramNode, dataResolver);
                    }

                    @params.Add(value);
                }
            }

            switch (node.Action.ToLower())
            {
            case "sqrt":
                return(Math.Sqrt(ExpressionHelper.GetNumber(@params[0])));

            case "sin":
                return(Math.Sin(ExpressionHelper.GetNumber(@params[0])));

            case "cos":
                return(Math.Cos(ExpressionHelper.GetNumber(@params[0])));

            case "tan":
                return(Math.Tan(ExpressionHelper.GetNumber(@params[0])));

            case "asin":
                return(Math.Asin(ExpressionHelper.GetNumber(@params[0])));

            case "acos":
                return(Math.Acos(ExpressionHelper.GetNumber(@params[0])));

            case "atan":
                return(Math.Atan(ExpressionHelper.GetNumber(@params[0])));

            case "abs":
                return(Math.Abs(ExpressionHelper.GetNumber(@params[0])));

            case "atan2":
                return(Math.Atan2(ExpressionHelper.GetNumber(@params[0]), ExpressionHelper.GetNumber(@params[1])));

            case "ceil":
                return(Math.Ceiling(ExpressionHelper.GetNumber(@params[0])));

            case "cosh":
                return(Math.Cosh(ExpressionHelper.GetNumber(@params[0])));

            case "exp":
                return(Math.Exp(ExpressionHelper.GetNumber(@params[0])));

            case "floor":
                return(Math.Floor(ExpressionHelper.GetNumber(@params[0])));

            case "log":
                return(Math.Log(ExpressionHelper.GetNumber(@params[0])));

            case "log10":
                return(Math.Log10(ExpressionHelper.GetNumber(@params[0])));

            case "rnd":
            {
                var len = 8D;

                if (@params.Count > 0)
                {
                    len = ExpressionHelper.GetNumber(@params[0]);
                    len = (len < 1 ? 8D : len);
                }

                var max = Math.Pow(10, len) - 1D;
                var rnd = new Random();

                return(rnd.Next(0, (int)max));
            }

            case "round":
            {
                if (@params.Count > 1)
                {
                    return(Math.Round(ExpressionHelper.GetNumber(@params[0]), (int)ExpressionHelper.GetNumber(@params[1])));
                }

                return(Math.Round(ExpressionHelper.GetNumber(@params[0])));
            }

            case "sign":
                return(Math.Sign(ExpressionHelper.GetNumber(@params[0])));

            case "sinh":
                return(Math.Sinh(ExpressionHelper.GetNumber(@params[0])));

            case "tanh":
                return(Math.Tanh(ExpressionHelper.GetNumber(@params[0])));

            case "trunc":
                return(Math.Truncate(ExpressionHelper.GetNumber(@params[0])));

            case "pow":
                return(Math.Pow(ExpressionHelper.GetNumber(@params[0]), ExpressionHelper.GetNumber(@params[1])));

            case "or":
                return((long)ExpressionHelper.GetNumber(@params[0]) | (long)ExpressionHelper.GetNumber(@params[1]));

            case "and":
                return((long)ExpressionHelper.GetNumber(@params[0]) & (long)ExpressionHelper.GetNumber(@params[1]));

            case "xor":
                return((long)ExpressionHelper.GetNumber(@params[0]) ^ (long)ExpressionHelper.GetNumber(@params[1]));

            case "mod":
                return(ExpressionHelper.GetNumber(@params[0]) % ExpressionHelper.GetNumber(@params[1]));

            case "len":
            {
                var val = @params[0];
                if (val == null)
                {
                    return(0);
                }

                if (val is ICollection)
                {
                    return(((ICollection)val).Count);
                }

                var type = val.GetType();
                if (ExpressionHelper.IsListOrDictionary(val))
                {
                    var countProperty = type.GetProperty("Count");
                    if (countProperty == null)
                    {
                        return(0);
                    }

                    return(countProperty.GetValue(val));
                }

                var strVal = Convert.ToString(val);
                return(strVal.Length);
            }

            case "set":
            {
                var name = Convert.ToString(@params[0]);
                dataResolver.SetValue(name, @params[1]);

                return(true);
            }

            case "get":
            {
                var val = @params[0];
                if (val == null)
                {
                    return(null);
                }

                if (val is IList)
                {
                    var list = (IList)val;
                    return(list[0]);
                }

                var type = val.GetType();
                if (ExpressionHelper.IsListOrDictionary(type))
                {
                    var properties = type.GetProperties();

                    var indexerProperty = properties.FirstOrDefault(n => n.GetIndexParameters().Length > 0);
                    if (indexerProperty != null)
                    {
                        var idxParams = new[] { @params[1] };

                        var result = indexerProperty.GetValue(val, idxParams);
                        return(result);
                    }
                }

                var idx = (int)ExpressionHelper.GetNumber(@params[1]);

                var strVal = Convert.ToString(val);
                return(strVal[idx]);
            }

            case "join":
            {
                var val = @params[0];
                if (val == null)
                {
                    return(null);
                }

                var coll = val as ICollection;
                if (coll == null)
                {
                    return(val);
                }

                var separator = Convert.ToString(@params[1]);
                return(String.Join(separator, coll.OfType <Object>()));
            }

            case "concat":
            {
                var val = @params[0];
                if (val == null)
                {
                    return(null);
                }

                var coll = val as ICollection;
                if (coll == null)
                {
                    return(val);
                }

                return(String.Concat(coll.OfType <Object>()));
            }

            case "format":
            {
                var format = Convert.ToString(@params[0]);
                var args   = new Object[@params.Count - 1];

                @params.CopyTo(1, args, 0, args.Length);

                return(String.Format(format, args));
            }

            case "substring":
            {
                var text  = Convert.ToString(@params[0]);
                var index = (int)ExpressionHelper.GetNumber(@params[1]);

                var length = (@params.Count > 2 ? (int)ExpressionHelper.GetNumber(@params[2]) : text.Length);
                length = Math.Min(length, text.Length - index);

                return(text.Substring(index, length));
            }

            case "getdatetime":
            {
                var currDate = DateTime.Now;
                if (@params.Count == 0)
                {
                    return(currDate);
                }

                var year  = (int)ExpressionHelper.GetNumber(@params.Count > 0 ? @params[0] : currDate.Year);
                var month = (int)ExpressionHelper.GetNumber(@params.Count > 1 ? @params[1] : currDate.Month);
                var day   = (int)ExpressionHelper.GetNumber(@params.Count > 2 ? @params[2] : currDate.Day);

                var hour   = (int)ExpressionHelper.GetNumber(@params.Count > 3 ? @params[3] : currDate.Hour);
                var minute = (int)ExpressionHelper.GetNumber(@params.Count > 4 ? @params[4] : currDate.Minute);
                var second = (int)ExpressionHelper.GetNumber(@params.Count > 5 ? @params[5] : currDate.Second);

                var milisecond = (int)ExpressionHelper.GetNumber(@params.Count > 6 ? @params[6] : currDate.Millisecond);

                return(new DateTime(year, month, day, hour, minute, second, milisecond));
            }

            case "getdate":
            {
                var currDate = DateTime.Now.Date;
                if (@params.Count == 0)
                {
                    return(currDate);
                }

                var year  = (int)ExpressionHelper.GetNumber(@params.Count > 0 ? @params[0] : currDate.Year);
                var month = (int)ExpressionHelper.GetNumber(@params.Count > 1 ? @params[1] : currDate.Month);
                var day   = (int)ExpressionHelper.GetNumber(@params.Count > 2 ? @params[2] : currDate.Day);

                return(new DateTime(year, month, day));
            }

            case "isempty":
            {
                var val = @params[0];
                if (val == null)
                {
                    return(true);
                }

                if (val is ICollection)
                {
                    return(((ICollection)val).Count == 0);
                }

                var type = val.GetType();
                if (ExpressionHelper.IsListOrDictionary(val))
                {
                    var countProperty = type.GetProperty("Count");
                    if (countProperty == null)
                    {
                        return(true);
                    }

                    var count = (int)countProperty.GetValue(val);
                    return(count == 0);
                }

                var strVal = Convert.ToString(val);
                return(strVal.Length == 0);
            }

            case "isdate":
                return(ExpressionHelper.IsDateTime(@params[0]));

            case "isday":
            {
                var input = Convert.ToString(@params[0]);
                return(dayRx.IsMatch(input));
            }

            case "ismonth":
            {
                var input = Convert.ToString(@params[0]);
                return(monthRx.IsMatch(input));
            }

            case "isyear":
            {
                var input = Convert.ToString(@params[0]);
                return(yearRx.IsMatch(input));
            }

            case "isnumber":
            {
                return(ExpressionHelper.IsNumber(@params[0]));
            }

            case "isinteger":
            {
                return(ExpressionHelper.IsInteger(@params[0]));
            }

            case "rgx":
            {
                var input   = Convert.ToString(@params[0]);
                var pattern = Convert.ToString(@params[1]);

                return(Regex.IsMatch(input, pattern));
            }

            case "min":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var val = (Object)null;

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        if (item == null)
                        {
                            continue;
                        }

                        var order = ExpressionHelper.Compare(val, item);
                        if (order < 0)
                        {
                            val = item;
                        }
                    }

                    return(val);
                }

                var query = (from n in @params
                             let m = ExpressionHelper.GetNumber(n)
                                     select m);

                return(query.Min());
            }

            case "max":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var val = (Object)null;

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        if (item == null)
                        {
                            continue;
                        }

                        if (val == null)
                        {
                            val = item;
                        }
                        else
                        {
                            var order = ExpressionHelper.Compare(val, item);
                            if (order > 0)
                            {
                                val = item;
                            }
                        }
                    }

                    return(val);
                }

                var query = (from n in @params
                             let m = ExpressionHelper.GetNumber(n)
                                     select m);

                return(query.Max());
            }

            case "avg":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var val   = 0D;
                    var count = 0;

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        if (item == null)
                        {
                            continue;
                        }

                        val += ExpressionHelper.GetNumber(item);
                        count++;
                    }

                    return(val / count);
                }

                var query = (from n in @params
                             let m = ExpressionHelper.GetNumber(n)
                                     select m);

                return(query.Average());
            }

            case "sum":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var val = 0D;

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        if (item == null)
                        {
                            continue;
                        }

                        val += ExpressionHelper.GetNumber(item);
                    }

                    return(val);
                }

                var query = (from n in @params
                             let m = ExpressionHelper.GetNumber(n)
                                     select m);

                return(query.Sum());
            }

            case "all":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var conditionNde = (ExpressionNode)@params[1];

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        var res = ExpressionEvaluator.Eval(conditionNde, subResolver);
                        if (!Convert.ToBoolean(res))
                        {
                            return(false);
                        }
                    }

                    return(true);
                }

                return(false);
            }

            case "any":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var conditionNde = (ExpressionNode)@params[1];

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];
                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        var res = ExpressionEvaluator.Eval(conditionNde, subResolver);
                        if (Convert.ToBoolean(res))
                        {
                            return(true);
                        }
                    }
                }

                return(false);
            }

            case "single":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var conditionNode = (ExpressionNode)null;
                    if (@params.Count > 2)
                    {
                        conditionNode = (ExpressionNode)@params[2];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    var flag   = false;
                    var result = (object)null;

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        if (flag)
                        {
                            throw new Exception();
                        }

                        if (conditionNode != null)
                        {
                            var res = ExpressionEvaluator.Eval(conditionNode, subResolver);
                            if (!Convert.ToBoolean(res))
                            {
                                continue;
                            }
                        }

                        if (selectorNode == null)
                        {
                            result = item;
                        }
                        else
                        {
                            result = ExpressionEvaluator.Eval(selectorNode, subResolver);
                        }

                        flag = true;
                    }

                    return(result);
                }

                return(null);
            }

            case "first":
            {
                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var conditionNode = (ExpressionNode)null;
                    if (@params.Count > 2)
                    {
                        conditionNode = (ExpressionNode)@params[2];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        if (conditionNode != null)
                        {
                            var res = ExpressionEvaluator.Eval(conditionNode, subResolver);
                            if (!Convert.ToBoolean(res))
                            {
                                continue;
                            }
                        }

                        if (selectorNode == null)
                        {
                            return(item);
                        }

                        var obj = ExpressionEvaluator.Eval(selectorNode, subResolver);
                        return(obj);
                    }
                }

                return(null);
            }

            case "last":
            {
                var result = (Object)null;

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var conditionNode = (ExpressionNode)null;
                    if (@params.Count > 2)
                    {
                        conditionNode = (ExpressionNode)@params[2];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        if (conditionNode != null)
                        {
                            var res = ExpressionEvaluator.Eval(conditionNode, subResolver);
                            if (!Convert.ToBoolean(res))
                            {
                                continue;
                            }
                        }

                        if (selectorNode == null)
                        {
                            result = item;
                            continue;
                        }

                        result = ExpressionEvaluator.Eval(selectorNode, subResolver);
                    }
                }

                return(result);
            }

            case "skip":
            {
                var result = new List <Object>();

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var list  = (IEnumerable)@params[0];
                    var count = ExpressionHelper.GetNumber(@params[1]);

                    foreach (var item in list)
                    {
                        if (count <= 0D)
                        {
                            result.Add(item);
                        }

                        count--;
                    }
                }

                return(result.ToArray());
            }

            case "take":
            {
                var result = new List <Object>();

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var list  = (IEnumerable)@params[0];
                    var count = ExpressionHelper.GetNumber(@params[1]);

                    foreach (var item in list)
                    {
                        if (result.Count == count)
                        {
                            break;
                        }

                        result.Add(item);
                    }
                }

                return(result.ToArray());
            }

            case "sortasc":
            {
                var items = new List <DictionaryEntry>();

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        var key = item;
                        if (selectorNode != null)
                        {
                            key = ExpressionEvaluator.Eval(selectorNode, subResolver);
                        }

                        var entry = new DictionaryEntry(key, item);
                        items.Add(entry);
                    }
                }

                var ordered = items.OrderBy(n => n.Key, ExpressionHelper.Comparer);
                var result  = ordered.Select(n => n.Value);

                return(result.ToArray());
            }

            case "sortdesc":
            {
                var items = new List <DictionaryEntry>();

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        var key = item;
                        if (selectorNode != null)
                        {
                            key = ExpressionEvaluator.Eval(selectorNode, subResolver);
                        }

                        var entry = new DictionaryEntry(key, item);
                        items.Add(entry);
                    }
                }

                var ordered = items.OrderByDescending(n => n.Key, ExpressionHelper.Comparer);
                var result  = ordered.Select(n => n.Value);

                return(result.ToArray());
            }

            case "select":
            {
                var result = new List <Object>();

                if (!(@params[0] is String) && @params[0] is IEnumerable)
                {
                    var selectorNode = (ExpressionNode)null;
                    if (@params.Count > 1)
                    {
                        selectorNode = (ExpressionNode)@params[1];
                    }

                    var conditionNode = (ExpressionNode)null;
                    if (@params.Count > 2)
                    {
                        conditionNode = (ExpressionNode)@params[2];
                    }

                    var dictionary = new Dictionary <String, Object> {
                        ["@"] = null
                    };
                    var subResolver = new DefaultDataResolver(dictionary, dataResolver);

                    var list = (IEnumerable)@params[0];

                    foreach (var item in list)
                    {
                        subResolver.SetValue("@", item);

                        if (conditionNode != null)
                        {
                            var res = ExpressionEvaluator.Eval(conditionNode, subResolver);
                            if (!Convert.ToBoolean(res))
                            {
                                continue;
                            }
                        }

                        if (selectorNode == null)
                        {
                            result.Add(item);
                            continue;
                        }

                        var obj = ExpressionEvaluator.Eval(selectorNode, subResolver);
                        result.Add(obj);
                    }
                }

                return(result.ToArray());
            }

            case "if":
            {
                var flag = Convert.ToBoolean(@params[0]);

                var trueNode  = (ExpressionNode)@params[1];
                var falseNode = (ExpressionNode)@params[2];

                if (flag)
                {
                    return(ExpressionEvaluator.Eval(trueNode, dataResolver));
                }

                return(ExpressionEvaluator.Eval(falseNode, dataResolver));
            }

            case "switch":
            {
                if (@params.Count % 2 > 0)
                {
                    throw new ArgumentOutOfRangeException();
                }

                var switchValue = @params[0];

                for (int i = 1; i < @params.Count; i += 2)
                {
                    var caseValue  = @params[i];
                    var resultNode = (ExpressionNode)@params[i + 1];

                    if (Equals(switchValue, caseValue))
                    {
                        return(ExpressionEvaluator.Eval(resultNode, dataResolver));
                    }
                }

                var defNode = (ExpressionNode)@params[@params.Count - 1];
                return(ExpressionEvaluator.Eval(defNode, dataResolver));
            }

            case "comp":
                return(ExpressionHelper.Compare(@params[0], @params[1]));

            case "lower":
                return(Convert.ToString(@params[0]).ToLower());

            case "upper":
                return(Convert.ToString(@params[0]).ToUpper());

            case "contains":
            {
                var collection = @params[0];
                if (collection == null)
                {
                    return(null);
                }

                var item = @params[1];
                if (item == null)
                {
                    return(null);
                }

                if (collection is IDictionary)
                {
                    var dictionary = (IDictionary)collection;
                    return(dictionary.Contains(item));
                }

                var type = collection.GetType();
                if (type.IsGenericType)
                {
                    var genericTypeDef = type.GetGenericTypeDefinition();
                    if (genericTypeDef == typeof(ISet <>) ||
                        genericTypeDef == typeof(IList <>) ||
                        genericTypeDef == typeof(IDictionary <,>))
                    {
                        var itemMethod = type.GetMethod("ContainsKey");
                        if (itemMethod == null)
                        {
                            itemMethod = type.GetMethod("Contains");
                        }

                        return(itemMethod.Invoke(collection, new[] { item }));
                    }
                }

                if (collection is IEnumerable && !(collection is String))
                {
                    var list = (IEnumerable)collection;

                    var query = (from n in list.OfType <Object>()
                                 where ExpressionHelper.Compare(n, item) == 0
                                 select n);

                    return(query.Any());
                }

                var strValue = Convert.ToString(collection);
                return(strValue.Contains(Convert.ToString(item)));
            }

            case "startswith":
            {
                var strValue = Convert.ToString(@params[0]);
                return(strValue.StartsWith(Convert.ToString(@params[1])));
            }

            case "endswith":
            {
                var strValue = Convert.ToString(@params[0]);
                return(strValue.EndsWith(Convert.ToString(@params[1])));
            }

            case "split":
            {
                var result = new String[0];

                if (@params.Count > 1)
                {
                    var strValue  = Convert.ToString(@params[0]);
                    var delimiter = Convert.ToString(@params[1]);

                    if (!ExpressionHelper.IsEmptyOrSpace(strValue) &&
                        !ExpressionHelper.IsEmptyOrSpace(delimiter))
                    {
                        var delimites = new[] { delimiter };
                        result = strValue.Split(delimites, StringSplitOptions.None);
                    }
                }

                return(result);
            }

            case "trim":
            {
                var strValue = Convert.ToString(@params[0]);
                return(strValue.Trim());
            }

            case "ltrim":
            {
                var strValue = Convert.ToString(@params[0]);
                return(strValue.TrimStart());
            }

            case "rtrim":
            {
                var strValue = Convert.ToString(@params[0]);
                return(strValue.TrimEnd());
            }

            case "getdaysinmonth":
            {
                if (ExpressionHelper.IsDateTime(@params[0]))
                {
                    var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                    return(DateTime.DaysInMonth(dateValue.Year, dateValue.Month));
                }

                var currDate = DateTime.Now.Date;

                var year  = (int)ExpressionHelper.GetNumber(@params.Count > 0 ? @params[0] : currDate.Year);
                var month = (int)ExpressionHelper.GetNumber(@params.Count > 1 ? @params[1] : currDate.Month);

                return(DateTime.DaysInMonth(year, month));
            }

            case "getyear":
            case "getyears":
            {
                if (@params.Count == 0)
                {
                    return(DateTime.Now.Year);
                }

                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Year);
            }

            case "getmonth":
            case "getmonths":
            {
                if (@params.Count == 0)
                {
                    return(DateTime.Now.Month);
                }

                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Month);
            }

            case "getday":
            case "getdays":
            case "getdayofmonth":
            {
                if (@params.Count == 0)
                {
                    return(DateTime.Now.Day);
                }

                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Day);
            }

            case "getdayofweek":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.DayOfWeek);
            }

            case "getdayofyear":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.DayOfYear);
            }

            case "gethours":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Hour);
            }

            case "getminutes":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Minute);
            }

            case "getseconds":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.Second);
            }

            case "gettotaldays":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);

                var timeSpan = TimeSpan.FromTicks(dateValue.Ticks);
                return(timeSpan.TotalDays);
            }

            case "gettotalhours":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);

                var timeSpan = TimeSpan.FromTicks(dateValue.Ticks);
                return(timeSpan.TotalHours);
            }

            case "gettotalminutes":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);

                var timeSpan = TimeSpan.FromTicks(dateValue.Ticks);
                return(timeSpan.TotalMinutes);
            }

            case "gettotalseconds":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);

                var timeSpan = TimeSpan.FromTicks(dateValue.Ticks);
                return(timeSpan.TotalSeconds);
            }

            case "gettotalmiliseconds":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);

                var timeSpan = TimeSpan.FromTicks(dateValue.Ticks);
                return(timeSpan.TotalMilliseconds);
            }

            case "addyears":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddYears((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "addmonths":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddMonths((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "adddays":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddDays((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "addhours":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddHours((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "addminutes":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddMinutes((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "addseconds":
            {
                var dateValue = ExpressionHelper.GetDateTime(@params[0]);
                return(dateValue.AddSeconds((int)ExpressionHelper.GetNumber(@params[1])));
            }

            case "print":
            {
                foreach (var item in @params)
                {
                    Console.WriteLine(item);
                }
            }
            break;
            }

            var message = $"Unknown function '{node}', check function name or count of parameters";

            throw new Exception(message);
        }