internal/postgres: delete Legacy functions

For golang/go#37102

Change-Id: Icda2856dd6af29267affd075a95974a3c65c0adc
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/317429
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
This commit is contained in:
Julie Qiu 2021-05-05 17:54:40 -04:00
Родитель ab4eaf3df7
Коммит 671ddf2fc1
5 изменённых файлов: 68 добавлений и 307 удалений

Просмотреть файл

@ -37,7 +37,7 @@ func upsertSymbolHistory(ctx context.Context, ddb *database.DB,
return err
}
for packagePath, docIDToDoc := range pathToDocIDToDoc {
dbVersionToNameToUnitSymbol, err := LegacyGetSymbolHistoryFromTable(ctx, ddb, packagePath, modulePath)
sh, err := GetSymbolHistoryFromTable(ctx, ddb, packagePath, modulePath)
if err != nil {
return err
}
@ -49,10 +49,13 @@ func upsertSymbolHistory(ctx context.Context, ddb *database.DB,
}
for _, b := range builds {
dbNameToVersion := map[string]string{}
for v, nameToUS := range dbVersionToNameToUnitSymbol {
for name, us := range nameToUS {
if us.SupportsBuild(b) {
dbNameToVersion[name] = v
for _, v := range sh.Versions() {
nts := sh.SymbolsAtVersion(v)
for name, stu := range nts {
for _, us := range stu {
if us.SupportsBuild(b) {
dbNameToVersion[name] = v
}
}
}
}

Просмотреть файл

@ -50,7 +50,10 @@ func getPackageSymbols(ctx context.Context, ddb *database.DB, packagePath, modul
sh, collect := collectSymbolHistory(func(sh *internal.SymbolHistory, sm internal.SymbolMeta, v string, build internal.BuildContext) error {
if sm.Section == internal.SymbolSectionTypes && sm.Kind != internal.SymbolKindType {
_, err := sh.GetSymbol(sm.ParentName, v, build)
return err
if err != nil {
return fmt.Errorf("could not find parent for %q: %v", sm.Name, err)
}
return nil
}
return nil
})
@ -88,99 +91,3 @@ func collectSymbolHistory(check func(sh *internal.SymbolHistory, sm internal.Sym
return nil
}
}
// legacyGetPackageSymbols returns all of the symbols for a given package path and module path.
func legacyGetPackageSymbols(ctx context.Context, ddb *database.DB, packagePath, modulePath string,
) (_ map[string]map[string]*internal.UnitSymbol, err error) {
defer derrors.Wrap(&err, "legacyGetPackageSymbols(ctx, ddb, %q, %q)", packagePath, modulePath)
defer middleware.ElapsedStat(ctx, "getPackageSymbols")()
query := `
SELECT
s1.name AS symbol_name,
s2.name AS parent_symbol_name,
ps.section,
ps.type,
ps.synopsis,
m.version,
d.goos,
d.goarch
FROM modules m
INNER JOIN units u ON u.module_id = m.id
INNER JOIN documentation d ON d.unit_id = u.id
INNER JOIN documentation_symbols ds ON ds.documentation_id = d.id
INNER JOIN package_symbols ps ON ps.id = ds.package_symbol_id
INNER JOIN paths p1 ON u.path_id = p1.id
INNER JOIN symbol_names s1 ON ps.symbol_name_id = s1.id
INNER JOIN symbol_names s2 ON ps.parent_symbol_name_id = s2.id
WHERE
p1.path = $1
AND m.module_path = $2
AND NOT m.incompatible
AND m.version_type = 'release'
ORDER BY
CASE WHEN ps.type='Type' THEN 0 ELSE 1 END,
symbol_name;`
// versionToNameToUnitSymbol contains all of the types for this unit,
// grouped by name and build context. This is used to keep track of the
// parent types, so that we can map the children to those symbols.
versionToNameToUnitSymbol := map[string]map[string]*internal.UnitSymbol{}
collect := func(rows *sql.Rows) error {
var (
newUS internal.UnitSymbol
build internal.BuildContext
v string
)
if err := rows.Scan(
&newUS.Name,
&newUS.ParentName,
&newUS.Section,
&newUS.Kind,
&newUS.Synopsis,
&v,
&build.GOOS,
&build.GOARCH,
); err != nil {
return fmt.Errorf("row.Scan(): %v", err)
}
if newUS.Section == internal.SymbolSectionTypes && newUS.Kind != internal.SymbolKindType {
if err := validateChildSymbol(&newUS, v, build, versionToNameToUnitSymbol); err != nil {
return err
}
}
nts, ok := versionToNameToUnitSymbol[v]
if !ok {
nts = map[string]*internal.UnitSymbol{}
versionToNameToUnitSymbol[v] = nts
}
us, ok := nts[newUS.Name]
if !ok {
us = &newUS
nts[newUS.Name] = us
}
us.AddBuildContext(build)
return nil
}
if err := ddb.RunQuery(ctx, query, collect, packagePath, modulePath); err != nil {
return nil, err
}
return versionToNameToUnitSymbol, nil
}
func validateChildSymbol(us *internal.UnitSymbol, v string, build internal.BuildContext,
versionToNameToUnitSymbol map[string]map[string]*internal.UnitSymbol) error {
nameToUnitSymbol, ok := versionToNameToUnitSymbol[v]
if !ok {
return fmt.Errorf("version %q could not be found: %q", v, us.Name)
}
parent, ok := nameToUnitSymbol[us.ParentName]
if !ok {
return fmt.Errorf("parent %q could not be found at version %q: %q",
us.ParentName, v, us.Name)
}
if !parent.SupportsBuild(build) {
return fmt.Errorf("parent %q does not have build %v at version %q: %q",
us.ParentName, build, v, us.Name)
}
return nil
}

Просмотреть файл

@ -87,106 +87,6 @@ func GetSymbolHistoryWithPackageSymbols(ctx context.Context, ddb *database.DB,
return symbol.IntroducedHistory(sh)
}
// LegacyGetSymbolHistory returns a map of the first version when a symbol name is
// added to the API, to the symbol name, to the UnitSymbol struct. The
// UnitSymbol.Children field will always be empty, as children names are also
// tracked.
func (db *DB) LegacyGetSymbolHistory(ctx context.Context, packagePath, modulePath string,
) (_ map[string]map[string]*internal.UnitSymbol, err error) {
defer derrors.Wrap(&err, "LegacyGetSymbolHistory(ctx, %q, %q)", packagePath, modulePath)
defer middleware.ElapsedStat(ctx, "LegacyGetSymbolHistory")()
if experiment.IsActive(ctx, internal.ExperimentReadSymbolHistory) {
return LegacyGetSymbolHistoryFromTable(ctx, db.db, packagePath, modulePath)
}
return LegacyGetSymbolHistoryWithPackageSymbols(ctx, db.db, packagePath, modulePath)
}
// LegacyGetSymbolHistoryFromTable fetches symbol history data from the symbol_history table.
//
// LegacyGetSymbolHistoryFromTable is exported for use in tests.
func LegacyGetSymbolHistoryFromTable(ctx context.Context, ddb *database.DB,
packagePath, modulePath string) (_ map[string]map[string]*internal.UnitSymbol, err error) {
defer derrors.WrapStack(&err, "LegacyGetSymbolHistoryFromTable(ctx, ddb, %q, %q)", packagePath, modulePath)
q := squirrel.Select(
"s1.name AS symbol_name",
"s2.name AS parent_symbol_name",
"ps.section",
"ps.type",
"ps.synopsis",
"sh.since_version",
"sh.goos",
"sh.goarch",
).From("symbol_history sh").
Join("package_symbols ps ON ps.id = sh.package_symbol_id").
Join("symbol_names s1 ON ps.symbol_name_id = s1.id").
Join("symbol_names s2 ON ps.parent_symbol_name_id = s2.id").
Join("paths p1 ON sh.package_path_id = p1.id").
Join("paths p2 ON sh.module_path_id = p2.id").
Where(squirrel.Eq{"p1.path": packagePath}).
Where(squirrel.Eq{"p2.path": modulePath})
query, args, err := q.PlaceholderFormat(squirrel.Dollar).ToSql()
if err != nil {
return nil, err
}
// versionToNameToUnitSymbol is a map of the version a symbol was
// introduced, to the name and unit symbol.
versionToNameToUnitSymbol := map[string]map[string]*internal.UnitSymbol{}
collect := func(rows *sql.Rows) error {
var (
newUS internal.UnitSymbol
build internal.BuildContext
v string
)
if err := rows.Scan(
&newUS.Name,
&newUS.ParentName,
&newUS.Section,
&newUS.Kind,
&newUS.Synopsis,
&v,
&build.GOOS,
&build.GOARCH,
); err != nil {
return fmt.Errorf("row.Scan(): %v", err)
}
nts, ok := versionToNameToUnitSymbol[v]
if !ok {
nts = map[string]*internal.UnitSymbol{}
versionToNameToUnitSymbol[v] = nts
}
us, ok := nts[newUS.Name]
if !ok {
us = &newUS
nts[newUS.Name] = us
}
us.AddBuildContext(build)
return nil
}
if err := ddb.RunQuery(ctx, query, collect, args...); err != nil {
return nil, err
}
return versionToNameToUnitSymbol, nil
}
// LegacyGetSymbolHistoryWithPackageSymbols fetches symbol history data by using data
// from package_symbols and documentation_symbols, and computed using
// symbol.IntroducedHistory.
//
// LegacyGetSymbolHistoryWithPackageSymbols is exported for use in tests.
func LegacyGetSymbolHistoryWithPackageSymbols(ctx context.Context, ddb *database.DB,
packagePath, modulePath string) (_ map[string]map[string]*internal.UnitSymbol, err error) {
defer derrors.WrapStack(&err, "GetSymbolHistoryWithPackageSymbols(ctx, ddb, %q, %q)", packagePath, modulePath)
defer middleware.ElapsedStat(ctx, "GetSymbolHistoryWithPackageSymbols")()
versionToNameToUnitSymbols, err := legacyGetPackageSymbols(ctx, ddb, packagePath, modulePath)
if err != nil {
return nil, err
}
return symbol.LegacyIntroducedHistory(versionToNameToUnitSymbols), nil
}
// GetSymbolHistoryForBuildContext returns a map of the first version when a symbol name is
// added to the API for the specified build context, to the symbol name, to the
// UnitSymbol struct. The UnitSymbol.Children field will always be empty, as

Просмотреть файл

@ -63,27 +63,23 @@ func TestInsertSymbolNamesAndHistory(t *testing.T) {
}
compareUnitSymbols(ctx, t, testDB, mod.Packages()[0].Path, mod.ModulePath, mod.Version,
map[internal.BuildContext][]*internal.Symbol{internal.BuildContextAll: api})
want2 := map[string]map[string]*internal.UnitSymbol{}
want2[mod.Version] = unitSymbolsFromAPI(api, mod.Version)
want2 := symbolHistoryFromAPI(api, mod.Version)
comparePackageSymbols(ctx, t, testDB, mod.Packages()[0].Path, mod.ModulePath, mod.Version, want2)
gotHist, err := testDB.LegacyGetSymbolHistory(ctx, mod.Packages()[0].Path, mod.ModulePath)
gotHist, err := testDB.GetSymbolHistory(ctx, mod.Packages()[0].Path, mod.ModulePath)
if err != nil {
t.Fatal(err)
}
wantHist := map[string]map[string]*internal.UnitSymbol{
"v1.0.0": map[string]*internal.UnitSymbol{
"Constant": unitSymbolFromSymbol(sample.Constant, "v1.0.0"),
"Variable": unitSymbolFromSymbol(sample.Variable, "v1.0.0"),
"Function": unitSymbolFromSymbol(sample.Function, "v1.0.0"),
"Type": unitSymbolFromSymbol(sample.Type, "v1.0.0"),
"Type.Field": unitSymbolFromSymbolMeta(sample.Type.Children[0], "v1.0.0", internal.BuildContextAll),
"New": unitSymbolFromSymbolMeta(sample.Type.Children[1], "v1.0.0", internal.BuildContextAll),
"Type.Method": unitSymbolFromSymbolMeta(sample.Type.Children[2], "v1.0.0", internal.BuildContextAll),
},
}
wantHist := internal.NewSymbolHistory()
wantHist.AddSymbol(sample.Constant.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(sample.Variable.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(sample.Function.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(sample.Type.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(*sample.Type.Children[0], "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(*sample.Type.Children[1], "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(*sample.Type.Children[2], "v1.0.0", internal.BuildContextAll)
if diff := cmp.Diff(wantHist, gotHist,
cmp.AllowUnexported(internal.UnitSymbol{})); diff != "" {
cmp.AllowUnexported(internal.UnitSymbol{}, internal.SymbolHistory{})); diff != "" {
t.Fatalf("mismatch on symbol history(-want +got):\n%s", diff)
}
}
@ -116,8 +112,7 @@ func TestInsertSymbolHistory_Basic(t *testing.T) {
compareUnitSymbols(ctx, t, testDB, mod.Packages()[0].Path, mod.ModulePath, mod.Version,
map[internal.BuildContext][]*internal.Symbol{internal.BuildContextAll: api})
want2 := map[string]map[string]*internal.UnitSymbol{}
want2[mod.Version] = unitSymbolsFromAPI(api, mod.Version)
want2 := symbolHistoryFromAPI(api, mod.Version)
comparePackageSymbols(ctx, t, testDB, mod.Packages()[0].Path, mod.ModulePath, mod.Version, want2)
}
@ -187,7 +182,7 @@ func TestInsertSymbolHistory_MultiVersions(t *testing.T) {
compareUnitSymbols(ctx, t, testDB, mod11.Packages()[0].Path, mod11.ModulePath, mod11.Version, want11)
compareUnitSymbols(ctx, t, testDB, mod12.Packages()[0].Path, mod12.ModulePath, mod12.Version, want12)
want2 := map[string]map[string]*internal.UnitSymbol{}
want2 := internal.NewSymbolHistory()
for _, want := range []struct {
version string
buildToSymbols map[internal.BuildContext][]*internal.Symbol
@ -196,13 +191,16 @@ func TestInsertSymbolHistory_MultiVersions(t *testing.T) {
{mod11.Version, want11},
{mod12.Version, want12},
} {
for _, api := range want.buildToSymbols {
want2[want.version] = unitSymbolsFromAPI(api, want.version)
for build, api := range want.buildToSymbols {
updateSymbols(api, func(s *internal.SymbolMeta) error {
want2.AddSymbol(*s, want.version, build)
return nil
})
}
}
comparePackageSymbols(ctx, t, testDB, mod10.Packages()[0].Path, mod10.ModulePath, mod10.Version, want2)
gotHist, err := testDB.LegacyGetSymbolHistory(ctx, mod10.Packages()[0].Path, mod10.ModulePath)
gotHist, err := testDB.GetSymbolHistory(ctx, mod10.Packages()[0].Path, mod10.ModulePath)
if err != nil {
t.Fatal(err)
}
@ -212,19 +210,12 @@ func TestInsertSymbolHistory_MultiVersions(t *testing.T) {
typA.GOARCH = internal.All
methodA.GOARCH = internal.All
methodB.GOARCH = internal.All
wantHist := map[string]map[string]*internal.UnitSymbol{
"v1.0.0": map[string]*internal.UnitSymbol{
"Foo": unitSymbolFromSymbol(&typA, "v1.0.0"),
},
"v1.1.0": {
"Foo.A": unitSymbolFromSymbol(&methodA, "v1.1.0"),
},
"v1.2.0": {
"Foo.B": unitSymbolFromSymbol(&methodB, "v1.2.0"),
},
}
wantHist := internal.NewSymbolHistory()
wantHist.AddSymbol(typA.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(methodA.SymbolMeta, "v1.1.0", internal.BuildContextAll)
wantHist.AddSymbol(methodB.SymbolMeta, "v1.2.0", internal.BuildContextAll)
if diff := cmp.Diff(wantHist, gotHist,
cmp.AllowUnexported(internal.UnitSymbol{})); diff != "" {
cmp.AllowUnexported(internal.UnitSymbol{}, internal.SymbolHistory{})); diff != "" {
t.Fatalf("mismatch on symbol history(-want +got):\n%s", diff)
}
}
@ -339,15 +330,19 @@ func TestInsertSymbolHistory_MultiGOOS(t *testing.T) {
compareUnitSymbols(ctx, t, testDB, mod11.Packages()[0].Path, mod11.ModulePath, mod11.Version, want11)
compareUnitSymbols(ctx, t, testDB, mod12.Packages()[0].Path, mod12.ModulePath, mod12.Version, want12)
want2 := map[string]map[string]*internal.UnitSymbol{}
want2 := internal.NewSymbolHistory()
for _, mod := range []*internal.Module{mod10, mod11, mod12} {
want2[mod.Version] = map[string]*internal.UnitSymbol{}
for _, pkg := range mod.Packages() {
for _, doc := range pkg.Documentation {
nameToUnitSym := unitSymbolsFromAPI(doc.API, mod.Version)
for name, unitSym := range nameToUnitSym {
if _, ok := want2[mod.Version][name]; !ok {
want2[mod.Version][name] = unitSym
sh := symbolHistoryFromAPI(doc.API, mod.Version)
for _, v := range sh.Versions() {
nts := sh.SymbolsAtVersion(v)
for _, stu := range nts {
for sm, us := range stu {
for _, b := range us.BuildContexts() {
want2.AddSymbol(sm, mod.Version, b)
}
}
}
}
}
@ -355,52 +350,25 @@ func TestInsertSymbolHistory_MultiGOOS(t *testing.T) {
}
comparePackageSymbols(ctx, t, testDB, mod10.Packages()[0].Path, mod10.ModulePath, mod10.Version, want2)
gotHist, err := testDB.LegacyGetSymbolHistory(ctx, mod10.Packages()[0].Path, mod10.ModulePath)
gotHist, err := testDB.GetSymbolHistory(ctx, mod10.Packages()[0].Path, mod10.ModulePath)
if err != nil {
t.Fatal(err)
}
typ.GOOS = internal.All
typ.GOARCH = internal.All
wantHist := map[string]map[string]*internal.UnitSymbol{
"v1.0.0": map[string]*internal.UnitSymbol{
"Foo": unitSymbolFromSymbol(&typ, "v1.0.0"),
},
"v1.1.0": map[string]*internal.UnitSymbol{
"Foo.A": func() *internal.UnitSymbol {
us := unitSymbolFromSymbol(&methodA, "v1.1.0")
us.RemoveBuildContexts()
us.AddBuildContext(internal.BuildContextLinux)
us.AddBuildContext(internal.BuildContextWindows)
return us
}(),
"Foo.B": func() *internal.UnitSymbol {
us := unitSymbolFromSymbol(&methodB, "v1.1.0")
us.RemoveBuildContexts()
us.AddBuildContext(internal.BuildContextJS)
us.AddBuildContext(internal.BuildContextDarwin)
return us
}(),
},
"v1.2.0": map[string]*internal.UnitSymbol{
"Foo.A": func() *internal.UnitSymbol {
us := unitSymbolFromSymbol(&methodA, "v1.2.0")
us.RemoveBuildContexts()
us.AddBuildContext(internal.BuildContextJS)
us.AddBuildContext(internal.BuildContextDarwin)
return us
}(),
"Foo.B": func() *internal.UnitSymbol {
us := unitSymbolFromSymbol(&methodB, "v1.2.0")
us.RemoveBuildContexts()
us.AddBuildContext(internal.BuildContextLinux)
us.AddBuildContext(internal.BuildContextWindows)
return us
}(),
},
}
wantHist := internal.NewSymbolHistory()
wantHist.AddSymbol(typ.SymbolMeta, "v1.0.0", internal.BuildContextAll)
wantHist.AddSymbol(methodA.SymbolMeta, "v1.1.0", internal.BuildContextLinux)
wantHist.AddSymbol(methodA.SymbolMeta, "v1.1.0", internal.BuildContextWindows)
wantHist.AddSymbol(methodB.SymbolMeta, "v1.1.0", internal.BuildContextJS)
wantHist.AddSymbol(methodB.SymbolMeta, "v1.1.0", internal.BuildContextDarwin)
wantHist.AddSymbol(methodA.SymbolMeta, "v1.2.0", internal.BuildContextJS)
wantHist.AddSymbol(methodA.SymbolMeta, "v1.2.0", internal.BuildContextDarwin)
wantHist.AddSymbol(methodB.SymbolMeta, "v1.2.0", internal.BuildContextLinux)
wantHist.AddSymbol(methodB.SymbolMeta, "v1.2.0", internal.BuildContextWindows)
if diff := cmp.Diff(wantHist, gotHist,
cmp.AllowUnexported(internal.UnitSymbol{})); diff != "" {
cmp.AllowUnexported(internal.UnitSymbol{}, internal.SymbolHistory{})); diff != "" {
t.Fatalf("mismatch on symbol history(-want +got):\n%s", diff)
}
@ -473,42 +441,24 @@ func compareUnitSymbols(ctx context.Context, t *testing.T, testDB *DB,
}
func comparePackageSymbols(ctx context.Context, t *testing.T, testDB *DB,
path, modulePath, version string, want map[string]map[string]*internal.UnitSymbol) {
path, modulePath, version string, want *internal.SymbolHistory) {
t.Helper()
got, err := legacyGetPackageSymbols(ctx, testDB.db, path, modulePath)
got, err := getPackageSymbols(ctx, testDB.db, path, modulePath)
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(want, got,
cmp.AllowUnexported(internal.UnitSymbol{}, internal.SymbolHistory{}),
cmpopts.IgnoreFields(internal.UnitSymbol{}, "builds")); diff != "" {
t.Errorf("mismatch (-want +got):\n%s", diff)
}
}
func unitSymbolsFromAPI(api []*internal.Symbol, version string) map[string]*internal.UnitSymbol {
nameToUnitSymbols := map[string]*internal.UnitSymbol{}
func symbolHistoryFromAPI(api []*internal.Symbol, version string) *internal.SymbolHistory {
sh := internal.NewSymbolHistory()
updateSymbols(api, func(s *internal.SymbolMeta) error {
if _, ok := nameToUnitSymbols[s.Name]; !ok {
us := unitSymbolFromSymbolMeta(s, version, internal.BuildContextAll)
nameToUnitSymbols[s.Name] = us
}
sh.AddSymbol(*s, version, internal.BuildContextAll)
return nil
})
return nameToUnitSymbols
}
func unitSymbolFromSymbol(s *internal.Symbol, version string) *internal.UnitSymbol {
us := &internal.UnitSymbol{
SymbolMeta: s.SymbolMeta,
}
us.AddBuildContext(internal.BuildContext{GOOS: s.GOOS, GOARCH: s.GOARCH})
return us
}
func unitSymbolFromSymbolMeta(sm *internal.SymbolMeta, version string, b internal.BuildContext) *internal.UnitSymbol {
us := &internal.UnitSymbol{
SymbolMeta: *sm,
}
us.AddBuildContext(b)
return us
return sh
}

Просмотреть файл

@ -540,13 +540,14 @@ func (db *DB) getUnitWithAllFields(ctx context.Context, um *internal.UnitMeta, b
}
return &u, nil
}
versionToNameToUnitSymbol, err := LegacyGetSymbolHistoryWithPackageSymbols(ctx, db.db, um.Path,
sh, err := GetSymbolHistoryWithPackageSymbols(ctx, db.db, um.Path,
um.ModulePath)
if err != nil {
return nil, err
}
nameToVersion := map[string]string{}
for v, nts := range versionToNameToUnitSymbol {
for _, v := range sh.Versions() {
nts := sh.SymbolsAtVersion(v)
for n := range nts {
nameToVersion[n] = v
}