From ff2b6fbe3516d96257968aa1d7b07351ac37cf44 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Wed, 15 May 2024 03:23:33 +0200 Subject: [PATCH] wip --- app/vlselect/logsql/logsql.go | 1 + lib/logstorage/parser.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/vlselect/logsql/logsql.go b/app/vlselect/logsql/logsql.go index 6cf2b266f0..d7385b642d 100644 --- a/app/vlselect/logsql/logsql.go +++ b/app/vlselect/logsql/logsql.go @@ -36,6 +36,7 @@ func ProcessQueryRequest(ctx context.Context, w http.ResponseWriter, r *http.Req if limit > 0 { q.AddPipeLimit(uint64(limit)) } + q.Optimize() tenantIDs := []logstorage.TenantID{tenantID} diff --git a/lib/logstorage/parser.go b/lib/logstorage/parser.go index b93a9eaeda..9d4e76e09f 100644 --- a/lib/logstorage/parser.go +++ b/lib/logstorage/parser.go @@ -215,6 +215,33 @@ func (q *Query) AddPipeLimit(n uint64) { }) } +// Optimize tries optimizing the query. +func (q *Query) Optimize() { + q.pipes = optimizeSortLimitPipes(q.pipes) +} + +func optimizeSortLimitPipes(pipes []pipe) []pipe { + // Merge 'sort ... | limit ...' into 'sort ... limit ...' + i := 1 + for i < len(pipes) { + pl, ok := pipes[i].(*pipeLimit) + if !ok { + i++ + continue + } + ps, ok := pipes[i-1].(*pipeSort) + if !ok { + i++ + continue + } + if ps.limit == 0 || pl.n < ps.limit { + ps.limit = pl.n + } + pipes = append(pipes[:i], pipes[i+1:]...) + } + return pipes +} + func (q *Query) getNeededColumns() ([]string, []string) { neededFields := newFieldsSet() neededFields.add("*")