refactor SelectAndOmitColumns

This commit is contained in:
0x2d3c 2022-03-12 00:44:34 +08:00
parent b566ed7913
commit cb18433078

View File

@ -647,51 +647,39 @@ var nameMatcher = regexp.MustCompile(`^[\W]?(?:[a-z_]+?)[\W]?\.[\W]?([a-z_]+?)[\
// SelectAndOmitColumns get select and omit columns, select -> true, omit -> false // SelectAndOmitColumns get select and omit columns, select -> true, omit -> false
func (stmt *Statement) SelectAndOmitColumns(requireCreate, requireUpdate bool) (map[string]bool, bool) { func (stmt *Statement) SelectAndOmitColumns(requireCreate, requireUpdate bool) (map[string]bool, bool) {
results := map[string]bool{}
notRestricted := false notRestricted := false
results := map[string]bool{}
// select columns filter := func(columns []string, selected bool) {
for _, column := range stmt.Selects { for _, column := range columns {
if stmt.Schema == nil { switch {
results[column] = true case stmt.Schema == nil:
} else if column == "*" { results[column] = selected
notRestricted = true case column == "*":
for _, dbName := range stmt.Schema.DBNames { notRestricted = selected
results[dbName] = true for _, dbName := range stmt.Schema.DBNames {
results[dbName] = selected
}
case column == clause.Associations:
for _, rel := range stmt.Schema.Relationships.Relations {
results[rel.Name] = selected
}
default:
if field := stmt.Schema.LookUpField(column); field != nil && field.DBName != "" {
results[field.DBName] = selected
} else if matches := nameMatcher.FindStringSubmatch(column); len(matches) == 2 {
results[matches[1]] = selected
} else {
results[column] = selected
}
} }
} else if column == clause.Associations {
for _, rel := range stmt.Schema.Relationships.Relations {
results[rel.Name] = true
}
} else if field := stmt.Schema.LookUpField(column); field != nil && field.DBName != "" {
results[field.DBName] = true
} else if matches := nameMatcher.FindStringSubmatch(column); len(matches) == 2 {
results[matches[1]] = true
} else {
results[column] = true
} }
} }
// omit columns // omit columns
for _, omit := range stmt.Omits { filter(stmt.Omits, false)
if stmt.Schema == nil {
results[omit] = false // select columns
} else if omit == "*" { filter(stmt.Selects, true)
for _, dbName := range stmt.Schema.DBNames {
results[dbName] = false
}
} else if omit == clause.Associations {
for _, rel := range stmt.Schema.Relationships.Relations {
results[rel.Name] = false
}
} else if field := stmt.Schema.LookUpField(omit); field != nil && field.DBName != "" {
results[field.DBName] = false
} else if matches := nameMatcher.FindStringSubmatch(omit); len(matches) == 2 {
results[matches[1]] = false
} else {
results[omit] = false
}
}
if stmt.Schema != nil { if stmt.Schema != nil {
for _, field := range stmt.Schema.FieldsByName { for _, field := range stmt.Schema.FieldsByName {