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]
}
}