spanner/spannertest: factor out value list comparison helper
This is used right now for ORDER BY, and the same code can be reused to
implement GROUP BY.
Change-Id: I6d4025dc5c9cddc7a86e275d23217412373bc60a
Reviewed-on: https://code-review.googlesource.com/c/gocloud/+/52734
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Shanika Kuruppu <skuruppu@google.com>
diff --git a/spanner/spannertest/db_eval.go b/spanner/spannertest/db_eval.go
index 1d5a87c..be20e55 100644
--- a/spanner/spannertest/db_eval.go
+++ b/spanner/spannertest/db_eval.go
@@ -401,6 +401,22 @@
}
}
+// compareValLists compares pair-wise elements of a and b.
+// If desc is not nil, it indicates which comparisons should be reversed.
+func compareValLists(a, b []interface{}, desc []bool) int {
+ for i := range a {
+ cmp := compareVals(a[i], b[i])
+ if cmp == 0 {
+ continue
+ }
+ if desc != nil && desc[i] {
+ cmp = -cmp
+ }
+ return cmp
+ }
+ return 0
+}
+
func compareVals(x, y interface{}) int {
// NULL is always the minimum possible value.
if x == nil && y == nil {
diff --git a/spanner/spannertest/db_query.go b/spanner/spannertest/db_query.go
index 4e0029d..fff96d1 100644
--- a/spanner/spannertest/db_query.go
+++ b/spanner/spannertest/db_query.go
@@ -254,17 +254,7 @@
sort.Slice(raw.rows, func(one, two int) bool {
r1, r2 := raw.rows[one], raw.rows[two]
aux1, aux2 := r1[len(r1)-len(aux):], r2[len(r2)-len(aux):] // sort keys
- for i := range aux1 {
- cmp := compareVals(aux1[i], aux2[i])
- if desc[i] {
- cmp = -cmp
- }
- if cmp == 0 {
- continue
- }
- return cmp < 0
- }
- return false
+ return compareValLists(aux1, aux2, desc) < 0
})
// Remove ORDER BY values.
raw.cols = raw.cols[:len(raw.cols)-len(aux)]