Exemple #1
0
        public async Task VerifyRootNestedAliasAsync()
        {
            var client  = GetClient();
            var visitor = new AliasMappingVisitor(client.Infer);
            var walker  = new MappingWalker(visitor);

            walker.Accept(new TypeMappingDescriptor <Employee>().Properties(p => p
                                                                            .Object <object>(o => o.Name("data").Properties(p1 => p1
                                                                                                                            .Keyword(f => f.Name("Profile_URL").RootAlias("url"))))));

            var map = visitor.RootAliasMap;

            Assert.Equal(2, map.Count);
            Assert.True(map.ContainsKey("url"));
            Assert.Equal("data.Profile_URL", map["url"].Name);
            Assert.False(map["url"].HasChildMappings);

            Assert.True(map.ContainsKey("data"));
            Assert.Equal("data", map["data"].Name);
            Assert.False(map["data"].HasChildMappings);

            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("url:test");

            var aliased = await AliasedQueryVisitor.RunAsync(result, map);

            Assert.Equal("data.Profile_URL:test", aliased.ToString());
        }
 public async Task CanUseAliasMapForTopLevelAliasAsync() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("field1:value");
     var aliasMap = new FieldMap { { "field1", "field2" } };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("field2:value", aliased.ToString());
 }
        public async Task CanSkipIncludes()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("outter @include:other @skipped:(other stuff @include:other)");

            var includes = new Dictionary <string, string> {
                { "other", "field:value" },
                { "nested", "field:value @include:other" }
            };
            var resolved = await IncludeVisitor.RunAsync(result, includes, shouldSkipInclude : (n, ctx) => true);

            Assert.Equal("outter @include:other @skipped:(other stuff @include:other)", resolved.ToString());

            resolved = await IncludeVisitor.RunAsync(result, includes, shouldSkipInclude : ShouldSkipInclude);

            Assert.Equal("outter (field:value) @skipped:(other stuff @include:other)", resolved.ToString());

            resolved = await IncludeVisitor.RunAsync(result, includes, shouldSkipInclude : (n, ctx) => !ShouldSkipInclude(n, ctx));

            Assert.Equal("outter (field:value) @skipped:(other stuff (field:value))", resolved.ToString());

            var nestedResult = await parser.ParseAsync("outter @skipped:(other stuff @include:nested)");

            resolved = await IncludeVisitor.RunAsync(nestedResult, includes, shouldSkipInclude : ShouldSkipInclude);

            Assert.Equal("outter @skipped:(other stuff @include:nested)", resolved.ToString());
        }
        public EventStackFilter()
        {
            var stackOnlyFields = _stackOnlyFields.Union(_stackOnlySpecialFields);
            var stackFields     = stackOnlyFields.Union(_stackAndEventFields);

            _parser            = new LuceneQueryParser();
            _eventQueryVisitor = new ChainedQueryVisitor();
            _eventQueryVisitor.AddVisitor(new RemoveFieldsQueryVisitor(stackOnlyFields));
            _eventQueryVisitor.AddVisitor(new CleanupQueryVisitor());

            _stackQueryVisitor = new ChainedQueryVisitor();
            // remove everything not in the stack fields list
            _stackQueryVisitor.AddVisitor(new RemoveFieldsQueryVisitor(f => !stackFields.Contains(f)));
            _stackQueryVisitor.AddVisitor(new CleanupQueryVisitor());
            // handles stack special fields and changing event field names to their stack equivalent
            _stackQueryVisitor.AddVisitor(new StackFilterQueryVisitor());
            _stackQueryVisitor.AddVisitor(new CleanupQueryVisitor());

            _invertedStackQueryVisitor = new ChainedQueryVisitor();
            // remove everything not in the stack fields list
            _invertedStackQueryVisitor.AddVisitor(new RemoveFieldsQueryVisitor(f => !stackFields.Contains(f)));
            _invertedStackQueryVisitor.AddVisitor(new CleanupQueryVisitor());
            // handles stack special fields and changing event field names to their stack equivalent
            _invertedStackQueryVisitor.AddVisitor(new StackFilterQueryVisitor());
            _invertedStackQueryVisitor.AddVisitor(new CleanupQueryVisitor());
            // inverts the filter
            _invertedStackQueryVisitor.AddVisitor(new InvertQueryVisitor(_stackNonInvertedFields));
            _invertedStackQueryVisitor.AddVisitor(new CleanupQueryVisitor());
        }
        public async Task CanParseFieldRegex()
        {
            string query = @"myfield:/\(\[A-Za-z\]+\).*?/";

#if ENABLE_TRACING
            var tracer = new LoggingTracer(_logger, reportPerformance: true);
#else
            var tracer = NullTracer.Instance;
#endif
            var parser = new LuceneQueryParser {
                Tracer = tracer
            };

            try {
                var result = await parser.ParseAsync(query);

                _logger.LogInformation(await DebugQueryVisitor.RunAsync(result));
                string generatedQuery = await GenerateQueryVisitor.RunAsync(result);

                Assert.Equal(query, generatedQuery);

                var groupNode = result as GroupNode;
                Assert.NotNull(groupNode);
                var leftNode = groupNode.Left as TermNode;
                Assert.NotNull(leftNode);
                Assert.Equal("myfield", leftNode.Field);
                Assert.True(leftNode.IsRegexTerm);
            } catch (FormatException ex) {
                var cursor = ex.Data["cursor"] as Cursor;
                throw new FormatException($"[{cursor.Line}:{cursor.Column}] {ex.Message}", ex);
            }
        }
        public static QueryProcessResult Process(string query)
        {
            if (String.IsNullOrWhiteSpace(query))
            {
                return new QueryProcessResult {
                           IsValid = true
                }
            }
            ;

            GroupNode result;

            try {
                var parser = new LuceneQueryParser();

                result = parser.Parse(query);
            } catch (Exception ex) {
                return(new QueryProcessResult {
                    Message = ex.Message
                });
            }

            var validator = new QueryProcessorVisitor(_freeFields);
            var context   = new ElasticQueryVisitorContext();

            result.Accept(validator, context);

            var expandedQuery = validator.UsesDataFields ? GenerateQueryVisitor.Run(result) : query;

            return(new QueryProcessResult {
                IsValid = true,
                UsesPremiumFeatures = validator.UsesPremiumFeatures,
                ExpandedQuery = expandedQuery
            });
        }
