ClickHouse / ClickHouse/clickhouse-cpp

Allow for inheritance of Query Interface

Offen
#416 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
enhancement
Vorherrschende Sprache
C
Sterne
382
Forks
209
Ø Merge
1 T. 22 Std.
Gemergte PRs (30 T.)
13

Beschreibung

Enhancement request.

## Description:

Currently the clickhouse::Query interface cannot be inherited for any requirements which deviate from the existing implementation.

e.g, if we need a callback for when the query is finished, we should be able to override the Query as follows:
```C++
#ifndef CLICKHOUSE_OVERRIDES
#define CLICKHOUSE_OVERRIDES

#include

namespace DB
{

class Query : public clickhouse::Query
{

public:
Query();
Query(const char *query, const char *query_id = nullptr);
Query(const std::string &query, const std::string &query_id = default_query_id);
Query &OnFinish(std::function callback);

std::function _finish_callback;
void OnFinish() override;

private:
};
}

#endif // CLICKHOUSE_OVERRIDES
```

However this does not work and the original function `OnFinish` of clickhouse::Query is called instead of DB::Query.

The culprit as far as I can understand is:
```C++
// clickhouse/client.cpp
void Client::Impl::ExecuteQuery(Query query) {
EnsureNull en(static_cast(&query), &events_);

if (options_.ping_before_query) {
RetryGuard([this]() { Ping(); });
}

SendQuery(query);

while (ReceivePacket()) {
;
}
}
```

Here the function is called without reference and I believe that the compiler is creating a copy of clickhouse::Query with data from the object passed. This causes the overrides from DB::Query to not be called.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne in clickhouse/client.cpp bei Client::Impl::ExecuteQuery und verfolge, wie Query an SendQuery übergeben und von QueryEvents verarbeitet wird. Vergleiche diesen Ablauf mit dem Vererbungsbeispiel und ermittle, wie das virtuelle OnFinish-Verhalten der Schnittstelle verloren geht. Als erledigt gilt, wenn abgeleitete Query-Implementierungen während der Ausführung das beabsichtigte Callback-Verhalten erhalten können, ohne die bestehende Verwendung von Query zu beeinträchtigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
cpp
Bereich
backend-api-design, databases
Issue-Typ
Feature
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.