Exemplo n.º 1
0
        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;
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
 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);
                 }
             }
         }
     }
 }
Exemplo n.º 3
0
 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));
 }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 9
0
        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);
        }