html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,issue,performed_via_github_app
https://github.com/simonw/sqlite-utils/issues/21#issuecomment-496665669,https://api.github.com/repos/simonw/sqlite-utils/issues/21,496665669,MDEyOklzc3VlQ29tbWVudDQ5NjY2NTY2OQ==,9599,2019-05-28T19:57:47Z,2019-05-28T19:57:47Z,OWNER,"https://www.sqlite.org/lang_insert.html
Looks like it's as simple as `INSERT OR IGNORE` - and we already have code related to that here:
https://github.com/simonw/sqlite-utils/blob/1e28eeee8ce55ea68eddb228294a1eff6785b497/sqlite_utils/db.py#L498-L501","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",448391492,
https://github.com/simonw/datasette/issues/485#issuecomment-496367866,https://api.github.com/repos/simonw/datasette/issues/485,496367866,MDEyOklzc3VlQ29tbWVudDQ5NjM2Nzg2Ng==,9599,2019-05-28T05:14:06Z,2019-05-28T05:14:06Z,OWNER,"I'm going to generate statistics for every TEXT column.
Any column with more than 90% distinct rows (compared to the total count of rows) will be a candidate for the label.
I will then pick the candidate column with the shortest average length.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",447469253,
https://github.com/simonw/datasette/issues/489#issuecomment-496345660,https://api.github.com/repos/simonw/datasette/issues/489,496345660,MDEyOklzc3VlQ29tbWVudDQ5NjM0NTY2MA==,9599,2019-05-28T02:48:57Z,2019-05-28T02:48:57Z,OWNER,Fixed: https://latest.datasette.io/fixtures/roadside_attraction_characteristics?_sort=attraction_id&_size=2,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",448977444,
https://github.com/simonw/datasette/issues/473#issuecomment-496339819,https://api.github.com/repos/simonw/datasette/issues/473,496339819,MDEyOklzc3VlQ29tbWVudDQ5NjMzOTgxOQ==,9599,2019-05-28T02:13:44Z,2019-05-28T02:13:44Z,OWNER,I'm leaning towards supporting both hooks.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,
https://github.com/simonw/datasette/issues/473#issuecomment-496339574,https://api.github.com/repos/simonw/datasette/issues/473,496339574,MDEyOklzc3VlQ29tbWVudDQ5NjMzOTU3NA==,9599,2019-05-28T02:12:13Z,2019-05-28T02:13:07Z,OWNER,"Here's an older version of what that custom table filtering plugin might look like: https://github.com/simonw/datasette/commit/5116c4ec8aed5091e1f75415424b80f613518dc6
```python
from datasette.utils import TableFilter
@hookimpl
def table_filter():
async def inner(view, name, table, request):
extra_human_descriptions = []
where_clauses = []
params = {}
# ... build those things here
return TableFilter(
human_description_extras=extra_human_descriptions,
where_clauses=where_clauses,
params=params,
)
return inner
```
I built this for the https://github.com/simonw/russian-ira-facebook-ads-datasette project.
It's pretty neat. Maybe I should go with that?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,
https://github.com/simonw/datasette/issues/473#issuecomment-496338808,https://api.github.com/repos/simonw/datasette/issues/473,496338808,MDEyOklzc3VlQ29tbWVudDQ5NjMzODgwOA==,9599,2019-05-28T02:07:23Z,2019-05-28T02:07:23Z,OWNER,"Assuming I do go ahead with this plugin hook, the existing `InFilter` makes for a nice simple example that illustrates the two key methods: `.where_clause()` and `.human_clause()`:
```python
class InFilter(Filter):
key = ""in""
display = ""in""
def split_value(self, value):
if value.startswith(""[""):
return json.loads(value)
else:
return [v.strip() for v in value.split("","")]
def where_clause(self, table, column, value, param_counter):
values = self.split_value(value)
params = ["":p{}"".format(param_counter + i) for i in range(len(values))]
sql = ""{} in ({})"".format(escape_sqlite(column), "", "".join(params))
return sql, values
def human_clause(self, column, value):
return ""{} in {}"".format(column, json.dumps(self.split_value(value)))
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,
https://github.com/simonw/datasette/issues/473#issuecomment-496338666,https://api.github.com/repos/simonw/datasette/issues/473,496338666,MDEyOklzc3VlQ29tbWVudDQ5NjMzODY2Ng==,9599,2019-05-28T02:06:23Z,2019-05-28T02:06:23Z,OWNER,I'm having trouble coming up with interesting column-based filters which don't make sense to ship as default behaviour.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,
https://github.com/simonw/datasette/issues/473#issuecomment-496338533,https://api.github.com/repos/simonw/datasette/issues/473,496338533,MDEyOklzc3VlQ29tbWVudDQ5NjMzODUzMw==,9599,2019-05-28T02:05:39Z,2019-05-28T02:05:39Z,OWNER,"I wonder if this is the right hook?
The more likely case is that we need a hook that registers a new type of lookup entirely - `?_spatial_within={geojson}` for example. These aren't necessarily attached to a specific column and may have entirely custom syntax - but they still need to be able to influence the query (like the `_where=` clause does) and the human-readable description of the page.
Is there a strong case for supporting both custom filter plugins AND custom table where plugins, or could those where plugins cover both bases?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,
https://github.com/simonw/datasette/issues/473#issuecomment-496337533,https://api.github.com/repos/simonw/datasette/issues/473,496337533,MDEyOklzc3VlQ29tbWVudDQ5NjMzNzUzMw==,9599,2019-05-28T01:59:19Z,2019-05-28T01:59:19Z,OWNER,It would be nice if this plugin was passed the current database/table so it can decide to enable new filters only for specific tables. This will require a bit of refactoring because the filters list is static at the moment - it would instead have to be returned by a function that runs when the table view is rendered.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,