(ctx context.Context, qry *metricsview.SearchQuery, executionTime *time.Time)
| 723 | } |
| 724 | |
| 725 | func (e *Executor) executeSearchInDruid(ctx context.Context, qry *metricsview.SearchQuery, executionTime *time.Time) ([]metricsview.SearchResult, error) { |
| 726 | if qry.TimeRange == nil { |
| 727 | return nil, errDruidNativeSearchUnimplemented |
| 728 | } |
| 729 | |
| 730 | dimensions := make([]metricsview.Dimension, len(qry.Dimensions)) |
| 731 | for i, d := range qry.Dimensions { |
| 732 | dimensions[i] = metricsview.Dimension{Name: d} |
| 733 | } |
| 734 | q := &metricsview.Query{ |
| 735 | MetricsView: qry.MetricsView, |
| 736 | Dimensions: dimensions, |
| 737 | Measures: nil, |
| 738 | PivotOn: nil, |
| 739 | Spine: nil, |
| 740 | Sort: nil, |
| 741 | TimeRange: qry.TimeRange, |
| 742 | ComparisonTimeRange: nil, |
| 743 | Where: qry.Where, |
| 744 | Having: qry.Having, |
| 745 | Limit: qry.Limit, |
| 746 | Offset: nil, |
| 747 | TimeZone: "", |
| 748 | UseDisplayNames: false, |
| 749 | Rows: false, |
| 750 | QueryLimits: &metricsview.QueryLimits{ |
| 751 | RequireTimeRange: false, |
| 752 | MaxTimeRangeDays: 0, // not enforced |
| 753 | }, |
| 754 | UnusedFields: nil, |
| 755 | } //exhaustruct:enforce |
| 756 | |
| 757 | if err := e.RewriteQueryTimeRanges(ctx, q, executionTime); err != nil { |
| 758 | return nil, err |
| 759 | } |
| 760 | |
| 761 | a, err := metricsview.NewAST(e.metricsView, e.security, q, e.olap.Dialect()) |
| 762 | if err != nil { |
| 763 | return nil, err |
| 764 | } |
| 765 | |
| 766 | if err := e.rewriteLimitsIntoSubqueries(a); err != nil { |
| 767 | return nil, err |
| 768 | } |
| 769 | |
| 770 | if a.Root.FromSelect != nil { |
| 771 | // This means either the dimension uses an unnest or measure filters which are not directly supported by native search. |
| 772 | // This can be supported in future using query datasource in future if performance turns out to be a concern. |
| 773 | return nil, errDruidNativeSearchUnimplemented |
| 774 | } |
| 775 | var query map[string]interface{} |
| 776 | if a.Root.Where != nil { |
| 777 | // NOTE :: this does not work for measure filters. |
| 778 | // The query planner resolves them to joins instead of filters. |
| 779 | rows, err := e.olap.Query(ctx, &drivers.Statement{ |
| 780 | Query: fmt.Sprintf("EXPLAIN PLAN FOR SELECT 1 FROM %s WHERE %s", *a.Root.FromTable, a.Root.Where.Expr), |
| 781 | Args: a.Root.Where.Args, |
| 782 | Priority: e.priority, |
no test coverage detected