mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Compare commits
3 commits
main
...
facet-by-c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47ac6c6e46 | ||
|
|
03f5a82203 | ||
|
|
45be26907d |
1 changed files with 29 additions and 5 deletions
|
|
@ -66,6 +66,16 @@ def register_facet_classes():
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
|
|
||||||
|
def json_split(value, sep):
|
||||||
|
tokens = [s.strip() for s in str(value).split(sep) if s.strip()]
|
||||||
|
return json.dumps(tokens)
|
||||||
|
|
||||||
|
|
||||||
|
@hookimpl
|
||||||
|
def prepare_connection(conn):
|
||||||
|
conn.create_function("json_split", 2, json_split)
|
||||||
|
|
||||||
|
|
||||||
class Facet:
|
class Facet:
|
||||||
type = None
|
type = None
|
||||||
|
|
||||||
|
|
@ -138,7 +148,11 @@ class ColumnFacet(Facet):
|
||||||
columns = await self.get_columns(self.sql, self.params)
|
columns = await self.get_columns(self.sql, self.params)
|
||||||
facet_size = self.ds.config("default_facet_size")
|
facet_size = self.ds.config("default_facet_size")
|
||||||
suggested_facets = []
|
suggested_facets = []
|
||||||
already_enabled = [c["config"]["simple"] for c in self.get_configs()]
|
already_enabled = [
|
||||||
|
c["config"]["simple"]
|
||||||
|
for c in self.get_configs()
|
||||||
|
if c["config"].get("simple")
|
||||||
|
]
|
||||||
for column in columns:
|
for column in columns:
|
||||||
if column in already_enabled:
|
if column in already_enabled:
|
||||||
continue
|
continue
|
||||||
|
|
@ -270,7 +284,11 @@ class ArrayFacet(Facet):
|
||||||
async def suggest(self):
|
async def suggest(self):
|
||||||
columns = await self.get_columns(self.sql, self.params)
|
columns = await self.get_columns(self.sql, self.params)
|
||||||
suggested_facets = []
|
suggested_facets = []
|
||||||
already_enabled = [c["config"]["simple"] for c in self.get_configs()]
|
already_enabled = [
|
||||||
|
c["config"]["simple"]
|
||||||
|
for c in self.get_configs()
|
||||||
|
if c["config"].get("simple")
|
||||||
|
]
|
||||||
for column in columns:
|
for column in columns:
|
||||||
if column in already_enabled:
|
if column in already_enabled:
|
||||||
continue
|
continue
|
||||||
|
|
@ -337,19 +355,25 @@ class ArrayFacet(Facet):
|
||||||
config = source_and_config["config"]
|
config = source_and_config["config"]
|
||||||
source = source_and_config["source"]
|
source = source_and_config["source"]
|
||||||
column = config.get("column") or config["simple"]
|
column = config.get("column") or config["simple"]
|
||||||
|
sep = config.get("sep")
|
||||||
|
select_column = escape_sqlite(column)
|
||||||
|
extra_params = []
|
||||||
|
if sep:
|
||||||
|
select_column = "json_split({}, :json_split_sep)".format(select_column)
|
||||||
|
extra_params.append(sep)
|
||||||
facet_sql = """
|
facet_sql = """
|
||||||
select j.value as value, count(*) as count from (
|
select j.value as value, count(*) as count from (
|
||||||
{sql}
|
{sql}
|
||||||
) join json_each({col}) j
|
) join json_each({select_column}) j
|
||||||
group by j.value order by count desc limit {limit}
|
group by j.value order by count desc limit {limit}
|
||||||
""".format(
|
""".format(
|
||||||
col=escape_sqlite(column), sql=self.sql, limit=facet_size + 1
|
select_column=select_column, sql=self.sql, limit=facet_size + 1
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
facet_rows_results = await self.ds.execute(
|
facet_rows_results = await self.ds.execute(
|
||||||
self.database,
|
self.database,
|
||||||
facet_sql,
|
facet_sql,
|
||||||
self.params,
|
self.params + extra_params,
|
||||||
truncate=False,
|
truncate=False,
|
||||||
custom_time_limit=self.ds.config("facet_time_limit_ms"),
|
custom_time_limit=self.ds.config("facet_time_limit_ms"),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue