ClickHouse / ClickHouse/clickhouse-cpp

Allow for inheritance of Query Interface

Ouverte
#416 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
enhancement
Langage dominant
C
Étoiles
382
Forks
209
Merge moyen
2 j 19 h
PR mergées (30 j)
14

Description

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.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez dans clickhouse/client.cpp, au niveau de Client::Impl::ExecuteQuery, et suivez la façon dont Query est transmis à SendQuery et géré par QueryEvents. Comparez ce flux avec l’exemple d’héritage et déterminez comment le comportement virtuel OnFinish de l’interface est perdu. Le travail est terminé lorsque les implémentations dérivées de Query peuvent recevoir le comportement de callback prévu pendant l’exécution sans casser l’utilisation existante de Query.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
cpp
Domaine
backend-api-design, databases
Type d'issue
Fonctionnalité
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.