diff --git a/main.go b/main.go index 8699312..a4d55b9 100644 --- a/main.go +++ b/main.go @@ -333,6 +333,29 @@ func TranslateFilters(app *pocketbase.PocketBase, dataset string, filterGroups [ return filterGroups, nil } +// Generic function to filter JSON data dynamically based on key-value pairs +func filterDynamicChartData(chartData []map[string]interface{}, keyToFilter, valueToExclude string) []map[string]interface{} { + var filteredData []map[string]interface{} + + for _, item := range chartData { + obsKey, ok := item["ObsKey"].(map[string]interface{}) + if !ok { + // Skip items without "ObsKey" or malformed data + continue + } + + // Check if the key exists and matches the value to exclude + if obsKey[keyToFilter] == valueToExclude { + continue + } + + // Add item to filtered data + filteredData = append(filteredData, item) + } + + return filteredData +} + var app *pocketbase.PocketBase func main() { @@ -396,8 +419,6 @@ func main() { return c.JSON(http.StatusNotFound, map[string]string{"error": "No records found for the given dataset"}) } - var aggregatedResponse []map[string]interface{} - param := dbx.NewExp("dataset = {:dataset}", dbx.Params{"dataset": dataset}) languageSource, err := app.Dao().FindRecordsByExpr("charts_variables", param) if err != nil { @@ -409,31 +430,8 @@ func main() { languageSourceConverted = append(languageSourceConverted, record.SchemaData()) } - //get all filter based of kpi - var dataSetKpis []struct { - Kpi string `db:"kpi" json:"kpi"` - } - err = app.DB().Select("kpi").From("charts").Where(dbx.HashExp{"dataset": dataset}).GroupBy("kpi").All(&dataSetKpis) - if err != nil { - log.Fatalf("Failed to get kpi groupby data: %v", err) - } - - aggregatedFilterResponse := make(map[string]interface{}) - for _, dataSetKpi := range dataSetKpis { - - kpi := dataSetKpi.Kpi - filterData, err := fetchfilterJSON(kpi) - - // Translate filter data using the desired dataset and language key - fRes, err := TranslateFilters(app, dataset, filterData, "value_en") - if err != nil { - log.Fatalf("Error translating filters: %v", err) - } - - aggregatedFilterResponse[kpi] = fRes - - } - + //get chart and card data + var aggregatedResponse []map[string]interface{} for _, record := range records { // Extract the URL for each record apiURL := record.GetString("url") @@ -460,6 +458,21 @@ func main() { log.Printf("Failed to read JSON for KPI '%s': %v", file_name, err) } + // Retrieve the unset key and value + keyToFilter := record.GetString("unset_key") + valueToExclude := record.GetString("unset_value") + + // Check if both the key and value are empty + if keyToFilter == "" || valueToExclude == "" { + fmt.Println("unset_key or unset_value is empty. Skipping processing.") + } else { + // Log the extracted key and value for debugging purposes + fmt.Printf("Filtering with Key: %s, Value: %s\n", keyToFilter, valueToExclude) + + // Filter the data dynamically and update chartData + chartData = filterDynamicChartData(chartData, keyToFilter, valueToExclude) + } + langKey := "value_en" cRes := utils.ProcessChartData(chartData, languageSourceConverted, langKey) @@ -475,13 +488,41 @@ func main() { "response": cRes, "group_by": record.GetString("group_by"), "chart_heading": record.GetString("chart_heading"), + "unset_value": record.Get("unset_value"), } // Add the result to the aggregated response aggregatedResponse = append(aggregatedResponse, recordResult) } + + // get all filter based on kpi + var dataSetKpis []struct { + Kpi string `db:"kpi" json:"kpi"` + } + err = app.DB().Select("kpi").From("charts").Where(dbx.HashExp{"dataset": dataset}).GroupBy("kpi").All(&dataSetKpis) + if err != nil { + log.Fatalf("Failed to get kpi groupby data: %v", err) + } + + aggregatedFilterResponse := make(map[string]interface{}) + for _, dataSetKpi := range dataSetKpis { + + kpi := dataSetKpi.Kpi + filterData, err := fetchfilterJSON(kpi) + + // Translate filter data using the desired dataset and language key + fRes, err := TranslateFilters(app, dataset, filterData, "value_en") + if err != nil { + log.Fatalf("Error translating filters: %v", err) + } + + aggregatedFilterResponse[kpi] = fRes + + } + temp, err := fetchfilterJSON(dataset) + // Create the response structure response := map[string]interface{}{ "filter_data": temp, diff --git a/pb_data/data.db b/pb_data/data.db index c7bae22..37d2a7c 100644 Binary files a/pb_data/data.db and b/pb_data/data.db differ diff --git a/pb_data/data.db-shm b/pb_data/data.db-shm index fe9ac28..4aea087 100644 Binary files a/pb_data/data.db-shm and b/pb_data/data.db-shm differ diff --git a/pb_data/data.db-wal b/pb_data/data.db-wal index e69de29..4e3a9dc 100644 Binary files a/pb_data/data.db-wal and b/pb_data/data.db-wal differ diff --git a/pb_data/logs.db b/pb_data/logs.db index bfd14c7..d150f6b 100644 Binary files a/pb_data/logs.db and b/pb_data/logs.db differ diff --git a/pb_data/logs.db-shm b/pb_data/logs.db-shm index fe9ac28..c41956a 100644 Binary files a/pb_data/logs.db-shm and b/pb_data/logs.db-shm differ diff --git a/pb_data/logs.db-wal b/pb_data/logs.db-wal index e69de29..1728b09 100644 Binary files a/pb_data/logs.db-wal and b/pb_data/logs.db-wal differ