[NO ISSUE][COMP] Improve error message when function not found

Details:
- Remove arity from the error message raised when
  the function is not found
- Also remove "null." prefix from that message if
  the function call did not specify a dataverse

Change-Id: I384ca2af87078e72aab23dccd3651a8edf02a3b4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/7307
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 5cc30f3..eb4bfd4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -845,7 +845,7 @@
         AbstractFunctionCallExpression f = lookupFunction(signature, args, sourceLoc);
 
         if (f == null) {
-            throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, signature.getName());
+            throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, signature.toString(false));
         }
 
         if (fcall.hasAggregateFilterExpr()) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 39d9c48d..95fb793 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -2212,7 +2212,7 @@
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                     return false;
                 } else {
-                    throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, signature);
+                    throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, signature.toString(false));
                 }
             }
 
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
index cc66f0a..43e1b02 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
@@ -52,7 +52,7 @@
 
     Let Variable [ Name=$sig_sponsorship_count ]
       :=
-      FunctionCall null.count@1[
+      FunctionCall count@1[
         Variable [ Name=$es ]
       ]
     Let Variable [ Name=$by_chapter ]
@@ -68,7 +68,7 @@
           (
             LiteralExpr [STRING] [escount]
             :
-            FunctionCall null.count@1[
+            FunctionCall count@1[
               Variable [ Name=$es ]
             ]
           )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 94d0335..7e389dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3013,7 +3013,7 @@
     <test-case FilePath="array_fun">
       <compilation-unit name="array_slice/array_slice_exception_result">
         <output-dir compare="Text">array_slice/array_slice_exception_result</output-dir>
-        <expected-error>ASX1081: Cannot find function with name TinySocial.array_slice@0</expected-error>
+        <expected-error>ASX1081: Cannot find function with name TinySocial.array_slice</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="array_fun">
@@ -11692,13 +11692,13 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-5">
         <output-dir compare="Text">bad-function-ddl-5</output-dir>
-        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist@0</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-6">
         <output-dir compare="Text">bad-function-ddl-6</output-dir>
-        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist@2</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11716,13 +11716,13 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-9">
         <output-dir compare="Text">bad-function-ddl-9</output-dir>
-        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist@0</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="bad-function-ddl-10">
         <output-dir compare="Text">bad-function-ddl-10</output-dir>
-        <expected-error>ASX1081: Cannot find function with name experiments.f0@2</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments.f0</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11823,7 +11823,7 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="query-issue455">
         <output-dir compare="Text">query-issue455</output-dir>
-        <expected-error>ASX1081: Cannot find function with name test.printName@0</expected-error>
+        <expected-error>ASX1081: Cannot find function with name test.printName</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11991,7 +11991,7 @@
     <test-case FilePath="user-defined-functions">
       <compilation-unit name="f01">
         <output-dir compare="Text">f01</output-dir>
-        <expected-error>ASX1081: Cannot find function with name test.tinyint@0</expected-error>
+        <expected-error>ASX1081: Cannot find function with name test.tinyint</expected-error>
       </compilation-unit>
     </test-case>
     <!-- This test case is not valid anymore since we do not required "IMPORT_PRIVATE_FUNCTIONS" flag anymore -->
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
index 9bbf2e7..0771645 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
@@ -61,11 +61,15 @@
     }
 
     public String toString(boolean includeArity) {
-        String namespaceCanonicalForm = dataverseName != null ? dataverseName.getCanonicalForm() : null;
-        int len = (namespaceCanonicalForm != null ? namespaceCanonicalForm.length() : 4) + 1 + name.length()
+        boolean dataverseNameExists = dataverseName != null;
+        String dataverseCanonicalName = dataverseNameExists ? dataverseName.getCanonicalForm() : null;
+        int len = (dataverseNameExists ? dataverseCanonicalName.length() + 1 : 0) + name.length()
                 + (includeArity ? 3 : 0);
         StringBuilder sb = new StringBuilder(len);
-        sb.append(namespaceCanonicalForm).append('.').append(name);
+        if (dataverseNameExists) {
+            sb.append(dataverseCanonicalName).append('.');
+        }
+        sb.append(name);
         if (includeArity) {
             sb.append('@').append(arity);
         }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index dee130c..60c1c3d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -166,7 +166,7 @@
         }
         FunctionSignature fsBuiltin = builtinFunctionResolver.apply(name, arity);
         if (fsBuiltin == null) {
-            throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, fs);
+            throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, sourceLoc, fs.toString(false));
         }
         return fsBuiltin;
     }