From d3b6ec7b5a1ef34eebc1f98743c001b09744aab6 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 4 Feb 2025 14:15:20 +0530 Subject: [PATCH] Filter multiple remove : GWM --- main.go | 117 +++++++++++++++++++++++++++++++++--------- pb_data/data.db | Bin 196608 -> 196608 bytes pb_data/data.db-shm | Bin 0 -> 32768 bytes pb_data/data.db-wal | 0 pb_data/logs.db | Bin 770048 -> 770048 bytes pb_data/logs.db-shm | Bin 0 -> 32768 bytes pb_data/logs.db-wal | Bin 0 -> 61832 bytes utils/filter_utils.go | 64 +++++++++++++++++++++++ 8 files changed, 157 insertions(+), 24 deletions(-) create mode 100644 pb_data/data.db-shm create mode 100644 pb_data/data.db-wal create mode 100644 pb_data/logs.db-shm create mode 100644 pb_data/logs.db-wal create mode 100644 utils/filter_utils.go diff --git a/main.go b/main.go index 0c9dabb..98339aa 100644 --- a/main.go +++ b/main.go @@ -161,12 +161,18 @@ type ResponseItem struct { ObsValue map[string]string `json:"ObsValue"` } -type FilterGroup struct { - FilterKey string `json:"filter_key"` - FilterData []interface{} `json:"filter_data"` +type FilterJsonData struct { + Order int `json:"order"` + Text string `json:"text"` } -func generateFilters(responseRaw []map[string]interface{}, filterKeys []string, unsetKey string, unsetValue string) ([]FilterGroup, error) { +type FilterGroup struct { + FilterKey string `json:"filter_key"` + FilterData []interface{} `json:"filter_data"` + FilterTextAndOrder FilterJsonData `json:"filter_text_and_order"` +} + +func generateFilters(responseRaw []map[string]interface{}, filterKeys []string, filterJsonData map[string]FilterJsonData) ([]FilterGroup, error) { // Transform responseRaw to []ResponseItem var response []ResponseItem responseBytes, err := json.Marshal(responseRaw) // Marshal raw data to JSON @@ -200,17 +206,13 @@ func generateFilters(responseRaw []map[string]interface{}, filterKeys []string, for key, values := range filterMap { filterData := make([]interface{}, 0, len(values)) for value := range values { - if key == unsetKey { - if value != unsetValue { - filterData = append(filterData, value) - } - } else { - filterData = append(filterData, value) - } + + filterData = append(filterData, value) } filters = append(filters, FilterGroup{ - FilterKey: key, - FilterData: filterData, + FilterKey: key, + FilterData: filterData, + FilterTextAndOrder: filterJsonData[key], }) } @@ -222,19 +224,19 @@ func fetchfilterJSON(kpi string) ([]FilterGroup, error) { // Define struct for the result var dataSetFilter struct { - Id string `db:"id" json:"id"` - FullDataUrl string `db:"full_data_url" json:"full_data_url"` - FilterKeys string `db:"filter_keys" json:"filter_keys"` - FileStatus bool `db:"file_status" json:"file_status"` - DataSet string `db:"dataset" json:"dataset"` - Kpi string `db:"kpi" json:"kpi"` - UnsetKey string `db:"unset_key" json:"unset_key"` - UnsetValue string `db:"unset_value" json:"unset_value"` + Id string `db:"id" json:"id"` + FullDataUrl string `db:"full_data_url" json:"full_data_url"` + FilterKeys string `db:"filter_keys" json:"filter_keys"` + FileStatus bool `db:"file_status" json:"file_status"` + DataSet string `db:"dataset" json:"dataset"` + Kpi string `db:"kpi" json:"kpi"` + ExclusionFiltersJSON string `db:"exclusion_filters_array" json:"exclusion_filters_array"` + FilterJson string `db:"filter_json" json:"filter_json"` } // Query to get one row from the data_set_filter table err := app.DB(). - Select("id", "full_data_url", "filter_keys", "file_status", "dataset", "kpi", "unset_key", "unset_value"). + Select("id", "full_data_url", "filter_keys", "file_status", "dataset", "kpi", "filter_json", "exclusion_filters_array"). From("data_set_filter"). Where(dbx.HashExp{"kpi": kpi}). One(&dataSetFilter) @@ -244,6 +246,15 @@ func fetchfilterJSON(kpi string) ([]FilterGroup, error) { return nil, err } + // Use a map to store the dynamic JSON keys + var filterJson map[string]FilterJsonData + + // Parse the JSON + err = json.Unmarshal([]byte(dataSetFilter.FilterJson), &filterJson) + if err != nil { + log.Fatalf("Error parsing JSON: %v", err) + } + // Fetch and convert XML to JSON if file is not saved if !dataSetFilter.FileStatus { // Check if FileStatus is false _, err := fetchAndConvertXMLToJSON(dataSetFilter.FullDataUrl, "filter_files", dataSetFilter.Kpi, "data_set_filter", dataSetFilter.Id) @@ -264,14 +275,72 @@ func fetchfilterJSON(kpi string) ([]FilterGroup, error) { filterKeys := strings.Split(dataSetFilter.FilterKeys, ",") // Generate filters - filters, err := generateFilters(response, filterKeys, dataSetFilter.UnsetKey, dataSetFilter.UnsetValue) + filters, err := generateFilters(response, filterKeys, filterJson) if err != nil { log.Printf("Failed to generate filters: %v", err) return nil, err } - // Return the filters directly + // Debug Log Exclusion Filters + log.Printf("Raw Exclusion Filters JSON: %s", dataSetFilter.ExclusionFiltersJSON) + + // Parse exclusion filters JSON if it's not empty + var exclusionFilters []utils.FilterGroup + if dataSetFilter.ExclusionFiltersJSON != "" { + err = json.Unmarshal([]byte(dataSetFilter.ExclusionFiltersJSON), &exclusionFilters) + if err != nil { + log.Printf("Failed to parse exclusion filters JSON: %v", err) + return nil, err + } + log.Printf("Parsed Exclusion Filters: %+v", exclusionFilters) + } + + // Convert filters from []FilterGroup to []utils.FilterGroup manually + var utilsFilters []utils.FilterGroup + for _, f := range filters { + utilsFilters = append(utilsFilters, convertToUtilsFilterGroup(f)) + } + + // Apply the filter removal logic only if exclusionFilters has values + if len(exclusionFilters) > 0 { + filteredResult := utils.RemoveExcludedFilters(utilsFilters, exclusionFilters) + + // Convert back to []FilterGroup before returning + var finalFilters []FilterGroup + for _, f := range filteredResult { + finalFilters = append(finalFilters, convertToFilterGroup(f)) + } + + return finalFilters, nil + } + + // If no exclusion filters, return the original filters return filters, nil + +} + +// Convert FilterGroup to utils.FilterGroup +func convertToUtilsFilterGroup(f FilterGroup) utils.FilterGroup { + return utils.FilterGroup{ + FilterKey: f.FilterKey, + FilterData: f.FilterData, + FilterTextAndOrder: utils.FilterJsonData{ + Order: f.FilterTextAndOrder.Order, + Text: f.FilterTextAndOrder.Text, + }, + } +} + +// Convert utils.FilterGroup to FilterGroup +func convertToFilterGroup(f utils.FilterGroup) FilterGroup { + return FilterGroup{ + FilterKey: f.FilterKey, + FilterData: f.FilterData, + FilterTextAndOrder: FilterJsonData{ + Order: f.FilterTextAndOrder.Order, + Text: f.FilterTextAndOrder.Text, + }, + } } // LanguageSource represents the source language data structure diff --git a/pb_data/data.db b/pb_data/data.db index 1375e25d9a8b8dd53a8d975da521e82ceb5d784e..330e891acaee4bf27889f8b43a18792e38bfd817 100644 GIT binary patch delta 918 zcmZ`$&rcIU6yABQLbqGDBs3a+xo%X1{>bi@wzx?THCYatiZmJnLbeNCL!lHYw17&e zSj7S%5EJK!hIsJcMPoL2@PvsMym0cMSG^ej06jR{rB$QO%bWS$H}k&tW~NwVibZCl zxuJ`qD1mr&Ol|stsOwJhUJ|`Z!qeV5=Pu>kW%gf+?m4=lB%mYFR)@0G?v1v(TqOkQkI;EiIRY+X?Q#pg&EosJ-8_Cb2pmHA%OJdIw(>)AFd~a$KnMqG z`JzEu2%yDlE}G+RnG?tH*VCC9J*STA^SsRQ38hDkC6pNN`*S;`&1hu5l37WMDgG;c z<|#g=94!9W`6^0WsG^=47aQO$&BY;eU8q#}cNg)5db$5nMfdj}|7s$xUR16U?=h>H zC&_(GF0K;FVys#&dWa_93hW1p{c6xj_|7`PLmhq(9%jt``Jw3Eq1T|!?XCBCA1OwD z3eF+A9JYu}ze)7lI#Of8jq#hIQQpUAwF#YxDMr&TSN)8=uc0K?c; zfSrcwZ%UFZNP(~<7<&bXIGQLoMKShY=G>rPI3lJQZADmi*qx`53qLEv3PIE&j;z2p zJGsJ`(YXq}h(O!2v9JbVAP~h3V;$nC#Z+a>?Aw~<*_s*L1{`9Ku^M$|CKO5Q;e2W$ zn;9L>rJRIo#L+D{X;x^&`WAGXXaqkwK<)VB7Ie@m#qQfy*>$91_hb0MmTq%(M@zG0 u@_JGE6n_02TIf=r6+h@V<2Jg~aS%HU67M6N-i8xRKJI^yXUuLxdGIIM!RjFZ delta 529 zcmZo@;Av>!nIJ7_$iTp00K_nmJyFM)(XcV0HGy$!0@G4|HlFPae7||ND>g7qg5jE6eHHq^@l%FD>4ZIsHitlfrb?Sf+jIhPuXv3I?WDM&?!~=6V*!7Evjg zW%)(Psl|rALGdAx0j|FBA^suT@5M6dG4eJsF>=97lAS&^is_z|p{|jsf}tVE07C;k zb0Y(|0oxLoSOvHlvl-aVF=q2*u{_^wC=kZT-&V&ipxu=KBsfI1r!a1pFJg*h=EyEc zEi+6@%AT&p#Wa`0JU!nerNAU_`gty<`O~G!m=*~F9clo!$I!~aQqS1TaQoRZCUZ_H zUXJYy{Dpj*dB5^H^HlP%a8KY? z-m_$IaN2Iy>Spq1WNCC~<=kG|!(_(9(rC@ZxqW*dlP{wTFW+AVeqa7X{xZcRI}2Q+`OEOq@omVkl1wF`AjM-U{>mU zCJP8_A)Ix0K9eSw9RvSm=5GEzM!V?(3z+^)b`a3zZ}C@P7jN+b6585~9p2L&7c$9h fzp<8SE93Ou<&2!u3zjo_Ot)VQ6zp2eR2BmOJ2sD5 diff --git a/pb_data/data.db-shm b/pb_data/data.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 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 diff --git a/pb_data/logs.db-shm b/pb_data/logs.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..19f38fe9cce0e52d7cfb41306e882f0ea34919fb GIT binary patch literal 32768 zcmeI*Jx)SF5CGss!Cyq}9*Gt9h;BH$^X~gaQrxWt>!<^KR^Wk++fcowryE0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;& zQU&tF2|<7W0RjXFlr7LsS7kpy_XG&+T%eUscV0sQ0*5JZw3@Pbn7x(SRi1At2oTtZ zKxZ`>esR literal 0 HcmV?d00001 diff --git a/pb_data/logs.db-wal b/pb_data/logs.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..da8095de216110a14b9396a18e64602124531108 GIT binary patch literal 61832 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 literal 0 HcmV?d00001 diff --git a/utils/filter_utils.go b/utils/filter_utils.go new file mode 100644 index 0000000..9c0310f --- /dev/null +++ b/utils/filter_utils.go @@ -0,0 +1,64 @@ +package utils + +type FilterJsonData struct { + Order int `json:"order"` + Text string `json:"text"` +} + +type FilterGroup struct { + FilterKey string `json:"filter_key"` + FilterData []interface{} `json:"filter_data"` + FilterTextAndOrder FilterJsonData `json:"filter_text_and_order"` +} + +// RemoveExcludedFilters removes specified filter_data values from filters. +func RemoveExcludedFilters(filters []FilterGroup, exclusions []FilterGroup) []FilterGroup { + // Create a map for quick lookup of exclusion filter data + exclusionMap := make(map[string]map[interface{}]bool) + + // Populate the exclusion map + for _, excl := range exclusions { + if _, exists := exclusionMap[excl.FilterKey]; !exists { + exclusionMap[excl.FilterKey] = make(map[interface{}]bool) + } + for _, value := range excl.FilterData { + exclusionMap[excl.FilterKey][value] = true + } + } + + // Debug: Print exclusionMap to verify exclusions + // log.Println("Exclusion Map: ", exclusionMap) + + // Process the filters and remove excluded values + var filteredFilters []FilterGroup + + for _, filter := range filters { + if excludedValues, found := exclusionMap[filter.FilterKey]; found { + // Debug: Print current filter data and exclusions + // log.Printf("Checking filter: %s with data: %v", filter.FilterKey, filter.FilterData) + + // Remove excluded values + var newFilterData []interface{} + for _, value := range filter.FilterData { + // Debug: Check if value is excluded + if _, exists := excludedValues[value]; exists { + // log.Printf("Excluding value: %v", value) // Debug log for excluded value + } else { + newFilterData = append(newFilterData, value) + } + } + if len(newFilterData) > 0 { + filter.FilterData = newFilterData + filteredFilters = append(filteredFilters, filter) + } + } else { + // No exclusions, add filter as is + filteredFilters = append(filteredFilters, filter) + } + } + + // Debug: Print final filtered result + // log.Println("Filtered Filters: ", filteredFilters) + + return filteredFilters +}