private static string RangeClauseToKQL(RangeClause rangeClause) { var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockSchemaRetriever()); visitor.Visit(rangeClause); return(rangeClause.KustoQL); }
private static string RangeClauseToKQL(RangeClause rangeClause) { var visitor = VisitorTestsUtils.CreateAndVisitRootVisitor("MyField", "long"); visitor.Visit(rangeClause); return(rangeClause.KustoQL); }
private static string VisitRangeClause(RangeClause clause, string fieldName = "MyField", string type = "string") { var visitor = VisitorTestsUtils.CreateAndVisitRootVisitor(fieldName, type); visitor.Visit(clause); return(clause.KustoQL); }
private static string DateRangeClauseToKQL(RangeClause rangeClause) { var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockDateSchemaRetriever()); VisitorTestsUtils.VisitRootDsl(visitor); visitor.Visit(rangeClause); return rangeClause.KustoQL; }
/// <inheritdoc/> public void Visit(LuceneRangeQuery rangeQueryWrapper) { VerifyValid(rangeQueryWrapper); var rangeQuery = (TermRangeQuery)rangeQueryWrapper.LuceneQuery; var rangeClause = new RangeClause { FieldName = rangeQuery.Field, GTEValue = decimal.Parse(rangeQuery.LowerTerm, CultureInfo.InvariantCulture), LTValue = decimal.Parse(rangeQuery.UpperTerm, CultureInfo.InvariantCulture), }; rangeQueryWrapper.ESQuery = rangeClause; }
/// <inheritdoc/> public void Visit(LuceneRangeQuery rangeQueryWrapper) { VerifyValid(rangeQueryWrapper); var rangeQuery = (TermRangeQuery)rangeQueryWrapper.LuceneQuery; var rangeClause = new RangeClause { FieldName = rangeQuery.Field, GTEValue = rangeQuery.LowerTerm, LTValue = rangeQuery.UpperTerm, }; rangeQueryWrapper.ESQuery = rangeClause; }
public void Visit(RangeClause rangeClause) { Ensure.IsNotNull(rangeClause, nameof(rangeClause)); EnsureClause.StringIsNotNullOrEmpty(rangeClause.FieldName, nameof(rangeClause.FieldName)); EnsureClause.IsNotNull(rangeClause.GTEValue, nameof(rangeClause.GTEValue)); // format used by Kibana 6 if (rangeClause.Format == "epoch_millis") { // default time filter through a rangeClause query uses epoch times with GTE+LTE EnsureClause.IsNotNull(rangeClause.LTEValue, nameof(rangeClause.LTEValue)); rangeClause.KustoQL = $"{rangeClause.FieldName} >= unixtime_milliseconds_todatetime({rangeClause.GTEValue}) {KustoQLOperators.And} {rangeClause.FieldName} <= unixtime_milliseconds_todatetime({rangeClause.LTEValue})"; } // format used by Kibana 7 else if (rangeClause.Format == "strict_date_optional_time") { // default time filter through a rangeClause query uses epoch times with GTE+LTE EnsureClause.IsNotNull(rangeClause.LTEValue, nameof(rangeClause.LTEValue)); var gte = DateTime.Parse(rangeClause.GTEValue).ToUniversalTime().ToString("o"); var lte = DateTime.Parse(rangeClause.LTEValue).ToUniversalTime().ToString("o"); rangeClause.KustoQL = $"{rangeClause.FieldName} >= {KustoQLOperators.ToDateTime}(\"{gte}\") {KustoQLOperators.And} {rangeClause.FieldName} <= {KustoQLOperators.ToDateTime}(\"{lte}\")"; } else { // general "is between" filter on numeric fields uses a rangeClause query with GTE+LT (not LTE like above) EnsureClause.IsNotNull(rangeClause.LTValue, nameof(rangeClause.LTValue)); var t = ClauseFieldTypeProcessor.GetType(schemaRetriever, rangeClause.FieldName).Result; switch (t) { case ClauseFieldType.Numeric: rangeClause.KustoQL = $"{rangeClause.FieldName} >= {rangeClause.GTEValue} and {rangeClause.FieldName} < {rangeClause.LTValue}"; break; case ClauseFieldType.Date: rangeClause.KustoQL = $"{rangeClause.FieldName} >= {KustoQLOperators.ToDateTime}(\"{rangeClause.GTEValue}\") {KustoQLOperators.And} {rangeClause.FieldName} < {KustoQLOperators.ToDateTime}(\"{rangeClause.LTValue}\")"; break; case ClauseFieldType.Text: throw new NotSupportedException("Text Range is not supported."); case ClauseFieldType.Unknown: throw new Exception($"Field name {rangeClause.FieldName} has an unknown type."); } } }
/// <inheritdoc/> public void Visit(RangeClause rangeClause) { Ensure.IsNotNull(rangeClause, nameof(rangeClause)); EnsureClause.StringIsNotNullOrEmpty(rangeClause.FieldName, nameof(rangeClause.FieldName)); EnsureClause.IsNotNull(rangeClause.GTEValue, nameof(rangeClause.GTEValue)); if (rangeClause.Format == "epoch_millis") { // default time filter through a rangeClause query uses epoch times with GTE+LTE EnsureClause.IsNotNull(rangeClause.LTEValue, nameof(rangeClause.LTEValue)); rangeClause.KustoQL = $"{rangeClause.FieldName} >= fromUnixTimeMilli({rangeClause.GTEValue}) {KustoQLOperators.And} {rangeClause.FieldName} <= fromUnixTimeMilli({rangeClause.LTEValue})"; } else { // general "is between" filter on numeric fields uses a rangeClause query with GTE+LT (not LTE like above) EnsureClause.IsNotNull(rangeClause.LTValue, nameof(rangeClause.LTValue)); rangeClause.KustoQL = $"{rangeClause.FieldName} >= {rangeClause.GTEValue} and {rangeClause.FieldName} < {rangeClause.LTValue}"; } }
/// <inheritdoc/> public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jo = JObject.Load(reader); var first = (JProperty)jo.First; var obj = new RangeClause { FieldName = first.Name, GTEValue = first.First.Value <decimal?>("gte"), GTValue = first.First.Value <decimal?>("gt"), LTEValue = first.First.Value <decimal?>("lte"), LTValue = first.First.Value <decimal?>("lt"), Format = (string)first.First["format"], }; return(obj); }
public void Visit(RangeClause rangeClause) { Ensure.IsNotNull(rangeClause, nameof(rangeClause)); EnsureClause.StringIsNotNullOrEmpty(rangeClause.FieldName, nameof(rangeClause.FieldName)); EnsureClause.IsNotNull(rangeClause.GTEValue, nameof(rangeClause.GTEValue)); if (rangeClause.Format == "epoch_millis") { // default time filter through a rangeClause query uses epoch times with GTE+LTE EnsureClause.IsNotNull(rangeClause.LTEValue, nameof(rangeClause.LTEValue)); rangeClause.KustoQL = $"{rangeClause.FieldName} >= fromUnixTimeMilli({rangeClause.GTEValue}) {KustoQLOperators.And} {rangeClause.FieldName} <= fromUnixTimeMilli({rangeClause.LTEValue})"; } else { // general "is between" filter on numeric fields uses a rangeClause query with GTE+LT (not LTE like above) EnsureClause.IsNotNull(rangeClause.LTValue, nameof(rangeClause.LTValue)); var t = ClauseFieldTypeProcessor.GetType(schemaRetriever, rangeClause.FieldName).Result; switch (t) { case ClauseFieldType.Numeric: rangeClause.KustoQL = $"{rangeClause.FieldName} >= {rangeClause.GTEValue} and {rangeClause.FieldName} < {rangeClause.LTValue}"; break; case ClauseFieldType.Date: rangeClause.KustoQL = $"{rangeClause.FieldName} >= todatetime('{rangeClause.GTEValue}') and {rangeClause.FieldName} < todatetime('{rangeClause.LTValue}')"; break; case ClauseFieldType.Text: throw new NotSupportedException("Text Range is not supported."); case ClauseFieldType.Unknown: throw new Exception($"Field name {rangeClause.FieldName} has an unknown type."); } } }
/// <summary> /// Construct a "syntax tree" representing the LINQ query. /// </summary> /// /// <param name="cx">The extraction context.</param> /// <param name="node">The query expression.</param> /// <returns>A "syntax tree" of the query.</returns> static Clause ConstructQueryExpression(Context cx, QueryExpressionSyntax node) { var info = cx.Model(node).GetQueryClauseInfo(node.FromClause); var method = info.OperationInfo.Symbol as IMethodSymbol; Clause clauseExpr = new RangeClause(method, node.FromClause, cx.Model(node).GetDeclaredSymbol(node.FromClause), node.FromClause.Identifier).AddArgument(node.FromClause.Expression); foreach (var qc in node.Body.Clauses) { info = cx.Model(node).GetQueryClauseInfo(qc); method = info.OperationInfo.Symbol as IMethodSymbol; switch (qc.Kind()) { case SyntaxKind.OrderByClause: var orderByClause = (OrderByClauseSyntax)qc; foreach (var ordering in orderByClause.Orderings) { method = cx.Model(node).GetSymbolInfo(ordering).Symbol as IMethodSymbol; clauseExpr = clauseExpr.WithCallClause(method, orderByClause).AddArgument(ordering.Expression); if (method == null) { cx.ModelError(ordering, "Could not determine method call for orderby clause"); } } break; case SyntaxKind.WhereClause: var whereClause = (WhereClauseSyntax)qc; clauseExpr = clauseExpr.WithCallClause(method, whereClause).AddArgument(whereClause.Condition); break; case SyntaxKind.FromClause: var fromClause = (FromClauseSyntax)qc; clauseExpr = clauseExpr. WithLetClause(method, fromClause, cx.Model(node).GetDeclaredSymbol(fromClause), fromClause.Identifier). AddArgument(fromClause.Expression); break; case SyntaxKind.LetClause: var letClause = (LetClauseSyntax)qc; clauseExpr = clauseExpr.WithLetClause(method, letClause, cx.Model(node).GetDeclaredSymbol(letClause), letClause.Identifier). AddArgument(letClause.Expression); break; case SyntaxKind.JoinClause: var joinClause = (JoinClauseSyntax)qc; clauseExpr = clauseExpr.WithLetClause(method, joinClause, cx.Model(node).GetDeclaredSymbol(joinClause), joinClause.Identifier). AddArgument(joinClause.InExpression). AddArgument(joinClause.LeftExpression). AddArgument(joinClause.RightExpression); if (joinClause.Into != null) { var into = cx.Model(node).GetDeclaredSymbol(joinClause.Into); ((LetClause)clauseExpr).WithInto(into); } break; default: throw new InternalError(qc, $"Unhandled query clause of kind {qc.Kind()}"); } } method = cx.Model(node).GetSymbolInfo(node.Body.SelectOrGroup).Symbol as IMethodSymbol; clauseExpr = new CallClause(clauseExpr, method, node.Body.SelectOrGroup); if (node.Body.SelectOrGroup is SelectClauseSyntax selectClause) { clauseExpr.AddArgument(selectClause.Expression); } else if (node.Body.SelectOrGroup is GroupClauseSyntax groupClause) { clauseExpr. AddArgument(groupClause.GroupExpression). AddArgument(groupClause.ByExpression); } else { throw new InternalError(node, "Failed to process select/group by clause"); } return(clauseExpr); }