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; }
public MultipleDataReader(SqlDataReader reader, IDataResolver resolver = null) { _reader = reader; _disposedValue = false; _resolver = resolver == null ? new DefaultDataResolver() : resolver; HasNext = true; }
/// <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); }
/// <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); }
/// <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]; }
/// <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); }
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); }
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; }
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); }
/// <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); }
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; }
/// <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); }
/// <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); } } }
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; } }
/// <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)); }
/// <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)); }
public MultipleBulkDataReader(DataSet dataset, IDataResolver resolver = null) { _dataset = dataset; _tables = dataset.Tables.Cast <DataTable>().Select(table => new BulkDataReader(table, resolver)).ToArray(); _disposedValue = false; }
/// <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) }); }
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"); } }
/// <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); }
/// <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)); }
/// <summary> /// Выполнение диалога /// </summary> /// <param name="summary">Результаты запроса</param> /// <param name="dataResolver">Объект для дополнительной загрузки данных</param> public void ShowDialog(RequestSummary summary, IDataResolver dataResolver) { _summary = summary; _dataResolver = dataResolver; BuildSalesView(); base.ShowDialog(); }
/// <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; }
/// <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)); }
/// <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)); }
public DefaultDataResolver(IDictionary <String, Object> dictionary, IDataResolver parentResolver) { _dictionary = dictionary; _parentResolver = parentResolver; }
public DefaultDataResolver(IDataResolver parentResolver) : this(new Dictionary <String, Object>(), parentResolver) { }
/// <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; }
public XMLContext(IDataResolver parenResolver) : base(parenResolver) { }
/// <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); }
public BulkDataReader(DataTable table, IDataResolver resolver = null) { _table = table; _resolver = resolver == null ? new DefaultDataResolver() : resolver; _disposedValue = false; }
public WrappedDataResolver(IDataResolver resolver) { _resolver = resolver; }
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); }