[gold] Add ability to search entire sliding window.

Bug: skia:10582
Change-Id: Ie17d71ed684f7594826703ec868098f36aec7f6f
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/402650
Reviewed-by: Leandro Lovisolo <lovisolo@google.com>
diff --git a/golden/go/search2/search2.go b/golden/go/search2/search2.go
index 591ea82..f63fef4 100644
--- a/golden/go/search2/search2.go
+++ b/golden/go/search2/search2.go
@@ -604,26 +604,60 @@
 	}
 	args := []interface{}{getFirstCommitID(ctx), ignoreStatuses}
 
-	if len(keyFilters) == 0 {
-		// Corpus is being used as a string
-		args = append(args, q.TraceValues[types.CorpusField][0])
-		return `
+	if q.OnlyIncludeDigestsProducedAtHead {
+		if len(keyFilters) == 0 {
+			// Corpus is being used as a string
+			args = append(args, q.TraceValues[types.CorpusField][0])
+			return `
 MatchingTraces AS (
     SELECT trace_id, grouping_id, digest FROM ValuesAtHead
 	WHERE most_recent_commit_id >= $2 AND
     	matches_any_ignore_rule = ANY($3) AND
     	corpus = $4
 )`, args
-	}
-	// Corpus is being used as a JSONB value here
-	args = append(args, `"`+q.TraceValues[types.CorpusField][0]+`"`)
-	return joinedTracesStatement(keyFilters) + `
+		}
+		// Corpus is being used as a JSONB value here
+		args = append(args, `"`+q.TraceValues[types.CorpusField][0]+`"`)
+		return joinedTracesStatement(keyFilters) + `
 MatchingTraces AS (
     SELECT ValuesAtHead.trace_id, grouping_id, digest FROM ValuesAtHead
 	JOIN JoinedTraces ON ValuesAtHead.trace_id = JoinedTraces.trace_id
 	WHERE most_recent_commit_id >= $2 AND
     	matches_any_ignore_rule = ANY($3)
 )`, args
+	} else {
+		if len(keyFilters) == 0 {
+			// Corpus is being used as a string
+			args = append(args, q.TraceValues[types.CorpusField][0])
+			return `
+TracesOfInterest AS (
+    SELECT trace_id FROM ValuesAtHead
+	WHERE matches_any_ignore_rule = ANY($3) AND
+    	corpus = $4
+),
+MatchingTraces AS (
+	SELECT DISTINCT TraceValues.trace_id, TraceValues.grouping_id, TraceValues.digest
+	FROM TraceValues
+	JOIN TracesOfInterest on TraceValues.trace_id = TracesOfInterest.trace_id
+	WHERE commit_id >= $2
+)
+`, args
+		}
+		// Corpus is being used as a JSONB value here
+		args = append(args, `"`+q.TraceValues[types.CorpusField][0]+`"`)
+		return joinedTracesStatement(keyFilters) + `
+TracesOfInterest AS (
+    SELECT Traces.trace_id FROM Traces
+	JOIN JoinedTraces ON Traces.trace_id = JoinedTraces.trace_id
+	WHERE matches_any_ignore_rule = ANY($3)
+),
+MatchingTraces AS (
+	SELECT DISTINCT TraceValues.trace_id, TraceValues.grouping_id, TraceValues.digest
+	FROM TraceValues
+	JOIN TracesOfInterest on TraceValues.trace_id = TracesOfInterest.trace_id
+	WHERE commit_id >= $2
+)`, args
+	}
 }
 
 // joinedTracesStatement returns a SQL snippet that includes a WITH table called JoinedTraces.
diff --git a/golden/go/search2/search2_test.go b/golden/go/search2/search2_test.go
index eebc98b..b209d29 100644
--- a/golden/go/search2/search2_test.go
+++ b/golden/go/search2/search2_test.go
@@ -1615,6 +1615,393 @@
 	}, res)
 }
 
