Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mountainash_data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from mountainash_data.core.inspection import (
CatalogInfo,
ColumnInfo,
IndexInfo,
NamespaceInfo,
TableInfo,
)
Expand All @@ -22,6 +23,7 @@
"Backend",
"CatalogInfo",
"ColumnInfo",
"IndexInfo",
"NamespaceInfo",
"TableInfo",
"Namespace",
Expand Down
46 changes: 37 additions & 9 deletions src/mountainash_data/backends/ibis/_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def build_create_index_sql(
index_type: t.Optional[str],
guard: str,
where_sql: t.Optional[str],
index_ref: t.Optional[str] = None,
) -> str:
"""Render a CREATE INDEX statement from pre-validated parts.

Expand All @@ -55,7 +56,7 @@ def build_create_index_sql(
"""
unique_sql = "UNIQUE " if unique else ""
cols_sql = ", ".join(quote_identifier(c, dialect) for c in cols)
name_sql = quote_identifier(index_name, dialect)
name_sql = index_ref or quote_identifier(index_name, dialect)
where = f" WHERE {where_sql}" if where_sql else ""
name_part = f"{guard}{name_sql}"
# dialect may be a sqlglot Dialect class (live path) or a plain string (tests/golden).
Expand Down Expand Up @@ -91,10 +92,10 @@ def build_drop_index_sql(
index_name: str,
target: t.Optional[str],
guard: str,
index_ref: t.Optional[str] = None,
) -> str:
"""Render a DROP INDEX statement. `target` is required (already quoted) when
`drop_scope` is TABLE_SCOPED."""
name_sql = quote_identifier(index_name, dialect)
"""Render a DROP INDEX statement with an optional qualified index ref."""
name_sql = index_ref or quote_identifier(index_name, dialect)
if drop_scope is DropScope.TABLE_SCOPED:
return f"DROP INDEX {guard}{name_sql} ON {target}"
return f"DROP INDEX {guard}{name_sql}"
Expand Down Expand Up @@ -132,13 +133,31 @@ def _generic_index_exists(
first_col = result.to_pyarrow().column(0).to_pylist()
return first_col[0] > 0


def _target_ref(ibis_conn: t.Any, table_name: str, namespace: t.Optional[str]) -> str:
dialect = dialect_of(ibis_conn)
dialect_name = (
dialect.__name__.lower()
if isinstance(dialect, type)
else str(dialect).lower()
)
if dialect_name == "sqlite":
return quote_identifier(table_name, dialect)
parts = [namespace, table_name] if namespace else [table_name]
return qualified_name(parts, dialect)


def _index_ref(ibis_conn: t.Any, index_name: str, namespace: t.Optional[str]) -> str:
dialect = dialect_of(ibis_conn)
dialect_name = (
dialect.__name__.lower()
if isinstance(dialect, type)
else str(dialect).lower()
)
if dialect_name == "sqlite" and namespace:
return qualified_name([namespace, index_name], dialect)
return quote_identifier(index_name, dialect)


def _generic_create_index(
ibis_conn: t.Any,
table_name: str,
Expand Down Expand Up @@ -197,8 +216,13 @@ def _generic_create_index(
sql = build_create_index_sql(
dialect=dialect_of(ibis_conn),
target=_target_ref(ibis_conn, table_name, namespace),
index_name=index_name, cols=cols, unique=unique,
index_type=index_type, guard=guard, where_sql=where_sql,
index_name=index_name,
cols=cols,
unique=unique,
index_type=index_type,
guard=guard,
where_sql=where_sql,
index_ref=_index_ref(ibis_conn, index_name, namespace),
)
ibis_conn.raw_sql(sql)

Expand Down Expand Up @@ -241,7 +265,11 @@ def _generic_drop_index(

target = _target_ref(ibis_conn, table_name, namespace) if table_name else None
sql = build_drop_index_sql(
dialect=dialect_of(ibis_conn), drop_scope=caps.drop_scope,
index_name=index_name, target=target, guard=guard,
dialect=dialect_of(ibis_conn),
drop_scope=caps.drop_scope,
index_name=index_name,
target=target,
guard=guard,
index_ref=_index_ref(ibis_conn, index_name, namespace),
)
ibis_conn.raw_sql(sql)
Loading
Loading