@@ -96,16 +96,15 @@ func (datasource *Datasource) QueryData(ctx context.Context, req *backend.QueryD
9696}
9797
9898type QueryModel struct {
99- Type string `json:"type"`
100- Nav * string `json:"nav"` // A zinc-encoded Ref or null
101- Eval string `json:"eval"`
102- HisRead string `json:"hisRead"`
103- Read string `json:"read"`
99+ Type string `json:"type"`
100+ Nav * string `json:"nav"` // A zinc-encoded Ref or null
101+ Eval string `json:"eval"`
102+ HisRead string `json:"hisRead"`
103+ HisReadFilter string `json:"hisReadFilter"`
104+ Read string `json:"read"`
104105}
105106
106107func (datasource * Datasource ) query (ctx context.Context , pCtx backend.PluginContext , query backend.DataQuery ) backend.DataResponse {
107- var response backend.DataResponse
108-
109108 // Unmarshal the JSON into our queryModel.
110109 var model QueryModel
111110
@@ -122,58 +121,92 @@ func (datasource *Datasource) query(ctx context.Context, pCtx backend.PluginCont
122121 "$__interval" : haystack .NewNumber (query .Interval .Minutes (), "min" ).ToZinc (),
123122 }
124123
125- var grid haystack.Grid
126124 switch model .Type {
125+ case "" :
126+ // If no type is specified, just return an empty response.
127+ return responseFromGrids ([]haystack.Grid {})
127128 case "ops" :
128129 ops , err := datasource .ops ()
129130 if err != nil {
130131 log .DefaultLogger .Error (err .Error ())
131132 return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Ops failure: %v" , err .Error ()))
132133 }
133- grid = ops
134+ return responseFromGrids ([]haystack. Grid { ops })
134135 case "nav" :
135136 nav , err := datasource .nav (model .Nav )
136137 if err != nil {
137138 log .DefaultLogger .Error (err .Error ())
138139 return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Nav failure: %v" , err .Error ()))
139140 }
140- grid = nav
141+ return responseFromGrids ([]haystack. Grid { nav })
141142 case "eval" :
142143 eval , err := datasource .eval (model .Eval , variables )
143144 if err != nil {
144145 log .DefaultLogger .Error (err .Error ())
145146 return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Eval failure: %v" , err .Error ()))
146147 }
147- grid = eval
148+ return responseFromGrids ([]haystack. Grid { eval })
148149 case "hisRead" :
149- hisRead , err := datasource .hisRead (model .HisRead , query .TimeRange )
150+ hisRead , err := datasource .hisRead (haystack . NewRef ( model .HisRead , "" ) , query .TimeRange )
150151 if err != nil {
151152 log .DefaultLogger .Error (err .Error ())
152153 return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("HisRead failure: %v" , err .Error ()))
153154 }
154- grid = hisRead
155+ return responseFromGrids ([]haystack.Grid {hisRead })
156+ case "hisReadFilter" :
157+ points , readErr := datasource .read (model .HisReadFilter , variables )
158+ if readErr != nil {
159+ log .DefaultLogger .Error (readErr .Error ())
160+ return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("HisReadFilter failure: %v" , readErr .Error ()))
161+ }
162+
163+ grids := []haystack.Grid {}
164+ for _ , point := range points .Rows () {
165+ id := point .Get ("id" )
166+ var ref haystack.Ref
167+ switch id .(type ) {
168+ case haystack.Ref :
169+ ref = id .(haystack.Ref )
170+ default :
171+ errMsg := fmt .Sprintf ("id is not a ref: %v" , id )
172+ log .DefaultLogger .Error (errMsg )
173+ return backend .ErrDataResponse (backend .StatusBadRequest , errMsg )
174+ }
175+ hisRead , err := datasource .hisRead (ref , query .TimeRange )
176+ if err != nil {
177+ log .DefaultLogger .Error (err .Error ())
178+ return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("HisReadFilter failure: %v" , err .Error ()))
179+ }
180+ grids = append (grids , hisRead )
181+ }
182+ return responseFromGrids (grids )
155183 case "read" :
156184 read , err := datasource .read (model .Read , variables )
157185 if err != nil {
158186 log .DefaultLogger .Error (err .Error ())
159187 return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Read failure: %v" , err .Error ()))
160188 }
161- grid = read
189+ return responseFromGrids ([]haystack. Grid { read })
162190 default :
163- log .DefaultLogger .Warn ("No valid input, returning empty Grid" )
164- grid = haystack .EmptyGrid ()
165- }
166-
167- frame , frameErr := dataFrameFromGrid (grid )
168- if frameErr != nil {
169- log .DefaultLogger .Error (frameErr .Error ())
170- return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Frame conversion failure: %v" , frameErr .Error ()))
191+ warnMsg := fmt .Sprintf ("Invalid type %s, returning empty Grid" , model .Type )
192+ log .DefaultLogger .Warn (warnMsg )
193+ return backend .ErrDataResponse (backend .StatusBadRequest , warnMsg )
171194 }
195+ }
172196
173- // add the frames to the response.
174- response .Frames = append (response .Frames , frame )
175- response .Status = backend .StatusOK
197+ func responseFromGrids (grids []haystack.Grid ) backend.DataResponse {
198+ var response backend.DataResponse
199+ for _ , grid := range grids {
200+ frame , frameErr := dataFrameFromGrid (grid )
201+ if frameErr != nil {
202+ log .DefaultLogger .Error (frameErr .Error ())
203+ return backend .ErrDataResponse (backend .StatusBadRequest , fmt .Sprintf ("Frame conversion failure: %v" , frameErr .Error ()))
204+ }
176205
206+ // add the frames to the response.
207+ response .Frames = append (response .Frames , frame )
208+ response .Status = backend .StatusOK
209+ }
177210 return response
178211}
179212
@@ -220,14 +253,13 @@ func (datasource *Datasource) eval(expr string, variables map[string]string) (ha
220253 )
221254}
222255
223- func (datasource * Datasource ) hisRead (id string , timeRange backend.TimeRange ) (haystack.Grid , error ) {
224- ref := haystack .NewRef (id , "" )
256+ func (datasource * Datasource ) hisRead (id haystack.Ref , timeRange backend.TimeRange ) (haystack.Grid , error ) {
225257 start := haystack .NewDateTimeFromGo (timeRange .From .UTC ())
226258 end := haystack .NewDateTimeFromGo (timeRange .To .UTC ())
227259
228260 return datasource .withRetry (
229261 func () (haystack.Grid , error ) {
230- return datasource .client .HisReadAbsDateTime (ref , start , end )
262+ return datasource .client .HisReadAbsDateTime (id , start , end )
231263 },
232264 )
233265}
0 commit comments