{"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496337533", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496337533, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzNzUzMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T01:59:19Z", "updated_at": "2019-05-28T01:59:19Z", "author_association": "OWNER", "body": "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.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496338533", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496338533, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzODUzMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:05:39Z", "updated_at": "2019-05-28T02:05:39Z", "author_association": "OWNER", "body": "I wonder if this is the right hook?\r\n\r\nThe 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.\r\n\r\nIs there a strong case for supporting both custom filter plugins AND custom table where plugins, or could those where plugins cover both bases?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496338666", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496338666, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzODY2Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:06:23Z", "updated_at": "2019-05-28T02:06:23Z", "author_association": "OWNER", "body": "I'm having trouble coming up with interesting column-based filters which don't make sense to ship as default behaviour.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496338808", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496338808, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzODgwOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:07:23Z", "updated_at": "2019-05-28T02:07:23Z", "author_association": "OWNER", "body": "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()`:\r\n\r\n```python\r\nclass InFilter(Filter):\r\n key = \"in\"\r\n display = \"in\"\r\n\r\n def split_value(self, value):\r\n if value.startswith(\"[\"):\r\n return json.loads(value)\r\n else:\r\n return [v.strip() for v in value.split(\",\")]\r\n\r\n def where_clause(self, table, column, value, param_counter):\r\n values = self.split_value(value)\r\n params = [\":p{}\".format(param_counter + i) for i in range(len(values))]\r\n sql = \"{} in ({})\".format(escape_sqlite(column), \", \".join(params))\r\n return sql, values\r\n\r\n def human_clause(self, column, value):\r\n return \"{} in {}\".format(column, json.dumps(self.split_value(value)))\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496339574", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496339574, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzOTU3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:12:13Z", "updated_at": "2019-05-28T02:13:07Z", "author_association": "OWNER", "body": "Here's an older version of what that custom table filtering plugin might look like: https://github.com/simonw/datasette/commit/5116c4ec8aed5091e1f75415424b80f613518dc6\r\n\r\n```python\r\nfrom datasette.utils import TableFilter\r\n\r\n@hookimpl\r\ndef table_filter():\r\n async def inner(view, name, table, request):\r\n extra_human_descriptions = []\r\n where_clauses = []\r\n params = {}\r\n # ... build those things here\r\n return TableFilter(\r\n human_description_extras=extra_human_descriptions,\r\n where_clauses=where_clauses,\r\n params=params,\r\n )\r\n return inner\r\n```\r\n\r\nI built this for the https://github.com/simonw/russian-ira-facebook-ads-datasette project.\r\n\r\nIt's pretty neat. Maybe I should go with that?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/473#issuecomment-496339819", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/473", "id": 496339819, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjMzOTgxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:13:44Z", "updated_at": "2019-05-28T02:13:44Z", "author_association": "OWNER", "body": "I'm leaning towards supporting both hooks.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 445850934, "label": "Plugin hook: filters_from_request"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/485#issuecomment-496367866", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/485", "id": 496367866, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjM2Nzg2Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T05:14:06Z", "updated_at": "2019-05-28T05:14:06Z", "author_association": "OWNER", "body": "I'm going to generate statistics for every TEXT column.\r\n\r\nAny column with more than 90% distinct rows (compared to the total count of rows) will be a candidate for the label.\r\n\r\nI will then pick the candidate column with the shortest average length.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 447469253, "label": "Improvements to table label detection "}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/489#issuecomment-496345660", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/489", "id": 496345660, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjM0NTY2MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T02:48:57Z", "updated_at": "2019-05-28T02:48:57Z", "author_association": "OWNER", "body": "Fixed: https://latest.datasette.io/fixtures/roadside_attraction_characteristics?_sort=attraction_id&_size=2", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 448977444, "label": "Pagination breaks when combined with expanded foreign keys"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/21#issuecomment-496665669", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/21", "id": 496665669, "node_id": "MDEyOklzc3VlQ29tbWVudDQ5NjY2NTY2OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-05-28T19:57:47Z", "updated_at": "2019-05-28T19:57:47Z", "author_association": "OWNER", "body": "https://www.sqlite.org/lang_insert.html\r\n\r\nLooks like it's as simple as `INSERT OR IGNORE` - and we already have code related to that here: \r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1e28eeee8ce55ea68eddb228294a1eff6785b497/sqlite_utils/db.py#L498-L501", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 448391492, "label": "Option to ignore inserts if primary key exists already"}, "performed_via_github_app": null}