diff --git a/frontend/src/container/QueryBuilder/components/Query/Query.tsx b/frontend/src/container/QueryBuilder/components/Query/Query.tsx index 9f4fca9b12..8da2c14335 100644 --- a/frontend/src/container/QueryBuilder/components/Query/Query.tsx +++ b/frontend/src/container/QueryBuilder/components/Query/Query.tsx @@ -151,18 +151,16 @@ export const Query = memo(function Query({ case PANEL_TYPES.TIME_SERIES: { return ( <> - {!isMetricsDataSource && ( - - - - - - - - - - - )} + + + + + + + + + + @@ -173,16 +171,14 @@ export const Query = memo(function Query({ - {!isMetricsDataSource && ( - - - - - - {renderOrderByFilter()} - - - )} + + + + + + {renderOrderByFilter()} + + {renderAggregateEveryFilter()} @@ -251,7 +247,6 @@ export const Query = memo(function Query({ } }, [ panelType, - isMetricsDataSource, query, filterConfigs?.limit?.isHidden, filterConfigs?.having?.isHidden, diff --git a/frontend/src/hooks/queryBuilder/useQueryOperations.ts b/frontend/src/hooks/queryBuilder/useQueryOperations.ts index 0d2f8f0cf2..3de26f1f94 100644 --- a/frontend/src/hooks/queryBuilder/useQueryOperations.ts +++ b/frontend/src/hooks/queryBuilder/useQueryOperations.ts @@ -7,7 +7,7 @@ import { import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { getOperatorsBySourceAndPanelType } from 'lib/newQueryBuilder/getOperatorsBySourceAndPanelType'; import { findDataTypeOfOperator } from 'lib/query/findDataTypeOfOperator'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { @@ -148,13 +148,9 @@ export const useQueryOperations: UseQueryOperations = ({ [query, index, handleSetQueryData], ); - const isMetricsDataSource = useMemo( - () => query.dataSource === DataSource.METRICS, - [query.dataSource], - ); - const isTracePanelType = useMemo(() => panelType === PANEL_TYPES.TRACE, [ - panelType, - ]); + const isMetricsDataSource = query.dataSource === DataSource.METRICS; + + const isTracePanelType = panelType === PANEL_TYPES.TRACE; useEffect(() => { if (initialDataSource && dataSource !== initialDataSource) return; diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 3c85c07166..a576b637e1 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -3062,7 +3062,7 @@ func applyMetricLimit(results []*v3.Result, queryRangeParams *v3.QueryRangeParam limit := builderQueries[result.QueryName].Limit orderByList := builderQueries[result.QueryName].OrderBy - if limit != 0 { + if limit >= 0 { if len(orderByList) == 0 { // If no orderBy is specified, sort by value in descending order orderByList = []v3.OrderBy{{ColumnName: constants.SigNozOrderByValue, Order: "desc"}} @@ -3070,6 +3070,18 @@ func applyMetricLimit(results []*v3.Result, queryRangeParams *v3.QueryRangeParam sort.SliceStable(result.Series, func(i, j int) bool { for _, orderBy := range orderByList { if orderBy.ColumnName == constants.SigNozOrderByValue { + + // For table type queries (we rely on the fact that one value for row), sort + // based on final aggregation value + if len(result.Series[i].Points) == 1 && len(result.Series[j].Points) == 1 { + if orderBy.Order == "asc" { + return result.Series[i].Points[0].Value < result.Series[j].Points[0].Value + } else if orderBy.Order == "desc" { + return result.Series[i].Points[0].Value > result.Series[j].Points[0].Value + } + } + + // For graph type queries, sort based on GroupingSetsPoint if result.Series[i].GroupingSetsPoint == nil || result.Series[j].GroupingSetsPoint == nil { // Handle nil GroupingSetsPoint, if needed // Here, we assume non-nil values are always less than nil values @@ -3102,7 +3114,7 @@ func applyMetricLimit(results []*v3.Result, queryRangeParams *v3.QueryRangeParam return i < j }) - if len(result.Series) > int(limit) { + if limit > 0 && len(result.Series) > int(limit) { result.Series = result.Series[:limit] } }