Пример #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());
        }
Пример #2
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());
        }
Пример #3
0
        public async Task AliasMapShouldBeAppliedToAllLevels4Async()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1.nested:value");

            var aliasMap = new AliasMap {
                { "field1.nested", "field2.other" }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("field2.other:value", aliased.ToString());
        }
Пример #4
0
        public async Task CanUseAliasMapForTopLevelAliasAsync()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1:value");

            var aliasMap = new AliasMap {
                { "field1", "field2" }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("field2:value", aliased.ToString());
        }
        public ElasticQueryParserConfiguration UseAliases(AliasResolver defaultAliasResolver, int priority = 50)
        {
            DefaultAliasResolver = defaultAliasResolver;

            var visitor = new AliasedQueryVisitor();

            QueryVisitor.AddVisitor(visitor, priority);
            SortVisitor.AddVisitor(visitor, priority);

            AggregationVisitor.AddVisitor(new AliasedQueryVisitor(false), priority);
            return(this);
        }
Пример #6
0
        public async Task AliasMapShouldBeAppliedToAllLevels7Async()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1.nested.childproperty:value");

            var aliasMap = new AliasMap {
                { "field1", new AliasMapValue {
                      Name = "field2", ChildMap = { { "nested", "other" } }
                  } }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("field2.other.childproperty:value", aliased.ToString());
        }
Пример #7
0
        public async Task CanApplyRootLevelAliasMapOnNestedTermAsync()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1.nested.morenested:value");

            var aliasMap = new AliasMap {
                { "field1", new AliasMapValue {
                      Name = "field2", ChildMap = { { "stuff", "other" } }
                  } }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("field2.nested.morenested:value", aliased.ToString());
        }
Пример #8
0
        public async Task AliasMapShouldAllowDeepAliasesAsync()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("level1.level2.level3:(level4:value)");

            var aliasMap = new AliasMap {
                { "level1", new AliasMapValue {
                      Name = "alias1", ChildMap = { { "level2", "alias2" }, { "level4", "alias4" } }
                  } }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("alias1.alias2.level3:(level4:value)", aliased.ToString());
        }
        public Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            var searchQuery = ctx.GetSourceAs <ISearchQuery>();

            if (searchQuery == null)
            {
                return(Task.CompletedTask);
            }

            if (!String.IsNullOrEmpty(searchQuery.Filter))
            {
                var result = _parser.Parse(searchQuery.Filter);
                searchQuery.Filter = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Filter &= new QueryFilter {
                    Query = new QueryStringQuery {
                        Query           = searchQuery.Filter,
                        DefaultOperator = Operator.And,
                        AnalyzeWildcard = false
                    }.ToContainer()
                };
            }

            if (!String.IsNullOrEmpty(searchQuery.Criteria))
            {
                var result = _parser.Parse(searchQuery.Criteria);
                searchQuery.Criteria = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Query &= new QueryStringQuery {
                    Query           = searchQuery.Criteria,
                    DefaultOperator = searchQuery.DefaultCriteriaOperator == SearchOperator.Or ? Operator.Or : Operator.And,
                    AnalyzeWildcard = true
                };
            }

            if (!String.IsNullOrEmpty(searchQuery.Sort))
            {
                var result = _parser.Parse(searchQuery.Sort);
                var opt    = ctx.GetOptionsAs <IElasticQueryOptions>();
                TermToFieldVisitor.Run(result, ctx);
                AliasedQueryVisitor.Run(result, _aliasMap, ctx);
                var fields = GetReferencedFieldsQueryVisitor.Run(result);
                // TODO: Check referenced fields against opt.AllowedSortFields

                var sort = GetSortFieldsVisitor.Run(result, ctx);
                ctx.Search.Sort(sort);
            }

            return(Task.CompletedTask);
        }
