Merge pull request #650 from alonho/mql

Feature: MQL query runner
This commit is contained in:
Arik Fraimovich 2015-11-15 17:21:44 +02:00
commit 32638aebed
3 changed files with 72 additions and 0 deletions

View File

@ -0,0 +1,57 @@
import json
from . import BaseQueryRunner, register
from .mongodb import TYPES_MAP, TYPE_STRING
try:
import pymongo
from ognom import query_to_plan
from website.server.utils import simplify
enabled = True
except ImportError:
enabled = False
def deduce_columns(rows):
column_to_type = {}
for row in rows:
for column, value in row.iteritems():
column_to_type[column] = TYPES_MAP.get(value.__class__, TYPE_STRING)
return [{'name': column, 'friendly_name': column, 'type': type}
for column, type in column_to_type.iteritems()]
class MQL(BaseQueryRunner):
def __init__(self, configuration_json):
super(MQL, self).__init__(configuration_json)
self.syntax = 'sql'
@classmethod
def enabled(cls):
return enabled
@classmethod
def annotate_query(cls):
return False
@classmethod
def configuration_schema(cls):
return {
'type': 'object',
'properties': {
'uri': {
'type': 'string',
'title': 'Connection String'
}
},
'required': ['uri']
}
def run_query(self, query):
conn = pymongo.MongoClient(self.configuration['uri'])
# execute() returns a generator (that wraps a cursor)
gen = query_to_plan(query).execute(conn)
# simplify converts special MongoDB data types (ObjectId, Date, etc') to strings
result = simplify(list(gen))
return json.dumps({'columns': deduce_columns(result), 'rows': result}), None
register(MQL)

View File

@ -118,6 +118,7 @@ default_query_runners = [
'redash.query_runner.google_spreadsheets',
'redash.query_runner.graphite',
'redash.query_runner.mongodb',
'redash.query_runner.mql',
'redash.query_runner.mysql',
'redash.query_runner.pg',
'redash.query_runner.url',

View File

@ -0,0 +1,14 @@
from datetime import datetime
from unittest import TestCase
from redash.query_runner import TYPE_DATETIME, TYPE_INTEGER, TYPE_STRING
from redash.query_runner.mql import deduce_columns
class TestMQL(TestCase):
def test_deduce_columns(self):
self.assertEquals(deduce_columns([{'a': 1}]),
[{'name': 'a', 'friendly_name': 'a', 'type': TYPE_INTEGER}])
self.assertEquals(deduce_columns([{'a': 'foo'}]),
[{'name': 'a', 'friendly_name': 'a', 'type': TYPE_STRING}])
self.assertEquals(deduce_columns([{'a': datetime.now()}]),
[{'name': 'a', 'friendly_name': 'a', 'type': TYPE_DATETIME}])