Skip to content

Commit 4713b30

Browse files
committed
Support 'table' as well as 'timeserie'
1 parent d808f10 commit 4713b30

File tree

4 files changed

+188
-35
lines changed

4 files changed

+188
-35
lines changed

.vscode/launch.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"type": "node",
9+
"request": "launch",
10+
"name": "Launch Program",
11+
"program": "${workspaceFolder}/server/mongodb-proxy.js",
12+
"cwd" : "${workspaceFolder}/server"
13+
}
14+
]
15+
}

dist/server/mongodb-proxy.js

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ app.all('/query', function(req, res, next)
127127

128128
for ( var queryId = 0; queryId < req.body.targets.length && !error; queryId++)
129129
{
130-
tg = req.body.targets[queryId].target
131-
queryArgs = parseQuery(tg, substitutions)
130+
tg = req.body.targets[queryId]
131+
queryArgs = parseQuery(tg.target, substitutions)
132+
queryArgs.type = tg.type
132133
if (queryArgs.err != null)
133134
{
134135
queryError(requestId, queryArgs.err, next)
@@ -299,22 +300,13 @@ function runAggregateQuery( requestId, queryId, body, queryArgs, res, next )
299300
try
300301
{
301302
var results = {}
302-
for ( var i = 0; i < docs.length; i++)
303+
if ( queryArgs.type == 'timeserie' )
303304
{
304-
var doc = docs[i]
305-
var tg = doc.name
306-
var dp = null
307-
if (tg in results)
308-
{
309-
dp = results[tg]
310-
}
311-
else
312-
{
313-
dp = { 'target' : tg, 'datapoints' : [] }
314-
results[tg] = dp
315-
}
316-
317-
results[tg].datapoints.push([doc['value'], doc['ts'].getTime()])
305+
results = getTimeseriesResults(docs)
306+
}
307+
else
308+
{
309+
results = getTableResults(docs)
318310
}
319311

320312
client.close();
@@ -333,6 +325,83 @@ function runAggregateQuery( requestId, queryId, body, queryArgs, res, next )
333325
})
334326
}
335327

328+
function getTableResults(docs)
329+
{
330+
var columns = {}
331+
332+
// Build superset of columns
333+
for ( var i = 0; i < docs.length; i++)
334+
{
335+
var doc = docs[i]
336+
// Go through all properties
337+
for (var propName in doc )
338+
{
339+
// See if we need to add a new column
340+
if ( !(propName in columns) )
341+
{
342+
columns[propName] =
343+
{
344+
text : propName,
345+
type : "text"
346+
}
347+
}
348+
}
349+
}
350+
351+
// Build return rows
352+
rows = []
353+
for ( var i = 0; i < docs.length; i++)
354+
{
355+
var doc = docs[i]
356+
row = []
357+
// All cols
358+
for ( var colName in columns )
359+
{
360+
var col = columns[colName]
361+
if ( col.text in doc )
362+
{
363+
row.push(doc[col.text])
364+
}
365+
else
366+
{
367+
row.push(null)
368+
}
369+
}
370+
rows.push(row)
371+
}
372+
373+
var results = {}
374+
results["table"] = {
375+
columns : Object.values(columns),
376+
rows : rows,
377+
type : "table"
378+
}
379+
return results
380+
}
381+
382+
function getTimeseriesResults(docs)
383+
{
384+
var results = {}
385+
for ( var i = 0; i < docs.length; i++)
386+
{
387+
var doc = docs[i]
388+
var tg = doc.name
389+
var dp = null
390+
if (tg in results)
391+
{
392+
dp = results[tg]
393+
}
394+
else
395+
{
396+
dp = { 'target' : tg, 'datapoints' : [] }
397+
results[tg] = dp
398+
}
399+
400+
results[tg].datapoints.push([doc['value'], doc['ts'].getTime()])
401+
}
402+
return results
403+
}
404+
336405
// Runs a query to support templates. Must returns documents of the form
337406
// { _id : <id> }
338407
function doTemplateQuery(requestId, queryArgs, db, res, next)

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "grafana-mongodb",
33
"private": true,
4-
"version": "0.7.0",
4+
"version": "0.8.0",
55
"description": "",
66
"main": "server/mongodb-proxy.js",
77
"scripts": {

server/mongodb-proxy.js

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ app.all('/query', function(req, res, next)
127127

128128
for ( var queryId = 0; queryId < req.body.targets.length && !error; queryId++)
129129
{
130-
tg = req.body.targets[queryId].target
131-
queryArgs = parseQuery(tg, substitutions)
130+
tg = req.body.targets[queryId]
131+
queryArgs = parseQuery(tg.target, substitutions)
132+
queryArgs.type = tg.type
132133
if (queryArgs.err != null)
133134
{
134135
queryError(requestId, queryArgs.err, next)
@@ -299,22 +300,13 @@ function runAggregateQuery( requestId, queryId, body, queryArgs, res, next )
299300
try
300301
{
301302
var results = {}
302-
for ( var i = 0; i < docs.length; i++)
303+
if ( queryArgs.type == 'timeserie' )
303304
{
304-
var doc = docs[i]
305-
var tg = doc.name
306-
var dp = null
307-
if (tg in results)
308-
{
309-
dp = results[tg]
310-
}
311-
else
312-
{
313-
dp = { 'target' : tg, 'datapoints' : [] }
314-
results[tg] = dp
315-
}
316-
317-
results[tg].datapoints.push([doc['value'], doc['ts'].getTime()])
305+
results = getTimeseriesResults(docs)
306+
}
307+
else
308+
{
309+
results = getTableResults(docs)
318310
}
319311

320312
client.close();
@@ -333,6 +325,83 @@ function runAggregateQuery( requestId, queryId, body, queryArgs, res, next )
333325
})
334326
}
335327

328+
function getTableResults(docs)
329+
{
330+
var columns = {}
331+
332+
// Build superset of columns
333+
for ( var i = 0; i < docs.length; i++)
334+
{
335+
var doc = docs[i]
336+
// Go through all properties
337+
for (var propName in doc )
338+
{
339+
// See if we need to add a new column
340+
if ( !(propName in columns) )
341+
{
342+
columns[propName] =
343+
{
344+
text : propName,
345+
type : "text"
346+
}
347+
}
348+
}
349+
}
350+
351+
// Build return rows
352+
rows = []
353+
for ( var i = 0; i < docs.length; i++)
354+
{
355+
var doc = docs[i]
356+
row = []
357+
// All cols
358+
for ( var colName in columns )
359+
{
360+
var col = columns[colName]
361+
if ( col.text in doc )
362+
{
363+
row.push(doc[col.text])
364+
}
365+
else
366+
{
367+
row.push(null)
368+
}
369+
}
370+
rows.push(row)
371+
}
372+
373+
var results = {}
374+
results["table"] = {
375+
columns : Object.values(columns),
376+
rows : rows,
377+
type : "table"
378+
}
379+
return results
380+
}
381+
382+
function getTimeseriesResults(docs)
383+
{
384+
var results = {}
385+
for ( var i = 0; i < docs.length; i++)
386+
{
387+
var doc = docs[i]
388+
var tg = doc.name
389+
var dp = null
390+
if (tg in results)
391+
{
392+
dp = results[tg]
393+
}
394+
else
395+
{
396+
dp = { 'target' : tg, 'datapoints' : [] }
397+
results[tg] = dp
398+
}
399+
400+
results[tg].datapoints.push([doc['value'], doc['ts'].getTime()])
401+
}
402+
return results
403+
}
404+
336405
// Runs a query to support templates. Must returns documents of the form
337406
// { _id : <id> }
338407
function doTemplateQuery(requestId, queryArgs, db, res, next)

0 commit comments

Comments
 (0)