diff options
| author | Physick <96335032+DegustatorPonos@users.noreply.github.com> | 2025-11-29 21:05:36 +0500 |
|---|---|---|
| committer | Physick <96335032+DegustatorPonos@users.noreply.github.com> | 2025-11-29 21:05:36 +0500 |
| commit | c64d43552497d46ae30272d5bf93c2162ea2a1db (patch) | |
| tree | 853605a091c71048c06bd64c950f40822573c0f3 /:w | |
| parent | 757e8534d1651965f55610d96f93c952a377f3c9 (diff) | |
Filtered query generator
Diffstat (limited to ':w')
| -rw-r--r-- | :w | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -0,0 +1,66 @@ +package db + +import ( + "fmt" + "reflect" + "strings" +) + +type DataTable[T any] struct { + TableName string +} + +// Filters are stored as KVP where the field is the key and the value is the filter +func (base *DataTable[T]) formQueryWithFilters(filters map[string]any) string { + if len(filters) == 0 { + return base.formSelectAllQuery() + } + var sb = strings.Builder{} + var baseQuery = base.formSelectAllQuery() + sb.WriteString(strings.TrimRight(baseQuery, ";")) + sb.WriteString(" WHERE (") + var isFirst = true + for k, v := range filters { + if !isFirst { + sb.WriteString(" AND ") + } + switch v.(type) { + case string: + sb.WriteString(fmt.Sprintf("%s = '%s'", k, v)) + } + isFirst = false + } + sb.WriteString(");") + return sb.String() +} + +// Forms a query to get all the fields from database +func (base *DataTable[T]) formSelectAllQuery() string { + var sb = strings.Builder{} + sb.WriteString("SELECT (") + var fields = base.getFields() + for i, v := range fields { + if i != 0 { + sb.WriteString(", ") + } + sb.WriteString(v) + } + sb.WriteString(") FROM ") + sb.WriteString(base.TableName) + sb.WriteString(";") + return sb.String() +} + +func (base *DataTable[T]) getFields() []string { + var zero T + var outp = make([]string, 0) + for _, f := range reflect.VisibleFields(reflect.TypeOf(zero)) { + var tag, exists = f.Tag.Lookup("sql") + if exists { + outp = append(outp, tag) + } else { + outp = append(outp, f.Name) + } + } + return outp +} |
