@@ -69,7 +69,7 @@ class TUdfResolverWithIndex : public IUdfResolver {
6969 TMaybe<TFilePathWithMd5> GetSystemModulePath (const TStringBuf& moduleName) const override {
7070 with_lock (Lock_) {
7171 TString moduleNameStr (moduleName);
72- if (!UdfIndex_->ContainsModule (moduleNameStr)) {
72+ if (!UdfIndex_->ContainsModuleStrict (moduleNameStr)) {
7373 return Nothing ();
7474 }
7575
@@ -115,7 +115,7 @@ class TUdfResolverWithIndex : public IUdfResolver {
115115
116116 bool ContainsModule (const TStringBuf& moduleName) const override {
117117 TString moduleNameStr = TString (moduleName);
118- if (UdfIndex_->ContainsModule (moduleNameStr)) {
118+ if (UdfIndex_->ContainsModuleStrict (moduleNameStr)) {
119119 return true ;
120120 }
121121
@@ -142,17 +142,29 @@ class TUdfResolverWithIndex : public IUdfResolver {
142142 */
143143
144144 TString moduleNameStr = TString (moduleName);
145- if (!UdfIndex_->ContainsModule (moduleNameStr)) {
145+ auto moduleStatus = UdfIndex_->ContainsModule (moduleNameStr);
146+ if (moduleStatus == TUdfIndex::EStatus::NotFound) {
146147 fallbackFunction = &function;
147148 return true ;
148149 }
149150
151+ if (moduleStatus == TUdfIndex::EStatus::Ambigious) {
152+ ctx.AddError (TIssue (function.Pos , TStringBuilder () << " Ambigious module name: " << moduleName));
153+ return false ;
154+ }
155+
150156 TFunctionInfo info;
151- if (!UdfIndex_->FindFunction (moduleNameStr, function.Name , info)) {
157+ auto functionStatus = UdfIndex_->FindFunction (moduleNameStr, function.Name , info);
158+ if (functionStatus == TUdfIndex::EStatus::NotFound) {
152159 ctx.AddError (TIssue (function.Pos , TStringBuilder () << " Function not found: " << function.Name ));
153160 return false ;
154161 }
155162
163+ if (functionStatus == TUdfIndex::EStatus::Ambigious) {
164+ ctx.AddError (TIssue (function.Pos , TStringBuilder () << " Ambigious function: " << function.Name ));
165+ return false ;
166+ }
167+
156168 TResourceFile::TPtr file = DownloadFileWithModule (moduleName, function.Pos , ctx);
157169 if (!file) {
158170 return false ;
@@ -161,6 +173,7 @@ class TUdfResolverWithIndex : public IUdfResolver {
161173 additionalImport = &file->Import_ ;
162174
163175 if (info.IsTypeAwareness ) {
176+ function.Name = info.Name ;
164177 fallbackFunction = &function;
165178 return true ;
166179 }
@@ -170,6 +183,7 @@ class TUdfResolverWithIndex : public IUdfResolver {
170183 return false ;
171184 }
172185
186+ function.NormalizedName = info.Name ;
173187 function.CallableType = ParseTypeFromYson (TStringBuf{info.CallableType }, ctx, function.Pos );
174188 if (!function.CallableType ) {
175189 ctx.AddError (TIssue (function.Pos , TStringBuilder () << " Failed to build callable type from YSON for function " << function.Name ));
@@ -205,26 +219,29 @@ class TUdfResolverWithIndex : public IUdfResolver {
205219 TResourceFile::TPtr DownloadFileWithModule (const TStringBuf& module ) const {
206220 TString moduleName (module );
207221
208- const auto it = DownloadedFiles_.find (module );
209- if (it != DownloadedFiles_.end ()) {
210- return it->second ;
211- }
212-
213222 auto resource = UdfIndex_->FindResourceByModule (moduleName);
214223 if (!resource) {
215224 ythrow yexception () << " No resource has been found for registered module " << moduleName;
216225 }
217226
227+ auto canonizedModuleName = moduleName;
228+ Y_ENSURE (UdfIndex_->CanonizeModule (canonizedModuleName));
229+
230+ const auto it = DownloadedFiles_.find (canonizedModuleName);
231+ if (it != DownloadedFiles_.end ()) {
232+ return it->second ;
233+ }
234+
218235 // token is empty for urls for now
219236 // assumption: file path is frozen already, no need to put into file storage
220237 const TDownloadLink& downloadLink = resource->Link ;
221238 TFileLinkPtr link = downloadLink.IsUrl ? FileStorage_->PutUrl (downloadLink.Path , {}) : CreateFakeFileLink (downloadLink.Path , downloadLink.Md5 );
222- TResourceFile::TPtr file = TResourceFile::Create (moduleName , resource->Modules , link);
239+ TResourceFile::TPtr file = TResourceFile::Create (canonizedModuleName , resource->Modules , link);
223240 for (auto & d : resource->Modules ) {
224241 auto p = DownloadedFiles_.emplace (d, file);
225242 if (!p.second ) {
226243 // should not happen because UdfIndex handles conflicts
227- ythrow yexception () << " file already downloaded for module " << moduleName << " , conflicting path " << downloadLink.Path << " , existing local file " << p.first ->second ->Link_ ->GetPath ();
244+ ythrow yexception () << " file already downloaded for module " << canonizedModuleName << " , conflicting path " << downloadLink.Path << " , existing local file " << p.first ->second ->Link_ ->GetPath ();
228245 }
229246 }
230247
0 commit comments