瀏覽代碼

Fix docs generation of signatures for variadic functions (#107865)

This fixes the generation of the signatures for variadic functions,
except for those that take a list as last argument; i.e.  functions with
optional arguments (like ROUND) or functions with overloading-like
signatures (like BUCKET).
Bogdan Pintea 1 年之前
父節點
當前提交
5f4ef87c47

+ 5 - 0
docs/changelog/107865.yaml

@@ -0,0 +1,5 @@
+pr: 107865
+summary: Fix docs generation of signatures for variadic functions
+area: ES|QL
+type: bug
+issues: []

+ 5 - 0
docs/reference/esql/functions/types/bucket.asciidoc

@@ -5,7 +5,10 @@
 [%header.monospaced.styled,format=dsv,separator=|]
 |===
 field | buckets | from | to | result
+datetime | date_period | | | datetime
 datetime | integer | datetime | datetime | datetime
+datetime | time_duration | | | datetime
+double | double | | | double
 double | integer | double | double | double
 double | integer | double | integer | double
 double | integer | double | long | double
@@ -15,6 +18,7 @@ double | integer | integer | long | double
 double | integer | long | double | double
 double | integer | long | integer | double
 double | integer | long | long | double
+integer | double | | | double
 integer | integer | double | double | double
 integer | integer | double | integer | double
 integer | integer | double | long | double
@@ -24,6 +28,7 @@ integer | integer | integer | long | double
 integer | integer | long | double | double
 integer | integer | long | integer | double
 integer | integer | long | long | double
+long | double | | | double
 long | integer | double | double | double
 long | integer | double | integer | double
 long | integer | double | long | double

+ 5 - 0
docs/reference/esql/functions/types/coalesce.asciidoc

@@ -6,8 +6,13 @@
 |===
 first | rest | result
 boolean | boolean | boolean
+boolean | | boolean
 integer | integer | integer
+integer | | integer
 keyword | keyword | keyword
+keyword | | keyword
 long | long | long
+long | | long
 text | text | text
+text | | text
 |===

+ 5 - 0
docs/reference/esql/functions/types/greatest.asciidoc

@@ -6,11 +6,16 @@
 |===
 first | rest | result
 boolean | boolean | boolean
+boolean | | boolean
 double | double | double
 integer | integer | integer
+integer | | integer
 ip | ip | ip
 keyword | keyword | keyword
+keyword | | keyword
 long | long | long
+long | | long
 text | text | text
+text | | text
 version | version | version
 |===

+ 5 - 0
docs/reference/esql/functions/types/least.asciidoc

@@ -6,11 +6,16 @@
 |===
 first | rest | result
 boolean | boolean | boolean
+boolean | | boolean
 double | double | double
 integer | integer | integer
+integer | | integer
 ip | ip | ip
 keyword | keyword | keyword
+keyword | | keyword
 long | long | long
+long | | long
 text | text | text
+text | | text
 version | version | version
 |===

+ 4 - 0
docs/reference/esql/functions/types/locate.asciidoc

@@ -6,7 +6,11 @@
 |===
 string | substring | start | result
 keyword | keyword | integer | integer
+keyword | keyword | | integer
 keyword | text | integer | integer
+keyword | text | | integer
 text | keyword | integer | integer
+text | keyword | | integer
 text | text | integer | integer
+text | text | | integer
 |===

+ 4 - 0
docs/reference/esql/functions/types/log.asciidoc

@@ -9,16 +9,20 @@ double | double | double
 double | integer | double
 double | long | double
 double | unsigned_long | double
+double | | double
 integer | double | double
 integer | integer | double
 integer | long | double
 integer | unsigned_long | double
+integer | | double
 long | double | double
 long | integer | double
 long | long | double
 long | unsigned_long | double
+long | | double
 unsigned_long | double | double
 unsigned_long | integer | double
 unsigned_long | long | double
 unsigned_long | unsigned_long | double
+unsigned_long | | double
 |===

+ 4 - 0
docs/reference/esql/functions/types/round.asciidoc

@@ -6,6 +6,10 @@
 |===
 number | decimals | result
 double | integer | double
+double | | double
 integer | integer | integer
+integer | | integer
 long | integer | long
+long | | long
+unsigned_long | | unsigned_long
 |===

+ 4 - 3
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/AbstractFunctionTestCase.java

@@ -1133,6 +1133,7 @@ public abstract class AbstractFunctionTestCase extends ESTestCase {
         if (signatures != null && classGeneratingSignatures == testClass) {
             return signatures;
         }
+        classGeneratingSignatures = testClass;
         signatures = new HashMap<>();
         Set<Method> paramsFactories = new ClassModel(testClass).getAnnotatedLeafMethods(ParametersFactory.class).keySet();
         assertThat(paramsFactories, hasSize(1));
@@ -1214,13 +1215,14 @@ public abstract class AbstractFunctionTestCase extends ESTestCase {
 
         List<String> table = new ArrayList<>();
         for (Map.Entry<List<DataType>, DataType> sig : signatures().entrySet()) { // TODO flip to using sortedSignatures
-            if (sig.getKey().size() != argNames.size()) {
+            if (sig.getKey().size() > argNames.size()) { // skip variadic [test] cases (but not those with optional parameters)
                 continue;
             }
             StringBuilder b = new StringBuilder();
             for (DataType arg : sig.getKey()) {
                 b.append(arg.typeName()).append(" | ");
             }
+            b.append("| ".repeat(argNames.size() - sig.getKey().size()));
             b.append(sig.getValue().typeName());
             table.add(b.toString());
         }
@@ -1389,8 +1391,7 @@ public abstract class AbstractFunctionTestCase extends ESTestCase {
                     // For variadic functions we test much longer signatures, let's just stop at the last one
                     continue;
                 }
-                // TODO make constants for auto_bucket so the signatures get recognized
-                if (name.equals("auto_bucket") == false && sig.getKey().size() < minArgCount) {
+                if (sig.getKey().size() < minArgCount) {
                     throw new IllegalArgumentException("signature " + sig.getKey() + " is missing non-optional arg for " + args);
                 }
                 builder.startObject();