コード例 #1
0
        private static string RangeClauseToKQL(RangeClause rangeClause)
        {
            var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockSchemaRetriever());

            visitor.Visit(rangeClause);
            return(rangeClause.KustoQL);
        }
コード例 #2
0
        private static string RangeClauseToKQL(RangeClause rangeClause)
        {
            var visitor = VisitorTestsUtils.CreateAndVisitRootVisitor("MyField", "long");

            visitor.Visit(rangeClause);
            return(rangeClause.KustoQL);
        }
コード例 #3
0
        private static string VisitRangeClause(RangeClause clause, string fieldName = "MyField", string type = "string")
        {
            var visitor = VisitorTestsUtils.CreateAndVisitRootVisitor(fieldName, type);

            visitor.Visit(clause);
            return(clause.KustoQL);
        }
コード例 #4
0
 private static string DateRangeClauseToKQL(RangeClause rangeClause)
 {
     var visitor = new ElasticSearchDSLVisitor(SchemaRetrieverMock.CreateMockDateSchemaRetriever());
     VisitorTestsUtils.VisitRootDsl(visitor);
     visitor.Visit(rangeClause);
     return rangeClause.KustoQL;
 }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
        /// <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;
        }
コード例 #7
0
ファイル: RangeClauseVisitor.cs プロジェクト: punnam/K2Bridge
        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.");
                }
            }
        }
コード例 #8
0
        /// <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}";
            }
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        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.");
                }
            }
        }
コード例 #11
0
        /// <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);
        }