def test_large_compile(): """ Tests that compiling a large expression tree finishes within a reasonable amount of time """ num_columns = 20 num_joins = 7 class MockBigQueryClient(bq.BigQueryClient): def __init__(self): pass names = [f"col_{i}" for i in range(num_columns)] schema = ibis.Schema(names, ['string'] * num_columns) ibis_client = MockBigQueryClient() table = TableExpr( ops.SQLQueryResult("select * from t", schema, ibis_client) ) for _ in range(num_joins): table = table.mutate(dummy=ibis.literal("")) table = table.left_join(table, ["dummy"])[[table]] start = datetime.datetime.now() table.compile() delta = datetime.datetime.now() - start assert delta.total_seconds() < 10
def sql(self, query): """Convert a SQL query to an Ibis table expression. Parameters ---------- query : string Returns ------- table : TableExpr """ # Get the schema by adding a LIMIT 0 on to the end of the query. If # there is already a limit in the query, we find and remove it limited_query = 'SELECT * FROM ({}) t0 LIMIT 0'.format(query) schema = self._get_schema_using_query(limited_query) return ops.SQLQueryResult(query, schema, self).to_expr()
def sql(self, query): """ Convert a MSSQL query to an Ibis table expression Parameters ---------- query: string SQL query to execute on connection Returns ------- table : TableExpr """ limited_query = 'SELECT TOP 0 * FROM ({}) t0'.format(query) schema = self._get_schema_using_query(limited_query) return ops.SQLQueryResult(query, schema, self).to_expr()
def sql(self, query: str): """ Convert a SQL query to an Ibis table expression. Parameters ---------- query : string Returns ------- table : TableExpr """ # Remove `;` + `--` (comment) query = re.sub(r'\s*;\s*--', '\n--', query.strip()) # Remove trailing ; query = re.sub(r'\s*;\s*$', '', query.strip()) schema = self._get_schema_using_validator(query) return ops.SQLQueryResult(query, schema, self).to_expr()
def sql(self, query): """ Convert a SQL query to an Ibis table expression Parameters ---------- Returns ------- table : TableExpr """ # Get the schema by adding a LIMIT 0 on to the end of the query. If # there is already a limit in the query, we find and remove it limited_query = _set_limit(query, 0) schema = self._get_schema_using_query(limited_query) node = ops.SQLQueryResult(query, schema, self) return ir.TableExpr(node)
def sql(self, query): """ Convert a SQL query to an Ibis table expression Parameters ---------- Returns ------- table : TableExpr """ if pymapd_dtype is None: raise com.UnsupportedOperationError( 'This method is available just on Python version >= 3.6.') # Remove `;` + `--` (comment) query = re.sub(r'\s*;\s*--', '\n--', query.strip()) # Remove trailing ; query = re.sub(r'\s*;\s*$', '', query.strip()) schema = self._get_schema_using_validator(query) return ops.SQLQueryResult(query, schema, self).to_expr()
def prevent_rewrite(self, client=None) -> TableExpr: """Prevent optimization from happening below this expression. Only valid on SQL-string generating backends. Parameters ---------- client A client to use to create the SQLQueryResult operation. This can be useful if you're compiling an expression that derives from an `UnboundTable` operation. Returns ------- TableExpr An opaque SQL query """ from .. import operations as ops if client is None: client = self._find_backend() query = client.compile(self) return ops.SQLQueryResult(query, self.schema(), client).to_expr()