internal/postgres: delete other packages from search during reconciliation

When reconciling search to match the latest good version, delete from
search_documents any packages in the module that are not in the good
version.

Change-Id: I654eda3d3066bb82963fc98ca537d4b3761ad6eb
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/343189
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/postgres/delete.go b/internal/postgres/delete.go
index e447076..ed25317 100644
--- a/internal/postgres/delete.go
+++ b/internal/postgres/delete.go
@@ -10,7 +10,6 @@
 
 	"github.com/Masterminds/squirrel"
 	"github.com/lib/pq"
-	"golang.org/x/pkgsite/internal"
 	"golang.org/x/pkgsite/internal/database"
 	"golang.org/x/pkgsite/internal/derrors"
 	"golang.org/x/pkgsite/internal/log"
@@ -50,16 +49,16 @@
 
 // deleteOtherModulePackagesFromSearchDocuments deletes all packages from search
 // documents with the given module that are not in m.
-func deleteOtherModulePackagesFromSearchDocuments(ctx context.Context, tx *database.DB, m *internal.Module) error {
+func deleteOtherModulePackagesFromSearchDocuments(ctx context.Context, tx *database.DB, modulePath string, pkgPaths []string) error {
 	dbPkgs, err := tx.CollectStrings(ctx, `
 		SELECT package_path FROM search_documents WHERE module_path = $1
-	`, m.ModulePath)
+	`, modulePath)
 	if err != nil {
 		return err
 	}
 	pkgInModule := map[string]bool{}
-	for _, u := range m.Packages() {
-		pkgInModule[u.Path] = true
+	for _, p := range pkgPaths {
+		pkgInModule[p] = true
 	}
 	var otherPkgs []string
 	for _, p := range dbPkgs {
diff --git a/internal/postgres/insert_module.go b/internal/postgres/insert_module.go
index 542354f..c253e99 100644
--- a/internal/postgres/insert_module.go
+++ b/internal/postgres/insert_module.go
@@ -144,12 +144,15 @@
 		}
 
 		// Here, this module is the latest good version.
-
 		if err := insertImportsUnique(ctx, tx, m); err != nil {
 			return err
 		}
 
-		if err := deleteOtherModulePackagesFromSearchDocuments(ctx, tx, m); err != nil {
+		var pkgPaths []string
+		for _, u := range m.Packages() {
+			pkgPaths = append(pkgPaths, u.Path)
+		}
+		if err := deleteOtherModulePackagesFromSearchDocuments(ctx, tx, m.ModulePath, pkgPaths); err != nil {
 			return err
 		}
 
@@ -718,6 +721,15 @@
 			return err
 		}
 
+		// Delete packages not in this version.
+		var pkgPaths []string
+		for _, pkg := range pkgMetas {
+			pkgPaths = append(pkgPaths, pkg.Path)
+		}
+		if err := deleteOtherModulePackagesFromSearchDocuments(ctx, tx, modulePath, pkgPaths); err != nil {
+			return err
+		}
+
 		// Insert into search_documents.
 		for _, pkg := range pkgMetas {
 			if isInternalPackage(pkg.Path) {