From cb9a6638e192c535ed7107b7501c69ed507d2f14 Mon Sep 17 00:00:00 2001 From: etj Date: Fri, 3 Nov 2023 16:43:42 +0100 Subject: [PATCH] [Fixes #11652] Facets: wrong count on multiple tkeywords filtering - region --- geonode/facets/providers/region.py | 18 ++++----- geonode/facets/tests.py | 64 +++++++++++++++++------------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/geonode/facets/providers/region.py b/geonode/facets/providers/region.py index bd912ab8693..73a7e578d37 100644 --- a/geonode/facets/providers/region.py +++ b/geonode/facets/providers/region.py @@ -46,7 +46,7 @@ def get_info(self, lang="en", **kwargs) -> dict: def get_facet_items( self, - queryset=None, + queryset, start: int = 0, end: int = DEFAULT_FACET_PAGE_SIZE, lang="en", @@ -56,19 +56,19 @@ def get_facet_items( ) -> (int, list): logger.debug("Retrieving facets for %s", self.name) - filters = {"regions__isnull": False} + filters = {"resourcebase__in": queryset} if topic_contains: - filters["regions__name"] = topic_contains + filters["name__icontains"] = topic_contains if keys: logger.debug("Filtering by keys %r", keys) - filters["regions__code__in"] = keys + filters["code__in"] = keys q = ( - queryset.filter(**filters) - .values("regions__code", "regions__name") - .annotate(count=Count("regions__code")) + Region.objects.filter(**filters) + .values("code", "name") + .annotate(count=Count("resourcebase")) .order_by("-count") ) @@ -80,8 +80,8 @@ def get_facet_items( topics = [ { - "key": r["regions__code"], - "label": r["regions__name"], + "key": r["code"], + "label": r["name"], "count": r["count"], } for r in q[start:end].all() diff --git a/geonode/facets/tests.py b/geonode/facets/tests.py index a5eb5aafd0b..402218a3fae 100644 --- a/geonode/facets/tests.py +++ b/geonode/facets/tests.py @@ -151,26 +151,26 @@ def _create_resources(self): # These are the assigned keywords to the Resources - # RB00 -> T1K0 R0,R1 FEAT K0 C0 - # RB01 -> T0K0 T1K0 R0 FEAT K1 - # RB02 -> T1K0 R1 FEAT K2 C0 - # RB03 -> T0K0 T1K0 K0 - # RB04 -> T1K0 K0,K1 C0 - # RB05 -> T0K0 T1K0 K0,K2 C1 - # RB06 -> T1K0 FEAT - # RB07 -> T0K0 T1K0 FEAT C3 - # RB08 -> T1K0 T1K1 R1 FEAT C3 - # RB09 -> T0K0 T1K0 T1K1 C3 - # RB10 -> T1K1 C3 + # RB00 -> T1K0 R0,R1 FEAT K0 C0 + # RB01 -> T0K0 T1K0 R0 FEAT K1 + # RB02 -> T1K0 R1 FEAT K2 C0 + # RB03 -> T0K0 T1K0 K0 + # RB04 -> T1K0 K0,K1 C0 + # RB05 -> T0K0 T1K0 K0,K2 C1 + # RB06 -> T1K0 FEAT + # RB07 -> T0K0 T1K0 R2 FEAT C3 + # RB08 -> T1K0 T1K1 R1,R2 FEAT C3 + # RB09 -> T0K0 T1K0 T1K1 R2 C3 + # RB10 -> T1K1 R2 C3 # RB11 -> T0K0 T0K1 T1K1 - # RB12 -> T1K1 FEAT - # RB13 -> T0K0 T0K1 R1 FEAT - # RB14 -> FEAT - # RB15 -> T0K0 T0K1 C1 - # RB16 -> C1 + # RB12 -> T1K1 FEAT + # RB13 -> T0K0 T0K1 R1 FEAT + # RB14 -> FEAT + # RB15 -> T0K0 T0K1 C1 + # RB16 -> C1 # RB17 -> T0K0 T0K1 - # RB18 -> FEAT C2 - # RB19 -> T0K0 T0K1 FEAT C2 + # RB18 -> FEAT C2 + # RB19 -> T0K0 T0K1 FEAT C2 if x % 2 == 1: logger.debug(f"ADDING KEYWORDS {self.thesauri_k['0_0']} to RB {d}") @@ -190,6 +190,7 @@ def _create_resources(self): for reg, idx in ( # fmt: skip ("R0", (0, 1)), ("R1", (0, 2, 8, 13)), + ("R2", (7, 8, 9, 10)), ): if x in idx: d.regions.add(self.regions[reg]) @@ -298,10 +299,11 @@ def test_facets_rich(self): { "name": "region", "topics": { - "total": 2, + "total": 3, "items": [ {"label": "Region0", "key": "R0", "count": 2}, {"label": "Region1", "key": "R1", "count": 4}, + {"label": "Region2", "key": "R2", "count": 4}, ], }, }, @@ -389,15 +391,21 @@ def test_prefiltering(self): ("t_1", {}, 2, 10), ("t_1", {regfilter: "R0"}, 1, 2), ("t_1", {regfilter: "R1"}, 2, 3), - (reginfo["name"], {}, 2, 4), - (reginfo["name"], {t0filter: self.thesauri_k["0_0"].id}, 2, 1), - (reginfo["name"], {t1filter: self.thesauri_k["1_0"].id}, 2, 3), + (reginfo["name"], {}, 3, 4), + (reginfo["name"], {t0filter: self.thesauri_k["0_0"].id}, 3, 2), + (reginfo["name"], {t1filter: self.thesauri_k["1_0"].id}, 3, 3), ): req = self.rf.get(reverse("get_facet", args=[facet]), data=filters) res: JsonResponse = GetFacetView.as_view()(req, facet) obj = json.loads(res.content) - self.assertEqual(totals, obj["topics"]["total"], f"Bad totals for facet '{facet} and filter {filters}") - self.assertEqual(count0, obj["topics"]["items"][0]["count"], f"Bad count0 for facet '{facet}") + self.assertEqual( + totals, + obj["topics"]["total"], + f"Bad totals for facet '{facet} and filter {filters}\nRESPONSE: {obj}", + ) + self.assertEqual( + count0, obj["topics"]["items"][0]["count"], f"Bad count0 for facet '{facet}\nRESPONSE: {obj}" + ) def test_prefiltering_tkeywords(self): regname = RegionFacetProvider().name @@ -405,7 +413,7 @@ def test_prefiltering_tkeywords(self): t1filter = facet_registry.get_provider("t_1").get_info()["filter"] tkey_1_1 = self.thesauri_k["1_1"].id - expected_region = {"R1": 1} + expected_region = {"R1": 1, "R2": 3} expected_feat = {True: 2, False: 3} # Run the single requests @@ -491,7 +499,7 @@ def test_count0(self): def t(tk): return self.thesauri_k[tk].id - for facet, params, items in ( + for facet, params, items in ( # fmt: skip # thesauri ("t_1", {regflt: "R0"}, {t("1_0"): 2}), ("t_1", {regflt: "R0", "key": [t("1_0")]}, {t("1_0"): 2}), @@ -509,7 +517,9 @@ def t(tk): ("t_1", {catflt: ["C0"]}, {t("1_0"): 3}), ("t_1", {catflt: ["C0", "C1"]}, {t("1_0"): 4}), # regions - (regname, {t1flt: t("1_1")}, {"R1": 1}), + (regname, {t1flt: t("1_0")}, {"R0": 2, "R1": 3, "R2": 3}), + (regname, {t1flt: t("1_1")}, {"R1": 1, "R2": 3}), + (regname, {t1flt: [t("1_1"), t("1_0")]}, {"R0": 2, "R1": 3, "R2": 4}), (regname, {t1flt: t("1_1"), "key": ["R0", "R1"]}, {"R1": 1, "R0": None}), (regname, {t1flt: t("1_1"), "key": ["R0"]}, {"R0": None}), # category