diff options
| author | Physcik <mynameisgennadiy@vk.com> | 2025-11-30 00:10:40 +0500 |
|---|---|---|
| committer | Physcik <mynameisgennadiy@vk.com> | 2025-11-30 00:10:40 +0500 |
| commit | f7cc7d93ace61115248761dcafd938f0cadee68e (patch) | |
| tree | d7c2a73cfb81f688491f4b9a6ff9883b93f37b47 /DAL | |
| parent | aa3d908506cb4ea325d31fcfea2c1dca3735e76f (diff) | |
The diff query generator
Diffstat (limited to 'DAL')
| -rw-r--r-- | DAL/DB/CRUD.go | 29 | ||||
| -rw-r--r-- | DAL/DB/CRUD_test.go | 20 |
2 files changed, 48 insertions, 1 deletions
diff --git a/DAL/DB/CRUD.go b/DAL/DB/CRUD.go index b466d3c..52268df 100644 --- a/DAL/DB/CRUD.go +++ b/DAL/DB/CRUD.go @@ -10,6 +10,21 @@ type DataTable[T any] struct { TableName string } +func (base *DataTable[T]) GetSimilarFieldsQuery(ref T, fields []string) (string, error) { + var structFields = base.getFieldsMap() + var value = reflect.ValueOf(ref) + var filterMap = make(map[string]any) + for _, v := range fields { + var fieldIndex, exists = structFields[v] + if !exists { + return "", fmt.Errorf("Failed to create a query for the object: there is no such field as %s in %s", v, reflect.TypeFor[T]().Name()) + } + filterMap[v] = value.Field(fieldIndex).Interface() + } + fmt.Println(filterMap) + return base.formQueryWithFilters(filterMap), nil +} + // 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 { @@ -67,3 +82,17 @@ func (base *DataTable[T]) getFields() []string { } return outp } + +func (base *DataTable[T]) getFieldsMap() map[string]int { + var zero T + var outp = make(map[string]int) + for i, f := range reflect.VisibleFields(reflect.TypeOf(zero)) { + var tag, exists = f.Tag.Lookup("sql") + if exists { + outp[tag] = i + } else { + outp[f.Name] = i + } + } + return outp +} diff --git a/DAL/DB/CRUD_test.go b/DAL/DB/CRUD_test.go index 3b60aa0..d6fba1f 100644 --- a/DAL/DB/CRUD_test.go +++ b/DAL/DB/CRUD_test.go @@ -34,4 +34,22 @@ func TestFilteredSelectRequestForm(t *testing.T) { } } - +func TestSearchSimilarElementQuery(t *testing.T) { + var reference = testDataType { + Id: 10, + Name: "physick", + Data: time.Now(), + } + var expected = "SELECT (Id, username, Data) FROM DataTable WHERE (Id = 10 AND username = 'physick');" + var request, err = testDataTable.GetSimilarFieldsQuery(reference, []string { + "Id", + "username", + }) + if err != nil { + t.Error(err.Error()) + return + } + if request != expected { + t.Errorf("Incorrect select query. \n Expected: '%s' \n Got: '%s'", expected, request) + } +} |
