enhancement
major
defect
major
minor
major
#29697
HistoryQuery: Start- und Stop-Revision aus HistoryQueryArguments werden bei der Suche ignoriert.
HistoryQueryArguments bietet getStartRevision() (inklusive) und getStopRevision() (exklusive), um eine HistoryQuery auf einen Revisionsbereich einzuschränken. Die HistoryQuery selbst trägt dazu den RevisionParam: RevisionParam.range soll die Suche auf diesen Bereich begrenzen, RevisionParam.all die gesamte Historie durchsuchen.
DBKnowledgeBase.search(HistoryQuery, HistoryQueryArguments) wertet weder den RevisionParam noch die beiden Revisionen aus. Eine mit RevisionParam.range erzeugte Suche liefert daher immer die Lebensperioden über die gesamte Historie, unabhängig von der gesetzten Start- und Stop-Revision.
Umsetzung
Bei RevisionParam.range schränkt bereits die Datenbankabfrage auf den Bereich ein: SQLBuilder.createHistorySearches() ergänzt die WHERE-Bedingung für jede beteiligte Tabelle um rev_min < stopRevision und rev_max >= startRevision (jeweils NULL-tolerant für Left Joins). Die Werte werden über die synthetischen Parameter SQLBuilder.START_REVISION_PARAM / STOP_REVISION_PARAM übergeben. Damit zählen für stopRow nur noch Zeilen, die im angefragten Bereich liegen.
Als Start-Revision wird für die Datenbank höchstens die Session-Revision verwendet, weil adaptToCurrentRevision() Zeilen, die in der Session-Revision noch leben, in die Zukunft verlängert.
Anschließend werden die Lebensperioden an den Bereichsgrenzen abgeschnitten; Objekte ohne Treffer im Bereich entfallen. Revision.CURRENT_REV als Stop-Revision bedeutet "bis heute". Bei RevisionParam.all bleibt das Verhalten unverändert.
Test
- com.top_logic/src/test/java/test/com/top_logic/knowledge/service/db2/expr/visit/TestHistoryQuery.java