@@ -206,51 +206,67 @@ func printCsv(response map[string]interface{}, filter []string) {
206
206
enc .Flush ()
207
207
}
208
208
209
- func filterResponse (response map [string ]interface {}, filter []string , outputType string ) map [string ]interface {} {
210
- if filter == nil || len (filter ) == 0 {
209
+ func filterResponse (response map [string ]interface {}, filter []string , excludeFilter [] string , outputType string ) map [string ]interface {} {
210
+ if ( filter == nil || len (filter ) == 0 ) && ( excludeFilter == nil || len ( excludeFilter ) == 0 ) {
211
211
return response
212
212
}
213
+
214
+ excludeSet := make (map [string ]struct {}, len (excludeFilter ))
215
+ for _ , key := range excludeFilter {
216
+ excludeSet [key ] = struct {}{}
217
+ }
218
+
219
+ filterSet := make (map [string ]struct {}, len (filter ))
220
+ for _ , key := range filter {
221
+ filterSet [key ] = struct {}{}
222
+ }
223
+
213
224
filteredResponse := make (map [string ]interface {})
214
- for k , v := range response {
215
- valueType := reflect .TypeOf (v )
216
- if valueType .Kind () == reflect .Slice || valueType .Kind () == reflect .Map {
217
- items , ok := v .([]interface {})
218
- if ! ok {
219
- continue
220
- }
225
+
226
+ for key , value := range response {
227
+ switch items := value .(type ) {
228
+ case []interface {}:
221
229
var filteredRows []interface {}
222
230
for _ , item := range items {
223
231
row , ok := item .(map [string ]interface {})
224
- if ! ok || len (row ) < 1 {
232
+ if ! ok || len (row ) == 0 {
225
233
continue
226
234
}
235
+
227
236
filteredRow := make (map [string ]interface {})
228
- for _ , filterKey := range filter {
229
- for field := range row {
230
- if filterKey == field {
231
- filteredRow [field ] = row [field ]
237
+
238
+ if len (filter ) > 0 {
239
+ // Include only keys that exist in filterSet
240
+ for filterKey := range filterSet {
241
+ if val , exists := row [filterKey ]; exists {
242
+ filteredRow [filterKey ] = val
243
+ } else if outputType == config .COLUMN || outputType == config .CSV || outputType == config .TABLE {
244
+ filteredRow [filterKey ] = "" // Ensure all filter keys exist in row
232
245
}
233
246
}
234
- if outputType == config .COLUMN || outputType == config .CSV || outputType == config .TABLE {
235
- if _ , ok := filteredRow [filterKey ]; ! ok {
236
- filteredRow [filterKey ] = ""
247
+ } else {
248
+ // Exclude keys from excludeFilter
249
+ for field , val := range row {
250
+ if _ , excluded := excludeSet [field ]; ! excluded {
251
+ filteredRow [field ] = val
237
252
}
238
253
}
239
254
}
255
+
240
256
filteredRows = append (filteredRows , filteredRow )
241
257
}
242
- filteredResponse [k ] = filteredRows
243
- } else {
244
- filteredResponse [k ] = v
245
- continue
246
- }
258
+ filteredResponse [key ] = filteredRows
247
259
260
+ default :
261
+ filteredResponse [key ] = value
262
+ }
248
263
}
264
+
249
265
return filteredResponse
250
266
}
251
267
252
- func printResult (outputType string , response map [string ]interface {}, filter []string ) {
253
- response = filterResponse (response , filter , outputType )
268
+ func printResult (outputType string , response map [string ]interface {}, filter []string , excludeFilter [] string ) {
269
+ response = filterResponse (response , filter , excludeFilter , outputType )
254
270
switch outputType {
255
271
case config .JSON :
256
272
printJSON (response )
0 commit comments