This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 7836671  Add support for Exasol (#8343)
7836671 is described below

commit 783667168bcdf8ca0a8d08e0a579a1b252b9c509
Author: kevang <[email protected]>
AuthorDate: Sun Oct 6 12:43:45 2019 +0100

    Add support for Exasol (#8343)
    
    * Add support for Exasol
    
    * add time grain functions for Exasol
    
    * remove duplicate of
    
    * override ExasolEngineSpec's fetch_data method
    
    * remove duplicate https
    
    * simplify super call
---
 docs/index.rst                     |  1 +
 docs/installation.rst              | 21 +++++++++++++++++
 superset/db_engine_specs/exasol.py | 48 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+)

diff --git a/docs/index.rst b/docs/index.rst
index 00b796d..465423a 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -109,6 +109,7 @@ The following RDBMS are currently suppored:
 - `Apache Spark SQL <https://spark.apache.org/sql/>`_
 - `BigQuery <https://cloud.google.com/bigquery/>`_
 - `ClickHouse <https://clickhouse.yandex/>`_
+- `Exasol <https://www.exasol.com/>`_
 - `Google Sheets <https://www.google.com/sheets/about/>`_
 - `Greenplum <https://greenplum.org/>`_
 - `IBM Db2 <https://www.ibm.com/analytics/db2/>`_
diff --git a/docs/installation.rst b/docs/installation.rst
index fc8fc2b..cc6792a 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -377,6 +377,8 @@ Here's a list of some of the recommended packages.
 
+------------------+---------------------------------------+-------------------------------------------------+
 | ClickHouse       | ``pip install sqlalchemy-clickhouse`` |                   
                              |
 
+------------------+---------------------------------------+-------------------------------------------------+
+| Exasol           | ``pip install sqlalchemy-exasol``     | ``exa+pyodbc://`` 
                              |
++------------------+---------------------------------------+-------------------------------------------------+
 | Google Sheets    | ``pip install gsheetsdb``             | ``gsheets://``    
                              |
 
+------------------+---------------------------------------+-------------------------------------------------+
 | IBM Db2          | ``pip install ibm_db_sa``             | ``db2+ibm_db://`` 
                              |
@@ -659,6 +661,25 @@ it in the ``extra`` parameter::
     }
 
 
+Exasol
+---------
+
+The connection string for Exasol looks like this ::
+
+    exa+pyodbc://{user}:{password}@{host}
+
+*Note*: It's required to have Exasol ODBC drivers installed for the sqlalchemy 
dialect to work properly. Exasol ODBC Drivers available are here: 
https://www.exasol.com/portal/display/DOWNLOAD/Exasol+Download+Section
+
+Example config (odbcinst.ini can be left empty) ::
+
+    $ cat $/.../path/to/odbc.ini
+    [EXAODBC]
+    DRIVER = /.../path/to/driver/EXASOL_driver.so
+    EXAHOST = host:8563
+    EXASCHEMA = main
+
+See `SQLAlchemy for Exasol 
<https://github.com/blue-yonder/sqlalchemy_exasol>`_.
+
 CORS
 ----
 
diff --git a/superset/db_engine_specs/exasol.py 
b/superset/db_engine_specs/exasol.py
new file mode 100644
index 0000000..c6b38cb
--- /dev/null
+++ b/superset/db_engine_specs/exasol.py
@@ -0,0 +1,48 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# pylint: disable=C,R,W
+from typing import List, Tuple
+
+from superset.db_engine_specs.base import BaseEngineSpec
+
+
+class ExasolEngineSpec(BaseEngineSpec):
+    """Engine spec for Exasol"""
+
+    engine = "exa"
+    max_column_name_length = 128
+
+    # Exasol's DATE_TRUNC function is PostgresSQL compatible
+    _time_grain_functions = {
+        None: "{col}",
+        "PT1S": "DATE_TRUNC('second', {col})",
+        "PT1M": "DATE_TRUNC('minute', {col})",
+        "PT1H": "DATE_TRUNC('hour', {col})",
+        "P1D": "DATE_TRUNC('day', {col})",
+        "P1W": "DATE_TRUNC('week', {col})",
+        "P1M": "DATE_TRUNC('month', {col})",
+        "P0.25Y": "DATE_TRUNC('quarter', {col})",
+        "P1Y": "DATE_TRUNC('year', {col})",
+    }
+
+    @classmethod
+    def fetch_data(cls, cursor, limit: int) -> List[Tuple]:
+        data = super().fetch_data(cursor, limit)
+        # Lists of `pyodbc.Row` need to be unpacked further
+        if data and type(data[0]).__name__ == "Row":
+            data = [[value for value in row] for row in data]
+        return data

Reply via email to