private async Task GetAggregationQueryInfoAsync(IQueryParser parser, string query, bool isValid, int maxNodeDepth, HashSet <string> fields, Dictionary <string, ICollection <string> > operations)
        {
            IQueryNode queryNode;
            var        context = new ElasticQueryVisitorContext {
                QueryType = QueryType.Aggregation
            };

            try {
                queryNode = await parser.ParseAsync(query, context);
            } catch (Exception ex) {
                _logger.LogError(ex, "Error parsing query: {Message}", ex.Message);
                if (isValid)
                {
                    throw;
                }

                return;
            }

            var info = await ValidationVisitor.RunAsync(queryNode, context);

            Assert.Equal(QueryType.Aggregation, info.QueryType);
            Assert.Equal(isValid, info.IsValid);
            Assert.Equal(maxNodeDepth, info.MaxNodeDepth);
            Assert.Equal(fields, info.ReferencedFields);
            Assert.Equal(operations, info.Operations.ToDictionary(pair => pair.Key, pair => pair.Value));
        }
        private async Task GetQueryInfoAsync(IQueryParser parser)
        {
            const string query  = "stuff hey:now nested:(stuff:33)";
            var          result = await parser.ParseAsync(query);

            var info = await ValidationVisitor.RunAsync(result);

            Assert.Equal(QueryType.Query, info.QueryType);
            Assert.Equal(2, info.MaxNodeDepth);
            Assert.Equal(new HashSet <string> {
                "",
                "hey",
                "nested",
                "stuff"
            }, info.ReferencedFields);
        }