Browse Source

fix sort

Signed-off-by: Rui-Gan <1171530954@qq.com>
Rui-Gan 1 year atrás
parent
commit
8e18b9ed6a
2 changed files with 116 additions and 9 deletions
  1. 112 1
      internal/topo/operator/order_test.go
  2. 4 8
      internal/xsql/sorter.go

+ 112 - 1
internal/topo/operator/order_test.go

@@ -1,4 +1,4 @@
-// Copyright 2021-2022 EMQ Technologies Co., Ltd.
+// Copyright 2021-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -514,6 +514,117 @@ func TestOrderPlan_Apply(t *testing.T) {
 				},
 			},
 		},
+		{
+			sql: "SELECT a FROM demo GROUP BY a, TUMBLINGWINDOW(ss, 10) ORDER BY a ASC",
+			data: &xsql.WindowTuples{
+				Content: []xsql.TupleRow{
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 4},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 5},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 3},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 7},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 1},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 9},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 10},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 2},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 6},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 8},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 15},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 11},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 13},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 14},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 12},
+					},
+				},
+			},
+			result: &xsql.WindowTuples{
+				Content: []xsql.TupleRow{
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 1},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 2},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 3},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 4},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 5},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 6},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 7},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 8},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 9},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 10},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 11},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 12},
+					},
+					&xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 13},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 14},
+					}, &xsql.Tuple{
+						Emitter: "demo",
+						Message: xsql.Message{"a": 15},
+					},
+				},
+			},
+		},
 	}
 
 	fmt.Printf("The test bucket size is %d.\n\n", len(tests))

+ 4 - 8
internal/xsql/sorter.go

@@ -1,4 +1,4 @@
-// Copyright 2022 EMQ Technologies Co., Ltd.
+// Copyright 2022-2023 EMQ Technologies Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -57,27 +57,23 @@ func (ms *MultiSorter) Less(i, j int) bool {
 		if vp == nil && vq != nil {
 			return false
 		} else if vp != nil && vq == nil {
-			ms.valueSwap(true, i, j)
 			return true
 		} else if vp == nil && vq == nil {
 			return false
 		}
 		switch {
 		case v.simpleDataEval(vp, vq, ast.LT):
-			ms.valueSwap(field.Ascending, i, j)
 			return field.Ascending
 		case v.simpleDataEval(vq, vp, ast.LT):
-			ms.valueSwap(!field.Ascending, i, j)
 			return !field.Ascending
 		}
 	}
 	return false
 }
 
-func (ms *MultiSorter) valueSwap(s bool, i, j int) {
-	if s {
-		ms.values[i], ms.values[j] = ms.values[j], ms.values[i]
-	}
+func (ms *MultiSorter) Swap(i, j int) {
+	ms.values[i], ms.values[j] = ms.values[j], ms.values[i]
+	ms.SortingData.Swap(i, j)
 }
 
 // Sort sorts the argument slice according to the less functions passed to OrderedBy.