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); }
/// <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; } }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
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); }
/// <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); }