http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java deleted file mode 100644 index 420a8e2..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java +++ /dev/null @@ -1,1186 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language; - -import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.*; - -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionLexer; -import org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser; -import org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.DateEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.Evaluator; -import org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.QueryResult; -import org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.cast.BooleanCastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.cast.DateCastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.cast.NumberCastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.cast.StringCastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.AndEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.AppendEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.AttributeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ContainsEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.DateToNumberEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.DivideEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.EndsWithEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.EqualsEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.EqualsIgnoreCaseEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.FindEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.FormatEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.GreaterThanEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.GreaterThanOrEqualEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.HostnameEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.IPEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.IndexOfEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.IsEmptyEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.IsNullEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.LastIndexOfEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.LengthEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.LessThanEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.LessThanOrEqualEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.MatchesEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.MinusEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ModEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.MultiplyEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.NotEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.NotNullEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.NowEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.NumberToDateEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.OneUpSequenceEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.OrEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.PlusEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.PrependEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ReplaceAllEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ReplaceEmptyEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ReplaceEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ReplaceNullEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.StartsWithEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.StringToDateEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringAfterEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringAfterLastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringBeforeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringBeforeLastEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ToLowerEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ToNumberEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ToRadixEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ToStringEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.ToUpperEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.TrimEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.UrlDecodeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.UrlEncodeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.functions.UuidEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.literals.BooleanLiteralEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.literals.NumberLiteralEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.literals.StringLiteralEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.reduce.CountEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.reduce.JoinEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.reduce.ReduceEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.AllAttributesEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.AnyAttributeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.DelineatedAttributeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.MultiAttributeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.MultiMatchAttributeEvaluator; -import org.apache.nifi.attribute.expression.language.evaluation.selection.MultiNamedAttributeEvaluator; -import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageException; -import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException; -import org.apache.nifi.expression.AttributeExpression.ResultType; -import org.apache.nifi.expression.AttributeValueDecorator; -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.exception.ProcessException; -import org.antlr.runtime.ANTLRStringStream; -import org.antlr.runtime.CharStream; -import org.antlr.runtime.CommonTokenStream; -import org.antlr.runtime.tree.Tree; -import org.apache.nifi.attribute.expression.language.evaluation.selection.MappingEvaluator; - -/** - * Class used for creating and evaluating NiFi Expression Language. Once a Query - * has been created, it may be evaluated using the evaluate methods exactly - * once. - */ -public class Query { - - private final String query; - private final Tree tree; - private final Evaluator<?> evaluator; - private final AtomicBoolean evaluated = new AtomicBoolean(false); - - private Query(final String query, final Tree tree, final Evaluator<?> evaluator) { - this.query = query; - this.tree = tree; - this.evaluator = evaluator; - } - - public static boolean isValidExpression(final String value) { - try { - validateExpression(value, false); - return true; - } catch (final ProcessException e) { - return false; - } - } - - public static ResultType getResultType(final String value) throws AttributeExpressionLanguageParsingException { - return Query.compile(value).getResultType(); - } - - public static List<ResultType> extractResultTypes(final String value) throws AttributeExpressionLanguageParsingException { - final List<ResultType> types = new ArrayList<>(); - - for (final Range range : extractExpressionRanges(value)) { - final String text = value.substring(range.getStart(), range.getEnd() + 1); - types.add(getResultType(text)); - } - - return types; - } - - public static List<String> extractExpressions(final String value) throws AttributeExpressionLanguageParsingException { - final List<String> expressions = new ArrayList<>(); - - for (final Range range : extractExpressionRanges(value)) { - expressions.add(value.substring(range.getStart(), range.getEnd() + 1)); - } - - return expressions; - } - - public static List<Range> extractExpressionRanges(final String value) throws AttributeExpressionLanguageParsingException { - final List<Range> ranges = new ArrayList<>(); - char lastChar = 0; - int embeddedCount = 0; - int expressionStart = -1; - boolean oddDollarCount = false; - int backslashCount = 0; - - charLoop: - for (int i = 0; i < value.length(); i++) { - final char c = value.charAt(i); - - if (expressionStart > -1 && (c == '\'' || c == '"') && (lastChar != '\\' || backslashCount % 2 == 0)) { - final int endQuoteIndex = findEndQuoteChar(value, i); - if (endQuoteIndex < 0) { - break charLoop; - } - - i = endQuoteIndex; - continue; - } - - if (c == '{') { - if (oddDollarCount && lastChar == '$') { - if (embeddedCount == 0) { - expressionStart = i - 1; - } - } - - embeddedCount++; - } else if (c == '}') { - if (embeddedCount <= 0) { - continue; - } - - if (--embeddedCount == 0) { - if (expressionStart > -1) { - // ended expression. Add a new range. - final Range range = new Range(expressionStart, i); - ranges.add(range); - } - - expressionStart = -1; - } - } else if (c == '$') { - oddDollarCount = !oddDollarCount; - } else if (c == '\\') { - backslashCount++; - } else { - oddDollarCount = false; - } - - lastChar = c; - } - - return ranges; - } - - /** - * - * - * @param value - * @param allowSurroundingCharacters - * @throws AttributeExpressionLanguageParsingException - */ - public static void validateExpression(final String value, final boolean allowSurroundingCharacters) throws AttributeExpressionLanguageParsingException { - if (!allowSurroundingCharacters) { - final List<Range> ranges = extractExpressionRanges(value); - if (ranges.size() > 1) { - throw new AttributeExpressionLanguageParsingException("Found multiple Expressions but expected only 1"); - } - - if (ranges.isEmpty()) { - throw new AttributeExpressionLanguageParsingException("No Expressions found"); - } - - final Range range = ranges.get(0); - final String expression = value.substring(range.getStart(), range.getEnd() + 1); - Query.compile(expression); - - if (range.getStart() > 0 || range.getEnd() < value.length() - 1) { - throw new AttributeExpressionLanguageParsingException("Found characters outside of Expression"); - } - } else { - for (final Range range : extractExpressionRanges(value)) { - final String expression = value.substring(range.getStart(), range.getEnd() + 1); - Query.compile(expression); - } - } - } - - static int findEndQuoteChar(final String value, final int quoteStart) { - final char quoteChar = value.charAt(quoteStart); - - int backslashCount = 0; - char lastChar = 0; - for (int i = quoteStart + 1; i < value.length(); i++) { - final char c = value.charAt(i); - - if (c == '\\') { - backslashCount++; - } else if (c == quoteChar && ((backslashCount % 2 == 0) || lastChar != '\\')) { - return i; - } - - lastChar = c; - } - - return -1; - } - - static String evaluateExpression(final Tree tree, final String queryText, final Map<String, String> expressionMap, final AttributeValueDecorator decorator) throws ProcessException { - final Object evaluated = Query.fromTree(tree, queryText).evaluate(expressionMap).getValue(); - if (evaluated == null) { - return null; - } - - final String value = evaluated.toString(); - final String escaped = value.replace("$$", "$"); - return (decorator == null) ? escaped : decorator.decorate(escaped); - } - - static String evaluateExpressions(final String rawValue, Map<String, String> expressionMap) throws ProcessException { - return evaluateExpressions(rawValue, expressionMap, null); - } - - static String evaluateExpressions(final String rawValue) throws ProcessException { - return evaluateExpressions(rawValue, createExpressionMap(null), null); - } - - static String evaluateExpressions(final String rawValue, final FlowFile flowFile) throws ProcessException { - return evaluateExpressions(rawValue, createExpressionMap(flowFile), null); - } - - static String evaluateExpressions(final String rawValue, Map<String, String> expressionMap, final AttributeValueDecorator decorator) throws ProcessException { - return Query.prepare(rawValue).evaluateExpressions(expressionMap, decorator); - } - - public static String evaluateExpressions(final String rawValue, final FlowFile flowFile, final AttributeValueDecorator decorator) throws ProcessException { - if (rawValue == null) { - return null; - } - - final Map<String, String> expressionMap = createExpressionMap(flowFile); - return evaluateExpressions(rawValue, expressionMap, decorator); - } - - private static Evaluator<?> getRootSubjectEvaluator(final Evaluator<?> evaluator) { - if (evaluator == null) { - return null; - } - - final Evaluator<?> subject = evaluator.getSubjectEvaluator(); - if (subject == null) { - return evaluator; - } - - return getRootSubjectEvaluator(subject); - } - - /** - * Un-escapes ${...} patterns that were escaped - * - * @param value - * @return - */ - public static String unescape(final String value) { - return value.replaceAll("\\$\\$(?=\\$*\\{.*?\\})", "\\$"); - } - - static Map<String, String> createExpressionMap(final FlowFile flowFile) { - final Map<String, String> attributeMap = flowFile == null ? new HashMap<String, String>() : flowFile.getAttributes(); - final Map<String, String> envMap = System.getenv(); - final Map<?, ?> sysProps = System.getProperties(); - - final Map<String, String> flowFileProps = new HashMap<>(); - if (flowFile != null) { - flowFileProps.put("flowFileId", String.valueOf(flowFile.getId())); - flowFileProps.put("fileSize", String.valueOf(flowFile.getSize())); - flowFileProps.put("entryDate", String.valueOf(flowFile.getEntryDate())); - flowFileProps.put("lineageStartDate", String.valueOf(flowFile.getLineageStartDate())); - } - - return wrap(attributeMap, flowFileProps, envMap, sysProps); - } - - private static Map<String, String> wrap(final Map<String, String> attributes, final Map<String, String> flowFileProps, - final Map<String, String> env, final Map<?, ?> sysProps) { - @SuppressWarnings("rawtypes") - final Map[] maps = new Map[]{attributes, flowFileProps, env, sysProps}; - - return new Map<String, String>() { - @Override - public int size() { - int size = 0; - for (final Map<?, ?> map : maps) { - size += map.size(); - } - return size; - } - - @Override - public boolean isEmpty() { - for (final Map<?, ?> map : maps) { - if (!map.isEmpty()) { - return false; - } - } - return true; - } - - @Override - public boolean containsKey(final Object key) { - if (key == null) { - return false; - } - if (!(key instanceof String)) { - return false; - } - - for (final Map<?, ?> map : maps) { - if (map.containsKey(key)) { - return true; - } - } - return false; - } - - @Override - public boolean containsValue(final Object value) { - for (final Map<?, ?> map : maps) { - if (map.containsValue(value)) { - return true; - } - } - return false; - } - - @Override - @SuppressWarnings("rawtypes") - public String get(final Object key) { - if (key == null) { - throw new IllegalArgumentException("Null Keys are not allowed"); - } - if (!(key instanceof String)) { - return null; - } - - for (final Map map : maps) { - final Object val = map.get(key); - if (val != null) { - return String.valueOf(val); - } - } - return null; - } - - @Override - public String put(String key, String value) { - throw new UnsupportedOperationException(); - } - - @Override - public String remove(final Object key) { - throw new UnsupportedOperationException(); - } - - @Override - public void putAll(final Map<? extends String, ? extends String> m) { - throw new UnsupportedOperationException(); - } - - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public Set<String> keySet() { - final Set<String> keySet = new HashSet<>(); - for (final Map map : maps) { - keySet.addAll(map.keySet()); - } - return keySet; - } - - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public Collection<String> values() { - final Set<String> values = new HashSet<>(); - for (final Map map : maps) { - values.addAll(map.values()); - } - return values; - } - - @Override - @SuppressWarnings({"unchecked", "rawtypes"}) - public Set<java.util.Map.Entry<String, String>> entrySet() { - final Set<java.util.Map.Entry<String, String>> entrySet = new HashSet<>(); - for (final Map map : maps) { - entrySet.addAll(map.entrySet()); - } - return entrySet; - } - - }; - } - - public static Query fromTree(final Tree tree, final String text) { - return new Query(text, tree, buildEvaluator(tree)); - } - - public static Tree compileTree(final String query) throws AttributeExpressionLanguageParsingException { - try { - final CommonTokenStream lexerTokenStream = createTokenStream(query); - final AttributeExpressionParser parser = new AttributeExpressionParser(lexerTokenStream); - final Tree ast = (Tree) parser.query().getTree(); - final Tree tree = ast.getChild(0); - - // ensure that we are able to build the evaluators, so that we validate syntax - final Evaluator<?> evaluator = buildEvaluator(tree); - verifyMappingEvaluatorReduced(evaluator); - return tree; - } catch (final AttributeExpressionLanguageParsingException e) { - throw e; - } catch (final Exception e) { - throw new AttributeExpressionLanguageParsingException(e); - } - } - - public static PreparedQuery prepare(final String query) throws AttributeExpressionLanguageParsingException { - if (query == null) { - return new EmptyPreparedQuery(null); - } - - final List<Range> ranges = extractExpressionRanges(query); - - if (ranges.isEmpty()) { - return new EmptyPreparedQuery(query.replace("$$", "$")); - } - - try { - final List<String> substrings = new ArrayList<>(); - final Map<String, Tree> trees = new HashMap<>(); - - int lastIndex = 0; - for (final Range range : ranges) { - if (range.getStart() > lastIndex) { - substrings.add(query.substring(lastIndex, range.getStart()).replace("$$", "$")); - lastIndex = range.getEnd() + 1; - } - - final String treeText = query.substring(range.getStart(), range.getEnd() + 1).replace("$$", "$"); - substrings.add(treeText); - trees.put(treeText, Query.compileTree(treeText)); - lastIndex = range.getEnd() + 1; - } - - final Range lastRange = ranges.get(ranges.size() - 1); - if (lastRange.getEnd() + 1 < query.length()) { - final String treeText = query.substring(lastRange.getEnd() + 1).replace("$$", "$"); - substrings.add(treeText); - } - - return new StandardPreparedQuery(substrings, trees); - } catch (final AttributeExpressionLanguageParsingException e) { - return new InvalidPreparedQuery(query, e.getMessage()); - } - } - - public static Query compile(final String query) throws AttributeExpressionLanguageParsingException { - try { - final CommonTokenStream lexerTokenStream = createTokenStream(query); - final AttributeExpressionParser parser = new AttributeExpressionParser(lexerTokenStream); - final Tree ast = (Tree) parser.query().getTree(); - final Tree tree = ast.getChild(0); - - final Evaluator<?> evaluator = buildEvaluator(tree); - verifyMappingEvaluatorReduced(evaluator); - - return new Query(query, tree, evaluator); - } catch (final AttributeExpressionLanguageParsingException e) { - throw e; - } catch (final Exception e) { - throw new AttributeExpressionLanguageParsingException(e); - } - } - - private static void verifyMappingEvaluatorReduced(final Evaluator<?> evaluator) { - // if the result type of the evaluator is BOOLEAN, then it will always - // be reduced when evaluator. - final ResultType resultType = evaluator.getResultType(); - if (resultType == ResultType.BOOLEAN) { - return; - } - - final Evaluator<?> rootEvaluator = getRootSubjectEvaluator(evaluator); - if (rootEvaluator != null && rootEvaluator instanceof MultiAttributeEvaluator) { - final MultiAttributeEvaluator multiAttrEval = (MultiAttributeEvaluator) rootEvaluator; - switch (multiAttrEval.getEvaluationType()) { - case ALL_ATTRIBUTES: - case ALL_MATCHING_ATTRIBUTES: - case ALL_DELINEATED_VALUES: { - if (!(evaluator instanceof ReduceEvaluator)) { - throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function"); - } - break; - } - default: - throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function"); - } - } - } - - private static CommonTokenStream createTokenStream(final String expression) throws AttributeExpressionLanguageParsingException { - final CharStream input = new ANTLRStringStream(expression); - final AttributeExpressionLexer lexer = new AttributeExpressionLexer(input); - return new CommonTokenStream(lexer); - } - - public ResultType getResultType() { - return evaluator.getResultType(); - } - - QueryResult<?> evaluate() { - return evaluate(createExpressionMap(null)); - } - - QueryResult<?> evaluate(final FlowFile flowFile) { - return evaluate(createExpressionMap(flowFile)); - } - - QueryResult<?> evaluate(final Map<String, String> attributes) { - if (evaluated.getAndSet(true)) { - throw new IllegalStateException("A Query cannot be evaluated more than once"); - } - - return evaluator.evaluate(attributes); - } - - Tree getTree() { - return this.tree; - } - - @Override - public String toString() { - return "Query [" + query + "]"; - } - - private static StringEvaluator newStringLiteralEvaluator(final String literalValue) { - if (literalValue == null || literalValue.length() < 2) { - return new StringLiteralEvaluator(literalValue); - } - - final List<Range> ranges = extractExpressionRanges(literalValue); - if (ranges.isEmpty()) { - return new StringLiteralEvaluator(literalValue); - } - - final List<Evaluator<?>> evaluators = new ArrayList<>(); - - int lastIndex = 0; - for (final Range range : ranges) { - if (range.getStart() > lastIndex) { - evaluators.add(newStringLiteralEvaluator(literalValue.substring(lastIndex, range.getStart()))); - } - - final String treeText = literalValue.substring(range.getStart(), range.getEnd() + 1); - evaluators.add(buildEvaluator(compileTree(treeText))); - lastIndex = range.getEnd() + 1; - } - - final Range lastRange = ranges.get(ranges.size() - 1); - if (lastRange.getEnd() + 1 < literalValue.length()) { - final String treeText = literalValue.substring(lastRange.getEnd() + 1); - evaluators.add(newStringLiteralEvaluator(treeText)); - } - - if (evaluators.size() == 1) { - return toStringEvaluator(evaluators.get(0)); - } - - StringEvaluator lastEvaluator = toStringEvaluator(evaluators.get(0)); - for (int i = 1; i < evaluators.size(); i++) { - lastEvaluator = new AppendEvaluator(lastEvaluator, toStringEvaluator(evaluators.get(i))); - } - - return lastEvaluator; - } - - private static Evaluator<?> buildEvaluator(final Tree tree) { - switch (tree.getType()) { - case EXPRESSION: { - return buildExpressionEvaluator(tree); - } - case ATTRIBUTE_REFERENCE: { - final Evaluator<?> childEvaluator = buildEvaluator(tree.getChild(0)); - if (childEvaluator instanceof MultiAttributeEvaluator) { - return childEvaluator; - } - return new AttributeEvaluator(toStringEvaluator(childEvaluator)); - } - case MULTI_ATTRIBUTE_REFERENCE: { - - final Tree functionTypeTree = tree.getChild(0); - final int multiAttrType = functionTypeTree.getType(); - if (multiAttrType == ANY_DELINEATED_VALUE || multiAttrType == ALL_DELINEATED_VALUES) { - final StringEvaluator delineatedValueEvaluator = toStringEvaluator(buildEvaluator(tree.getChild(1))); - final StringEvaluator delimiterEvaluator = toStringEvaluator(buildEvaluator(tree.getChild(2))); - - return new DelineatedAttributeEvaluator(delineatedValueEvaluator, delimiterEvaluator, multiAttrType); - } - - final List<String> attributeNames = new ArrayList<>(); - for (int i = 1; i < tree.getChildCount(); i++) { // skip the first child because that's the name of the multi-attribute function - attributeNames.add(newStringLiteralEvaluator(tree.getChild(i).getText()).evaluate(null).getValue()); - } - - switch (multiAttrType) { - case ALL_ATTRIBUTES: - for (final String attributeName : attributeNames) { - try { - FlowFile.KeyValidator.validateKey(attributeName); - } catch (final IllegalArgumentException iae) { - throw new AttributeExpressionLanguageParsingException("Invalid Attribute Name: " + attributeName + ". " + iae.getMessage()); - } - } - - return new MultiNamedAttributeEvaluator(attributeNames, ALL_ATTRIBUTES); - case ALL_MATCHING_ATTRIBUTES: - return new MultiMatchAttributeEvaluator(attributeNames, ALL_MATCHING_ATTRIBUTES); - case ANY_ATTRIBUTE: - for (final String attributeName : attributeNames) { - try { - FlowFile.KeyValidator.validateKey(attributeName); - } catch (final IllegalArgumentException iae) { - throw new AttributeExpressionLanguageParsingException("Invalid Attribute Name: " + attributeName + ". " + iae.getMessage()); - } - } - - return new MultiNamedAttributeEvaluator(attributeNames, ANY_ATTRIBUTE); - case ANY_MATCHING_ATTRIBUTE: - return new MultiMatchAttributeEvaluator(attributeNames, ANY_MATCHING_ATTRIBUTE); - default: - throw new AssertionError("Illegal Multi-Attribute Reference: " + functionTypeTree.toString()); - } - } - case ATTR_NAME: { - return newStringLiteralEvaluator(tree.getChild(0).getText()); - } - case NUMBER: { - return new NumberLiteralEvaluator(tree.getText()); - } - case STRING_LITERAL: { - return newStringLiteralEvaluator(tree.getText()); - } - case TRUE: - case FALSE: - return buildBooleanEvaluator(tree); - case UUID: { - return new UuidEvaluator(); - } - case NOW: { - return new NowEvaluator(); - } - case IP: { - try { - return new IPEvaluator(); - } catch (final UnknownHostException e) { - throw new AttributeExpressionLanguageException(e); - } - } - case HOSTNAME: { - if (tree.getChildCount() == 0) { - try { - return new HostnameEvaluator(false); - } catch (UnknownHostException e) { - throw new AttributeExpressionLanguageException(e); - } - } else if (tree.getChildCount() == 1) { - final Tree childTree = tree.getChild(0); - try { - switch (childTree.getType()) { - case TRUE: - return new HostnameEvaluator(true); - case FALSE: - return new HostnameEvaluator(false); - default: - throw new AttributeExpressionLanguageParsingException("Call to hostname() must take 0 or 1 (boolean) parameter"); - } - } catch (UnknownHostException e) { - throw new AttributeExpressionLanguageException(e); - } - } else { - throw new AttributeExpressionLanguageParsingException("Call to hostname() must take 0 or 1 (boolean) parameter"); - } - } - case NEXT_INT: { - return new OneUpSequenceEvaluator(); - } - default: - throw new AttributeExpressionLanguageParsingException("Unexpected token: " + tree.toString()); - } - } - - private static Evaluator<Boolean> buildBooleanEvaluator(final Tree tree) { - switch (tree.getType()) { - case TRUE: - return new BooleanLiteralEvaluator(true); - case FALSE: - return new BooleanLiteralEvaluator(false); - } - throw new AttributeExpressionLanguageParsingException("Cannot build Boolean evaluator from tree " + tree.toString()); - } - - private static Evaluator<?> buildExpressionEvaluator(final Tree tree) { - if (tree.getChildCount() == 0) { - throw new AttributeExpressionLanguageParsingException("EXPRESSION tree node has no children"); - } - - final Evaluator<?> evaluator; - if (tree.getChildCount() == 1) { - evaluator = buildEvaluator(tree.getChild(0)); - } else { - // we can chain together functions in the form of: - // ${x:trim():substring(1,2):trim()} - // in this case, the subject of the right-most function is the function to its left; its - // subject is the function to its left (the first trim()), and its subject is the value of - // the 'x' attribute. We accomplish this logic by iterating over all of the children of the - // tree from the right-most child going left-ward. - evaluator = buildFunctionExpressionEvaluator(tree, 0); - } - - Evaluator<?> chosenEvaluator = evaluator; - final Evaluator<?> rootEvaluator = getRootSubjectEvaluator(evaluator); - if (rootEvaluator != null) { - if (rootEvaluator instanceof MultiAttributeEvaluator) { - final MultiAttributeEvaluator multiAttrEval = (MultiAttributeEvaluator) rootEvaluator; - - switch (multiAttrEval.getEvaluationType()) { - case ANY_ATTRIBUTE: - case ANY_MATCHING_ATTRIBUTE: - case ANY_DELINEATED_VALUE: - chosenEvaluator = new AnyAttributeEvaluator((BooleanEvaluator) evaluator, multiAttrEval); - break; - case ALL_ATTRIBUTES: - case ALL_MATCHING_ATTRIBUTES: - case ALL_DELINEATED_VALUES: { - final ResultType resultType = evaluator.getResultType(); - if (resultType == ResultType.BOOLEAN) { - chosenEvaluator = new AllAttributesEvaluator((BooleanEvaluator) evaluator, multiAttrEval); - } else if (evaluator instanceof ReduceEvaluator) { - chosenEvaluator = new MappingEvaluator((ReduceEvaluator) evaluator, multiAttrEval); - } else { - throw new AttributeExpressionLanguageException("Cannot evaluate Expression because it attempts to reference multiple attributes but does not use a reducing function"); - } - break; - } - } - } - } - - return chosenEvaluator; - } - - private static Evaluator<?> buildFunctionExpressionEvaluator(final Tree tree, final int offset) { - if (tree.getChildCount() == 0) { - throw new AttributeExpressionLanguageParsingException("EXPRESSION tree node has no children"); - } - final int firstChildIndex = tree.getChildCount() - offset - 1; - if (firstChildIndex == 0) { - return buildEvaluator(tree.getChild(0)); - } - - final Tree functionTree = tree.getChild(firstChildIndex); - final Evaluator<?> subjectEvaluator = buildFunctionExpressionEvaluator(tree, offset + 1); - - final Tree functionNameTree = functionTree.getChild(0); - final List<Evaluator<?>> argEvaluators = new ArrayList<>(); - for (int i = 1; i < functionTree.getChildCount(); i++) { - argEvaluators.add(buildEvaluator(functionTree.getChild(i))); - } - return buildFunctionEvaluator(functionNameTree, subjectEvaluator, argEvaluators); - } - - private static List<Evaluator<?>> verifyArgCount(final List<Evaluator<?>> args, final int count, final String functionName) { - if (args.size() != count) { - throw new AttributeExpressionLanguageParsingException(functionName + "() function takes " + count + " arguments"); - } - return args; - } - - private static StringEvaluator toStringEvaluator(final Evaluator<?> evaluator) { - return toStringEvaluator(evaluator, null); - } - - private static StringEvaluator toStringEvaluator(final Evaluator<?> evaluator, final String location) { - if (evaluator.getResultType() == ResultType.STRING) { - return (StringEvaluator) evaluator; - } - - return new StringCastEvaluator(evaluator); - } - - private static BooleanEvaluator toBooleanEvaluator(final Evaluator<?> evaluator, final String location) { - switch (evaluator.getResultType()) { - case BOOLEAN: - return (BooleanEvaluator) evaluator; - case STRING: - return new BooleanCastEvaluator((StringEvaluator) evaluator); - default: - throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.BOOLEAN - + (location == null ? "" : " at location [" + location + "]")); - } - - } - - private static BooleanEvaluator toBooleanEvaluator(final Evaluator<?> evaluator) { - return toBooleanEvaluator(evaluator, null); - } - - private static NumberEvaluator toNumberEvaluator(final Evaluator<?> evaluator) { - return toNumberEvaluator(evaluator, null); - } - - private static NumberEvaluator toNumberEvaluator(final Evaluator<?> evaluator, final String location) { - switch (evaluator.getResultType()) { - case NUMBER: - return (NumberEvaluator) evaluator; - case STRING: - return new NumberCastEvaluator((StringEvaluator) evaluator); - case DATE: - return new DateToNumberEvaluator((DateEvaluator) evaluator); - default: - throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.NUMBER - + (location == null ? "" : " at location [" + location + "]")); - } - } - - private static DateEvaluator toDateEvaluator(final Evaluator<?> evaluator) { - return toDateEvaluator(evaluator, null); - } - - private static DateEvaluator toDateEvaluator(final Evaluator<?> evaluator, final String location) { - if (evaluator.getResultType() == ResultType.DATE) { - return (DateEvaluator) evaluator; - } - - return new DateCastEvaluator(evaluator); - } - - private static Evaluator<?> buildFunctionEvaluator(final Tree tree, final Evaluator<?> subjectEvaluator, final List<Evaluator<?>> argEvaluators) { - switch (tree.getType()) { - case TRIM: { - verifyArgCount(argEvaluators, 0, "trim"); - return new TrimEvaluator(toStringEvaluator(subjectEvaluator)); - } - case TO_STRING: { - verifyArgCount(argEvaluators, 0, "toString"); - return new ToStringEvaluator(subjectEvaluator); - } - case TO_LOWER: { - verifyArgCount(argEvaluators, 0, "toLower"); - return new ToLowerEvaluator(toStringEvaluator(subjectEvaluator)); - } - case TO_UPPER: { - verifyArgCount(argEvaluators, 0, "toUpper"); - return new ToUpperEvaluator(toStringEvaluator(subjectEvaluator)); - } - case URL_ENCODE: { - verifyArgCount(argEvaluators, 0, "urlEncode"); - return new UrlEncodeEvaluator(toStringEvaluator(subjectEvaluator)); - } - case URL_DECODE: { - verifyArgCount(argEvaluators, 0, "urlDecode"); - return new UrlDecodeEvaluator(toStringEvaluator(subjectEvaluator)); - } - case SUBSTRING_BEFORE: { - verifyArgCount(argEvaluators, 1, "substringBefore"); - return new SubstringBeforeEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to substringBefore")); - } - case SUBSTRING_BEFORE_LAST: { - verifyArgCount(argEvaluators, 1, "substringBeforeLast"); - return new SubstringBeforeLastEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to substringBeforeLast")); - } - case SUBSTRING_AFTER: { - verifyArgCount(argEvaluators, 1, "substringAfter"); - return new SubstringAfterEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to substringAfter")); - } - case SUBSTRING_AFTER_LAST: { - verifyArgCount(argEvaluators, 1, "substringAfterLast"); - return new SubstringAfterLastEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to substringAfterLast")); - } - case REPLACE_NULL: { - verifyArgCount(argEvaluators, 1, "replaceNull"); - return new ReplaceNullEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to replaceNull")); - } - case REPLACE_EMPTY: { - verifyArgCount(argEvaluators, 1, "replaceEmtpy"); - return new ReplaceEmptyEvaluator(toStringEvaluator(subjectEvaluator), toStringEvaluator(argEvaluators.get(0), "first argumen to replaceEmpty")); - } - case REPLACE: { - verifyArgCount(argEvaluators, 2, "replace"); - return new ReplaceEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to replace"), - toStringEvaluator(argEvaluators.get(1), "second argument to replace")); - } - case REPLACE_ALL: { - verifyArgCount(argEvaluators, 2, "replaceAll"); - return new ReplaceAllEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to replaceAll"), - toStringEvaluator(argEvaluators.get(1), "second argument to replaceAll")); - } - case APPEND: { - verifyArgCount(argEvaluators, 1, "append"); - return new AppendEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to append")); - } - case PREPEND: { - verifyArgCount(argEvaluators, 1, "prepend"); - return new PrependEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to prepend")); - } - case SUBSTRING: { - final int numArgs = argEvaluators.size(); - if (numArgs == 1) { - return new SubstringEvaluator(toStringEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to substring")); - } else if (numArgs == 2) { - return new SubstringEvaluator(toStringEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to substring"), - toNumberEvaluator(argEvaluators.get(1), "second argument to substring")); - } else { - throw new AttributeExpressionLanguageParsingException("substring() function can take either 1 or 2 arguments but cannot take " + numArgs + " arguments"); - } - } - case JOIN: { - verifyArgCount(argEvaluators, 1, "join"); - return new JoinEvaluator(toStringEvaluator(subjectEvaluator), toStringEvaluator(argEvaluators.get(0))); - } - case COUNT: { - verifyArgCount(argEvaluators, 0, "count"); - return new CountEvaluator(subjectEvaluator); - } - case IS_NULL: { - verifyArgCount(argEvaluators, 0, "isNull"); - return new IsNullEvaluator(toStringEvaluator(subjectEvaluator)); - } - case IS_EMPTY: { - verifyArgCount(argEvaluators, 0, "isNull"); - return new IsEmptyEvaluator(toStringEvaluator(subjectEvaluator)); - } - case NOT_NULL: { - verifyArgCount(argEvaluators, 0, "notNull"); - return new NotNullEvaluator(toStringEvaluator(subjectEvaluator)); - } - case STARTS_WITH: { - verifyArgCount(argEvaluators, 1, "startsWith"); - return new StartsWithEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to startsWith")); - } - case ENDS_WITH: { - verifyArgCount(argEvaluators, 1, "endsWith"); - return new EndsWithEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to endsWith")); - } - case CONTAINS: { - verifyArgCount(argEvaluators, 1, "contains"); - return new ContainsEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to contains")); - } - case FIND: { - verifyArgCount(argEvaluators, 1, "find"); - return new FindEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to find")); - } - case MATCHES: { - verifyArgCount(argEvaluators, 1, "matches"); - return new MatchesEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to matches")); - } - case EQUALS: { - verifyArgCount(argEvaluators, 1, "equals"); - return new EqualsEvaluator(subjectEvaluator, argEvaluators.get(0)); - } - case EQUALS_IGNORE_CASE: { - verifyArgCount(argEvaluators, 1, "equalsIgnoreCase"); - return new EqualsIgnoreCaseEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to equalsIgnoreCase")); - } - case GREATER_THAN: { - verifyArgCount(argEvaluators, 1, "gt"); - return new GreaterThanEvaluator(toNumberEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to gt")); - } - case GREATER_THAN_OR_EQUAL: { - verifyArgCount(argEvaluators, 1, "ge"); - return new GreaterThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to ge")); - } - case LESS_THAN: { - verifyArgCount(argEvaluators, 1, "lt"); - return new LessThanEvaluator(toNumberEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to lt")); - } - case LESS_THAN_OR_EQUAL: { - verifyArgCount(argEvaluators, 1, "le"); - return new LessThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator), - toNumberEvaluator(argEvaluators.get(0), "first argument to le")); - } - case LENGTH: { - verifyArgCount(argEvaluators, 0, "length"); - return new LengthEvaluator(toStringEvaluator(subjectEvaluator)); - } - case TO_DATE: { - if (argEvaluators.isEmpty()) { - return new NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)); - } else if (subjectEvaluator.getResultType() == ResultType.STRING) { - return new StringToDateEvaluator(toStringEvaluator(subjectEvaluator), toStringEvaluator(argEvaluators.get(0))); - } else { - return new NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)); - } - } - case TO_NUMBER: { - verifyArgCount(argEvaluators, 0, "toNumber"); - switch (subjectEvaluator.getResultType()) { - case STRING: - return new ToNumberEvaluator((StringEvaluator) subjectEvaluator); - case DATE: - return new DateToNumberEvaluator((DateEvaluator) subjectEvaluator); - default: - throw new AttributeExpressionLanguageParsingException(subjectEvaluator + " returns type " + subjectEvaluator.getResultType() + " but expected to get " + ResultType.STRING); - } - } - case TO_RADIX: { - if (argEvaluators.size() == 1) { - return new ToRadixEvaluator((NumberEvaluator) subjectEvaluator, toNumberEvaluator(argEvaluators.get(0))); - } else { - return new ToRadixEvaluator((NumberEvaluator) subjectEvaluator, toNumberEvaluator(argEvaluators.get(0)), toNumberEvaluator(argEvaluators.get(1))); - } - } - case MOD: { - return new ModEvaluator(toNumberEvaluator(subjectEvaluator), toNumberEvaluator(argEvaluators.get(0))); - } - case PLUS: { - return new PlusEvaluator(toNumberEvaluator(subjectEvaluator), toNumberEvaluator(argEvaluators.get(0))); - } - case MINUS: { - return new MinusEvaluator(toNumberEvaluator(subjectEvaluator), toNumberEvaluator(argEvaluators.get(0))); - } - case MULTIPLY: { - return new MultiplyEvaluator(toNumberEvaluator(subjectEvaluator), toNumberEvaluator(argEvaluators.get(0))); - } - case DIVIDE: { - return new DivideEvaluator(toNumberEvaluator(subjectEvaluator), toNumberEvaluator(argEvaluators.get(0))); - } - case INDEX_OF: { - verifyArgCount(argEvaluators, 1, "indexOf"); - return new IndexOfEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to indexOf")); - } - case LAST_INDEX_OF: { - verifyArgCount(argEvaluators, 1, "lastIndexOf"); - return new LastIndexOfEvaluator(toStringEvaluator(subjectEvaluator), - toStringEvaluator(argEvaluators.get(0), "first argument to lastIndexOf")); - } - case FORMAT: { - return new FormatEvaluator(toDateEvaluator(subjectEvaluator), toStringEvaluator(argEvaluators.get(0), "first argument of format")); - } - case OR: { - return new OrEvaluator(toBooleanEvaluator(subjectEvaluator), toBooleanEvaluator(argEvaluators.get(0))); - } - case AND: { - return new AndEvaluator(toBooleanEvaluator(subjectEvaluator), toBooleanEvaluator(argEvaluators.get(0))); - } - case NOT: { - return new NotEvaluator(toBooleanEvaluator(subjectEvaluator)); - } - default: - throw new AttributeExpressionLanguageParsingException("Expected a Function-type expression but got " + tree.toString()); - } - } - - public static class Range { - - private final int start; - private final int end; - - public Range(final int start, final int end) { - this.start = start; - this.end = end; - } - - public int getStart() { - return start; - } - - public int getEnd() { - return end; - } - - @Override - public String toString() { - return start + " - " + end; - } - } -}
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardAttributeExpression.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardAttributeExpression.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardAttributeExpression.java deleted file mode 100644 index 49ef6ef..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardAttributeExpression.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language; - -import org.apache.nifi.expression.AttributeExpression; -import org.apache.nifi.expression.AttributeValueDecorator; -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.exception.ProcessException; - -public class StandardAttributeExpression implements AttributeExpression { - - private final Query query; - - public StandardAttributeExpression(final Query query) { - this.query = query; - } - - @Override - public ResultType getResultType() { - return query.getResultType(); - } - - @Override - public String evaluate() throws ProcessException { - return evaluate((AttributeValueDecorator) null); - } - - @Override - public String evaluate(final AttributeValueDecorator decorator) throws ProcessException { - return evaluate(null, decorator); - } - - @Override - public String evaluate(final FlowFile flowFile) throws ProcessException { - return evaluate(flowFile, null); - } - - @Override - public String evaluate(final FlowFile flowFile, final AttributeValueDecorator decorator) throws ProcessException { - final Object evaluationResult = query.evaluate(flowFile).getValue(); - if (evaluationResult == null) { - return ""; - } - - String result = evaluationResult.toString(); - if (decorator != null) { - result = decorator.decorate(result); - } - return Query.unescape(result); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardExpressionLanguageCompiler.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardExpressionLanguageCompiler.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardExpressionLanguageCompiler.java deleted file mode 100644 index cec73d1..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardExpressionLanguageCompiler.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language; - -import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException; -import org.apache.nifi.expression.AttributeExpression; -import org.apache.nifi.expression.ExpressionLanguageCompiler; -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public class StandardExpressionLanguageCompiler implements ExpressionLanguageCompiler { - - @Override - public AttributeExpression compile(final String expression) throws IllegalArgumentException { - try { - return new StandardAttributeExpression(Query.compile(expression)); - } catch (final AttributeExpressionLanguageParsingException e) { - throw new IllegalArgumentException(e.getMessage()); - } - } - - @Override - public boolean isValidExpression(final String expression) { - return Query.isValidExpression(expression); - } - - @Override - public String validateExpression(final String expression, final boolean allowSurroundingCharacters) { - try { - Query.validateExpression(expression, allowSurroundingCharacters); - return null; - } catch (final AttributeExpressionLanguageParsingException aelpe) { - return aelpe.getMessage(); - } - } - - @Override - public ResultType getResultType(final String expression) throws IllegalArgumentException { - try { - return Query.getResultType(expression); - } catch (final AttributeExpressionLanguageParsingException e) { - throw new IllegalArgumentException(e); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPreparedQuery.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPreparedQuery.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPreparedQuery.java deleted file mode 100644 index 0affb7f..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPreparedQuery.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.nifi.expression.AttributeValueDecorator; -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.exception.ProcessException; - -import org.antlr.runtime.tree.Tree; - -public class StandardPreparedQuery implements PreparedQuery { - - private final List<String> queryStrings; - private final Map<String, Tree> trees; - - public StandardPreparedQuery(final List<String> queryStrings, final Map<String, Tree> trees) { - this.queryStrings = new ArrayList<>(queryStrings); - this.trees = new HashMap<>(trees); - } - - @Override - public String evaluateExpressions(Map<String, String> attributes) throws ProcessException { - return evaluateExpressions(attributes, null); - } - - @Override - public String evaluateExpressions(final Map<String, String> attributes, final AttributeValueDecorator decorator) throws ProcessException { - final StringBuilder sb = new StringBuilder(); - for (final String val : queryStrings) { - final Tree tree = trees.get(val); - if (tree == null) { - sb.append(val); - } else { - final String evaluated = Query.evaluateExpression(tree, val, attributes, decorator); - if (evaluated != null) { - sb.append(evaluated); - } - } - } - return sb.toString(); - } - - @Override - public String evaluateExpressions(final FlowFile flowFile, final AttributeValueDecorator decorator) throws ProcessException { - final Map<String, String> expressionMap = Query.createExpressionMap(flowFile); - return evaluateExpressions(expressionMap, decorator); - } - - @Override - public String evaluateExpressions() throws ProcessException { - return evaluateExpressions((FlowFile) null, null); - } - - @Override - public String evaluateExpressions(final AttributeValueDecorator decorator) throws ProcessException { - return evaluateExpressions((FlowFile) null, decorator); - } - - @Override - public String evaluateExpressions(final FlowFile flowFile) throws ProcessException { - return evaluateExpressions(flowFile, null); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java deleted file mode 100644 index 376ddfe..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public abstract class BooleanEvaluator implements Evaluator<Boolean> { - - @Override - public ResultType getResultType() { - return ResultType.BOOLEAN; - } - - @Override - public int getEvaluationsRemaining() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanQueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanQueryResult.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanQueryResult.java deleted file mode 100644 index e5ef113..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanQueryResult.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public class BooleanQueryResult implements QueryResult<Boolean> { - - private final Boolean value; - - public BooleanQueryResult(final Boolean value) { - this.value = value; - } - - @Override - public Boolean getValue() { - return value; - } - - @Override - public ResultType getResultType() { - return ResultType.BOOLEAN; - } - - @Override - public String toString() { - return String.valueOf(getValue()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java deleted file mode 100644 index 7474b60..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import java.util.Date; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public abstract class DateEvaluator implements Evaluator<Date> { - - @Override - public ResultType getResultType() { - return ResultType.DATE; - } - - @Override - public int getEvaluationsRemaining() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateQueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateQueryResult.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateQueryResult.java deleted file mode 100644 index a77bbe9..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateQueryResult.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import java.util.Date; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public class DateQueryResult implements QueryResult<Date> { - - private final Date date; - - public DateQueryResult(final Date date) { - this.date = date; - } - - @Override - public Date getValue() { - return date; - } - - @Override - public ResultType getResultType() { - return ResultType.DATE; - } - - @Override - public String toString() { - return String.valueOf(getValue()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java deleted file mode 100644 index 6d164df..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import java.util.Map; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public interface Evaluator<T> { - - QueryResult<T> evaluate(Map<String, String> attributes); - - ResultType getResultType(); - - int getEvaluationsRemaining(); - - Evaluator<?> getSubjectEvaluator(); -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java deleted file mode 100644 index 403bae3..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public abstract class NumberEvaluator implements Evaluator<Long> { - - @Override - public ResultType getResultType() { - return ResultType.NUMBER; - } - - @Override - public int getEvaluationsRemaining() { - return 0; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java deleted file mode 100644 index fc3c961..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public class NumberQueryResult implements QueryResult<Long> { - - private final Long value; - - public NumberQueryResult(final Long value) { - this.value = value; - } - - @Override - public Long getValue() { - return value; - } - - @Override - public ResultType getResultType() { - return ResultType.NUMBER; - } - - @Override - public String toString() { - return String.valueOf(getValue()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/QueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/QueryResult.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/QueryResult.java deleted file mode 100644 index 56bd76a..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/QueryResult.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public interface QueryResult<T> { - - T getValue(); - - ResultType getResultType(); -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java deleted file mode 100644 index 1f4ff21..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public abstract class StringEvaluator implements Evaluator<String> { - - @Override - public ResultType getResultType() { - return ResultType.STRING; - } - - @Override - public int getEvaluationsRemaining() { - return 0; - } -} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringQueryResult.java ---------------------------------------------------------------------- diff --git a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringQueryResult.java b/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringQueryResult.java deleted file mode 100644 index c010bb1..0000000 --- a/nifi/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringQueryResult.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.attribute.expression.language.evaluation; - -import org.apache.nifi.expression.AttributeExpression.ResultType; - -public class StringQueryResult implements QueryResult<String> { - - private final String value; - - public StringQueryResult(final String value) { - this.value = value; - } - - @Override - public String getValue() { - return value; - } - - @Override - public ResultType getResultType() { - return ResultType.STRING; - } - - @Override - public String toString() { - return String.valueOf(getValue()); - } -}