+func TestSearch_FilteredAcrossAllHistory_Success(t *testing.T) {
+	unittest.LargeTest(t)
+
+	ctx := context.Background()
+	db := sqltest.NewCockroachDBForTestsWithProductionSchema(ctx, t)
+	require.NoError(t, sqltest.BulkInsertDataTables(ctx, db, dks.Build()))
+
+	s := New(db, 100)
+	res, err := s.Search(ctx, &query.Search{
+		OnlyIncludeDigestsProducedAtHead: false,
+		IncludePositiveDigests:           false,
+		IncludeNegativeDigests:           true,
+		IncludeUntriagedDigests:          true,
+		Sort:                             query.SortDescending,
+		IncludeIgnoredTraces:             false,
+		TraceValues: paramtools.ParamSet{
+			types.CorpusField: []string{dks.CornersCorpus},
+			dks.OSKey:         []string{dks.IOS},
+		},
+		RGBAMinFilter: 0,
+		RGBAMaxFilter: 255,
+	})
+	require.NoError(t, err)
+	assert.Equal(t, &frontend.SearchResponse{
+		Results: []*frontend.SearchResult{{
+			Digest: dks.DigestBlank,
+			Test:   dks.TriangleTest,
+			Status: expectations.Untriaged,
+			ParamSet: paramtools.ParamSet{
+				dks.ColorModeKey:      []string{dks.GreyColorMode, dks.RGBColorMode},
+				types.CorpusField:     []string{dks.CornersCorpus},
+				dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+				dks.OSKey:             []string{dks.IOS},
+				types.PrimaryKeyField: []string{dks.TriangleTest},
+				"ext":                 []string{"png"},
+			},
+			TraceGroup: frontend.TraceGroup{
+				Traces: []frontend.Trace{{
+					ID:            "47109b059f45e4f9d5ab61dd0199e2c9",
+					DigestIndices: []int{4, 4, 4, 0, 4, 4, 4, 2, 2, 2},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.GreyColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPadDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}, {
+					ID:            "760c2db998331eafd3023f4b6d135b06",
+					DigestIndices: []int{3, -1, 0, -1, 0, -1, 3, -1, 1, -1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.RGBColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPhoneDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}, {
+					ID:            "8fe41dfab19e0a291f37964416432128",
+					DigestIndices: []int{3, 3, 0, 3, 3, 0, 3, 1, 1, 1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.RGBColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPadDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}, {
+					ID:            "c5b4010e73321614f9049ad1985324c2",
+					DigestIndices: []int{-1, 0, -1, -1, 4, -1, -1, 2, -1, -1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.GreyColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPhoneDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}},
+				Digests: []frontend.DigestStatus{
+					{Digest: dks.DigestBlank, Status: expectations.Untriaged},
+					{Digest: dks.DigestB01Pos, Status: expectations.Positive},
+					{Digest: dks.DigestB02Pos, Status: expectations.Positive},
+					{Digest: dks.DigestB03Neg, Status: expectations.Negative},
+					{Digest: dks.DigestB04Neg, Status: expectations.Negative},
+				},
+				TotalDigests: 5,
+			},
+			RefDiffs: map[common.RefClosest]*frontend.SRDiffDigest{
+				common.PositiveRef: {
+					CombinedMetric: 9.189747, QueryMetric: 9.189747, PixelDiffPercent: 90.625, NumDiffPixels: 58,
+					MaxRGBADiffs: [4]int{250, 244, 197, 255},
+					DimDiffer:    false,
+					Digest:       dks.DigestB01Pos,
+					Status:       expectations.Positive,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.RGBColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.QuadroDevice, dks.IPadDevice, dks.IPhoneDevice, dks.TaimenDevice, dks.WalleyeDevice},
+						dks.OSKey:             []string{dks.AndroidOS, dks.Windows10dot2OS, dks.Windows10dot3OS, dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+				common.NegativeRef: {
+					CombinedMetric: 9.519716, QueryMetric: 9.519716, PixelDiffPercent: 90.625, NumDiffPixels: 58,
+					MaxRGBADiffs: [4]int{255, 255, 255, 255},
+					DimDiffer:    true,
+					Digest:       dks.DigestB04Neg,
+					Status:       expectations.Negative,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.GreyColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+						dks.OSKey:             []string{dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+			},
+			ClosestRef: common.PositiveRef,
+		}, {
+			Digest: dks.DigestB04Neg,
+			Test:   dks.TriangleTest,
+			Status: expectations.Negative,
+			ParamSet: paramtools.ParamSet{
+				dks.ColorModeKey:      []string{dks.GreyColorMode},
+				types.CorpusField:     []string{dks.CornersCorpus},
+				dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+				dks.OSKey:             []string{dks.IOS},
+				types.PrimaryKeyField: []string{dks.TriangleTest},
+				"ext":                 []string{"png"},
+			},
+			TraceGroup: frontend.TraceGroup{
+				Traces: []frontend.Trace{{
+					ID:            "47109b059f45e4f9d5ab61dd0199e2c9",
+					DigestIndices: []int{0, 0, 0, 2, 0, 0, 0, 1, 1, 1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.GreyColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPadDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}, {
+					ID:            "c5b4010e73321614f9049ad1985324c2",
+					DigestIndices: []int{-1, 2, -1, -1, 0, -1, -1, 1, -1, -1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.GreyColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPhoneDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}},
+				Digests: []frontend.DigestStatus{
+					{Digest: dks.DigestB04Neg, Status: expectations.Negative},
+					{Digest: dks.DigestB02Pos, Status: expectations.Positive},
+					{Digest: dks.DigestBlank, Status: expectations.Untriaged},
+				},
+				TotalDigests: 3,
+			},
+			RefDiffs: map[common.RefClosest]*frontend.SRDiffDigest{
+				common.PositiveRef: {
+					CombinedMetric: 7.465255, QueryMetric: 7.465255, PixelDiffPercent: 64.0625, NumDiffPixels: 41,
+					MaxRGBADiffs: [4]int{255, 255, 255, 42},
+					DimDiffer:    true,
+					Digest:       dks.DigestB02Pos,
+					Status:       expectations.Positive,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.GreyColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.QuadroDevice, dks.IPadDevice, dks.IPhoneDevice, dks.WalleyeDevice},
+						dks.OSKey:             []string{dks.AndroidOS, dks.Windows10dot2OS, dks.Windows10dot3OS, dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+				common.NegativeRef: {
+					CombinedMetric: 9.336915, QueryMetric: 9.336915, PixelDiffPercent: 100, NumDiffPixels: 64,
+					MaxRGBADiffs: [4]int{255, 255, 255, 51},
+					DimDiffer:    true,
+					Digest:       dks.DigestB03Neg,
+					Status:       expectations.Negative,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.RGBColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+						dks.OSKey:             []string{dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+			},
+			ClosestRef: common.PositiveRef,
+		}, {
+			Digest: dks.DigestB03Neg,
+			Test:   dks.TriangleTest,
+			Status: expectations.Negative,
+			ParamSet: paramtools.ParamSet{
+				dks.ColorModeKey:      []string{dks.RGBColorMode},
+				types.CorpusField:     []string{dks.CornersCorpus},
+				dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+				dks.OSKey:             []string{dks.IOS},
+				types.PrimaryKeyField: []string{dks.TriangleTest},
+				"ext":                 []string{"png"},
+			},
+			TraceGroup: frontend.TraceGroup{
+				Traces: []frontend.Trace{{
+					ID:            "760c2db998331eafd3023f4b6d135b06",
+					DigestIndices: []int{0, -1, 2, -1, 2, -1, 0, -1, 1, -1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.RGBColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPhoneDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}, {
+					ID:            "8fe41dfab19e0a291f37964416432128",
+					DigestIndices: []int{0, 0, 2, 0, 0, 2, 0, 1, 1, 1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.RGBColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPadDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.TriangleTest,
+						"ext":                 "png",
+					},
+				}},
+				Digests: []frontend.DigestStatus{
+					{Digest: dks.DigestB03Neg, Status: expectations.Negative},
+					{Digest: dks.DigestB01Pos, Status: expectations.Positive},
+					{Digest: dks.DigestBlank, Status: expectations.Untriaged},
+				},
+				TotalDigests: 3,
+			},
+			RefDiffs: map[common.RefClosest]*frontend.SRDiffDigest{
+				common.PositiveRef: {
+					CombinedMetric: 2.9445405, QueryMetric: 2.9445405, PixelDiffPercent: 10.9375, NumDiffPixels: 7,
+					MaxRGBADiffs: [4]int{250, 244, 197, 51},
+					DimDiffer:    false,
+					Digest:       dks.DigestB01Pos,
+					Status:       expectations.Positive,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.RGBColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.QuadroDevice, dks.IPadDevice, dks.IPhoneDevice, dks.TaimenDevice, dks.WalleyeDevice},
+						dks.OSKey:             []string{dks.AndroidOS, dks.Windows10dot2OS, dks.Windows10dot3OS, dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+				common.NegativeRef: {
+					CombinedMetric: 9.336915, QueryMetric: 9.336915, PixelDiffPercent: 100, NumDiffPixels: 64,
+					MaxRGBADiffs: [4]int{255, 255, 255, 51},
+					DimDiffer:    true,
+					Digest:       dks.DigestB04Neg,
+					Status:       expectations.Negative,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.GreyColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.IPadDevice, dks.IPhoneDevice},
+						dks.OSKey:             []string{dks.IOS},
+						types.PrimaryKeyField: []string{dks.TriangleTest},
+						"ext":                 []string{"png"},
+					},
+				},
+			},
+			ClosestRef: common.PositiveRef,
+		}, {
+			Digest: dks.DigestA04Unt,
+			Test:   dks.SquareTest,
+			Status: expectations.Untriaged,
+			ParamSet: paramtools.ParamSet{
+				dks.ColorModeKey:      []string{dks.GreyColorMode},
+				types.CorpusField:     []string{dks.CornersCorpus},
+				dks.DeviceKey:         []string{dks.IPadDevice},
+				dks.OSKey:             []string{dks.IOS},
+				types.PrimaryKeyField: []string{dks.SquareTest},
+				"ext":                 []string{"png"},
+			},
+			TraceGroup: frontend.TraceGroup{
+				Traces: []frontend.Trace{{
+					ID:            "796f2cc3f33fa6a9a1f4bef3aa9c48c4",
+					DigestIndices: []int{2, 1, 2, 1, 2, 2, 2, 2, 0, 1},
+					Params: paramtools.Params{
+						dks.ColorModeKey:      dks.GreyColorMode,
+						types.CorpusField:     dks.CornersCorpus,
+						dks.DeviceKey:         dks.IPadDevice,
+						dks.OSKey:             dks.IOS,
+						types.PrimaryKeyField: dks.SquareTest,
+						"ext":                 "png",
+					},
+				}},
+				Digests: []frontend.DigestStatus{
+					{Digest: dks.DigestA04Unt, Status: expectations.Untriaged},
+					{Digest: dks.DigestA03Pos, Status: expectations.Positive},
+					{Digest: dks.DigestA02Pos, Status: expectations.Positive},
+				},
+				TotalDigests: 3,
+			},
+			RefDiffs: map[common.RefClosest]*frontend.SRDiffDigest{
+				common.PositiveRef: {
+					CombinedMetric: 0.17843534, QueryMetric: 0.17843534, PixelDiffPercent: 3.125, NumDiffPixels: 2,
+					MaxRGBADiffs: [4]int{3, 3, 3, 0},
+					DimDiffer:    false,
+					Digest:       dks.DigestA03Pos,
+					Status:       expectations.Positive,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.GreyColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.QuadroDevice, dks.IPadDevice},
+						dks.OSKey:             []string{dks.Windows10dot2OS, dks.Windows10dot3OS, dks.IOS},
+						types.PrimaryKeyField: []string{dks.SquareTest},
+						"ext":                 []string{"png"},
+					},
+				},
+				common.NegativeRef: {
+					CombinedMetric: 10, QueryMetric: 10, PixelDiffPercent: 100, NumDiffPixels: 64,
+					MaxRGBADiffs: [4]int{255, 255, 255, 255},
+					DimDiffer:    false,
+					Digest:       dks.DigestA09Neg,
+					Status:       expectations.Negative,
+					ParamSet: paramtools.ParamSet{
+						dks.ColorModeKey:      []string{dks.RGBColorMode},
+						types.CorpusField:     []string{dks.CornersCorpus},
+						dks.DeviceKey:         []string{dks.TaimenDevice},
+						dks.OSKey:             []string{dks.AndroidOS},
+						types.PrimaryKeyField: []string{dks.SquareTest},
+						"ext":                 []string{"png"},
+					},
+				},
+			},
+			ClosestRef: common.PositiveRef,
+		}},
+		Offset:  0,
+		Size:    4,
+		Commits: kitchenSinkCommits,
+		BulkTriageData: web_frontend.TriageRequestData{
+			dks.SquareTest: {
+				dks.DigestA04Unt: expectations.Positive,
+			},
+			dks.TriangleTest: {
+				dks.DigestBlank:  expectations.Positive,
+				dks.DigestB03Neg: expectations.Positive,
+				dks.DigestB04Neg: expectations.Positive,
+			},
+		},
+	}, res)
+}
+
+func TestSearch_AcrossAllHistory_Success(t *testing.T) {
+	unittest.LargeTest(t)
+
+	ctx := context.Background()
+	db := sqltest.NewCockroachDBForTestsWithProductionSchema(ctx, t)
+	require.NoError(t, sqltest.BulkInsertDataTables(ctx, db, dks.Build()))
+
+	s := New(db, 100)
+	res, err := s.Search(ctx, &query.Search{
+		OnlyIncludeDigestsProducedAtHead: false,
+		IncludePositiveDigests:           false,
+		IncludeNegativeDigests:           false,
+		IncludeUntriagedDigests:          true,
+		Sort:                             query.SortDescending,
+		IncludeIgnoredTraces:             false,
+		TraceValues: paramtools.ParamSet{
+			types.CorpusField: []string{dks.RoundCorpus},
+		},
+		RGBAMinFilter: 0,
+		RGBAMaxFilter: 255,
+	})
+	require.NoError(t, err)
+	require.Len(t, res.Results, 3)
+	// Spot check this data
+	assert.Equal(t, dks.DigestC05Unt, res.Results[0].Digest)
+	assert.Equal(t, dks.DigestC03Unt, res.Results[1].Digest)
+	assert.Equal(t, dks.DigestC04Unt, res.Results[2].Digest)
+}
+
 func TestJoinedTracesStatement_Success(t *testing.T) {
 	unittest.SmallTest(t)