Skip to content

Commit

Permalink
[Fixes #11652] Facets: wrong count on multiple tkeywords filtering - …
Browse files Browse the repository at this point in the history
…region
  • Loading branch information
etj committed Nov 3, 2023
1 parent 815e7d6 commit cb9a663
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 36 deletions.
18 changes: 9 additions & 9 deletions geonode/facets/providers/region.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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")
)

Expand All @@ -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()
Expand Down
64 changes: 37 additions & 27 deletions geonode/facets/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand All @@ -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])
Expand Down Expand Up @@ -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},
],
},
},
Expand Down Expand Up @@ -389,23 +391,29 @@ 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
featname = FeaturedFacetProvider().name
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
Expand Down Expand Up @@ -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}),
Expand All @@ -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
Expand Down

0 comments on commit cb9a663

Please sign in to comment.