Skip to content

Commit

Permalink
feat(ibis): add Cloud Spanner backend (#186)
Browse files Browse the repository at this point in the history
* ibis_cloud_spanner folder added

* Added tests folder for ibis_cloud_spanner connector

* increase large compile time for cloud build

* rename project param to project_id

This is consistent with the BigQuery Ibis connector

Co-authored-by: Tim Swast <swast@google.com>
  • Loading branch information
dollylipare and tswast committed Mar 9, 2021
1 parent e3f9518 commit 00158af
Show file tree
Hide file tree
Showing 19 changed files with 2,175 additions and 0 deletions.
7 changes: 7 additions & 0 deletions cloudbuild.yaml
Expand Up @@ -41,3 +41,10 @@ steps:
- 'NOX_SESSION=integration_bigquery'
- 'PROJECT_ID=pso-kokoro-resources'
waitFor: ['-']
- id: integration_spanner
name: 'gcr.io/pso-kokoro-resources/python-multi'
args: ['bash', './ci/build.sh']
env:
- 'NOX_SESSION=integration_spanner'
- 'PROJECT_ID=pso-kokoro-resources'
waitFor: ['-']
16 changes: 16 additions & 0 deletions noxfile.py
Expand Up @@ -137,3 +137,19 @@ def integration_bigquery(session):
raise Exception("Expected Env Var: %s" % env_var)

session.run("pytest", test_path, *session.posargs)


@nox.session(python=PYTHON_VERSIONS, venv_backend="venv")
def integration_spanner(session):
"""Run Spanner integration tests.
Ensure Spanner validation is running as expected.
"""
_setup_session_requirements(session, extra_packages=[])

expected_env_vars = ["PROJECT_ID"]
for env_var in expected_env_vars:
if not os.environ.get(env_var, ""):
raise Exception("Expected Env Var: %s" % env_var)

# TODO: Add tests for DVT data sources. See integration_bigquery.
session.run("pytest", "third_party/ibis/ibis_cloud_spanner/tests", *session.posargs)
1 change: 1 addition & 0 deletions requirements.txt
Expand Up @@ -16,5 +16,6 @@ pyarrow==3.0.0
pydata-google-auth==1.1.0
google-cloud-bigquery==2.7.0
google-cloud-bigquery-storage==2.2.1
google-cloud-spanner==3.1.0
setuptools>=34.0.0
jellyfish==0.8.2
2 changes: 2 additions & 0 deletions third_party/ibis/ibis_cloud_spanner/__init__.py
@@ -0,0 +1,2 @@


80 changes: 80 additions & 0 deletions third_party/ibis/ibis_cloud_spanner/api.py
@@ -0,0 +1,80 @@
# Copyright 2021 Google Inc.
#
# Licensed 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.


"""CloudSpanner public API."""


from third_party.ibis.ibis_cloud_spanner.client import CloudSpannerClient
from third_party.ibis.ibis_cloud_spanner.compiler import dialect

import google.cloud.spanner # noqa: F401, fail early if spanner is missing
import ibis.common.exceptions as com

__all__ = ("compile", "connect", "verify")


def compile(expr, params=None):
"""Compile an expression for Cloud Spanner.
Returns
-------
compiled : str
See Also
--------
ibis.expr.types.Expr.compile
"""
from third_party.ibis.ibis_cloud_spanner.compiler import to_sql

return to_sql(expr, dialect.make_context(params=params))


def verify(expr, params=None):
"""Check if an expression can be compiled using Cloud Spanner."""
try:
compile(expr, params=params)
return True
except com.TranslationError:
return False


def connect(
instance_id,
database_id,
project_id=None,
) -> CloudSpannerClient:
"""Create a CloudSpannerClient for use with Ibis.
Parameters
----------
instance_id : str
A Cloud Spanner Instance id.
database_id : str
A database id inside of the Cloud Spanner Instance
project_id : str (Optional)
The ID of the project which owns the instances, tables and data.
Returns
-------
CloudSpannerClient
"""

return CloudSpannerClient(
instance_id=instance_id,
database_id=database_id,
project_id=project_id,
)

0 comments on commit 00158af

Please sign in to comment.