Пример #10
0
        public async Task AliasMapShouldWorkOnGroupsAsync()
        {
            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("field1:(nested:value OR thing:yep) another:works");

            var aliasMap = new AliasMap {
                {
                    "field1",
                    new AliasMapValue {
                        Name = "field2", ChildMap = { { "nested", "other" }, { "thing", "nice" } }
                    }
                }
            };
            var aliased = await AliasedQueryVisitor.RunAsync(result, aliasMap);

            Assert.Equal("field2:(other:value OR nice:yep) another:works", aliased.ToString());
        }
        public Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            string filter = ctx.Source.GetFilterExpression();
            string search = ctx.Source.GetSearchExpression();
            string sort   = ctx.Source.GetSortExpression();

            if (!String.IsNullOrEmpty(filter))
            {
                var result = _parser.Parse(filter);
                filter = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Filter &= new QueryStringQuery {
                    Query           = filter,
                    DefaultOperator = Operator.And,
                    AnalyzeWildcard = false
                };
            }

            if (!String.IsNullOrEmpty(search))
            {
                var result = _parser.Parse(search);
                search = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Query &= new QueryStringQuery {
                    Query           = search,
                    DefaultOperator = ctx.Source.GetSearchExpressionDefaultOperator() == SearchOperator.Or ? Operator.Or : Operator.And,
                    AnalyzeWildcard = true
                };
            }

            if (!String.IsNullOrEmpty(sort))
            {
                var result = _parser.Parse(sort);
                var opt    = ctx.Options.GetElasticTypeSettings();
                TermToFieldVisitor.Run(result, ctx);
                AliasedQueryVisitor.Run(result, _aliasMap, ctx);
                var fields = GetReferencedFieldsQueryVisitor.Run(result);
                // TODO: Check referenced fields against opt.AllowedSortFields

                var fieldSort = GetSortFieldsVisitor.Run(result, ctx);
                ctx.Search.Sort(fieldSort);
            }

            return(Task.CompletedTask);
        }
Пример #12
0
        public async Task VerifyComplexNestedAliasAsync()
        {
            var client  = GetClient();
            var visitor = new AliasMappingVisitor(client.Infer);
            var walker  = new MappingWalker(visitor);

            walker.Accept(new TypeMappingDescriptor <Employee>().Properties(p => p
                                                                            .Object <object>(o1 => o1.Name("data").Properties(p1 => p1
                                                                                                                              .Object <object>(o2 => o2.Name("@request_info").Properties(p2 => p2
                                                                                                                                                                                         .Keyword(f => f.Name("user_agent").RootAlias("useragent"))
                                                                                                                                                                                         .Text(f4 => f4.Name("@browser_major_version").RootAlias("browser.major")
                                                                                                                                                                                               .Fields(sf => sf.Keyword(s => s.Name("keyword").IgnoreAbove(256))))
                                                                                                                                                                                         .Object <object>(o3 => o3.Name("data").Properties(p3 => p3
                                                                                                                                                                                                                                           .Keyword(f => f.Name("@is_bot").RootAlias("bot"))))))))));

            var map = visitor.RootAliasMap;

            Assert.Equal(4, map.Count);
            Assert.True(map.ContainsKey("useragent"));
            Assert.Equal("data.@request_info.user_agent", map["useragent"].Name);
            Assert.False(map["useragent"].HasChildMappings);

            Assert.True(map.ContainsKey("browser.major"));
            Assert.Equal("data.@request_info.@browser_major_version", map["browser.major"].Name);
            Assert.False(map["browser.major"].HasChildMappings);

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

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

            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("useragent:test browser.major:10 bot:true");

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

            Assert.Equal("data.@request_info.user_agent:test data.@request_info.@browser_major_version:10 data.@request_info.data.@is_bot:true", aliased.ToString());
        }
Пример #13
0
        public async Task VerifySimpleAliasAsync()
        {
            var client  = GetClient();
            var visitor = new AliasMappingVisitor(client.Infer);
            var walker  = new MappingWalker(visitor);

            walker.Accept(new TypeMappingDescriptor <Employee>().Properties(p => p
                                                                            .Keyword(f => f.Name(e => e.Id).Alias("employee_id"))));

            var map = visitor.RootAliasMap;

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

            var parser = new LuceneQueryParser();
            var result = await parser.ParseAsync("employee_id:1234");

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

            Assert.Equal("id:1234", aliased.ToString());
        }