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