diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java b/container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java index 1993871aa4c..397cb056ba2 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java +++ b/container-search/src/main/java/com/yahoo/search/yql/ParameterListParser.java @@ -1,6 +1,8 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.yql; +import com.yahoo.prelude.query.NumericInItem; +import com.yahoo.prelude.query.StringInItem; import com.yahoo.prelude.query.WeightedSetItem; import java.util.Arrays; @@ -61,6 +63,41 @@ class ParameterListParser { s.pass('}'); } + public static void addStringTokensFromString(String string, StringInItem out) { + if (string == null) { + return; + } + var s = new ParsableString(string); + while (!s.atEnd()) { + String token; + if (s.passOptional('\'')) { + token = s.stringTo(s.position('\'')); + s.pass('\''); + } + else if (s.passOptional('"')) { + token = s.stringTo(s.position('"')); + s.pass('"'); + } + else { + token = s.stringTo(s.positionOrEnd(',')).trim(); + } + out.addToken(token); + s.passOptional(','); + } + } + + public static void addNumericTokensFromString(String string, NumericInItem out) { + if (string == null) { + return; + } + var s = new ParsableString(string); + while (!s.atEnd()) { + long token = s.longTo(s.positionOrEnd(',')); + out.addToken(token); + s.passOptional(','); + } + } + private static class ParsableString { int position = 0; @@ -142,6 +179,17 @@ class ParameterListParser { throw new IllegalArgumentException("Expected one of " + Arrays.toString(characters) + " after " + position); } + int positionOrEnd(char ... characters) { + int localPosition = position; + while (localPosition < s.length()) { + char nextChar = s.charAt(localPosition); + for (char character : characters) + if (nextChar == character) return localPosition; + localPosition++; + } + return localPosition; + } + boolean atEnd() { return position >= s.length(); } |