summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhyscik <mynameisgennadiy@vk.com>2025-11-30 00:10:40 +0500
committerPhyscik <mynameisgennadiy@vk.com>2025-11-30 00:10:40 +0500
commitf7cc7d93ace61115248761dcafd938f0cadee68e (patch)
treed7c2a73cfb81f688491f4b9a6ff9883b93f37b47
parentaa3d908506cb4ea325d31fcfea2c1dca3735e76f (diff)
The diff query generator
-rw-r--r--DAL/DB/CRUD.go29
-rw-r--r--DAL/DB/CRUD_test.go20
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)
+ }
+}