Exemple #7
0
        public static async Task <EventStackFilterQueryResult> RunAsync(string query, EventStackFilterQueryMode queryMode, IQueryVisitorContext context = null)
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync(query, context).AnyContext();

            return(await RunAsync(result, queryMode, context).AnyContext());
        }
        public async Task CanUseForwardSlashes()
        {
            string query = @"hey/now";

#if ENABLE_TRACING
            var tracer = new LoggingTracer(_logger, reportPerformance: true);
#else
            var tracer = NullTracer.Instance;
#endif
            var parser = new LuceneQueryParser {
                Tracer = tracer
            };

            try {
                var result = await parser.ParseAsync(query);

                _logger.LogInformation(await DebugQueryVisitor.RunAsync(result));
                string generatedQuery = await GenerateQueryVisitor.RunAsync(result);

                Assert.Equal(query, generatedQuery);
            } catch (FormatException ex) {
                _logger.LogInformation(tracer.ToString());
                var cursor = ex.Data["cursor"] as Cursor;
                throw new FormatException($"[{cursor.Line}:{cursor.Column}] {ex.Message}", ex);
            }
        }
Exemple #9
0
        public async Task CanParseEscapedQuery(string escaped)
        {
            // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters
            // + - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
            string query = @"\" + escaped;

#if ENABLE_TRACING
            var tracer = new LoggingTracer(_logger, reportPerformance: true);
#else
            var tracer = NullTracer.Instance;
#endif
            var parser = new LuceneQueryParser {
                Tracer = tracer
            };

            try {
                _logger.LogInformation($"Attempting: {escaped}");
                var result = await parser.ParseAsync(query);

                _logger.LogInformation(await DebugQueryVisitor.RunAsync(result));
                string generatedQuery = await GenerateQueryVisitor.RunAsync(result);

                Assert.Equal(query, generatedQuery);
            } catch (FormatException ex) {
                var cursor = ex.Data["cursor"] as Cursor;
                throw new FormatException($"[{cursor.Line}:{cursor.Column}] {ex.Message}", ex);
            }
        }
