SelectAndOmitColumns get select and omit columns, select -> true, omit -> false
(requireCreate, requireUpdate bool)
| 713 | |
| 714 | // SelectAndOmitColumns get select and omit columns, select -> true, omit -> false |
| 715 | func (stmt *Statement) SelectAndOmitColumns(requireCreate, requireUpdate bool) (map[string]bool, bool) { |
| 716 | results := map[string]bool{} |
| 717 | notRestricted := false |
| 718 | |
| 719 | processColumn := func(column string, result bool) { |
| 720 | if stmt.Schema == nil { |
| 721 | results[column] = result |
| 722 | } else if column == "*" { |
| 723 | notRestricted = result |
| 724 | for _, dbName := range stmt.Schema.DBNames { |
| 725 | results[dbName] = result |
| 726 | } |
| 727 | } else if column == clause.Associations { |
| 728 | for _, rel := range stmt.Schema.Relationships.Relations { |
| 729 | results[rel.Name] = result |
| 730 | } |
| 731 | } else if field := stmt.Schema.LookUpField(column); field != nil && field.DBName != "" { |
| 732 | results[field.DBName] = result |
| 733 | } else if table, col := matchName(column); col != "" && (table == stmt.Table || table == "") { |
| 734 | if col == "*" { |
| 735 | for _, dbName := range stmt.Schema.DBNames { |
| 736 | results[dbName] = result |
| 737 | } |
| 738 | } else { |
| 739 | results[col] = result |
| 740 | } |
| 741 | } else { |
| 742 | results[column] = result |
| 743 | } |
| 744 | } |
| 745 | |
| 746 | // select columns |
| 747 | for _, column := range stmt.Selects { |
| 748 | processColumn(column, true) |
| 749 | } |
| 750 | |
| 751 | // omit columns |
| 752 | for _, column := range stmt.Omits { |
| 753 | processColumn(column, false) |
| 754 | } |
| 755 | |
| 756 | if stmt.Schema != nil { |
| 757 | for _, field := range stmt.Schema.FieldsByName { |
| 758 | name := field.DBName |
| 759 | if name == "" { |
| 760 | name = field.Name |
| 761 | } |
| 762 | |
| 763 | if requireCreate && !field.Creatable { |
| 764 | results[name] = false |
| 765 | } else if requireUpdate && !field.Updatable { |
| 766 | results[name] = false |
| 767 | } |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | return results, !notRestricted && len(stmt.Selects) > 0 |
| 772 | } |
no test coverage detected