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
  • Loading branch information
etj committed Nov 3, 2023
1 parent 6a8a202 commit 12ddf77
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 33 deletions.
28 changes: 14 additions & 14 deletions geonode/facets/providers/thesaurus.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,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 @@ -66,30 +66,30 @@ def get_facet_items(
) -> (int, list):
logger.debug("Retrieving facets for %s", self._name)

filter = {
"tkeywords__thesaurus__identifier": self._name,
}
filter = {"thesaurus__identifier": self._name, "resourcebase__in": queryset}

if topic_contains:
filter["tkeywords__keyword__label__icontains"] = topic_contains
filter["label__icontains"] = topic_contains

if keys:
logger.debug("Filtering by keys %r\n", keys)
filter["tkeywords__in"] = keys
filter["id__in"] = keys

q = (
queryset.filter(**filter)
.values("tkeywords", "tkeywords__alt_label", "tkeywords__image")
.annotate(count=Count("tkeywords"))
ThesaurusKeyword.objects.filter(**filter)
.values("id", "alt_label", "image")
.annotate(count=Count("resourcebase"))
.annotate(
localized_label=Subquery(
ThesaurusKeywordLabel.objects.filter(keyword=OuterRef("tkeywords"), lang=lang).values("label")
ThesaurusKeywordLabel.objects.filter(keyword=OuterRef("id"), lang=lang).values("label")
)
)
.order_by("-count")
)

logger.debug(" ---> %s\n\n", q.query)
logger.debug(" PREFILTERED QUERY ---> %s\n\n", queryset.query)
logger.debug(" ADDITIONAL FILTERS ---> %s\n\n", filter)
logger.debug(" FINAL QUERY ---> %s\n\n", q.query)

cnt = q.count()

Expand All @@ -98,11 +98,11 @@ def get_facet_items(

topics = [
{
"key": r["tkeywords"],
"label": r["localized_label"] or r["tkeywords__alt_label"],
"key": r["id"],
"label": r["localized_label"] or r["alt_label"],
"is_localized": r["localized_label"] is not None,
"count": r["count"],
"image": r["tkeywords__image"],
"image": r["image"],
}
for r in q[start:end].all()
]
Expand Down
42 changes: 23 additions & 19 deletions geonode/facets/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,49 +471,53 @@ def test_config(self):

def test_count0(self):
reginfo = RegionFacetProvider().get_info()
regfilter = reginfo["filter"]
regflt = reginfo["filter"]
regname = reginfo["name"]

catinfo = CategoryFacetProvider().get_info()
catname = catinfo["name"]

kwinfo = KeywordFacetProvider().get_info()
kwfilter = kwinfo["filter"]
kwflt = kwinfo["filter"]
kwname = kwinfo["name"]

t0filter = facet_registry.get_provider("t_0").get_info()["filter"]
t1filter = facet_registry.get_provider("t_1").get_info()["filter"]
t0flt = facet_registry.get_provider("t_0").get_info()["filter"]
t1flt = facet_registry.get_provider("t_1").get_info()["filter"]

def t(tk):
return self.thesauri_k[tk].id

for facet, params, items in (
# thesauri
("t_1", {regfilter: "R0"}, {t("1_0"): 2}),
("t_1", {regfilter: "R0", "key": [t("1_0")]}, {t("1_0"): 2}),
("t_1", {regfilter: "R0", t0filter: t("0_1")}, {}),
("t_1", {regfilter: "R0", t0filter: t("0_1"), "key": [t("1_0")]}, {t("1_0"): None}),
("t_1", {regflt: "R0"}, {t("1_0"): 2}),
("t_1", {regflt: "R0", "key": [t("1_0")]}, {t("1_0"): 2}),
("t_1", {regflt: "R0", t0flt: t("0_1")}, {}),
("t_1", {regflt: "R0", t0flt: t("0_1"), "key": [t("1_0")]}, {t("1_0"): None}),
(
"t_1",
{regfilter: "R0", t0filter: t("0_1"), "key": [t("1_1"), t("1_0")]},
{regflt: "R0", t0flt: t("0_1"), "key": [t("1_1"), t("1_0")]},
{t("1_0"): None, t("1_1"): None},
),
("t_1", {"key": [t("0_1")]}, {}),
("t_1", {t0flt: t("0_0")}, {t("1_0"): 5, t("1_1"): 2}),
("t_1", {t0flt: t("0_1")}, {t("1_1"): 1}),
("t_1", {t0flt: [t("0_1"), t("0_0")]}, {t("1_0"): 5, t("1_1"): 2}),
# regions
(regname, {t1filter: t("1_1")}, {"R1": 1}),
(regname, {t1filter: t("1_1"), "key": ["R0", "R1"]}, {"R1": 1, "R0": None}),
(regname, {t1filter: t("1_1"), "key": ["R0"]}, {"R0": None}),
(regname, {t1flt: t("1_1")}, {"R1": 1}),
(regname, {t1flt: t("1_1"), "key": ["R0", "R1"]}, {"R1": 1, "R0": None}),
(regname, {t1flt: t("1_1"), "key": ["R0"]}, {"R0": None}),
# category
(catname, {t1filter: t("1_0")}, {"C0": 3, "C1": 1}),
(catname, {t1filter: t("1_0"), "key": ["C0", "C2"]}, {"C0": 3, "C2": None}),
(catname, {kwfilter: "K1"}, {"C0": 1}),
(catname, {kwfilter: "K1", "key": ["C0", "C2"]}, {"C0": 1, "C2": None}),
(catname, {t1flt: t("1_0")}, {"C0": 3, "C1": 1}),
(catname, {t1flt: t("1_0"), "key": ["C0", "C2"]}, {"C0": 3, "C2": None}),
(catname, {kwflt: "K1"}, {"C0": 1}),
(catname, {kwflt: "K1", "key": ["C0", "C2"]}, {"C0": 1, "C2": None}),
# keyword
(kwname, {t0filter: t("0_0")}, {"K0": 2, "K1": 1, "K2": 1}),
(kwname, {t0filter: t("0_0"), regfilter: "R0"}, {"K1": 1}),
(kwname, {t0filter: t("0_0"), regfilter: "R0", "key": ["K0"]}, {"K0": None}),
(kwname, {t0flt: t("0_0")}, {"K0": 2, "K1": 1, "K2": 1}),
(kwname, {t0flt: t("0_0"), regflt: "R0"}, {"K1": 1}),
(kwname, {t0flt: t("0_0"), regflt: "R0", "key": ["K0"]}, {"K0": None}),
):
req = self.rf.get(reverse("get_facet", args=[facet]), data=params)
req.user = self.admin
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 params {params}")
Expand Down

0 comments on commit 12ddf77

Please sign in to comment.