Exemple #10
0
        private async Task ParseAndValidateQuery(string query, string expected, bool isValid)
        {
#if ENABLE_TRACING
            var tracer = new LoggingTracer(_logger, reportPerformance: true);
#else
            var tracer = NullTracer.Instance;
#endif
            var parser = new LuceneQueryParser {
                Tracer = tracer
            };

            IQueryNode result;
            try {
                result = await parser.ParseAsync(query);
            } catch (FormatException ex) {
                Assert.False(isValid, ex.Message);
                return;
            }

            string nodes = await DebugQueryVisitor.RunAsync(result);

            _logger.LogInformation(nodes);
            string generatedQuery = await GenerateQueryVisitor.RunAsync(result);

            Assert.Equal(expected, generatedQuery);
        }
        public static QueryProcessResult Validate(string query)
        {
            if (String.IsNullOrEmpty(query))
            {
                return new QueryProcessResult {
                           IsValid = true
                }
            }
            ;

            GroupNode result;

            try {
                var parser = new LuceneQueryParser();

                result = parser.Parse(query);
            } catch (Exception ex) {
                return(new QueryProcessResult {
                    Message = ex.Message
                });
            }

            var validator = new QueryProcessorVisitor(_freeFields);
            var context   = new ElasticQueryVisitorContext();

            result.Accept(validator, context);

            return(new QueryProcessResult {
                IsValid = true,
                UsesPremiumFeatures = validator.UsesPremiumFeatures
            });
        }
    }
        public void DoubleOperatorsIsNotValid()
        {
            var sut = new LuceneQueryParser();

            Assert.Throws <FormatException>(() => {
                var result = sut.Parse("something AND OR otherthing");
            });
        }
Exemple #13
0
 public static Query BuildQuery(string query, QueryOperator defaultOperator, string defaultField, Analyzer analyzer)
 {
     using (CultureHelper.EnsureInvariantCulture())
     {
         if (UseLuceneASTParser)
         {
             try
             {
                 var parser = new LuceneQueryParser();
                 parser.Parse(query);
                 var res = parser.LuceneAST.ToQuery(
                     new LuceneASTQueryConfiguration
                 {
                     Analayzer       = analyzer,
                     DefaultOperator = defaultOperator,
                     FieldName       = defaultField ?? string.Empty
                 });
                 // The parser should throw ParseException in this case.
                 if (res == null)
                 {
                     throw new GeoAPI.IO.ParseException("Could not parse query");
                 }
                 return(res);
             }
             catch (ParseException pe)
             {
                 throw new ParseException("Could not parse: '" + query + "'", pe);
             }
         }
         var originalQuery = query;
         try
         {
             var queryParser = new RangeQueryParser(Version.LUCENE_29, defaultField ?? string.Empty, analyzer)
             {
                 DefaultOperator = defaultOperator == QueryOperator.Or
                     ? QueryParser.Operator.OR
                     : QueryParser.Operator.AND,
                 AllowLeadingWildcard = true
             };
             query = PreProcessComments(query);
             query = PreProcessMixedInclusiveExclusiveRangeQueries(query);
             query = PreProcessUntokenizedTerms(query, queryParser);
             query = PreProcessSearchTerms(query);
             query = PreProcessDateTerms(query, queryParser);
             var generatedQuery = queryParser.Parse(query);
             generatedQuery = HandleMethods(generatedQuery, analyzer);
             return(generatedQuery);
         }
         catch (ParseException pe)
         {
             if (originalQuery == query)
             {
                 throw new ParseException("Could not parse: '" + query + "'", pe);
             }
             throw new ParseException("Could not parse modified query: '" + query + "' original was: '" + originalQuery + "'", pe);
         }
     }
 }
 public async Task CanApplyRootLevelAliasMapOnNestedTermAsync() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("field1.nested.morenested:value");
     var aliasMap = new FieldMap {
         { "field1.nested.morenested", "field2.nested.morenested" }
     };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("field2.nested.morenested:value", aliased.ToString());
 }
 public async Task AliasMapShouldBeAppliedToAllLevels2Async() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("(field1.nested:value field1.another:blah)");
     var aliasMap = new FieldMap {
         { "field1.nested", "field2.other" }
     };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("(field2.other:value field1.another:blah)", aliased.ToString());
 }
        public void CanParseQueryConcurrently()
        {
            var parser = new LuceneQueryParser();

            Parallel.For(0, 100, i => {
                var result = parser.Parse("criteria   some:criteria blah:(more      stuff)");
                Assert.NotNull(result);
            });
        }
        void CanParseThreeTermsWithDiffrentOperators2()
        {
            var parser = new LuceneQueryParser();

            parser.Parse("foo:a AND foo:b foo:-c");
            var query = parser.LuceneAST.ToQuery(config);

            Assert.Equal("+foo:a +foo:b foo:c", query.ToString());
        }
        public void  CanParseQueriesAndOutputWithNoChanges(string expectedQuery)
        {
            var sut = new LuceneQueryParser();

            var rootNode     = sut.Parse(expectedQuery);
            var actualResult = rootNode.ToString();

            Assert.Equal(expectedQuery, actualResult);
        }
        void CanParseComplexedBooleanQuery()
        {
            var parser = new LuceneQueryParser();

            parser.Parse("(foo:a foo:b) (foo:b +d) AND (foo:(e -c) OR g)");
            var query = parser.LuceneAST.ToQuery(config);

            Assert.Equal("(foo:a foo:b) +(foo:b +foo:d) +((foo:e -foo:c) foo:g)", query.ToString());
        }
        void CanParseParenthesisInsideNextedBooleanQuery2()
        {
            var parser = new LuceneQueryParser();

            parser.Parse("foo:a AND (foo:b -d) foo:-c");
            var query = parser.LuceneAST.ToQuery(config);

            Assert.Equal("+foo:a +(foo:b -foo:d) foo:c", query.ToString());
        }
        public void MultipleOperatorsIsNotValid()
        {
            var sut = new LuceneQueryParser();

            Assert.Throws <FormatException>(() => {
                var result = sut.Parse("something AND NOT OR otherthing");
                var ast    = DebugQueryVisitor.Run(result);
            });
        }
 public async Task AliasMapShouldBeAppliedToAllLevels8Async() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("field1.nested.childproperty:value");
     var aliasMap = new FieldMap {
         { "field1.nested.childproperty", "field2.other.childproperty" }
     };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("field2.other.childproperty:value", aliased.ToString());
 }
 public async Task AliasMapShouldAllowDeepAliasesAsync() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("level1.level2.level3.level4:value");
     var aliasMap = new FieldMap {
         { "level1.level2.level3.level4", "alias1.alias2.level3.level4" }
     };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("alias1.alias2.level3.level4:value", aliased.ToString());
 }
