Query executes the provided query against the metrics view.
(ctx context.Context, qry *metricsview.Query, executionTime *time.Time)
| 333 | |
| 334 | // Query executes the provided query against the metrics view. |
| 335 | func (e *Executor) Query(ctx context.Context, qry *metricsview.Query, executionTime *time.Time) (*drivers.Result, error) { |
| 336 | if !e.security.CanAccess() { |
| 337 | return nil, runtime.ErrForbidden |
| 338 | } |
| 339 | |
| 340 | err := qry.Validate() |
| 341 | if err != nil { |
| 342 | return nil, err |
| 343 | } |
| 344 | |
| 345 | // preserve the original limit, required in 2 phase comparison |
| 346 | ogLimit := qry.Limit |
| 347 | |
| 348 | rowsCap, err := e.rewriteQueryEnforceCaps(qry) |
| 349 | if err != nil { |
| 350 | return nil, err |
| 351 | } |
| 352 | |
| 353 | pivotAST, pivoting, err := e.rewriteQueryForPivot(qry) |
| 354 | if err != nil { |
| 355 | return nil, err |
| 356 | } |
| 357 | |
| 358 | if err := e.RewriteQueryTimeRanges(ctx, qry, executionTime); err != nil { |
| 359 | return nil, err |
| 360 | } |
| 361 | |
| 362 | if err := e.enforceQueryLimits(qry); err != nil { |
| 363 | return nil, err |
| 364 | } |
| 365 | |
| 366 | if err := e.rewritePercentOfTotals(ctx, qry); err != nil { |
| 367 | return nil, err |
| 368 | } |
| 369 | |
| 370 | if err := e.rewriteQueryDruidExactify(ctx, qry); err != nil { |
| 371 | return nil, err |
| 372 | } |
| 373 | |
| 374 | // Check if a rollup table can satisfy the query; if so, use a synthetic spec pointing to it |
| 375 | mvForAST := e.metricsView |
| 376 | rollupSpec, err := e.rewriteQueryForRollup(ctx, qry) |
| 377 | if err != nil { |
| 378 | return nil, err |
| 379 | } |
| 380 | if rollupSpec != nil { |
| 381 | mvForAST = rollupSpec |
| 382 | } |
| 383 | |
| 384 | ast, err := metricsview.NewAST(mvForAST, e.security, qry, e.olap.Dialect()) |
| 385 | if err != nil { |
| 386 | return nil, err |
| 387 | } |
| 388 | |
| 389 | ok, err := e.rewriteTwoPhaseComparisons(ctx, qry, ast, ogLimit) |
| 390 | if err != nil { |
| 391 | return nil, err |
| 392 | } // TODO if !ok then can log a warning that two phase comparison is not possible with a reason |
no test coverage detected