diff --git a/datasette/templates/table.html b/datasette/templates/table.html
index 5820d09e..700dc884 100644
--- a/datasette/templates/table.html
+++ b/datasette/templates/table.html
@@ -1,6 +1,6 @@
{% extends "base.html" %}
-{% block title %}{{ database }}: {{ table }}: {% if filtered_table_rows_count or filtered_table_rows_count == 0 %}{{ "{:,}".format(filtered_table_rows_count) }} row{% if filtered_table_rows_count == 1 %}{% else %}s{% endif %}{% endif %}{% if human_description_en %} {{ human_description_en }}{% endif %}{% endblock %}
+{% block title %}{{ database }}: {{ table }}: {% if count or count == 0 %}{{ "{:,}".format(count) }} row{% if count == 1 %}{% else %}s{% endif %}{% endif %}{% if human_description_en %} {{ human_description_en }}{% endif %}{% endblock %}
{% block extra_head %}
{{- super() -}}
@@ -55,8 +55,8 @@
{% endif %}
-{% if filtered_table_rows_count or human_description_en %}
-
{% if filtered_table_rows_count or filtered_table_rows_count == 0 %}{{ "{:,}".format(filtered_table_rows_count) }} row{% if filtered_table_rows_count == 1 %}{% else %}s{% endif %}{% endif %}
+{% if count or human_description_en %}
+ {% if count or count == 0 %}{{ "{:,}".format(count) }} row{% if count == 1 %}{% else %}s{% endif %}{% endif %}
{% if human_description_en %}{{ human_description_en }}{% endif %}
{% endif %}
diff --git a/datasette/views/table.py b/datasette/views/table.py
index ecf6f15b..065e8b4f 100644
--- a/datasette/views/table.py
+++ b/datasette/views/table.py
@@ -539,7 +539,7 @@ class TableView(DataView):
results = await db.execute(sql, params, truncate=True, **extra_args)
# Calculate the total count for this query
- filtered_table_rows_count = None
+ count = None
if (
not db.is_mutable
and self.ds.inspect_data
@@ -547,17 +547,17 @@ class TableView(DataView):
):
# We can use a previously cached table row count
try:
- filtered_table_rows_count = self.ds.inspect_data[database_name][
+ count = self.ds.inspect_data[database_name][
"tables"
][table_name]["count"]
except KeyError:
pass
# Otherwise run a select count(*) ...
- if count_sql and filtered_table_rows_count is None and not nocount:
+ if count_sql and count is None and not nocount:
try:
count_rows = list(await db.execute(count_sql, from_sql_params))
- filtered_table_rows_count = count_rows[0][0]
+ count = count_rows[0][0]
except QueryInterrupted:
pass
@@ -584,7 +584,7 @@ class TableView(DataView):
params=params,
table=table_name,
metadata=table_metadata,
- row_count=filtered_table_rows_count,
+ row_count=count,
)
)
@@ -853,7 +853,7 @@ class TableView(DataView):
"human_description_en": human_description_en,
"rows": rows[:page_size],
"truncated": results.truncated,
- "filtered_table_rows_count": filtered_table_rows_count,
+ "count": count,
"expanded_columns": expanded_columns,
"expandable_columns": expandable_columns,
"columns": columns,
diff --git a/docs/json_api.rst b/docs/json_api.rst
index a7e8da91..80b57490 100644
--- a/docs/json_api.rst
+++ b/docs/json_api.rst
@@ -38,6 +38,7 @@ looks like this::
"value": "Pinus radiata :: Monterey Pine"
}
],
+ "count": 195002,
"truncated": false,
"next": "100",
"next_url": "http://127.0.0.1:8001/sf-trees-02c8ef1/qSpecies.json?_next=100",
diff --git a/tests/test_api.py b/tests/test_api.py
index 0e2a55a3..b2cf7ef0 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -981,7 +981,7 @@ def test_common_prefix_database_names(app_client_conflicting_database_names):
def test_inspect_file_used_for_count(app_client_immutable_and_inspect_file):
response = app_client_immutable_and_inspect_file.get("/fixtures/sortable.json")
- assert response.json["filtered_table_rows_count"] == 100
+ assert response.json["count"] == 100
@pytest.mark.asyncio
diff --git a/tests/test_table_api.py b/tests/test_table_api.py
index 811d0c68..9e9578bf 100644
--- a/tests/test_table_api.py
+++ b/tests/test_table_api.py
@@ -233,7 +233,7 @@ async def test_page_size_zero(ds_client):
response = await ds_client.get("/fixtures/no_primary_key.json?_size=0")
assert response.status_code == 200
assert [] == response.json()["rows"]
- assert 201 == response.json()["filtered_table_rows_count"]
+ assert 201 == response.json()["count"]
assert None is response.json()["next"]
assert None is response.json()["next_url"]
@@ -346,7 +346,7 @@ async def test_sortable_and_filtered(ds_client):
== response.json()["human_description_en"]
)
expected = [row for row in generate_sortable_rows(201) if "d" in row["content"]]
- assert len(expected) == response.json()["filtered_table_rows_count"]
+ assert len(expected) == response.json()["count"]
expected.sort(key=lambda row: -row["sortable"])
assert [r["content"] for r in expected] == [r["content"] for r in fetched]
@@ -997,7 +997,7 @@ async def test_nocount(ds_client, nocount, expected_count):
if nocount:
path += "?_nocount=1"
response = await ds_client.get(path)
- assert response.json()["filtered_table_rows_count"] == expected_count
+ assert response.json()["count"] == expected_count
def test_nocount_nofacet_if_shape_is_object(app_client_with_trace):