bigtable/inmem: fix paging filters, change tests to use multiple cols

Change-Id: Ie387431a2bc4b252ac273dd79eb87f59a1da31ae
Reviewed-on: https://code-review.googlesource.com/15231
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/bigtable/bigtable_test.go b/bigtable/bigtable_test.go
index cfc63d6..054697d 100644
--- a/bigtable/bigtable_test.go
+++ b/bigtable/bigtable_test.go
@@ -460,6 +460,7 @@
 		// Timestamps are used in thousands because the server
 		// only permits that granularity.
 		mut.Set("ts", "col", Timestamp(i*1000), []byte(fmt.Sprintf("val-%d", i)))
+		mut.Set("ts", "col2", Timestamp(i*1000), []byte(fmt.Sprintf("val-%d", i)))
 	}
 	if err := tbl.Apply(ctx, "testrow", mut); err != nil {
 		t.Fatalf("Mutating row: %v", err)
@@ -474,6 +475,10 @@
 		{Row: "testrow", Column: "ts:col", Timestamp: 2000, Value: []byte("val-2")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 1000, Value: []byte("val-1")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 0, Value: []byte("val-0")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 3000, Value: []byte("val-3")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 1000, Value: []byte("val-1")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 0, Value: []byte("val-0")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions,\n got %v\nwant %v", r, wantRow)
@@ -486,6 +491,8 @@
 	wantRow = Row{"ts": []ReadItem{
 		{Row: "testrow", Column: "ts:col", Timestamp: 3000, Value: []byte("val-3")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 2000, Value: []byte("val-2")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 3000, Value: []byte("val-3")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions and LatestNFilter(2),\n got %v\nwant %v", r, wantRow)
@@ -509,6 +516,10 @@
 	}
 	wantRow = Row{"ts": []ReadItem{
 		{Row: "testrow", Column: "ts:col", Timestamp: 0, Value: []byte("val-0")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 3000, Value: []byte("val-3")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 1000, Value: []byte("val-1")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 0, Value: []byte("val-0")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions and CellsPerRowOffsetFilter(3),\n got %v\nwant %v", r, wantRow)
@@ -521,6 +532,8 @@
 	wantRow = Row{"ts": []ReadItem{
 		{Row: "testrow", Column: "ts:col", Timestamp: 2000, Value: []byte("val-2")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 1000, Value: []byte("val-1")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 1000, Value: []byte("val-1")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions and TimestampRangeFilter(1000, 3000),\n got %v\nwant %v", r, wantRow)
@@ -533,6 +546,9 @@
 		{Row: "testrow", Column: "ts:col", Timestamp: 3000, Value: []byte("val-3")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 2000, Value: []byte("val-2")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 1000, Value: []byte("val-1")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 3000, Value: []byte("val-3")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 1000, Value: []byte("val-1")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions and TimestampRangeFilter(1000, 0),\n got %v\nwant %v", r, wantRow)
@@ -582,6 +598,8 @@
 	wantRow = Row{"ts": []ReadItem{
 		{Row: "testrow", Column: "ts:col", Timestamp: 3000, Value: []byte("val-3")},
 		{Row: "testrow", Column: "ts:col", Timestamp: 1000, Value: []byte("val-1")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 3000, Value: []byte("val-3")},
+		{Row: "testrow", Column: "ts:col2", Timestamp: 2000, Value: []byte("val-2")},
 	}}
 	if !reflect.DeepEqual(r, wantRow) {
 		t.Errorf("Cell with multiple versions and LatestNFilter(2), after deleting timestamp 2000,\n got %v\nwant %v", r, wantRow)
diff --git a/bigtable/bttest/inmem.go b/bigtable/bttest/inmem.go
index ac129e9..31d8c55 100644
--- a/bigtable/bttest/inmem.go
+++ b/bigtable/bttest/inmem.go
@@ -463,12 +463,14 @@
 		// Grab the first n cells in the row.
 		lim := int(f.CellsPerRowLimitFilter)
 		for _, fam := range r.families {
-			for col, cs := range fam.cells {
+			for _, col := range fam.colNames {
+				cs := fam.cells[col]
 				if len(cs) > lim {
 					fam.cells[col] = cs[:lim]
-					return true
+					lim = 0
+				} else {
+					lim -= len(cs)
 				}
-				lim -= len(cs)
 			}
 		}
 		return true
@@ -476,11 +478,14 @@
 		// Skip the first n cells in the row.
 		offset := int(f.CellsPerRowOffsetFilter)
 		for _, fam := range r.families {
-			for col, cs := range fam.cells {
-				if offset > 0 && offset < len(cs) {
+			for _, col := range fam.colNames {
+				cs := fam.cells[col]
+				if len(cs) > offset {
 					fam.cells[col] = cs[offset:]
 					offset = 0
+					return true
 				} else {
+					fam.cells[col] = cs[:0]
 					offset -= len(cs)
 				}
 			}