Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SearchBase: Bedingungen für automatischen count #41

Open
digedag opened this issue May 4, 2016 · 2 comments
Open

SearchBase: Bedingungen für automatischen count #41

digedag opened this issue May 4, 2016 · 2 comments
Assignees
Labels

Comments

@digedag
Copy link
Owner

digedag commented May 4, 2016

Wenn man die what-Option einer Suchanfrage manipuliert, dann funktioniert der automatische Count nicht mehr in jedem Fall. Es sind da einige Bedingungen, die abgefragt werden, bevor der Count gesetzt wird:

// if we have to do a count and there still is a count in the custom what
// or there is a having or a groupby
// so we have to wrap the query into a subquery to count the results
if (
!$options['disableCountWrap'] &&
isset($options['count'])
&& (
(
isset($options['what'])
&& strpos(strtoupper($options['what']), 'COUNT(') !== FALSE
)
|| $options['groupby']
|| $options['having']
)
) {

Die Count-Abfrage wird in meinem Fall nur dann durchgeführt, wenn die what-Option schon ein COUNT( enthält. Ist das nicht verkehrt? Müsste das nicht genau andersrum sein? Denn so wird doch die Zähl-Query in eine weitere Zählquery verpackt?

@rengaw83
Copy link
Collaborator

rengaw83 commented May 9, 2016

Gute Frage,
ich hatte das damals in bce8d64 implementiert und später mit @hannesbochmann sehr lange durch diskutiert. Die Option wurde dann anschließend deaktivierbar gemacht.

Die Abfrage an der stelle ist schon richtig, denn vorher war es so, das der COUNT nicht funktionierte, wenn im what der Options bereits ein COUNTvorhanden war. Deshalb wird die Query nochmal in eine Subquery gepackt, um die korrekten Anzahl zu ermitteln.

Dein Problem liegt in der tx_rnbase_util_SearchBase::getWhat Methode. Der COUNT wird nur gebildet, wenn kein what in den Options gesetzt ist.

Was würde passieren, wenn die abfrage nach COUNT( im what der Options entfernt werden würde?
Die Subquery würde immer erzeugt werden. Das wird mit Sicherheit hier und da zu Problemen führen. Niemand weiß in welchen Projekten über das what skurrile Abfragen gebaut werden, die dann nicht mehr gehen. Beispielsweise über mehrere Tabellen oder über eine weitere Subquery. Genau deswegen ist die Abfrage da drin.

Ein Workaround für dich ist, das COUNT(*) as cnt mit in dein what aufzunehmen, und in den Options das count zu entfernen

Andernfalls müsste die komplette count thematik neu überdacht und implementiert werden.

@rengaw83
Copy link
Collaborator

rengaw83 commented May 9, 2016

Noch zur Erklärung, warum eine Count Query in eine weitere verpackt werden muss, hier ein Beispiel:

Eine Tabelle mit Statistiken. Für jeden View einer News wird beispielsweise ein Datensatz mit der News-ID angelegt.
Im View für die Statistiken möchte ich natürlich pro News-Id die Gesamtanzahl an Views haben, weshalb der what auf *, COUNT(STATS.news_id) as views gesetzt wird. Damit habe ich alle Felder plus die Summe aller View Datensätze.
Für Funktionalitäten wie Pagebrowser etc, ist allerdings ein zusätzlicher Count nötig, der genau mit bce8d64 möglich wurde. Die Statistiken sind jetzt nur ein Beispiel von Vielen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants