@@ -59,9 +59,7 @@ using TAms = THashMap<ui32, TAmDesc>;
59
59
60
60
using TNamespaces = THashMap<decltype (TNamespaceDesc::Oid), TNamespaceDesc>;
61
61
62
- // We parse OpFamilies' IDs for now. If we ever needed oid_symbol,
63
- // create TOpFamilyDesc class alike other catalogs
64
- using TOpFamilies = THashMap<TString, ui32>;
62
+ using TOpFamilies = THashMap<TString, TOpFamilyDesc>;
65
63
66
64
using TOpClasses = THashMap<std::pair<EOpClassMethod, ui32>, TOpClassDesc>;
67
65
@@ -1073,10 +1071,11 @@ class TOpFamiliesParser : public TParser {
1073
1071
if (IsSupported) {
1074
1072
Y_ENSURE (LastOpfId != InvalidOid);
1075
1073
1076
- // TODO: log or throw if dict keys aren't unique
1077
1074
// opfamily references have opf_method/opf_name format in PG catalogs
1078
- OpFamilies[LastOpfMethod.append (' /' ).append (
1079
- LastOpfName)] = LastOpfId; // LastOpfMethod is modified here. Use with caution till its reinit
1075
+ TOpFamilyDesc desc;
1076
+ desc.Name = LastOpfMethod + " /" + LastOpfName;
1077
+ desc.FamilyId = LastOpfId;
1078
+ Y_ENSURE (OpFamilies.emplace (desc.Name , desc).second );
1080
1079
}
1081
1080
1082
1081
IsSupported = true ;
@@ -1124,7 +1123,7 @@ class TOpClassesParser : public TParser {
1124
1123
auto opFamilyPtr = OpFamilies.FindPtr (value);
1125
1124
1126
1125
if (opFamilyPtr) {
1127
- LastOpClass.FamilyId = * opFamilyPtr;
1126
+ LastOpClass.FamilyId = opFamilyPtr-> FamilyId ;
1128
1127
} else {
1129
1128
IsSupported = false ;
1130
1129
}
@@ -1181,7 +1180,7 @@ class TAmOpsParser : public TParser {
1181
1180
LastAmOp.Family = value;
1182
1181
auto opFamilyPtr = OpFamilies.FindPtr (value);
1183
1182
if (opFamilyPtr) {
1184
- LastAmOp.FamilyId = * opFamilyPtr;
1183
+ LastAmOp.FamilyId = opFamilyPtr-> FamilyId ;
1185
1184
} else {
1186
1185
IsSupported = false ;
1187
1186
}
@@ -1292,7 +1291,7 @@ class TAmProcsParser : public TParser {
1292
1291
auto opFamilyPtr = OpFamilies.FindPtr (value);
1293
1292
1294
1293
if (opFamilyPtr) {
1295
- LastAmProc.FamilyId = * opFamilyPtr;
1294
+ LastAmProc.FamilyId = opFamilyPtr-> FamilyId ;
1296
1295
} else {
1297
1296
IsSupported = false ;
1298
1297
}
@@ -1843,10 +1842,10 @@ struct TCatalog : public IExtensionSqlBuilder {
1843
1842
State->AggregationsByName [v.Name ].push_back (k);
1844
1843
}
1845
1844
1846
- TOpFamilies opFamilies = ParseOpFamilies (opFamiliesData);
1847
- State->OpClasses = ParseOpClasses (opClassData, State->TypeByName , opFamilies );
1848
- State->AmOps = ParseAmOps (amOpData, State->TypeByName , State->Types , State->OperatorsByName , State->Operators , opFamilies );
1849
- State->AmProcs = ParseAmProcs (amProcData, State->TypeByName , State->ProcByName , State->Procs , opFamilies );
1845
+ State-> OpFamilies = ParseOpFamilies (opFamiliesData);
1846
+ State->OpClasses = ParseOpClasses (opClassData, State->TypeByName , State-> OpFamilies );
1847
+ State->AmOps = ParseAmOps (amOpData, State->TypeByName , State->Types , State->OperatorsByName , State->Operators , State-> OpFamilies );
1848
+ State->AmProcs = ParseAmProcs (amProcData, State->TypeByName , State->ProcByName , State->Procs , State-> OpFamilies );
1850
1849
State->Ams = ParseAms (amData);
1851
1850
State->Namespaces = FillNamespaces ();
1852
1851
for (auto & [k, v] : State->Types ) {
@@ -1855,30 +1854,8 @@ struct TCatalog : public IExtensionSqlBuilder {
1855
1854
if (regClasses.contains (lookupId)) {
1856
1855
lookupId = OidOid;
1857
1856
}
1858
- auto btreeOpClassPtr = State->OpClasses .FindPtr (std::make_pair (EOpClassMethod::Btree, lookupId));
1859
- if (btreeOpClassPtr) {
1860
- auto lessAmOpPtr = State->AmOps .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmStrategy::Less), lookupId, lookupId));
1861
- Y_ENSURE (lessAmOpPtr);
1862
- auto equalAmOpPtr = State->AmOps .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmStrategy::Equal), lookupId, lookupId));
1863
- Y_ENSURE (equalAmOpPtr);
1864
- auto lessOperPtr = State->Operators .FindPtr (lessAmOpPtr->OperId );
1865
- Y_ENSURE (lessOperPtr);
1866
- auto equalOperPtr = State->Operators .FindPtr (equalAmOpPtr->OperId );
1867
- Y_ENSURE (equalOperPtr);
1868
- v.LessProcId = lessOperPtr->ProcId ;
1869
- v.EqualProcId = equalOperPtr->ProcId ;
1870
-
1871
- auto compareAmProcPtr = State->AmProcs .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmProcNum::Compare), lookupId, lookupId));
1872
- Y_ENSURE (compareAmProcPtr);
1873
- v.CompareProcId = compareAmProcPtr->ProcId ;
1874
- }
1875
1857
1876
- auto hashOpClassPtr = State->OpClasses .FindPtr (std::make_pair (EOpClassMethod::Hash, lookupId));
1877
- if (hashOpClassPtr) {
1878
- auto hashAmProcPtr = State->AmProcs .FindPtr (std::make_tuple (hashOpClassPtr->FamilyId , ui32 (EHashAmProcNum::Hash), lookupId, lookupId));
1879
- Y_ENSURE (hashAmProcPtr);
1880
- v.HashProcId = hashAmProcPtr->ProcId ;
1881
- }
1858
+ CacheAmFuncs (lookupId, v);
1882
1859
}
1883
1860
}
1884
1861
@@ -1956,6 +1933,33 @@ struct TCatalog : public IExtensionSqlBuilder {
1956
1933
}
1957
1934
}
1958
1935
1936
+ void CacheAmFuncs (ui32 typeId, TTypeDesc& v) {
1937
+ auto btreeOpClassPtr = State->OpClasses .FindPtr (std::make_pair (EOpClassMethod::Btree, typeId));
1938
+ if (btreeOpClassPtr) {
1939
+ auto lessAmOpPtr = State->AmOps .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmStrategy::Less), typeId, typeId));
1940
+ Y_ENSURE (lessAmOpPtr);
1941
+ auto equalAmOpPtr = State->AmOps .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmStrategy::Equal), typeId, typeId));
1942
+ Y_ENSURE (equalAmOpPtr);
1943
+ auto lessOperPtr = State->Operators .FindPtr (lessAmOpPtr->OperId );
1944
+ Y_ENSURE (lessOperPtr);
1945
+ auto equalOperPtr = State->Operators .FindPtr (equalAmOpPtr->OperId );
1946
+ Y_ENSURE (equalOperPtr);
1947
+ v.LessProcId = lessOperPtr->ProcId ;
1948
+ v.EqualProcId = equalOperPtr->ProcId ;
1949
+
1950
+ auto compareAmProcPtr = State->AmProcs .FindPtr (std::make_tuple (btreeOpClassPtr->FamilyId , ui32 (EBtreeAmProcNum::Compare), typeId, typeId));
1951
+ Y_ENSURE (compareAmProcPtr);
1952
+ v.CompareProcId = compareAmProcPtr->ProcId ;
1953
+ }
1954
+
1955
+ auto hashOpClassPtr = State->OpClasses .FindPtr (std::make_pair (EOpClassMethod::Hash, typeId));
1956
+ if (hashOpClassPtr) {
1957
+ auto hashAmProcPtr = State->AmProcs .FindPtr (std::make_tuple (hashOpClassPtr->FamilyId , ui32 (EHashAmProcNum::Hash), typeId, typeId));
1958
+ Y_ENSURE (hashAmProcPtr);
1959
+ v.HashProcId = hashAmProcPtr->ProcId ;
1960
+ }
1961
+ }
1962
+
1959
1963
void CreateProc (const TProcDesc& desc) final {
1960
1964
Y_ENSURE (desc.ExtensionIndex );
1961
1965
TProcDesc newDesc = desc;
@@ -2183,6 +2187,52 @@ struct TCatalog : public IExtensionSqlBuilder {
2183
2187
State->AllowedProcs .insert (State->Procs .FindPtr (desc.TransFuncId )->Name );
2184
2188
}
2185
2189
2190
+ void CreateOpClass (const TOpClassDesc& opclass, const TVector<TAmOpDesc>& ops, const TVector<TAmProcDesc>& procs) final {
2191
+ Y_ENSURE (opclass.ExtensionIndex );
2192
+ auto newDesc = opclass;
2193
+ newDesc.Family = to_lower (newDesc.Family );
2194
+ newDesc.Name = to_lower (newDesc.Name );
2195
+ auto newFamilyId = 16000 + State->OpFamilies .size ();
2196
+ TOpFamilyDesc opFamilyDesc;
2197
+ opFamilyDesc.FamilyId = newFamilyId;
2198
+ opFamilyDesc.Name = newDesc.Family ;
2199
+ opFamilyDesc.ExtensionIndex = opclass.ExtensionIndex ;
2200
+ Y_ENSURE (State->OpFamilies .emplace (newDesc.Family , opFamilyDesc).second );
2201
+ newDesc.FamilyId = newFamilyId;
2202
+ const auto key = std::make_pair (newDesc.Method , newDesc.TypeId );
2203
+ Y_ENSURE (State->OpClasses .emplace (key, newDesc).second );
2204
+ for (const auto & o : ops) {
2205
+ Y_ENSURE (opclass.ExtensionIndex == o.ExtensionIndex );
2206
+ Y_ENSURE (opclass.Family == o.Family );
2207
+ auto newOpDesc = o;
2208
+ newOpDesc.FamilyId = newFamilyId;
2209
+ newOpDesc.Family = newDesc.Name ;
2210
+ Y_ENSURE (State->AmOps .emplace (std::make_tuple (newFamilyId, o.Strategy , o.LeftType , o.RightType ), newOpDesc).second );
2211
+ auto operPtr = State->Operators .FindPtr (o.OperId );
2212
+ Y_ENSURE (operPtr);
2213
+ auto procPtr = State->Procs .FindPtr (operPtr->ProcId );
2214
+ Y_ENSURE (procPtr);
2215
+ State->AllowedProcs .emplace (procPtr->Name );
2216
+ }
2217
+
2218
+ for (const auto & p : procs) {
2219
+ Y_ENSURE (opclass.ExtensionIndex == p.ExtensionIndex );
2220
+ Y_ENSURE (opclass.Family == p.Family );
2221
+ auto newProcDesc = p;
2222
+ newProcDesc.FamilyId = newFamilyId;
2223
+ newProcDesc.Family = newDesc.Name ;
2224
+ Y_ENSURE (State->AmProcs .emplace (std::make_tuple (newFamilyId, p.ProcNum , p.LeftType , p.RightType ), newProcDesc).second );
2225
+ auto procPtr = State->Procs .FindPtr (p.ProcId );
2226
+ Y_ENSURE (procPtr);
2227
+ State->AllowedProcs .emplace (procPtr->Name );
2228
+ }
2229
+
2230
+ auto typePtr = State->Types .FindPtr (opclass.TypeId );
2231
+ Y_ENSURE (typePtr);
2232
+ Y_ENSURE (typePtr->ExtensionIndex == opclass.ExtensionIndex );
2233
+ CacheAmFuncs (opclass.TypeId , *typePtr);
2234
+ }
2235
+
2186
2236
static const TCatalog& Instance () {
2187
2237
return *Singleton<TCatalog>();
2188
2238
}
@@ -2202,6 +2252,7 @@ struct TCatalog : public IExtensionSqlBuilder {
2202
2252
TAggregations Aggregations;
2203
2253
TAms Ams;
2204
2254
TNamespaces Namespaces;
2255
+ TOpFamilies OpFamilies;
2205
2256
TOpClasses OpClasses;
2206
2257
TAmOps AmOps;
2207
2258
TAmProcs AmProcs;
@@ -3840,6 +3891,87 @@ TString ExportExtensions(const TMaybe<TSet<ui32>>& filter) {
3840
3891
protoAggregation->SetNumDirectArgs (desc.NumDirectArgs );
3841
3892
}
3842
3893
3894
+ TVector<TString> extOpFamilies;
3895
+ for (const auto & f : catalog.State ->OpFamilies ) {
3896
+ const auto & desc = f.second ;
3897
+ if (!desc.ExtensionIndex ) {
3898
+ continue ;
3899
+ }
3900
+
3901
+ extOpFamilies.push_back (f.first );
3902
+ }
3903
+
3904
+ Sort (extOpFamilies);
3905
+ for (const auto & f : extOpFamilies) {
3906
+ const auto & desc = *catalog.State ->OpFamilies .FindPtr (f);
3907
+ auto protoOpClassFamily = proto.AddOpClassFamily ();
3908
+ protoOpClassFamily->SetFamilyId (desc.FamilyId );
3909
+ protoOpClassFamily->SetName (desc.Name );
3910
+ protoOpClassFamily->SetExtensionIndex (desc.ExtensionIndex );
3911
+ }
3912
+
3913
+ TVector<std::pair<NPg::EOpClassMethod, ui32>> extOpClasses;
3914
+ for (const auto & c : catalog.State ->OpClasses ) {
3915
+ const auto & desc = c.second ;
3916
+ if (!desc.ExtensionIndex ) {
3917
+ continue ;
3918
+ }
3919
+
3920
+ extOpClasses.push_back (c.first );
3921
+ }
3922
+
3923
+ for (const auto & c : extOpClasses) {
3924
+ const auto & desc = *catalog.State ->OpClasses .FindPtr (c);
3925
+ auto protoOpClass = proto.AddOpClass ();
3926
+ protoOpClass->SetMethod ((ui32)desc.Method );
3927
+ protoOpClass->SetTypeId (desc.TypeId );
3928
+ protoOpClass->SetExtensionIndex (desc.ExtensionIndex );
3929
+ protoOpClass->SetName (desc.Name );
3930
+ protoOpClass->SetFamilyId (desc.FamilyId );
3931
+ }
3932
+
3933
+ TVector<std::tuple<ui32, ui32, ui32, ui32>> extAmOps;
3934
+ for (const auto & o : catalog.State ->AmOps ) {
3935
+ const auto & desc = o.second ;
3936
+ if (!desc.ExtensionIndex ) {
3937
+ continue ;
3938
+ }
3939
+
3940
+ extAmOps.push_back (o.first );
3941
+ }
3942
+
3943
+ for (const auto & o : extAmOps) {
3944
+ const auto & desc = *catalog.State ->AmOps .FindPtr (o);
3945
+ auto protoAmOp = proto.AddAmOp ();
3946
+ protoAmOp->SetFamilyId (desc.FamilyId );
3947
+ protoAmOp->SetStrategy (desc.Strategy );
3948
+ protoAmOp->SetLeftType (desc.LeftType );
3949
+ protoAmOp->SetRightType (desc.RightType );
3950
+ protoAmOp->SetOperId (desc.OperId );
3951
+ protoAmOp->SetExtensionIndex (desc.ExtensionIndex );
3952
+ }
3953
+
3954
+ TVector<std::tuple<ui32, ui32, ui32, ui32>> extAmProcs;
3955
+ for (const auto & p : catalog.State ->AmProcs ) {
3956
+ const auto & desc = p.second ;
3957
+ if (!desc.ExtensionIndex ) {
3958
+ continue ;
3959
+ }
3960
+
3961
+ extAmProcs.push_back (p.first );
3962
+ }
3963
+
3964
+ for (const auto & p : extAmProcs) {
3965
+ const auto & desc = *catalog.State ->AmProcs .FindPtr (p);
3966
+ auto protoAmProc = proto.AddAmProc ();
3967
+ protoAmProc->SetFamilyId (desc.FamilyId );
3968
+ protoAmProc->SetProcNum (desc.ProcNum );
3969
+ protoAmProc->SetLeftType (desc.LeftType );
3970
+ protoAmProc->SetRightType (desc.RightType );
3971
+ protoAmProc->SetProcId (desc.ProcId );
3972
+ protoAmProc->SetExtensionIndex (desc.ExtensionIndex );
3973
+ }
3974
+
3843
3975
return proto.SerializeAsString ();
3844
3976
}
3845
3977
@@ -4017,6 +4149,51 @@ void ImportExtensions(const TString& exported, bool typesOnly, IExtensionLoader*
4017
4149
catalog.State ->AggregationsByName [desc.Name ].push_back (desc.AggId );
4018
4150
}
4019
4151
4152
+ THashMap<ui32, TString> opFamiliesByOid;
4153
+ for (const auto & protoOpClassFamily : proto.GetOpClassFamily ()) {
4154
+ TOpFamilyDesc desc;
4155
+ desc.FamilyId = protoOpClassFamily.GetFamilyId ();
4156
+ desc.Name = protoOpClassFamily.GetName ();
4157
+ desc.ExtensionIndex = protoOpClassFamily.GetExtensionIndex ();
4158
+ Y_ENSURE (catalog.State ->OpFamilies .emplace (desc.Name , desc).second );
4159
+ Y_ENSURE (opFamiliesByOid.emplace (desc.FamilyId , desc.Name ).second );
4160
+ }
4161
+
4162
+ for (const auto & protoOpClass : proto.GetOpClass ()) {
4163
+ TOpClassDesc desc;
4164
+ desc.Method = (EOpClassMethod)protoOpClass.GetMethod ();
4165
+ desc.TypeId = protoOpClass.GetTypeId ();
4166
+ desc.ExtensionIndex = protoOpClass.GetExtensionIndex ();
4167
+ desc.FamilyId = protoOpClass.GetFamilyId ();
4168
+ desc.Name = protoOpClass.GetName ();
4169
+ desc.Family = *opFamiliesByOid.FindPtr (desc.FamilyId );
4170
+ Y_ENSURE (catalog.State ->OpClasses .emplace (std::make_pair (desc.Method , desc.TypeId ), desc).second );
4171
+ }
4172
+
4173
+ for (const auto & protoAmOp : proto.GetAmOp ()) {
4174
+ TAmOpDesc desc;
4175
+ desc.FamilyId = protoAmOp.GetFamilyId ();
4176
+ desc.Strategy = protoAmOp.GetStrategy ();
4177
+ desc.LeftType = protoAmOp.GetLeftType ();
4178
+ desc.RightType = protoAmOp.GetRightType ();
4179
+ desc.OperId = protoAmOp.GetOperId ();
4180
+ desc.ExtensionIndex = protoAmOp.GetExtensionIndex ();
4181
+ desc.Family = *opFamiliesByOid.FindPtr (desc.FamilyId );
4182
+ Y_ENSURE (catalog.State ->AmOps .emplace (std::make_tuple (desc.FamilyId , desc.Strategy , desc.LeftType , desc.RightType ), desc).second );
4183
+ }
4184
+
4185
+ for (const auto & protoAmProc : proto.GetAmProc ()) {
4186
+ TAmProcDesc desc;
4187
+ desc.FamilyId = protoAmProc.GetFamilyId ();
4188
+ desc.ProcNum = protoAmProc.GetProcNum ();
4189
+ desc.LeftType = protoAmProc.GetLeftType ();
4190
+ desc.RightType = protoAmProc.GetRightType ();
4191
+ desc.ProcId = protoAmProc.GetProcId ();
4192
+ desc.ExtensionIndex = protoAmProc.GetExtensionIndex ();
4193
+ desc.Family = *opFamiliesByOid.FindPtr (desc.FamilyId );
4194
+ Y_ENSURE (catalog.State ->AmProcs .emplace (std::make_tuple (desc.FamilyId , desc.ProcNum , desc.LeftType , desc.RightType ), desc).second );
4195
+ }
4196
+
4020
4197
if (!typesOnly && loader) {
4021
4198
for (ui32 extensionIndex = 1 ; extensionIndex <= catalog.State ->Extensions .size (); ++extensionIndex) {
4022
4199
const auto & e = catalog.State ->Extensions [extensionIndex - 1 ];
0 commit comments