summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-12-07 16:46:42 +0100
committerGitHub <noreply@github.com>2023-12-07 16:46:42 +0100
commitb09acd1052da2742c9999fb8c91bff506de5b34a (patch)
tree3f14b69136a1717c2a1f839e0908b84723df5162
parent1eee8a86f9b8dc4f65c3931c4fba7f6fbb26954e (diff)
parenta32bb8795a32367a95e7883fe61c8c9ccd085892 (diff)
Merge pull request #29585 from vespa-engine/toregge/detect-integer-fields-in-fieldsets
Detect integer fields in fieldsets.
-rw-r--r--config-model/src/main/java/com/yahoo/schema/derived/IndexInfo.java8
-rw-r--r--config-model/src/test/derived/importedfields/index-info.cfg2
-rw-r--r--config-model/src/test/derived/indexschema/index-info.cfg2
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java4
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java7
5 files changed, 23 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/derived/IndexInfo.java b/config-model/src/main/java/com/yahoo/schema/derived/IndexInfo.java
index 7afa2b46693..96c64ff1a1c 100644
--- a/config-model/src/main/java/com/yahoo/schema/derived/IndexInfo.java
+++ b/config-model/src/main/java/com/yahoo/schema/derived/IndexInfo.java
@@ -351,6 +351,7 @@ public class IndexInfo extends Derived implements IndexInfoConfig.Producer {
boolean anyStemming = false;
boolean anyNormalizing = false;
boolean anyString = false;
+ boolean anyInteger = false;
String phraseSegmentingCommand = null;
String stemmingCommand = null;
Matching fieldSetMatching = fieldSet.getMatching(); // null if no explicit matching
@@ -382,6 +383,10 @@ public class IndexInfo extends Derived implements IndexInfoConfig.Producer {
if (explicitPhraseSegmentingCommand.isPresent()) {
phraseSegmentingCommand = explicitPhraseSegmentingCommand.get();
}
+ if (isTypeOrNested(field, DataType.INT) || isTypeOrNested(field, DataType.LONG) ||
+ isTypeOrNested(field, DataType.BYTE)) {
+ anyInteger = true;
+ }
}
if (anyIndexing && anyAttributing && fieldSet.getMatching() == null) {
// We have both attributes and indexes and no explicit match setting ->
@@ -445,6 +450,9 @@ public class IndexInfo extends Derived implements IndexInfoConfig.Producer {
if (anyString) {
addIndexCommand(iiB, fieldSet.getName(), CMD_STRING);
}
+ if (anyInteger) {
+ addIndexCommand(iiB, fieldSet.getName(), CMD_INTEGER);
+ }
if (fieldSetMatching != null) {
// Explicit matching set on fieldset
if (fieldSetMatching.getType().equals(MatchType.EXACT)) {
diff --git a/config-model/src/test/derived/importedfields/index-info.cfg b/config-model/src/test/derived/importedfields/index-info.cfg
index 830249b94db..749e8b71a30 100644
--- a/config-model/src/test/derived/importedfields/index-info.cfg
+++ b/config-model/src/test/derived/importedfields/index-info.cfg
@@ -76,4 +76,6 @@ indexinfo[].command[].command "index"
indexinfo[].command[].indexname "myfieldset"
indexinfo[].command[].command "string"
indexinfo[].command[].indexname "myfieldset"
+indexinfo[].command[].command "integer"
+indexinfo[].command[].indexname "myfieldset"
indexinfo[].command[].command "word"
diff --git a/config-model/src/test/derived/indexschema/index-info.cfg b/config-model/src/test/derived/indexschema/index-info.cfg
index 3de7adcb930..8c2349e37ea 100644
--- a/config-model/src/test/derived/indexschema/index-info.cfg
+++ b/config-model/src/test/derived/indexschema/index-info.cfg
@@ -365,6 +365,8 @@ indexinfo[].command[].indexname "fs3"
indexinfo[].command[].command "attribute"
indexinfo[].command[].indexname "fs3"
indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "fs3"
+indexinfo[].command[].command "integer"
indexinfo[].command[].indexname "fs4"
indexinfo[].command[].command "lowercase"
indexinfo[].command[].indexname "fs4"
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index 4ea221446a4..29f2d9aff9a 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -420,6 +420,10 @@ public class YqlParser implements Parser {
if (!index.isInteger() && !stringField)
throw new IllegalArgumentException("The in operator is only supported for integer and string fields. The field " +
field + " is not of these types");
+ if (index.isInteger() && stringField) {
+ throw new IllegalArgumentException("The in operator is not supported for fieldsets with a mix of integer and string fields. The fieldset " +
+ field + " has both");
+ }
Item item = null;
if (stringField) {
item = fillStringIn(ast, ast.getArgument(1), new StringInItem(field));
diff --git a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
index 178163cf961..783a0ec61de 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
@@ -90,6 +90,10 @@ public class YqlParserTestCase {
sd.addIndex(stringIndex);
Index floatIndex = new Index("float");
sd.addIndex(floatIndex);
+ Index mixedIndex = new Index("mixed");
+ mixedIndex.setInteger(true);
+ mixedIndex.setString(true);
+ sd.addIndex(mixedIndex);
return new IndexFacts(new IndexModel(sd));
}
@@ -1201,6 +1205,9 @@ public class YqlParserTestCase {
assertParseFail("select * from sources * where float in (25)",
new IllegalArgumentException("The in operator is only supported for integer and string fields. " +
"The field float is not of these types"));
+ assertParseFail("select * from sources * where mixed in (25)",
+ new IllegalArgumentException("The in operator is not supported for fieldsets with a mix of integer " +
+ "and string fields. The fieldset mixed has both"));
}
private static void assertNumericInItem(String field, long[] values, QueryTree query) {