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
|