Ejemplo n.º 1
0
        public async Task <PredicateEvaluationOperation <CandidateSearchResult> > Evaluate(string predicateExpression)
        {
            var charStream = new AntlrInputStream(predicateExpression);
            var lexer      = new PredicateLexer(charStream);
            var stream     = new CommonTokenStream(lexer);

            stream.Fill();
            var tokens = stream.Get(0, stream.Size);

            stream.Reset();

            if (tokens.Any(x => x.Type == PredicateLexer.Discardable))
            {
                throw new Exception("Contains unknown tokens");
            }

            var parser = new PredicateParser(stream);

            parser.RemoveErrorListeners();
            parser.AddErrorListener(new ThrowingErrorListener());
            var treeBuilder = new PredicateSyntaxTreeBuilderVisitor();
            var tree        = treeBuilder.Visit(parser.expr());

            var searchBuilder = new ElasticSearchQueryBuilder(_propertyDetailsProvider);
            var query         = searchBuilder.BuildNestQuery(tree);

            var searchResult = await _elasticClient.SearchAsync <CandidateDocument>(new SearchRequest(_index)
            {
                Query = query
            });

            var resultItems = searchResult.Documents
                              .Select(x => new CandidateSearchResultItem
            {
                CurrentJobTitle   = x.CurrentJobTitle,
                Salary            = x.Salary,
                ExperienceInYears = x.ExperienceInYears
            })
                              .ToList();

            return(new PredicateEvaluationOperation <CandidateSearchResult>(new CandidateSearchResult
            {
                Items = resultItems
            }));
        }
        protected ISearchProvider GetSearchProvider(string searchProvider, string scope, string dataSource = null)
        {
            ISearchProvider provider = null;

            var phraseSearchCriteriaPreprocessor  = new PhraseSearchCriteriaPreprocessor(new SearchPhraseParser()) as ISearchCriteriaPreprocessor;
            var catalogSearchCriteriaPreprocessor = new CatalogSearchCriteriaPreprocessor();
            var searchCriteriaPreprocessors       = new[] { phraseSearchCriteriaPreprocessor, catalogSearchCriteriaPreprocessor };

            if (searchProvider == "Lucene")
            {
                var connection   = new SearchConnection(_luceneStorageDir, scope);
                var queryBuilder = new LuceneSearchQueryBuilder() as ISearchQueryBuilder;
                provider = new LuceneSearchProvider(new[] { queryBuilder }, connection, searchCriteriaPreprocessors);
            }

            if (searchProvider == "Elastic")
            {
                var elasticsearchHost = dataSource ?? Environment.GetEnvironmentVariable("TestElasticsearchHost") ?? "localhost:9200";

                var connection            = new SearchConnection(elasticsearchHost, scope);
                var queryBuilder          = new ElasticSearchQueryBuilder() as ISearchQueryBuilder;
                var elasticSearchProvider = new ElasticSearchProvider(connection, searchCriteriaPreprocessors, new[] { queryBuilder }, GetSettingsManager())
                {
                    EnableTrace = true
                };
                provider = elasticSearchProvider;
            }

            if (searchProvider == "Azure")
            {
                var azureSearchServiceName = Environment.GetEnvironmentVariable("TestAzureSearchServiceName");
                var azureSearchAccessKey   = Environment.GetEnvironmentVariable("TestAzureSearchAccessKey");

                var connection   = new SearchConnection(azureSearchServiceName, scope, accessKey: azureSearchAccessKey);
                var queryBuilder = new AzureSearchQueryBuilder() as ISearchQueryBuilder;
                provider = new AzureSearchProvider(connection, searchCriteriaPreprocessors, new[] { queryBuilder });
            }

            if (provider == null)
            {
                throw new ArgumentException($"Search provider '{searchProvider}' is not supported", nameof(searchProvider));
            }

            return(provider);
        }
Ejemplo n.º 3
0
        public void Throws_exceptions_elastic()
        {
            var providerType    = "Elastic";
            var scope           = _DefaultScope;
            var badscope        = "doesntexist";
            var baddocumenttype = "badtype";
            var provider        = GetSearchProvider(providerType, scope);

            // try removing non-existing index
            // no exception should be generated, since 404 will be just eaten when index doesn't exist
            provider.RemoveAll(badscope, "");
            provider.RemoveAll(badscope, baddocumenttype);

            // now create an index and try removing non-existent document type
            SearchHelper.CreateSampleIndex(provider, scope);
            provider.RemoveAll(scope, "sometype");

            // create bad connection
            var queryBuilder = new ElasticSearchQueryBuilder();

            var conn         = new SearchConnection("localhost:9201", scope);
            var bad_provider = new ElasticSearchProvider(new[] { queryBuilder }, conn);

            bad_provider.EnableTrace = true;

            Assert.Throws <ElasticSearchException>(() => bad_provider.RemoveAll(badscope, ""));

            var criteria = new CatalogItemSearchCriteria
            {
                SearchPhrase      = "product",
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Pricelists        = new string[] { }
            };

            Assert.Throws <ElasticSearchException>(() => bad_provider.Search <DocumentDictionary>(scope, criteria));
        }