Exemplo n.º 1
0
        private static string VisitQuery(QueryStringClause queryStringClause)
        {
            var visitor = VisitorTestsUtils.CreateAndVisitRootVisitor();

            visitor.Visit(queryStringClause);
            return(queryStringClause.KustoQL);
        }
        private static string VisitQuery(QueryStringClause queryStringClause)
        {
            var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockSchemaRetriever());

            visitor.Visit(queryStringClause);
            return(queryStringClause.KustoQL);
        }
Exemplo n.º 3
0
        /// <inheritdoc/>
        public void Visit(QueryStringClause queryStringClause)
        {
            Ensure.IsNotNull(queryStringClause, nameof(queryStringClause));

            if (queryStringClause.ParsedType == null)
            {
                queryStringClause.KustoQL = IsSimplePhrase(queryStringClause.Phrase)
                    ? $"* {KustoQLOperators.Has} \"{queryStringClause.Phrase}\""
                    : CreateKqlFromLucenePhrase(queryStringClause);
                return;
            }

            // Depends on the exact request there are 3 possible options for the phrase:
            // wildcard, prefix and simple equality
            switch (queryStringClause.ParsedType)
            {
            case QueryStringClause.Subtype.Term:
                var isNumeric = GetIsFieldNumeric(queryStringClause.ParsedFieldName).Result;
                if (isNumeric)
                {
                    queryStringClause.KustoQL = $"{queryStringClause.ParsedFieldName} {KustoQLOperators.Equal} {queryStringClause.Phrase}";
                }
                else
                {
                    queryStringClause.KustoQL = $"{queryStringClause.ParsedFieldName} {KustoQLOperators.Has} \"{queryStringClause.Phrase}\"";
                }

                break;

            case QueryStringClause.Subtype.Phrase:
                queryStringClause.KustoQL = $"{queryStringClause.ParsedFieldName} {KustoQLOperators.Contains} \"{queryStringClause.Phrase}\"";
                break;

            case QueryStringClause.Subtype.Wildcard:
                // Now, each occurrence is replaced with [.\S] or [.\S]*
                // This group is looking for any char except space, this is in order
                // to be consistent with the way ES works
                // for example consider the following queries:
                // TelA* => TelA[.\S]*
                var phrase = SingleCharPattern.Replace(queryStringClause.Phrase, @"(.)");
                phrase = MultiCharPattern.Replace(phrase, @"(.)*");

                queryStringClause.KustoQL = $"{queryStringClause.ParsedFieldName} {KustoQLOperators.MatchRegex} \"{phrase}\"";
                break;

            case QueryStringClause.Subtype.Prefix:
                queryStringClause.KustoQL = $"{queryStringClause.ParsedFieldName} {KustoQLOperators.HasPrefix} \"{queryStringClause.Phrase}\"";
                break;

            default:
                // should not happen
                break;
            }
        }
Exemplo n.º 4
0
        /// <inheritdoc/>
        public void Visit(LucenePrefixQuery prefixQueryWrapper)
        {
            VerifyValid(prefixQueryWrapper);

            var prefix       = ((PrefixQuery)prefixQueryWrapper.LuceneQuery).Prefix;
            var prefixClause = new QueryStringClause
            {
                ParsedFieldName = prefix.Field,
                Phrase          = prefix.Text,
                ParsedType      = QueryStringClause.Subtype.Prefix,
            };

            prefixQueryWrapper.ESQuery = prefixClause;
        }
Exemplo n.º 5
0
        /// <inheritdoc/>
        public void Visit(LuceneTermQuery termQueryWrapper)
        {
            VerifyValid(termQueryWrapper);

            var term   = ((TermQuery)termQueryWrapper.LuceneQuery).Term;
            var clause = new QueryStringClause
            {
                ParsedFieldName = term.Field,
                Phrase          = term.Text,
                ParsedType      = QueryStringClause.Subtype.Term,
            };

            termQueryWrapper.ESQuery = clause;
        }
