Skip to content

Commit 52cfb1f

Browse files
feature: Adds hisReadFilter frontend support
1 parent 073e036 commit 52cfb1f

File tree

1 file changed

+60
-28
lines changed

1 file changed

+60
-28
lines changed

pkg/plugin/datasource.go

Lines changed: 60 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,15 @@ func (datasource *Datasource) QueryData(ctx context.Context, req *backend.QueryD
9696
}
9797

9898
type 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

106107
func (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

Comments
 (0)