5
5
#include < library/cpp/resource/resource.h>
6
6
#include < util/stream/file.h>
7
7
#include < util/string/split.h>
8
+ #include < util/string/strip.h>
8
9
9
10
namespace NYdbWorkload {
10
11
@@ -17,32 +18,55 @@ void TTpcBaseWorkloadGenerator::PatchQuery(TString& query) const {
17
18
TString header;
18
19
switch (Params.GetFloatMode ()) {
19
20
case TTpcBaseWorkloadParams::EFloatMode::FLOAT:
20
- header = NResource::Find (" consts.yql" );
21
+ header = FilterHeader ( NResource::Find (" consts.yql" ), query );
21
22
break ;
22
23
case TTpcBaseWorkloadParams::EFloatMode::DECIMAL:
23
- header = NResource::Find (" consts_decimal.yql" );
24
+ case TTpcBaseWorkloadParams::EFloatMode::DECIMAL_YDB:
25
+ header = FilterHeader (NResource::Find (" consts_decimal.yql" ), query);
24
26
break ;
25
- case TTpcBaseWorkloadParams::EFloatMode::DECIMAL_YDB: {
26
- header = NResource::Find (" consts_decimal.yql" );
27
- header.to_lower ();
28
- const TStringBuf dec (" decimal(" );
29
- auto p = header.find (dec);
30
- while (p != TString::npos) {
31
- p += dec.length ();
32
- const auto q = header.find (' )' , p);
33
- TVector<ui32> decParams;
34
- StringSplitter (header.cbegin () + p, q - p).SplitBySet (" , " ).SkipEmpty ().Limit (2 ).ParseInto (&decParams);
35
- TStringBuilder newDecParams;
36
- newDecParams
37
- << Max (decParams[0 ], NKikimr::NScheme::DECIMAL_PRECISION)
38
- << " ," << Max (decParams[1 ], NKikimr::NScheme::DECIMAL_SCALE);
39
- header.replace (p, q - p, newDecParams);
40
- p = header.find (dec, q);
27
+ }
28
+ PatchHeader (header);
29
+ SubstGlobal (query, " {% include 'header.sql.jinja' %}" , header);
30
+ }
31
+
32
+ TString TTpcBaseWorkloadGenerator::FilterHeader (TStringBuf header, const TString& query) const {
33
+ TStringBuilder result;
34
+ for (TStringBuf line; header.ReadLine (line);) {
35
+ const auto pos = line.find (' =' );
36
+ if (pos == line.npos ) {
37
+ continue ;
38
+ }
39
+ const auto name = StripString (line.SubString (0 , pos));
40
+ for (auto posInQ = query.find (name); posInQ != query.npos ; posInQ = query.find (name, posInQ)) {
41
+ posInQ += name.length ();
42
+ if (posInQ >= query.length () || !IsAsciiAlnum (query[posInQ]) && query[posInQ] != ' _' ) {
43
+ result << line << Endl;
44
+ break ;
41
45
}
42
46
}
43
- break ;
44
47
}
45
- SubstGlobal (query, " {% include 'header.sql.jinja' %}" , header);
48
+ return result;
49
+ }
50
+
51
+ void TTpcBaseWorkloadGenerator::PatchHeader (TString& header) const {
52
+ if (Params.GetFloatMode () != TTpcBaseWorkloadParams::EFloatMode::DECIMAL_YDB) {
53
+ return ;
54
+ }
55
+ header.to_lower ();
56
+ const TStringBuf dec (" decimal(" );
57
+ auto p = header.find (dec);
58
+ while (p != TString::npos) {
59
+ p += dec.length ();
60
+ const auto q = header.find (' )' , p);
61
+ TVector<ui32> decParams;
62
+ StringSplitter (header.cbegin () + p, q - p).SplitBySet (" , " ).SkipEmpty ().Limit (2 ).ParseInto (&decParams);
63
+ TStringBuilder newDecParams;
64
+ newDecParams
65
+ << Max (decParams[0 ], NKikimr::NScheme::DECIMAL_PRECISION)
66
+ << " ," << Max (decParams[1 ], NKikimr::NScheme::DECIMAL_SCALE);
67
+ header.replace (p, q - p, newDecParams);
68
+ p = header.find (dec, q);
69
+ }
46
70
}
47
71
48
72
void TTpcBaseWorkloadParams::ConfigureOpts (NLastGetopt::TOpts& opts, const ECommandType commandType, int workloadType) {
0 commit comments