Exemplo n.º 6
0
        /// <inheritdoc/>
        public void Visit(LuceneWildcardQuery wildcardQueryWrapper)
        {
            VerifyValid(wildcardQueryWrapper);

            var term           = ((WildcardQuery)wildcardQueryWrapper.LuceneQuery).Term;
            var wildcardClause = new QueryStringClause
            {
                ParsedFieldName = term.Field,
                Phrase          = term.Text,
                ParsedType      = QueryStringClause.Subtype.Wildcard,
            };

            wildcardQueryWrapper.ESQuery = wildcardClause;
        }
Exemplo n.º 7
0
        /// <inheritdoc/>
        public void Visit(LucenePhraseQuery phraseQueryWrapper)
        {
            VerifyValid(phraseQueryWrapper);

            var terms  = ((PhraseQuery)phraseQueryWrapper.LuceneQuery).GetTerms();
            var phrase = TermsToString(terms);
            var clause = new QueryStringClause
            {
                ParsedFieldName = terms[0].Field,
                Phrase          = phrase,
                ParsedType      = QueryStringClause.Subtype.Phrase,
            };

            phraseQueryWrapper.ESQuery = clause;
        }
Exemplo n.º 8
0
        private static IEnumerable <IQuery> CreateSimpleLeafList(IEnumerable <string> values)
        {
            var lst = new LinkedList <ILeafClause>();

            foreach (var value in values)
            {
                var item = new QueryStringClause
                {
                    Phrase = value,
                };

                lst.AddLast(item);
            }

            return(lst);
        }
        /// <inheritdoc/>
        public override object ReadJson(
            JsonReader reader,
            Type objectType,
            object existingValue,
            JsonSerializer serializer)
        {
            var jt = JToken.Load(reader);

            // we are setting the 'analyze_wildcard' and 'default_field' to defaults
            // as described here:
            // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-top-level-params
            var wildcard        = jt.First["analyze_wildcard"];
            var defaultWildcard = jt.First["default_field"];
            var obj             = new QueryStringClause
            {
                Phrase   = (string)jt.First["query"],
                Wildcard = (wildcard != null) ? (bool)wildcard : false,
                Default  = (defaultWildcard != null) ? (string)defaultWildcard : "*",
            };

            return(obj);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Given a clause which has a Lucene based phrase, creates a KQL query.
        /// </summary>
        /// <param name="queryStringClause">The given clausse.</param>
        /// <returns>A KQL query string.</returns>
        private string CreateKqlFromLucenePhrase(QueryStringClause queryStringClause)
        {
            // we need to parse the phrase
            using var analyzer = new WhitespaceAnalyzer();
            var queryParser =
                new QueryParser(
                    Lucene.Net.Util.Version.LUCENE_30,
                    queryStringClause.Default,
                    analyzer)
            {
                AllowLeadingWildcard   = queryStringClause.Wildcard,
                LowercaseExpandedTerms = false,
            };

            // escaping special charachters from the pharse before parsing.
            // we would call QueryParser.Escape() method, but it escapes all charachters and
            // in our case we only have to worry about backslash.
            // implementation is based on: https://github.com/apache/lucenenet/blob/0eaf76540b8de326d1aa9ca24f4b5d6425a9ae38/src/Lucene.Net.QueryParser/Classic/QueryParserBase.cs
            var escapedPhrase = queryStringClause.Phrase.Replace(@"\", @"\\\", StringComparison.OrdinalIgnoreCase);

            // we parse and get the Lucene.Net query model
            var query = queryParser.Parse(escapedPhrase);

            // We make our own 'visitable' Lucence.Net query model
            var luceneQuery = VisitableLuceneQueryFactory.Make(query);

            // Visit
            var luceneVisitor = new LuceneVisitor();

            luceneQuery.Accept(luceneVisitor);
            dynamic esQuery = luceneQuery.ESQuery;

            esQuery.Accept(this);

            return(esQuery.KustoQL);
        }