summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/ide/completion/name/service/cluster/name_service.cpp
blob: b5e6e00b224c2661c87f72034775ea1ff08e3cac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "name_service.h"

#include <library/cpp/case_insensitive_string/case_insensitive_string.h>

#include <util/charset/utf8.h>

namespace NSQLComplete {

namespace {

class TNameService: public INameService {
private:
    static auto FilterByName(TString name) {
        return [name = std::move(name)](auto f) {
            TClusterList clusters = f.ExtractValue();
            EraseIf(clusters, [prefix = TCaseInsensitiveStringBuf(name)](const TString& instance) {
                return !TCaseInsensitiveStringBuf(instance).StartsWith(prefix);
            });
            return clusters;
        };
    }

    static auto Crop(size_t limit) {
        return [limit](auto f) {
            TClusterList clusters = f.ExtractValue();
            clusters.crop(limit);
            return clusters;
        };
    }

    static auto ToResponse(TNameConstraints constraints) {
        return [constraints = std::move(constraints)](auto f) {
            TClusterList clusters = f.ExtractValue();

            TNameResponse response;
            response.RankedNames.reserve(clusters.size());

            for (auto& cluster : clusters) {
                TClusterName name;
                name.Identifier = std::move(cluster);
                response.RankedNames.emplace_back(std::move(name));
            }

            response.RankedNames = constraints.Unqualified(std::move(response.RankedNames));
            return response;
        };
    }

public:
    explicit TNameService(IClusterDiscovery::TPtr discovery)
        : Discovery_(std::move(discovery))
    {
    }

    NThreading::TFuture<TNameResponse> Lookup(const TNameRequest& request) const override {
        if (!request.Constraints.Cluster) {
            return NThreading::MakeFuture<TNameResponse>({});
        }

        return Discovery_->Query()
            .Apply(FilterByName(QualifiedClusterName(request)))
            .Apply(Crop(request.Limit))
            .Apply(ToResponse(request.Constraints));
    }

private:
    static TString QualifiedClusterName(const TNameRequest& request) {
        TClusterName cluster;
        cluster.Identifier = request.Prefix;

        TGenericName generic = request.Constraints.Qualified(cluster);
        return std::get<TClusterName>(std::move(generic)).Identifier;
    }

    IClusterDiscovery::TPtr Discovery_;
};

} // namespace

INameService::TPtr MakeClusterNameService(IClusterDiscovery::TPtr discovery) {
    return new TNameService(std::move(discovery));
}

} // namespace NSQLComplete