/// <summary> /// Expression construction /// </summary> internal Expression(ExpressionMode mode) { _flags = 0; switch(mode) { case ExpressionMode.None: break; case ExpressionMode.NonSharable: _flags |= InternalFlags.NonShareable; break; case ExpressionMode.ForwardsInvalidations: _flags |= InternalFlags.ForwardsInvalidations; _flags |= InternalFlags.NonShareable; break; case ExpressionMode.SupportsUnboundSources: _flags |= InternalFlags.ForwardsInvalidations; _flags |= InternalFlags.NonShareable; _flags |= InternalFlags.SupportsUnboundSources; break; default: throw new ArgumentException(SR.Get(SRID.UnknownExpressionMode)); } }
/// <summary> /// Expression construction /// </summary> internal Expression(ExpressionMode mode) { _flags = 0; switch (mode) { case ExpressionMode.None: break; case ExpressionMode.NonSharable: _flags |= InternalFlags.NonShareable; break; case ExpressionMode.ForwardsInvalidations: _flags |= InternalFlags.ForwardsInvalidations; _flags |= InternalFlags.NonShareable; break; case ExpressionMode.SupportsUnboundSources: _flags |= InternalFlags.ForwardsInvalidations; _flags |= InternalFlags.NonShareable; _flags |= InternalFlags.SupportsUnboundSources; break; default: throw new ArgumentException(SR.Get(SRID.UnknownExpressionMode)); } }
/// <summary> /// Where(WhereRelation,ExpressionMode,ExpressionRelation,object,object,object) 构造函数 /// </summary> /// <param name="_whereRelation">与前条件关系</param> /// <param name="_expressionMode">表达式模式</param> /// <param name="_expressionRelation">表达式关系</param> /// <param name="_field1">字段1的内容</param> /// <param name="_field2">字段2的内容</param> /// <param name="_field3">字段3的内容</param> public Where(WhereRelation _whereRelation, ExpressionMode _expressionMode, ExpressionRelation _expressionRelation, object _field1, object _field2, object _field3) { this.WhereRelation = _whereRelation; this.ExpressionMode = _expressionMode; this.ExpressionRelation = _expressionRelation; this.Field1 = _field1; this.Field2 = _field2; this.Field3 = _field3; this.HasSubWhere = false; this.Wheres = new WhereCollection(); }
public ExpressionMode mExpressionMode; // symbol rendering mode // Deserialization helper. public static ExpressionMode ParseExpressionMode(string str) { ExpressionMode em = ExpressionMode.Common; if (!string.IsNullOrEmpty(str)) { if (Enum.TryParse <ExpressionMode>(str, out ExpressionMode pem)) { em = pem; } } return(em); }
public object ValidationModeTesting(string expression) { var result = (object)null; using (ExpressionMode.BeginValidationMode()) { Assert.IsTrue(ExpressionMode.IsValidationMode, "Validation mode should be enabled"); result = Factory.Instance.Create().Compile(expression).EvalValue(null); } Assert.IsFalse(ExpressionMode.IsValidationMode, "Validation mode should be disabled"); return(result); }
public FragmentMatcher( int id, string name, PatternMatcher start = default, PatternMatcher end = default, IList <IMatcher> parts = default, PatternMatcher partsDelimiter = default, bool partsDelimiterRequired = true, PatternMatcher partsPadding = default, int?minMatchedParts = default, MatchMode partsMatchMode = default, bool isNoise = default, bool fallThrough = default, bool cacheable = default, bool clearCache = default, ExpressionMode expressionMode = default, int?expressionOrder = default, bool boundsAsParts = default, bool discardBounds = default, bool negate = default ) { Id = id; Name = name; Start = start; End = end; Parts = parts ?? new List <IMatcher>(); PartsDelimiter = partsDelimiter; PartsDelimiterRequired = partsDelimiterRequired; PartsPadding = partsPadding; MinMatchedParts = minMatchedParts; PartsMatchMode = partsMatchMode; IsNoise = isNoise; FallThrough = fallThrough; Cacheable = cacheable; ClearCache = clearCache; ExpressionMode = expressionMode; ExpressionOrder = expressionOrder; BoundsAsParts = boundsAsParts; DiscardBounds = discardBounds; Negate = negate; _hashCode = name.GetHashCode(); }
protected void ConvertToExpressionTree(FragmentMatchData matchData, ExpressionMode expressionMode) { IMatchData rootPart = matchData.Parts.ElementAtOrDefault(0); switch (expressionMode) { case ExpressionMode.BinaryTree: rootPart = ConvertToBinaryTree(matchData, rootPart); break; case ExpressionMode.LikeNameTree: rootPart = ConvertToLikeNameTree(matchData, rootPart); break; } matchData.Parts.Clear(); if (rootPart != null) { matchData.Parts.Add(rootPart); } }
internal Expression(ExpressionMode mode) { this.flags = Expression.InternalFlags.None; switch (mode) { case ExpressionMode.None: { return; } case ExpressionMode.NonSharable: { Expression expression = this; expression.flags = expression.flags | Expression.InternalFlags.NonShareable; return; } case ExpressionMode.ForwardsInvalidations: { Expression expression1 = this; expression1.flags = expression1.flags | Expression.InternalFlags.ForwardsInvalidations; Expression expression2 = this; expression2.flags = expression2.flags | Expression.InternalFlags.NonShareable; return; } case ExpressionMode.SupportsUnboundSources: { Expression expression3 = this; expression3.flags = expression3.flags | Expression.InternalFlags.ForwardsInvalidations; Expression expression4 = this; expression4.flags = expression4.flags | Expression.InternalFlags.NonShareable; Expression expression5 = this; expression5.flags = expression5.flags | Expression.InternalFlags.SupportsUnboundSources; return; } } throw new ArgumentException("UnknownExpressionMode"); }
/// <summary> /// initializes this expression holder /// </summary> /// <param name="expression">the expression that is being parsed</param> /// <param name="mode">the parsing mode of the expression</param> public ExpressionCompiler(string expression, ExpressionMode mode) { var lex = new ITVScriptingLexer(new AntlrInputStream(expression)); parser = new ITVScriptingParser(new CommonTokenStream(lex)); parser.RemoveErrorListeners(); parser.AddErrorListener(listener); //parser.ErrorHandler = new BailErrorStrategy(); object obj; if (mode == ExpressionMode.Expression) { obj = SingleExpression; } else { obj = Program; } Successful = parser.NumberOfSyntaxErrors == 0; SuspectLine = listener.SuspectLine; Errors = listener.GetAllErrors(); }
public string Generate(MatcherEngineGenerator generator) { string methodName = $"MatchFragment{GetSafeMethodName(Name)}"; string method = $"{methodName}(ref state, matchData)"; if (!generator.TryGetMethod(methodName, ref method)) { generator.Add(methodName, method); string code = $@"private bool {methodName}(ref State state, FragmentMatchData matchData) {{ {(generator.LanguageMatcher.LogMatches ? $@"int currentId = ++state.Id; state.MatchLogBuilder.AppendLine($""{{new String('\t', currentId)}} {{state.CurrentIndex}}. Try: {GetEscapedName()}"");" : null)} bool success = false; FragmentMatchData partMatcherData = null; {(Cacheable ? $@"if (!state.MatchCache.TryGetValue(new ValueTuple<string, int>(""{GetEscapedName()}"", state.CurrentIndex), out partMatcherData)) {{" : null)} int startIndex = state.CurrentIndex; int distinctIndex = state.DistinctIndex; partMatcherData = new FragmentMatchData {{ Name = ""{GetEscapedName()}"", StartIndex = state.CurrentIndex{(ExpressionOrder != null ? $@", ExpressionOrder = {ExpressionOrder}" : null)} }}; {(Start != null ? $"StringMatchData startMatchData;" : null)} {(End != null ? $"StringMatchData endMatchData;" : null)} success = ({(Start != null ? $"{string.Format(GenerateMatchFragmentBounds(generator, Start), DiscardBounds.ToString().ToLower(), "startMatchData")} && " : null)}{GenerateMatchFragmentParts(generator)}{(End != null ? $" && {string.Format(GenerateMatchFragmentBounds(generator, End), DiscardBounds.ToString().ToLower(), "endMatchData")}" : null)}); if (success) {{ {(!Negate ? $@"partMatcherData.Length = state.CurrentIndex - partMatcherData.StartIndex; partMatcherData.EndDistinctIndex = state.DistinctIndex;" : null)} {(Cacheable ? $@"state.MatchCache[new ValueTuple<string, int>(""{GetEscapedName()}"", startIndex)] = partMatcherData;" : null)} {(!IsNoise && ExpressionMode != ExpressionMode.None && !Negate ? $"ConvertToExpressionTree(partMatcherData, ExpressionMode.{ExpressionMode.ToString()});" : null)} {(BoundsAsParts && Start != null && !Negate ? $@"if (startMatchData != null) {{ partMatcherData.Parts.Insert(0, startMatchData); }}" : null)} {(BoundsAsParts && End != null && !Negate ? $@"if (endMatchData != null) {{ partMatcherData.Parts.Add(endMatchData); }}" : null)} }} else {{ {(Cacheable ? $@"state.MatchCache[new ValueTuple<string, int>(""{GetEscapedName()}"", startIndex)] = null;" : null)} {(!Negate ? $@"state.CurrentIndex = startIndex; state.DistinctIndex = distinctIndex;" : null)} }} {(Negate ? $@"state.CurrentIndex = startIndex; state.DistinctIndex = distinctIndex;" : null)} {(Cacheable ? $@"}}" : null)} {(Cacheable && !Negate ? $@"else if (success = partMatcherData != null) {{ state.CurrentIndex = partMatcherData.StartIndex + partMatcherData.Length; state.DistinctIndex = partMatcherData.EndDistinctIndex; }}" : null)} {(!Negate ? $@"if (success) {{ {(!IsNoise && FallThrough ? "matchData.Parts.AddRange(partMatcherData.Parts);" : null)} {(!IsNoise && !FallThrough ? "matchData.Parts.Add(partMatcherData);" : null)} {(ClearCache ? "state.MatchCache.Clear();" : null)} }}" : null)} {(generator.LanguageMatcher.LogMatches ? $@"state.MatchLogBuilder.AppendLine($""{{new String('\t', currentId)}} {{state.CurrentIndex}}. {{({(Negate ? "!" : null)}success ? ""Passed"" : ""Failed"")}}: {GetEscapedName()}""); state.Id = currentId - 1;" : null)} return {(Negate ? "!" : null)}success; }}"; method = generator.Add(method, methodName, code); } return(method); }
private string GetExpression(ExpressionMode _expressionMode, ExpressionRelation _expressionRelation, object _fieldObject1, object _fieldObject2, object _fieldObject3, ref SqlCommand _sqlCommand, Random _random) { string _return = ""; string _field1 = _fieldObject1 == null ? "" : _fieldObject1.ToString(); string _field2 = _fieldObject2 == null ? "" : _fieldObject2.ToString(); string _field3 = _fieldObject3 == null ? "" : _fieldObject3.ToString(); if (_expressionRelation != ExpressionRelation.Custom) { switch (_expressionMode) { case ExpressionMode.FieldVsField: _field1 = "[" + _field1.Replace(".", "].[") + "]"; _field2 = "[" + _field2.Replace(".", "].[") + "]"; _field3 = "[" + _field3.Replace(".", "].[") + "]"; _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.FieldVsFieldVsField: _field1 = "[" + _field1.Replace(".", "].[") + "]"; _field2 = "[" + _field2.Replace(".", "].[") + "]"; _field3 = "[" + _field3.Replace(".", "].[") + "]"; _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.FieldVsFieldVsValue: _field3 = "@" + _field1.Replace(".", "_") + _random.Next().ToString(); _field1 = "[" + _field1.Replace(".", "].[") + "]"; _field2 = "[" + _field2.Replace(".", "].[") + "]"; _sqlCommand.Parameters.AddWithValue(_field3, _fieldObject3); _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.FieldVsValue: _field2 = "@" + _field1.Replace(".", "_") + _random.Next().ToString(); _field1 = "[" + _field1.Replace(".", "].[") + "]"; _field3 = "[" + _field1.Replace(".", "].[") + "]"; if (_expressionRelation == ExpressionRelation.Like) { SqlParameter _sqlParameter = new SqlParameter(_field2, SqlDbType.NVarChar); _sqlParameter.Value = _fieldObject2; _sqlCommand.Parameters.Add(_sqlParameter); } else if (_expressionRelation == ExpressionRelation.In || _expressionRelation == ExpressionRelation.NotIn) { object[] _array = (object[])_fieldObject2; string _field2Value = ""; foreach (object _value in _array) { _field2Value += _field2Value == "" ? "" : ","; string _field2Name = _field2 + _random.Next().ToString(); _field2Value += _field2Name; _sqlCommand.Parameters.AddWithValue(_field2Name, _value); } _field2 = _field2Value; } else if (_fieldObject2.GetType() == Guid.NewGuid().GetType()) { SqlParameter _sqlParameter = new SqlParameter(_field2, SqlDbType.UniqueIdentifier); _sqlParameter.Value = _fieldObject2; _sqlCommand.Parameters.Add(_sqlParameter); } else { _sqlCommand.Parameters.AddWithValue(_field2, _fieldObject2); } _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.FieldVsValueVsField: _field2 = "@" + _field1.Replace(".", "_") + _random.Next().ToString(); _field1 = "[" + _field1.Replace(".", "].[") + "]"; _field3 = "[" + _field1.Replace(".", "].[") + "]"; _sqlCommand.Parameters.AddWithValue(_field2, _fieldObject2); _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.FieldVsValueVsValue: _field2 = "@" + _field1.Replace(".", "_") + "1" + _random.Next().ToString(); _field3 = "@" + _field1.Replace(".", "_") + "2" + _random.Next().ToString(); _field1 = "[" + _field1.Replace(".", "].[") + "]"; _sqlCommand.Parameters.AddWithValue(_field2, _fieldObject2); _sqlCommand.Parameters.AddWithValue(_field3, _fieldObject3); _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.ValueVsValueVsValue: _field1 = "@" + _field1.Replace(".", "_") + "1" + _random.Next().ToString(); _field2 = "@" + _field1.Replace(".", "_") + "2" + _random.Next().ToString(); _field3 = "@" + _field1.Replace(".", "_") + "3" + _random.Next().ToString(); _sqlCommand.Parameters.AddWithValue(_field1, _fieldObject1); _sqlCommand.Parameters.AddWithValue(_field2, _fieldObject2); _sqlCommand.Parameters.AddWithValue(_field3, _fieldObject3); _return = GetExpresstionString(_expressionRelation, _field1, _field2, _field3); break; case ExpressionMode.Custom: _field1 = _fieldObject1.ToString(); _field2 = ""; _field3 = ""; _return = " " + _field1; break; } } else { _return = _fieldObject1.ToString(); } return(_return); }
/// <summary> /// Creates a new expression. /// </summary> /// <param name="conn">The conn.</param> /// <param name="classDef">The class def.</param> /// <param name="mode">The mode.</param> /// <returns></returns> public static string NewExpression(FdoConnection conn, ClassDefinition classDef, Dictionary<string, ClassDefinition> aliasedClasses, ExpressionMode mode) { ExpressionEditor dlg = new ExpressionEditor(conn, classDef, aliasedClasses, mode); if (dlg.ShowDialog() == DialogResult.OK) { return dlg.txtExpression.Text.Trim(); } return null; }
/// <summary> /// Initializes a new instance of the <see cref="ExpressionEditor"/> class. /// </summary> /// <param name="conn">The conn.</param> /// <param name="classDef">The class def.</param> /// <param name="mode">The mode.</param> internal ExpressionEditor(FdoConnection conn, ClassDefinition classDef, Dictionary<string, ClassDefinition> aliasedClasses, ExpressionMode mode) : this() { _conn = conn; _ClassDef = classDef; _aliasedClasses = aliasedClasses ?? new Dictionary<string, ClassDefinition>(); _ExprMode = mode; }
internal ExpressionEditor() { InitializeComponent(); InitAutoComplete(); _FunctionMenuItems = new Dictionary<FunctionCategoryType, ToolStripMenuItem>(); _ExprMode = ExpressionMode.Filter; this.Text = ResourceService.GetString("TITLE_EXPRESSION_EDITOR"); }
private void Add(WhereRelation _relation, object[] _values) { bool[] _fields = new bool[_values.Length]; for (int i = 0; i < _fields.Length; i++) { _fields[i] = _values[i].GetType() == typeof(string) && Regex.IsMatch(_values[i].ToString(), @"\[.+\]"); if (_fields[i]) { _values[i] = _values[i].ToString().Substring(1, _values[i].ToString().Length - 2); } } switch (_values.Length) { case 1: #region 1 自定义条件(string) or 是否有自条件(bool) or 条件对象(Condition) { if (_values[0].GetType() == typeof(Where)) { base.Add((Where)_values[0]); } else if (_values[0].GetType() == typeof(bool)) { base.Add(new Where(_relation, (bool)_values[0])); } else { base.Add(new Where(_relation, _values[0].ToString())); } break; } #endregion case 2: #region 2 单一字段条件 NULL,NOTNULL { switch (_values[1].ToString()) { case "NULL": base.Add(new Where(_relation, ExpressionMode.FieldVsField, ExpressionRelation.Null, _values[0])); break; case "NOTNULL": base.Add(new Where(_relation, ExpressionMode.FieldVsField, ExpressionRelation.NotNull, _values[0])); break; } break; } #endregion case 3: #region 3 两个字段条件 =,<>,>,>=,<,<=,LIKE,NOTLIKE,IN,NOTIN { ExpressionMode _mode = _fields[2] ? ExpressionMode.FieldVsField : ExpressionMode.FieldVsValue; switch (_values[1].ToString()) { case "=": base.Add(new Where(_relation, _mode, ExpressionRelation.Equal, _values[0], _values[2])); break; case "<>": base.Add(new Where(_relation, _mode, ExpressionRelation.NotEqual, _values[0], _values[2])); break; case ">": base.Add(new Where(_relation, _mode, ExpressionRelation.MoreThen, _values[0], _values[2])); break; case ">=": base.Add(new Where(_relation, _mode, ExpressionRelation.MoreEqualThen, _values[0], _values[2])); break; case "<": base.Add(new Where(_relation, _mode, ExpressionRelation.LessThen, _values[0], _values[2])); break; case "<=": base.Add(new Where(_relation, _mode, ExpressionRelation.LessEqualThen, _values[0], _values[2])); break; case "LIKE": base.Add(new Where(_relation, _mode, ExpressionRelation.Like, _values[0], _values[2])); break; case "NOTLIKE": base.Add(new Where(_relation, _mode, ExpressionRelation.NotLike, _values[0], _values[2])); break; case "IN": #region IN { object[] _valueList; if (_values[2].GetType() == typeof(Array) || _values[2].GetType().BaseType == typeof(Array)) { List <object> _objects = new List <object>(); Array _array = (Array)_values[2]; for (int i = 0; i < _array.Length; i++) { _objects.Add(_array.GetValue(i)); } _valueList = _objects.ToArray(); } else { _valueList = new object[] { _values[2] }; } base.Add(new Where(_relation, ExpressionMode.FieldVsValue, ExpressionRelation.In, _values[0], _valueList)); break; } #endregion case "NOTIN": #region NOTIN { object[] _valueList; if (_values[2].GetType() == typeof(Array) || _values[2].GetType().BaseType == typeof(Array)) { _valueList = (object[])_values[2]; } else { _valueList = new object[] { _values[2] }; } base.Add(new Where(_relation, ExpressionMode.FieldVsValue, ExpressionRelation.NotIn, _values[0], _valueList)); break; } #endregion } break; } #endregion default: #region 个以上字段条件 BETWEEN,NOTBETWEEN,IN,NOTIN { if ((_values[1].ToString() == "BETWEEN" || _values[1].ToString() == "NOTBETWEEN") && _fields.Length == 4) { ExpressionRelation _expressRelation = _values[1].ToString() == "BETWEEN" ? ExpressionRelation.Between : ExpressionRelation.NotBetween; ExpressionMode _mode = ExpressionMode.FieldVsValueVsValue; if (_fields[2] && _fields[3]) { _mode = ExpressionMode.FieldVsFieldVsField; } if (_fields[2] && !_fields[3]) { _mode = ExpressionMode.FieldVsFieldVsValue; } if (!_fields[2] && _fields[3]) { _mode = ExpressionMode.FieldVsValueVsField; } if (!_fields[2] && !_fields[3]) { _mode = ExpressionMode.FieldVsValueVsValue; } base.Add(new Where(_relation, _mode, _expressRelation, _values[0], _values[2], _values[3])); } else if (_values[1].ToString() == "IN" || _values[1].ToString() == "NOTIN") { ExpressionRelation _expressRelation = _values[1].ToString() == "IN" ? ExpressionRelation.In : ExpressionRelation.NotIn; if (_values[2] is Array) { base.Add(new Where(_relation, ExpressionMode.FieldVsValue, _expressRelation, _values[0], _values[2])); } else { object[] _valueList = new object[_values.Length - 2]; Array.Copy(_values, 2, _valueList, 0, _valueList.Length); base.Add(new Where(_relation, ExpressionMode.FieldVsValue, _expressRelation, _values[0], _valueList)); } } break; } #endregion } }
public ExpressionBase(ExpressionMode mode) : base((System.Windows.ExpressionMode)mode) { }