@@ -206,51 +206,67 @@ func printCsv(response map[string]interface{}, filter []string) {
206206 enc .Flush ()
207207}
208208
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 ) {
211211 return response
212212 }
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+
213224 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 {}:
221229 var filteredRows []interface {}
222230 for _ , item := range items {
223231 row , ok := item .(map [string ]interface {})
224- if ! ok || len (row ) < 1 {
232+ if ! ok || len (row ) == 0 {
225233 continue
226234 }
235+
227236 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
232245 }
233246 }
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
237252 }
238253 }
239254 }
255+
240256 filteredRows = append (filteredRows , filteredRow )
241257 }
242- filteredResponse [k ] = filteredRows
243- } else {
244- filteredResponse [k ] = v
245- continue
246- }
258+ filteredResponse [key ] = filteredRows
247259
260+ default :
261+ filteredResponse [key ] = value
262+ }
248263 }
264+
249265 return filteredResponse
250266}
251267
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 )
254270 switch outputType {
255271 case config .JSON :
256272 printJSON (response )
0 commit comments