-
Notifications
You must be signed in to change notification settings - Fork 7
Description
Feature description
Add SnoopyView which is a type of View with loosend db-ally assumptions and runs user-defined method for accessing a schema.
Motivation
The db-ally usage allows for defining filters and aggregations but they bump into significant trade-off: genericness vs performance.
E.g. preferable (in terms of UX) implementation of an aggregation would be as follows:
@decorators.view_aggregation()
def count_by_column(self, filtered_query: sqlalchemy.Select, column_name: str) -> sqlalchemy.Select:
select = sqlalchemy.select(getattr(filtered_query.c, column_name),
sqlalchemy.func.count(filtered_query.c.name).label("count")) \
.group_by(getattr(filtered_query.c, column_name))
return selectPlease not that such implementation delegates the column name resolution to LLM which can impact the performance (LLM can poorly guess the column name).
To address the performance issue one can implement a method with the name of the column to be used directly:
@decorators.view_aggregation()
def count_by_university(self, filtered_query: sqlalchemy.Select) -> sqlalchemy.Select:
select = sqlalchemy.select(filtered_query.c.university),
sqlalchemy.func.count(filtered_query.c.name).label("count")) \
.group_by(filtered_query.c.university)
return selectThis creates a risk of creating vast amount of boilerplate assuming general-purpose View.
Some db-ally (or Text2SQL) user might prefer generic filters/aggregations usage and boost performance in favor of decoupling the database structure from the prompt. Such nosy SnoopyView might ask implicitly for the structure to use it in a prompt or inject additional few-shot examples.
Additional context
NosyView was initially considered but SnoopyView synonym additionally refers to a dog used together with the library name 🦮.