You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2015/01/21 14:04:58 UTC
[46/64] [partial] incubator-nifi git commit: NIFI-270 Made all
changes identified by adam, mark, joey to prep for a cleaner build
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());
- }
-}