Exemple #24
0
        public async Task CanUseResolverAsync()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1.nested:value");

            var aliased = await AliasedQueryVisitor.RunAsync(result, f => f == "field1.nested"?new GetAliasResult { Name = "field2.nested" } : null);

            Assert.Equal("field2.nested:value", aliased.ToString());
        }
 public async Task AliasMapShouldWorkOnGroupsAsync() {
     var parser = new LuceneQueryParser();
     var result = await parser.ParseAsync("(field1.nested:value OR field1.thing:yep) another:works");
     var aliasMap = new FieldMap {
         { "field1.nested", "field2.other" },
         { "field1.thing", "field2.nice" }
     };
     var aliased = await FieldResolverQueryVisitor.RunAsync(result, aliasMap);
     Assert.Equal("(field2.other:value OR field2.nice:yep) another:works", aliased.ToString());
 }
        public void CanParseNotBeforeParens()
        {
            var sut = new LuceneQueryParser();

            var result = sut.Parse("NOT (dog parrot)");

            Assert.IsType <GroupNode>(result.Left);
            Assert.True((result.Left as GroupNode).HasParens);
            Assert.True((result.Left as GroupNode).IsNegated);
        }
        public void UnterminatedParensIsNotValid()
        {
            var sut = new LuceneQueryParser();

            var ex = Assert.Throws <FormatException>(() => {
                var result = sut.Parse("(something");
            });

            Assert.Contains("Missing closing paren ')' for group expression", ex.Message);
        }
        public void PrefixWithoutImmediateExpressionIsInvalid()
        {
            var sut = new LuceneQueryParser();

            var ex = Assert.Throws <FormatException>(() => {
                var result = sut.Parse("something + other");
                var ast    = DebugQueryVisitor.Run(result);
            });

            Assert.Contains("Unexpected character '+'.", ex.Message);
        }
        public void DoubleUnterminatedQuotedStringIsNotValid()
        {
            var sut = new LuceneQueryParser();

            var ex = Assert.Throws <FormatException>(() => {
                var result = sut.Parse("\"something\"\"");
                var ast    = DebugQueryVisitor.Run(result);
            });

            Assert.Contains("Unexpected character", ex.Message);
        }
        public void CanHandleUnterminatedRegex()
        {
            var sut = new LuceneQueryParser();

            var ex = Assert.Throws <FormatException>(() => {
                var result = sut.Parse(@"/\(\[A-Za-z\/\]+\).*?");
                var ast    = DebugQueryVisitor.Run(result);
            });

            Assert.Contains("Unterminated regex", ex.Message);
        }