static IEnumerable <SearchItem> ProcessIterableSelector(SearchExpressionContext c, IEnumerable <SearchItem> results, SearchExpression selector) { var selectorName = c.ResolveAlias(selector, selector.name); foreach (var r in results) { if (r == null) { yield return(null); continue; } using (c.runtime.Push(r)) { foreach (var sv in selector.Execute(c)) { if (sv == null) { yield return(null); } else { AddSelectedValue(r, selectorName, null, sv.value); yield return(r); break; } } } } }
public static IEnumerable <SearchItem> WhereNone(SearchExpressionContext c, IEnumerable <SearchItem> mapSet, SearchExpression mapQuery) { foreach (var m in mapSet) { if (m == null) { yield return(null); } else { using (c.runtime.Push(m)) { var yieldResults = false; foreach (var e in mapQuery.Execute(c)) { if (e != null) { yieldResults = true; break; } } if (!yieldResults) { yield return(m); } } } } }
public IEnumerable <object> Evaluate(SearchContext context, bool reevaluateLiterals = false) { if (expression == null) { return new[] { rawText.ToString() } } ; if (expression.types.HasAny(SearchExpressionType.Literal) && !reevaluateLiterals) { return new[] { value } } ; return(expression.Execute(context).Where(item => item != null).Select(item => item.value)); }
public static bool Check(SearchExpression e, SearchExpressionContext c) { var result = e.Execute(c); var count = result.Count(); if (count == 0) { return(false); } if (count == 1) { return(IsTrue(result.First())); } return(true); }
public static IEnumerable <SearchItem> Evaluate(SearchExpressionContext c, SearchExpression expression) { var concurrentList = new ConcurrentBag <SearchItem>(); var yieldSignal = new EventWaitHandle(false, EventResetMode.AutoReset); var task = Task.Run(() => { var enumerable = expression.Execute(c, SearchExpressionExecutionFlags.ThreadedEvaluation); foreach (var searchItem in enumerable) { if (searchItem != null) { concurrentList.Add(searchItem); yieldSignal.Set(); } } }); while (!concurrentList.IsEmpty || !TaskHelper.IsTaskFinished(task)) { if (!yieldSignal.WaitOne(0)) { if (concurrentList.IsEmpty) { Dispatcher.ProcessOne(); } yield return(null); } while (concurrentList.TryTake(out var item)) { yield return(item); } } if (task.IsFaulted && task.Exception?.InnerException != null) { if (task.Exception.InnerException is SearchExpressionEvaluatorException sex) { throw sex; } UnityEngine.Debug.LogException(task.Exception.InnerException); } }
static IEnumerable <SearchItem> Random(SearchExpressionContext c, SearchExpression e) { var set = new List <SearchItem>(); foreach (var item in e.Execute(c)) { if (item != null) { set.Add(item); } yield return(null); // Wait until we have all results. } var randomItem = Random(set); // Rename random item label if an alias is defined. if (c.ResolveAlias(e) is string alias) { randomItem.label = alias; } yield return(randomItem); }
public static bool TryParse(StringView text, out QueryMarker marker) { marker = none; if (!IsQueryMarker(text)) { return(false); } var innerText = text.Substring(k_StartToken.Length, text.Length - k_StartToken.Length - k_EndToken.Length); var indexOfColon = innerText.IndexOf(':'); if (indexOfColon < 0) { return(false); } var controlType = innerText.Substring(0, indexOfColon).Trim().ToString(); var args = new List <StringView>(); var level = 0; var currentArgStart = indexOfColon + 1; for (var i = currentArgStart; i < innerText.Length; ++i) { if (ParserUtils.IsOpener(innerText[i])) { ++level; } if (ParserUtils.IsCloser(innerText[i])) { --level; } if (innerText[i] != ',' || level != 0) { continue; } if (i + 1 == innerText.Length) { return(false); } args.Add(innerText.Substring(currentArgStart, i - currentArgStart).Trim()); currentArgStart = i + 1; } if (currentArgStart == innerText.Length) { return(false); // No arguments } // Extract the final argument, since there is no comma after the last argument args.Add(innerText.Substring(currentArgStart, innerText.Length - currentArgStart).Trim()); var queryMarkerArguments = new List <QueryMarkerArgument>(); using (var context = SearchService.CreateContext("")) { foreach (var arg in args) { var parserArgs = new SearchExpressionParserArgs(arg, context, SearchExpressionParserFlags.ImplicitLiterals); SearchExpression expression = null; try { expression = SearchExpression.Parse(parserArgs); } catch (SearchExpressionParseException) { } if (expression == null || !expression.types.HasAny(SearchExpressionType.Literal)) { queryMarkerArguments.Add(new QueryMarkerArgument { rawText = arg, expression = expression, value = expression == null ? arg.ToString() : null }); continue; } var results = expression.Execute(context); var resolvedValue = results.FirstOrDefault(item => item != null); var resolvedValueObject = resolvedValue?.value; queryMarkerArguments.Add(new QueryMarkerArgument { rawText = arg, expression = expression, value = resolvedValueObject }); } } marker = new QueryMarker { type = controlType, text = text, args = queryMarkerArguments.ToArray() }; return(true); }
internal static IEnumerable <SearchItem> Evaluate(SearchExpressionContext c, SearchExpression expression) { var concurrentList = new ConcurrentBag <SearchItem>(); var yieldSignal = new EventWaitHandle(false, EventResetMode.AutoReset); var cancelToken = c.search.sessions.cancelToken; var task = Task.Run(() => { var enumerable = expression.Execute(c, SearchExpressionExecutionFlags.ThreadedEvaluation); foreach (var searchItem in enumerable) { if (cancelToken.IsCancellationRequested) { if (c.search.options.HasAny(SearchFlags.Debug)) { UnityEngine.Debug.LogWarning($"Interrupt {c.search.sessionId}"); } return; } if (searchItem != null) { concurrentList.Add(searchItem); yieldSignal.Set(); } } }); while (!concurrentList.IsEmpty || !TaskHelper.IsTaskFinished(task)) { if (cancelToken.IsCancellationRequested) { if (c.search.options.HasAny(SearchFlags.Debug)) { UnityEngine.Debug.LogWarning($"Interrupt {c.search.sessionId}"); } break; } if (!yieldSignal.WaitOne(0)) { if (concurrentList.IsEmpty) { Dispatcher.ProcessOne(); } yield return(null); } while (concurrentList.TryTake(out var item)) { yield return(item); } } yieldSignal.Dispose(); yieldSignal = null; if (task.IsFaulted && task.Exception?.InnerException != null) { if (task.Exception.InnerException is SearchExpressionEvaluatorException sex) { throw sex; } UnityEngine.Debug.LogException(task.Exception.InnerException); } }
internal static SearchExpression CreateStreamExpression(SearchExpression currentStream, string name = "<streamexpr>") { var exp = new SearchExpression(SearchExpressionType.Function, name.GetStringView(), new SearchExpressionEvaluator("StreamEvaluator", context => currentStream.Execute(context), SearchExpressionEvaluationHints.Default)); return(exp); }