コード例 #1
0
        public static IEnumerable <SearchItem> Last(SearchExpressionContext c)
        {
            SearchExpressionValidator.ValidateExpressionArguments(c, new[]
            {
                new SearchExpressionValidator.Signature().AddArgument(SearchExpressionType.Iterable, true, false),
                new SearchExpressionValidator.Signature().AddArgument(SearchExpressionType.Number).AddArgument(SearchExpressionType.Iterable, true, false)
            });

            var argIndex   = 0;
            var takeNumber = 1;

            if (c.args[0].types.HasFlag(SearchExpressionType.Number))
            {
                ++argIndex;
                takeNumber = Math.Max((int)(c.args[0].GetNumberValue(takeNumber)), 0);
            }

            var queue = new Queue <SearchItem>(takeNumber);

            return(c.ForEachArgument((context, e) =>
            {
                queue.Clear();
                if (takeNumber == 0)
                {
                    context.Break();
                }
            }, argIndex).AggregateResults(queue, (context, item, aggregator) =>
            {
                if (queue.Count == takeNumber)
                {
                    queue.Dequeue();
                }
                queue.Enqueue(item);
            }));
        }
コード例 #2
0
        internal static SearchExpression NamedParser(SearchExpressionParserArgs args)
        {
            var text = ParserUtils.SimplifyExpression(args.text);

            if (text.IsNullOrEmpty())
            {
                return(null);
            }

            var match = ParserUtils.namedExpressionStartRegex.Match(text.ToString());

            if (!match.Success || match.Index != 0 || match.Groups["name"].Length == 0)
            {
                return(null);
            }

            var expressionsStartAndLength = ParserUtils.GetExpressionsStartAndLength(text, out _);

            if (expressionsStartAndLength.Length != 1)
            {
                return(null);
            }

            var expressionName = match.Groups["name"].Value;

            if ((expressionName.Length + expressionsStartAndLength[0].length) != text.length)
            {
                return(null);
            }

            var evaluator           = EvaluatorManager.GetEvaluatorByNameDuringParsing(expressionName, text.Substring(0, expressionName.Length));
            var parametersText      = text.Substring(expressionName.Length, text.length - expressionName.Length);
            var parametersPositions = ParserUtils.ExtractArguments(parametersText, expressionName);
            var parameters          = new List <SearchExpression>();

            var argsWith    = SearchExpressionParserFlags.None;
            var argsWithout = SearchExpressionParserFlags.ImplicitLiterals;

            ApplyEvaluatorHints(evaluator.hints, ref argsWith, ref argsWithout);
            foreach (var paramText in parametersPositions)
            {
                parameters.Add(ParserManager.Parse(args.With(paramText, argsWith).Without(argsWithout)));
            }

            if (!evaluator.hints.HasFlag(SearchExpressionEvaluationHints.DoNotValidateSignature) &&
                args.HasOption(SearchExpressionParserFlags.ValidateSignature))
            {
                var signatures = EvaluatorManager.GetSignaturesByName(expressionName);
                if (signatures != null)
                {
                    SearchExpressionValidator.ValidateExpressionArguments(evaluator, parameters.ToArray(), signatures, text);
                }
            }

            var expressionText = ParserUtils.SimplifyExpression(expressionsStartAndLength[0].Substring(1, expressionsStartAndLength[0].length - 2));

            return(new SearchExpression(SearchExpressionType.Function, args.text, expressionText, evaluator, parameters.ToArray()));
        }
コード例 #3
0
        public static void AddSignature(string name, SearchExpressionValidator.Signature signature)
        {
            name = name.ToLowerInvariant();
            string error = "";

            if (!SearchExpressionValidator.ValidateSignature(name, signature, ref error))
            {
                Debug.LogError($"Invalid signature for {name}({signature}) : {error}");
                return;
            }

            if (!evaluatorSignatures.TryGetValue(name.ToLowerInvariant(), out var signatures))
            {
                signatures = new List <SearchExpressionValidator.Signature>();
                evaluatorSignatures.Add(name, signatures);
            }
            evaluatorSignatures[name].Add(signature);
        }