refactor SelectAndOmitColumns
This commit is contained in:
parent
da07675bae
commit
6aeaa94eea
66
statement.go
66
statement.go
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user