|
@@ -2604,11 +2604,11 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentInMap() {
|
|
|
+ public void testFunctionNamedParameterInMap() {
|
|
|
// functions can be scalar, grouping and aggregation
|
|
|
// functions can be in eval/where/stats/sort/dissect/grok commands, commands in snapshot are not covered
|
|
|
// positive
|
|
|
- // In eval and where clause as function arguments
|
|
|
+ // In eval and where clause as function named parameters
|
|
|
LinkedHashMap<String, Object> expectedMap1 = new LinkedHashMap<>(4);
|
|
|
expectedMap1.put("option1", "string");
|
|
|
expectedMap1.put("option2", 1);
|
|
@@ -2652,7 +2652,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
""")
|
|
|
);
|
|
|
|
|
|
- // In stats, by and sort as function arguments
|
|
|
+ // In stats, by and sort as function named parameters
|
|
|
assertEquals(
|
|
|
new OrderBy(
|
|
|
EMPTY,
|
|
@@ -2688,7 +2688,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
""")
|
|
|
);
|
|
|
|
|
|
- // In dissect and grok as function arguments
|
|
|
+ // In dissect and grok as function named parameter
|
|
|
LogicalPlan plan = statement("""
|
|
|
from test
|
|
|
| dissect fn1(f1, f2, {"option1":"string", "option2":1,"option3":[2.0,3.0,4.0],"option4":[true,false]}) "%{bar}"
|
|
@@ -2707,7 +2707,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
assertEquals(ur, relation("test"));
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentInMapWithNamedParameters() {
|
|
|
+ public void testFunctionNamedParameterInMapWithNamedParameters() {
|
|
|
// map entry values provided in named parameter, arrays are not supported by named parameters yet
|
|
|
LinkedHashMap<String, Object> expectedMap1 = new LinkedHashMap<>(4);
|
|
|
expectedMap1.put("option1", "string");
|
|
@@ -2850,7 +2850,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
assertEquals(ur, relation("test"));
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentWithCaseSensitiveKeys() {
|
|
|
+ public void testFunctionNamedParameterWithCaseSensitiveKeys() {
|
|
|
LinkedHashMap<String, Object> expectedMap1 = new LinkedHashMap<>(3);
|
|
|
expectedMap1.put("option", "string");
|
|
|
expectedMap1.put("Option", 1);
|
|
@@ -2888,7 +2888,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- public void testMultipleNamedFunctionArgumentsNotAllowed() {
|
|
|
+ public void testMultipleFunctionNamedParametersNotAllowed() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "41"),
|
|
|
Map.entry("where {}", "38"),
|
|
@@ -2912,7 +2912,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentNotInMap() {
|
|
|
+ public void testFunctionNamedParameterNotInMap() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "38"),
|
|
|
Map.entry("where {}", "35"),
|
|
@@ -2936,7 +2936,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentNotConstant() {
|
|
|
+ public void testFunctionNamedParameterNotConstant() {
|
|
|
Map<String, String[]> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", new String[] { "31", "35" }),
|
|
|
Map.entry("where {}", new String[] { "28", "32" }),
|
|
@@ -2952,7 +2952,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
String error1 = command.getValue()[0];
|
|
|
String error2 = command.getValue()[1];
|
|
|
String errorMessage1 = cmd.startsWith("dissect") || cmd.startsWith("grok")
|
|
|
- ? "mismatched input '1' expecting QUOTED_STRING"
|
|
|
+ ? "mismatched input '1' expecting {QUOTED_STRING"
|
|
|
: "no viable alternative at input 'fn(f1, { 1'";
|
|
|
String errorMessage2 = cmd.startsWith("dissect") || cmd.startsWith("grok")
|
|
|
? "mismatched input 'string' expecting {QUOTED_STRING"
|
|
@@ -2968,7 +2968,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentEmptyMap() {
|
|
|
+ public void testNamedFunctionNamedParametersEmptyMap() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "30"),
|
|
|
Map.entry("where {}", "27"),
|
|
@@ -2982,17 +2982,12 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
for (Map.Entry<String, String> command : commands.entrySet()) {
|
|
|
String cmd = command.getKey();
|
|
|
String error = command.getValue();
|
|
|
- String errorMessage = cmd.startsWith("dissect") || cmd.startsWith("grok")
|
|
|
- ? "mismatched input '}' expecting QUOTED_STRING"
|
|
|
- : "no viable alternative at input 'fn(f1, {}'";
|
|
|
- expectError(
|
|
|
- LoggerMessageFormat.format(null, "from test | " + cmd, "fn(f1, {}})"),
|
|
|
- LoggerMessageFormat.format(null, "line 1:{}: {}", error, errorMessage)
|
|
|
- );
|
|
|
+
|
|
|
+ statement(LoggerMessageFormat.format(null, "from test | " + cmd, "fn(f1, {})"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentMapWithNULL() {
|
|
|
+ public void testNamedFunctionNamedParametersMapWithNULL() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "29"),
|
|
|
Map.entry("where {}", "26"),
|
|
@@ -3008,17 +3003,12 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
String error = command.getValue();
|
|
|
expectError(
|
|
|
LoggerMessageFormat.format(null, "from test | " + cmd, "fn(f1, {\"option\":null})"),
|
|
|
- LoggerMessageFormat.format(
|
|
|
- null,
|
|
|
- "line 1:{}: {}",
|
|
|
- error,
|
|
|
- "Invalid named function argument [\"option\":null], NULL is not supported"
|
|
|
- )
|
|
|
+ LoggerMessageFormat.format(null, "line 1:{}: {}", error, "Invalid named parameter [\"option\":null], NULL is not supported")
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentMapWithEmptyKey() {
|
|
|
+ public void testNamedFunctionNamedParametersMapWithEmptyKey() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "29"),
|
|
|
Map.entry("where {}", "26"),
|
|
@@ -3034,26 +3024,16 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
String error = command.getValue();
|
|
|
expectError(
|
|
|
LoggerMessageFormat.format(null, "from test | " + cmd, "fn(f1, {\"\":1})"),
|
|
|
- LoggerMessageFormat.format(
|
|
|
- null,
|
|
|
- "line 1:{}: {}",
|
|
|
- error,
|
|
|
- "Invalid named function argument [\"\":1], empty key is not supported"
|
|
|
- )
|
|
|
+ LoggerMessageFormat.format(null, "line 1:{}: {}", error, "Invalid named parameter [\"\":1], empty key is not supported")
|
|
|
);
|
|
|
expectError(
|
|
|
LoggerMessageFormat.format(null, "from test | " + cmd, "fn(f1, {\" \":1})"),
|
|
|
- LoggerMessageFormat.format(
|
|
|
- null,
|
|
|
- "line 1:{}: {}",
|
|
|
- error,
|
|
|
- "Invalid named function argument [\" \":1], empty key is not supported"
|
|
|
- )
|
|
|
+ LoggerMessageFormat.format(null, "line 1:{}: {}", error, "Invalid named parameter [\" \":1], empty key is not supported")
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentMapWithDuplicatedKey() {
|
|
|
+ public void testNamedFunctionNamedParametersMapWithDuplicatedKey() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "29"),
|
|
|
Map.entry("where {}", "26"),
|
|
@@ -3073,13 +3053,13 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
null,
|
|
|
"line 1:{}: {}",
|
|
|
error,
|
|
|
- "Duplicated function arguments with the same name [dup] is not supported"
|
|
|
+ "Duplicated named parameters with the same name [dup] is not supported"
|
|
|
)
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentInInvalidPositions() {
|
|
|
+ public void testNamedFunctionNamedParametersInInvalidPositions() {
|
|
|
// negative, named arguments are not supported outside of a functionExpression where booleanExpression or indexPattern is supported
|
|
|
String map = "{\"option1\":\"string\", \"option2\":1}";
|
|
|
|
|
@@ -3108,7 +3088,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void testNamedFunctionArgumentWithUnsupportedNamedParameterTypes() {
|
|
|
+ public void testNamedFunctionNamedParametersWithUnsupportedNamedParameterTypes() {
|
|
|
Map<String, String> commands = Map.ofEntries(
|
|
|
Map.entry("eval x = {}", "29"),
|
|
|
Map.entry("where {}", "26"),
|
|
@@ -3129,7 +3109,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
null,
|
|
|
"line 1:{}: {}",
|
|
|
error,
|
|
|
- "Invalid named function argument [\"option1\":?n1], only constant value is supported"
|
|
|
+ "Invalid named parameter [\"option1\":?n1], only constant value is supported"
|
|
|
)
|
|
|
);
|
|
|
expectError(
|
|
@@ -3139,7 +3119,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
null,
|
|
|
"line 1:{}: {}",
|
|
|
error,
|
|
|
- "Invalid named function argument [\"option1\":?n1], only constant value is supported"
|
|
|
+ "Invalid named parameter [\"option1\":?n1], only constant value is supported"
|
|
|
)
|
|
|
);
|
|
|
}
|
|
@@ -3577,7 +3557,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
( LOOKUP JOIN idx2 ON f1 )
|
|
|
( ENRICH idx2 on f1 with f2 = f3 )
|
|
|
( FORK ( WHERE a:"baz" ) ( EVAL x = [ 1, 2, 3 ] ) )
|
|
|
- ( COMPLETION a = b WITH c )
|
|
|
+ ( COMPLETION a=b WITH { "inference_id": "c" } )
|
|
|
| KEEP a
|
|
|
""";
|
|
|
|
|
@@ -3614,7 +3594,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
( LOOKUP JOIN idx2 ON f1 )
|
|
|
( ENRICH idx2 on f1 with f2 = f3 )
|
|
|
( FORK ( WHERE a:"baz" ) ( EVAL x = [ 1, 2, 3 ] ) )
|
|
|
- ( COMPLETION a = b WITH c )
|
|
|
+ ( COMPLETION a=b WITH { "inference_id": "c" } )
|
|
|
( SAMPLE 0.99 )
|
|
|
| KEEP a
|
|
|
""";
|
|
@@ -3719,22 +3699,22 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
assertThat(rerank.rerankFields(), equalTo(List.of(alias("title", attribute("title")))));
|
|
|
}
|
|
|
|
|
|
- public void testRerankInferenceId() {
|
|
|
+ public void testRerankEmptyOptions() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH inferenceId=inferenceId");
|
|
|
+ var plan = processingCommand("RERANK \"query text\" ON title WITH {}");
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
- assertThat(rerank.inferenceId(), equalTo(literalString("inferenceId")));
|
|
|
+ assertThat(rerank.inferenceId(), equalTo(literalString(".rerank-v1-elasticsearch")));
|
|
|
+ assertThat(rerank.scoreAttribute(), equalTo(attribute("_score")));
|
|
|
assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
|
assertThat(rerank.rerankFields(), equalTo(List.of(alias("title", attribute("title")))));
|
|
|
- assertThat(rerank.scoreAttribute(), equalTo(attribute("_score")));
|
|
|
}
|
|
|
|
|
|
- public void testRerankQuotedInferenceId() {
|
|
|
+ public void testRerankInferenceId() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH inferenceId=\"inferenceId\"");
|
|
|
+ var plan = processingCommand("RERANK \"query text\" ON title WITH { \"inference_id\" : \"inferenceId\" }");
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.inferenceId(), equalTo(literalString("inferenceId")));
|
|
@@ -3746,19 +3726,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankScoreAttribute() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH scoreColumn=rerank_score");
|
|
|
- var rerank = as(plan, Rerank.class);
|
|
|
-
|
|
|
- assertThat(rerank.inferenceId(), equalTo(literalString(".rerank-v1-elasticsearch")));
|
|
|
- assertThat(rerank.scoreAttribute(), equalTo(attribute("rerank_score")));
|
|
|
- assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
|
- assertThat(rerank.rerankFields(), equalTo(List.of(alias("title", attribute("title")))));
|
|
|
- }
|
|
|
-
|
|
|
- public void testRerankQuotedScoreAttribute() {
|
|
|
- assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
-
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH scoreColumn=\"rerank_score\"");
|
|
|
+ var plan = processingCommand("RERANK rerank_score=\"query text\" ON title");
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.inferenceId(), equalTo(literalString(".rerank-v1-elasticsearch")));
|
|
@@ -3770,7 +3738,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankInferenceIdAnddScoreAttribute() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH inferenceId=inferenceId, scoreColumn=rerank_score");
|
|
|
+ var plan = processingCommand("RERANK rerank_score=\"query text\" ON title WITH { \"inference_id\" : \"inferenceId\" }");
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.inferenceId(), equalTo(literalString("inferenceId")));
|
|
@@ -3782,7 +3750,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankSingleField() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title WITH inferenceId=inferenceID");
|
|
|
+ var plan = processingCommand("RERANK \"query text\" ON title WITH { \"inference_id\" : \"inferenceID\" }");
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
@@ -3794,7 +3762,9 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankMultipleFields() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand("RERANK \"query text\" ON title, description, authors_renamed=authors WITH inferenceId=inferenceID");
|
|
|
+ var plan = processingCommand(
|
|
|
+ "RERANK \"query text\" ON title, description, authors_renamed=authors WITH { \"inference_id\" : \"inferenceID\" }"
|
|
|
+ );
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
@@ -3815,9 +3785,9 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankComputedFields() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var plan = processingCommand(
|
|
|
- "RERANK \"query text\" ON title, short_description = SUBSTRING(description, 0, 100) WITH inferenceId=inferenceID"
|
|
|
- );
|
|
|
+ var plan = processingCommand("""
|
|
|
+ RERANK "query text" ON title, short_description = SUBSTRING(description, 0, 100) WITH { "inference_id": "inferenceID" }
|
|
|
+ """);
|
|
|
var rerank = as(plan, Rerank.class);
|
|
|
|
|
|
assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
@@ -3834,14 +3804,25 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
assertThat(rerank.scoreAttribute(), equalTo(attribute("_score")));
|
|
|
}
|
|
|
|
|
|
+ public void testRerankComputedFieldsWithoutName() {
|
|
|
+ assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
+ // Unnamed alias are forbidden
|
|
|
+ expectError(
|
|
|
+ "FROM books METADATA _score | RERANK \"food\" ON title, SUBSTRING(description, 0, 100), yearRenamed=year`",
|
|
|
+ "line 1:63: mismatched input '(' expecting {<EOF>, '|', '=', ',', '.', 'with'}"
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
public void testRerankWithPositionalParameters() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var queryParams = new QueryParams(
|
|
|
- List.of(paramAsConstant(null, "query text"), paramAsConstant(null, "reranker"), paramAsConstant(null, "rerank_score"))
|
|
|
- );
|
|
|
+ var queryParams = new QueryParams(List.of(paramAsConstant(null, "query text"), paramAsConstant(null, "reranker")));
|
|
|
var rerank = as(
|
|
|
- parser.createStatement("row a = 1 | RERANK ? ON title WITH inferenceId=?, scoreColumn=? ", queryParams, EsqlTestUtils.TEST_CFG),
|
|
|
+ parser.createStatement(
|
|
|
+ "row a = 1 | RERANK rerank_score = ? ON title WITH { \"inference_id\" : ? }",
|
|
|
+ queryParams,
|
|
|
+ EsqlTestUtils.TEST_CFG
|
|
|
+ ),
|
|
|
Rerank.class
|
|
|
);
|
|
|
|
|
@@ -3854,16 +3835,10 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testRerankWithNamedParameters() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
|
|
|
- var queryParams = new QueryParams(
|
|
|
- List.of(
|
|
|
- paramAsConstant("queryText", "query text"),
|
|
|
- paramAsConstant("inferenceId", "reranker"),
|
|
|
- paramAsConstant("scoreColumnName", "rerank_score")
|
|
|
- )
|
|
|
- );
|
|
|
+ var queryParams = new QueryParams(List.of(paramAsConstant("queryText", "query text"), paramAsConstant("inferenceId", "reranker")));
|
|
|
var rerank = as(
|
|
|
parser.createStatement(
|
|
|
- "row a = 1 | RERANK ?queryText ON title WITH inferenceId=?inferenceId, scoreColumn=?scoreColumnName",
|
|
|
+ "row a = 1 | RERANK rerank_score=?queryText ON title WITH { \"inference_id\": ?inferenceId }",
|
|
|
queryParams,
|
|
|
EsqlTestUtils.TEST_CFG
|
|
|
),
|
|
@@ -3873,22 +3848,46 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
assertThat(rerank.queryText(), equalTo(literalString("query text")));
|
|
|
assertThat(rerank.inferenceId(), equalTo(literalString("reranker")));
|
|
|
assertThat(rerank.rerankFields(), equalTo(List.of(alias("title", attribute("title")))));
|
|
|
+ assertThat(rerank.scoreAttribute(), equalTo(attribute("rerank_score")));
|
|
|
}
|
|
|
|
|
|
public void testInvalidRerank() {
|
|
|
assumeTrue("RERANK requires corresponding capability", EsqlCapabilities.Cap.RERANK.isEnabled());
|
|
|
- expectError("FROM foo* | RERANK ON title WITH inferenceId", "line 1:20: mismatched input 'ON' expecting {QUOTED_STRING");
|
|
|
+ expectError(
|
|
|
+ "FROM foo* | RERANK \"query text\" ON title WITH { \"inference_id\": 3 }",
|
|
|
+ "line 1:65: Option [inference_id] must be a valid string, found [3]"
|
|
|
+ );
|
|
|
+ expectError(
|
|
|
+ "FROM foo* | RERANK \"query text\" ON title WITH { \"inference_id\": \"inferenceId\", \"unknown_option\": 3 }",
|
|
|
+ "line 1:42: Inavalid option [unknown_option] in RERANK, expected one of [[inference_id]]"
|
|
|
+ );
|
|
|
+ expectError("FROM foo* | RERANK 45 ON title", "Query must be a valid string in RERANK, found [45]");
|
|
|
+ expectError("FROM foo* | RERANK ON title WITH inferenceId", "line 1:20: extraneous input 'ON' expecting {QUOTED_STRING");
|
|
|
expectError("FROM foo* | RERANK \"query text\" WITH inferenceId", "line 1:33: mismatched input 'WITH' expecting 'on'");
|
|
|
|
|
|
var fromPatterns = randomIndexPatterns(CROSS_CLUSTER);
|
|
|
expectError(
|
|
|
- "FROM " + fromPatterns + " | RERANK \"query text\" ON title WITH inferenceId=inferenceId",
|
|
|
+ "FROM " + fromPatterns + " | RERANK \"query text\" ON title WITH { \"inference_id\" : \"inference_id\" }",
|
|
|
"invalid index pattern [" + unquoteIndexPattern(fromPatterns) + "], remote clusters are not supported with RERANK"
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ public void testCompletionMissingOptions() {
|
|
|
+ expectError("FROM foo* | COMPLETION targetField = prompt", "line 1:44: Missing mandatory option [inference_id] in COMPLETION");
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testCompletionEmptyOptions() {
|
|
|
+ expectError(
|
|
|
+ "FROM foo* | COMPLETION targetField = prompt WITH { }",
|
|
|
+ "line 1:45: Missing mandatory option [inference_id] in COMPLETION"
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
public void testCompletionUsingFieldAsPrompt() {
|
|
|
- var plan = as(processingCommand("COMPLETION targetField=prompt_field WITH inferenceID"), Completion.class);
|
|
|
+ var plan = as(
|
|
|
+ processingCommand("COMPLETION targetField=prompt_field WITH{ \"inference_id\" : \"inferenceID\" }"),
|
|
|
+ Completion.class
|
|
|
+ );
|
|
|
|
|
|
assertThat(plan.prompt(), equalTo(attribute("prompt_field")));
|
|
|
assertThat(plan.inferenceId(), equalTo(literalString("inferenceID")));
|
|
@@ -3896,7 +3895,10 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
|
|
|
public void testCompletionUsingFunctionAsPrompt() {
|
|
|
- var plan = as(processingCommand("COMPLETION targetField=CONCAT(fieldA, fieldB) WITH inferenceID"), Completion.class);
|
|
|
+ var plan = as(
|
|
|
+ processingCommand("COMPLETION targetField=CONCAT(fieldA, fieldB) WITH { \"inference_id\" : \"inferenceID\" }"),
|
|
|
+ Completion.class
|
|
|
+ );
|
|
|
|
|
|
assertThat(plan.prompt(), equalTo(function("CONCAT", List.of(attribute("fieldA"), attribute("fieldB")))));
|
|
|
assertThat(plan.inferenceId(), equalTo(literalString("inferenceID")));
|
|
@@ -3904,7 +3906,7 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
|
|
|
public void testCompletionDefaultFieldName() {
|
|
|
- var plan = as(processingCommand("COMPLETION prompt_field WITH inferenceID"), Completion.class);
|
|
|
+ var plan = as(processingCommand("COMPLETION prompt_field WITH{ \"inference_id\" : \"inferenceID\" }"), Completion.class);
|
|
|
|
|
|
assertThat(plan.prompt(), equalTo(attribute("prompt_field")));
|
|
|
assertThat(plan.inferenceId(), equalTo(literalString("inferenceID")));
|
|
@@ -3914,7 +3916,11 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testCompletionWithPositionalParameters() {
|
|
|
var queryParams = new QueryParams(List.of(paramAsConstant(null, "inferenceId")));
|
|
|
var plan = as(
|
|
|
- parser.createStatement("row a = 1 | COMPLETION prompt_field WITH ?", queryParams, EsqlTestUtils.TEST_CFG),
|
|
|
+ parser.createStatement(
|
|
|
+ "row a = 1 | COMPLETION prompt_field WITH { \"inference_id\" : ? }",
|
|
|
+ queryParams,
|
|
|
+ EsqlTestUtils.TEST_CFG
|
|
|
+ ),
|
|
|
Completion.class
|
|
|
);
|
|
|
|
|
@@ -3926,7 +3932,11 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
public void testCompletionWithNamedParameters() {
|
|
|
var queryParams = new QueryParams(List.of(paramAsConstant("inferenceId", "myInference")));
|
|
|
var plan = as(
|
|
|
- parser.createStatement("row a = 1 | COMPLETION prompt_field WITH ?inferenceId", queryParams, EsqlTestUtils.TEST_CFG),
|
|
|
+ parser.createStatement(
|
|
|
+ "row a = 1 | COMPLETION prompt_field WITH { \"inference_id\" : ?inferenceId }",
|
|
|
+ queryParams,
|
|
|
+ EsqlTestUtils.TEST_CFG
|
|
|
+ ),
|
|
|
Completion.class
|
|
|
);
|
|
|
|
|
@@ -3936,15 +3946,22 @@ public class StatementParserTests extends AbstractStatementParserTests {
|
|
|
}
|
|
|
|
|
|
public void testInvalidCompletion() {
|
|
|
- expectError("FROM foo* | COMPLETION WITH inferenceId", "line 1:24: extraneous input 'WITH' expecting {");
|
|
|
+ expectError(
|
|
|
+ "FROM foo* | COMPLETION prompt WITH { \"inference_id\": 3 }",
|
|
|
+ "line 1:54: Option [inference_id] must be a valid string, found [3]"
|
|
|
+ );
|
|
|
+ expectError(
|
|
|
+ "FROM foo* | COMPLETION prompt WITH { \"inference_id\": \"inferenceId\", \"unknown_option\": 3 }",
|
|
|
+ "line 1:31: Inavalid option [unknown_option] in COMPLETION, expected one of [[inference_id]]"
|
|
|
+ );
|
|
|
|
|
|
- expectError("FROM foo* | COMPLETION completion=prompt WITH", "line 1:46: mismatched input '<EOF>' expecting {");
|
|
|
+ expectError("FROM foo* | COMPLETION WITH inferenceId", "line 1:24: extraneous input 'WITH' expecting {");
|
|
|
|
|
|
- expectError("FROM foo* | COMPLETION completion=prompt", "line 1:41: mismatched input '<EOF>' expecting {");
|
|
|
+ expectError("FROM foo* | COMPLETION completion=prompt WITH", "ine 1:46: mismatched input '<EOF>' expecting '{'");
|
|
|
|
|
|
var fromPatterns = randomIndexPatterns(CROSS_CLUSTER);
|
|
|
expectError(
|
|
|
- "FROM " + fromPatterns + " | COMPLETION prompt_field WITH inferenceId",
|
|
|
+ "FROM " + fromPatterns + " | COMPLETION prompt_field WITH { \"inference_id\" : \"inference_id\" }",
|
|
|
"invalid index pattern [" + unquoteIndexPattern(fromPatterns) + "], remote clusters are not supported with COMPLETION"
|
|
|
);
|
|
|
}
|