From f81825d31ffbecc9cbf1c3c102be99ed1dc751a1 Mon Sep 17 00:00:00 2001 From: Ivan Bella Date: Tue, 9 Jul 2024 14:40:36 +0000 Subject: [PATCH] Revert "Added most recent equivalent unique functions (#2339)" This reverts commit bb8d3531a910b66f1a573e7d51d1a8a4e2b744ea. --- .../input/microservice/QueryLogicFactory.xml | 16 ----- .../input/webservice/QueryLogicFactory.xml | 12 +--- .../microservice/QueryLogicFactory.xml | 16 ----- .../query/jexl/functions/QueryFunctions.java | 2 - .../QueryOptionsFromQueryVisitor.java | 30 ++------ .../functions/jexl/MostRecentUnique.java | 72 ------------------- .../functions/jexl/MostRecentUniqueByDay.java | 22 ------ .../jexl/MostRecentUniqueByHour.java | 23 ------ .../jexl/MostRecentUniqueByMinute.java | 23 ------ .../jexl/MostRecentUniqueByMonth.java | 23 ------ .../jexl/MostRecentUniqueBySecond.java | 23 ------ .../jexl/MostRecentUniqueByTenthOfHour.java | 23 ------ .../jexl/MostRecentUniqueByYear.java | 23 ------ .../language/functions/jexl/UniqueByDay.java | 4 ++ .../language/functions/jexl/UniqueByHour.java | 6 +- .../functions/jexl/UniqueByMinute.java | 4 ++ .../QueryOptionsFromQueryVisitorTest.java | 51 ------------- .../datawave/query/QueryLogicFactory.xml | 14 +--- .../datawave/query/QueryLogicFactory.xml | 12 +--- 19 files changed, 23 insertions(+), 376 deletions(-) delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUnique.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByDay.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByHour.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMinute.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMonth.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueBySecond.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByTenthOfHour.java delete mode 100644 warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByYear.java diff --git a/microservices/configcheck/src/test/resources/input/microservice/QueryLogicFactory.xml b/microservices/configcheck/src/test/resources/input/microservice/QueryLogicFactory.xml index e6233a4fac1..c11b1c258c3 100644 --- a/microservices/configcheck/src/test/resources/input/microservice/QueryLogicFactory.xml +++ b/microservices/configcheck/src/test/resources/input/microservice/QueryLogicFactory.xml @@ -233,23 +233,7 @@ - - - - - - - - - - - - - - - - diff --git a/microservices/configcheck/src/test/resources/input/webservice/QueryLogicFactory.xml b/microservices/configcheck/src/test/resources/input/webservice/QueryLogicFactory.xml index 8c40461dcdf..306770277de 100644 --- a/microservices/configcheck/src/test/resources/input/webservice/QueryLogicFactory.xml +++ b/microservices/configcheck/src/test/resources/input/webservice/QueryLogicFactory.xml @@ -38,23 +38,15 @@ - + + - - - - - - - - - diff --git a/microservices/configcheck/src/test/resources/rendered/microservice/QueryLogicFactory.xml b/microservices/configcheck/src/test/resources/rendered/microservice/QueryLogicFactory.xml index bb07d23456d..a28dad51d0f 100644 --- a/microservices/configcheck/src/test/resources/rendered/microservice/QueryLogicFactory.xml +++ b/microservices/configcheck/src/test/resources/rendered/microservice/QueryLogicFactory.xml @@ -233,23 +233,7 @@ - - - - - - - - - - - - - - - - diff --git a/warehouse/query-core/src/main/java/datawave/query/jexl/functions/QueryFunctions.java b/warehouse/query-core/src/main/java/datawave/query/jexl/functions/QueryFunctions.java index 050758f35ff..73fe785a3ec 100644 --- a/warehouse/query-core/src/main/java/datawave/query/jexl/functions/QueryFunctions.java +++ b/warehouse/query-core/src/main/java/datawave/query/jexl/functions/QueryFunctions.java @@ -25,8 +25,6 @@ public class QueryFunctions { public static final String QUERY_FUNCTION_NAMESPACE = "f"; public static final String OPTIONS_FUNCTION = "options"; - - public static final String MOST_RECENT_PREFIX = "most_recent_"; public static final String UNIQUE_FUNCTION = "unique"; public static final String GROUPBY_FUNCTION = "groupby"; public static final String EXCERPT_FIELDS_FUNCTION = "excerpt_fields"; diff --git a/warehouse/query-core/src/main/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitor.java b/warehouse/query-core/src/main/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitor.java index 521e80b4489..a9b9bdb8de0 100644 --- a/warehouse/query-core/src/main/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitor.java +++ b/warehouse/query-core/src/main/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitor.java @@ -48,8 +48,6 @@ * {@code unique_by_minute('field1','field2')} *
  • {@code f:unique_by_second()}: Expects a comma-delimited list of fields to be unique with a granularity level of by SECOND, e.g. * {@code unique_by_second('field1','field2')}
  • - *
  • {@code f:most_recent_unique...} Adding most_recent_ before any unique function will set the most.recent.unique flag to true, e.g. - * {@code most_recent_unique_by_day('field1','field2')}
  • *
  • {@code f:rename}: Expects a comma-delimited list field/field mappings e.g. {@code f:rename('field1=field2','field3=field4')}
  • * */ @@ -61,18 +59,9 @@ public class QueryOptionsFromQueryVisitor extends RebuildingVisitor { QueryFunctions.UNIQUE_FUNCTION, UniqueFunction.UNIQUE_BY_DAY_FUNCTION, UniqueFunction.UNIQUE_BY_HOUR_FUNCTION, UniqueFunction.UNIQUE_BY_MINUTE_FUNCTION, UniqueFunction.UNIQUE_BY_TENTH_OF_HOUR_FUNCTION, UniqueFunction.UNIQUE_BY_MONTH_FUNCTION, UniqueFunction.UNIQUE_BY_SECOND_FUNCTION, UniqueFunction.UNIQUE_BY_MILLISECOND_FUNCTION, UniqueFunction.UNIQUE_BY_YEAR_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + QueryFunctions.UNIQUE_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_DAY_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_HOUR_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_MINUTE_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_TENTH_OF_HOUR_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_MONTH_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_SECOND_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_MILLISECOND_FUNCTION, - QueryFunctions.MOST_RECENT_PREFIX + UniqueFunction.UNIQUE_BY_YEAR_FUNCTION, QueryFunctions.GROUPBY_FUNCTION, - QueryFunctions.EXCERPT_FIELDS_FUNCTION, QueryFunctions.NO_EXPANSION, QueryFunctions.LENIENT_FIELDS_FUNCTION, - QueryFunctions.STRICT_FIELDS_FUNCTION, QueryFunctions.SUM, QueryFunctions.MIN, QueryFunctions.MAX, QueryFunctions.AVERAGE, - QueryFunctions.COUNT, QueryFunctions.RENAME_FUNCTION); + QueryFunctions.GROUPBY_FUNCTION, QueryFunctions.EXCERPT_FIELDS_FUNCTION, QueryFunctions.NO_EXPANSION, + QueryFunctions.LENIENT_FIELDS_FUNCTION, QueryFunctions.STRICT_FIELDS_FUNCTION, QueryFunctions.SUM, QueryFunctions.MIN, QueryFunctions.MAX, + QueryFunctions.AVERAGE, QueryFunctions.COUNT, QueryFunctions.RENAME_FUNCTION); @SuppressWarnings("unchecked") public static T collect(T node, Object data) { @@ -199,16 +188,7 @@ private Object visit(ASTFunctionNode node, Map optionsMap) { ASTNamespaceIdentifier nsIdentifier = (ASTNamespaceIdentifier) node.jjtGetChild(0); // if this is the f:options function, create a List for the userData to be passed to the child nodes if (nsIdentifier.getNamespace().equals(QueryFunctions.QUERY_FUNCTION_NAMESPACE)) { - String function = String.valueOf(nsIdentifier.getName()); - - // check for the most recent flag for the unique functions only - boolean mostRecent = function.startsWith(QueryFunctions.MOST_RECENT_PREFIX + QueryFunctions.UNIQUE_FUNCTION); - if (mostRecent) { - function = function.substring(QueryFunctions.MOST_RECENT_PREFIX.length()); - optionsMap.put(QueryParameters.MOST_RECENT_UNIQUE, "true"); - } - - switch (function) { + switch (String.valueOf(nsIdentifier.getName())) { case QueryFunctions.OPTIONS_FUNCTION: { List optionsList = new ArrayList<>(); this.visit(node, optionsList); @@ -254,7 +234,7 @@ private Object visit(ASTFunctionNode node, Map optionsMap) { case UniqueFunction.UNIQUE_BY_SECOND_FUNCTION: case UniqueFunction.UNIQUE_BY_TENTH_OF_HOUR_FUNCTION: { UniqueFields uniqueFields = new UniqueFields(); - updateUniqueFields(node, uniqueFields, optionsMap, UniqueFunction.findByName(function)); + updateUniqueFields(node, uniqueFields, optionsMap, UniqueFunction.findByName(nsIdentifier.getName())); return null; } case QueryFunctions.GROUPBY_FUNCTION: { diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUnique.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUnique.java deleted file mode 100644 index 1e0de067959..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUnique.java +++ /dev/null @@ -1,72 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.stream.Collectors; - -import datawave.query.attributes.UniqueFields; -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.language.functions.QueryFunction; -import datawave.webservice.query.exception.BadRequestQueryException; -import datawave.webservice.query.exception.DatawaveErrorCode; - -/** - * Function to determine most recent uniqueness among documents given a set of fields and the levels of granularity that should be used for each fields. This - * function accepts a list of fields with specified granularity levels in the format {@code field[ALL],dateField[DAY,HOUR,MINUTE]}. See {@link UniqueFields} for - * additional documentation on supported formatting. - */ -public class MostRecentUnique extends JexlQueryFunction { - - public MostRecentUnique() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryFunctions.UNIQUE_FUNCTION, new ArrayList<>()); - } - - /** - * query options contain a list of fields. Cannot be the empty list. - * - * @throws IllegalArgumentException - * for illegal arguments - */ - @Override - public void validate() throws IllegalArgumentException { - if (this.parameterList.isEmpty()) { - BadRequestQueryException qe = new BadRequestQueryException(DatawaveErrorCode.INVALID_FUNCTION_ARGUMENTS, - MessageFormat.format("{0} requires at least one argument", this.name)); - throw new IllegalArgumentException(qe); - } else { - String parameters = String.join(",", parameterList); - try { - UniqueFields.from(parameters); - } catch (Exception e) { - BadRequestQueryException qe = new BadRequestQueryException(DatawaveErrorCode.INVALID_FUNCTION_ARGUMENTS, - MessageFormat.format("Unable to parse unique fields from arguments for function {0}", this.name)); - throw new IllegalArgumentException(qe); - } - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - - sb.append(QueryFunctions.QUERY_FUNCTION_NAMESPACE).append(':').append(QueryFunctions.MOST_RECENT_PREFIX).append(QueryFunctions.UNIQUE_FUNCTION); - if (parameterList.isEmpty()) { - sb.append("()"); - } else { - char separator = '('; - for (String parm : parameterList) { - sb.append(separator).append(escapeString(parm)); - separator = ','; - } - sb.append(')'); - } - - return sb.toString(); - } - - @Override - public QueryFunction duplicate() { - return new Unique(); - } - -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByDay.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByDay.java deleted file mode 100644 index 4b0449246e8..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByDay.java +++ /dev/null @@ -1,22 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a unique result for every day for a given list of fields. This function is equivalent to {@code #MOST_RECENT_UNIQUE(field[DAY])}. - */ -public class MostRecentUniqueByDay extends UniqueByFunction { - - public MostRecentUniqueByDay() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_DAY_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByDay(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByHour.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByHour.java deleted file mode 100644 index fcfec8ddcc4..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByHour.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a unique result for every hour of the day for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[HOUR])}. - */ -public class MostRecentUniqueByHour extends UniqueByFunction { - - public MostRecentUniqueByHour() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_HOUR_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByHour(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMinute.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMinute.java deleted file mode 100644 index fec744f7a94..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMinute.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a most recent unique result for every minute of the hour for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[MINUTE])}. - */ -public class MostRecentUniqueByMinute extends UniqueByFunction { - - public MostRecentUniqueByMinute() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_MINUTE_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByMinute(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMonth.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMonth.java deleted file mode 100644 index 79a5a494746..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByMonth.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a most recent unique result for every month of the year for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[MONTH])}. - */ -public class MostRecentUniqueByMonth extends UniqueByFunction { - - public MostRecentUniqueByMonth() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_MONTH_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByMonth(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueBySecond.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueBySecond.java deleted file mode 100644 index 369091107a6..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueBySecond.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a most recent unique result for every second for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[SECOND])}. - */ -public class MostRecentUniqueBySecond extends UniqueByFunction { - - public MostRecentUniqueBySecond() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_SECOND_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueBySecond(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByTenthOfHour.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByTenthOfHour.java deleted file mode 100644 index a635eec6256..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByTenthOfHour.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a most recent_unique result for every tenth of an hour for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[TENTH_OF_HOUR])}. - */ -public class MostRecentUniqueByTenthOfHour extends UniqueByFunction { - - public MostRecentUniqueByTenthOfHour() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_TENTH_OF_HOUR_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByTenthOfHour(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByYear.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByYear.java deleted file mode 100644 index 68b6397cf5d..00000000000 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/MostRecentUniqueByYear.java +++ /dev/null @@ -1,23 +0,0 @@ -package datawave.query.language.functions.jexl; - -import java.util.ArrayList; - -import datawave.query.jexl.functions.QueryFunctions; -import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; -import datawave.query.language.functions.QueryFunction; - -/** - * Function to return a most recent unique result for the year for a given list of fields. This function is equivalent to - * {@code #MOST_RECENT_UNIQUE(field[YEAR])}. - */ -public class MostRecentUniqueByYear extends UniqueByFunction { - - public MostRecentUniqueByYear() { - super(QueryFunctions.MOST_RECENT_PREFIX + QueryOptionsFromQueryVisitor.UniqueFunction.UNIQUE_BY_YEAR_FUNCTION, new ArrayList<>()); - } - - @Override - public QueryFunction duplicate() { - return new UniqueByYear(); - } -} diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByDay.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByDay.java index c6fd2c0f040..a354b79c5a0 100644 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByDay.java +++ b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByDay.java @@ -1,9 +1,13 @@ package datawave.query.language.functions.jexl; +import java.text.MessageFormat; import java.util.ArrayList; +import datawave.query.jexl.functions.QueryFunctions; import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; import datawave.query.language.functions.QueryFunction; +import datawave.webservice.query.exception.BadRequestQueryException; +import datawave.webservice.query.exception.DatawaveErrorCode; /** * Function to return a unique result for every day for a given list of fields. This function is equivalent to {@code #unique(field[DAY])}. diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByHour.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByHour.java index c6f298f0c0b..78afb7e50b1 100644 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByHour.java +++ b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByHour.java @@ -1,12 +1,16 @@ package datawave.query.language.functions.jexl; +import java.text.MessageFormat; import java.util.ArrayList; +import datawave.query.jexl.functions.QueryFunctions; import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; import datawave.query.language.functions.QueryFunction; +import datawave.webservice.query.exception.BadRequestQueryException; +import datawave.webservice.query.exception.DatawaveErrorCode; /** - * Function to return a unique result for every hour of the day for a given list of fields. This function is equivalent to {@code #unique(field[HOUR])}. + * Function to return a unique result for every hour of the day for a given list of fields. This function is equivalent to {@code #unique(field[DAY])}. */ public class UniqueByHour extends UniqueByFunction { diff --git a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByMinute.java b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByMinute.java index b05d880f4fd..90bc82720fc 100644 --- a/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByMinute.java +++ b/warehouse/query-core/src/main/java/datawave/query/language/functions/jexl/UniqueByMinute.java @@ -1,9 +1,13 @@ package datawave.query.language.functions.jexl; +import java.text.MessageFormat; import java.util.ArrayList; +import datawave.query.jexl.functions.QueryFunctions; import datawave.query.jexl.visitors.QueryOptionsFromQueryVisitor; import datawave.query.language.functions.QueryFunction; +import datawave.webservice.query.exception.BadRequestQueryException; +import datawave.webservice.query.exception.DatawaveErrorCode; /** * Function to return a unique result for every minute of the hour for a given list of fields. This function is equivalent to {@code #unique(field[MINUTE])}. diff --git a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitorTest.java b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitorTest.java index afee2b09606..1031a1dd787 100644 --- a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitorTest.java +++ b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/QueryOptionsFromQueryVisitorTest.java @@ -59,85 +59,34 @@ public void testUniqueFunction() throws ParseException { // Verify an empty function results in an empty parameter value. assertResult("f:unique_by_day()", ""); assertOption(QueryParameters.UNIQUE_FIELDS, ""); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify that fields of no specified granularity are added with the default ALL granularity. assertResult("f:unique('field1','field2','field3')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[ALL],FIELD2[ALL],FIELD3[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify that fields with DAY granularity are added as such. assertResult("f:unique('field1[DAY]','field2[DAY]','field3[DAY]')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY],FIELD3[DAY]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify that fields with HOUR granularity are added as such. assertResult("f:unique('field1[HOUR]','field2[HOUR]','field3[HOUR]')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[HOUR],FIELD2[HOUR],FIELD3[HOUR]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify that fields with MINUTE granularity are added as such. assertResult("f:unique('field1[MINUTE]','field2[MINUTE]','field3[MINUTE]')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[MINUTE],FIELD2[MINUTE],FIELD3[MINUTE]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify that fields from multiple unique functions are merged together. assertResult("f:unique('field1','field2') AND f:unique('field2[DAY]','field3[DAY]') AND f:unique('field4')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[ALL],FIELD2[ALL,DAY],FIELD3[DAY],FIELD4[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Verify more complex fields with multiple granularity levels are merged together. assertResult("f:unique('field1[DAY]','field2[DAY,HOUR]','field3[HOUR,MINUTE]','field4[ALL,MINUTE]','field5')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY,HOUR],FIELD3[HOUR,MINUTE],FIELD4[ALL,MINUTE],FIELD5[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); // Lucene will parse comma-delimited granularity levels into separate strings. Ensure it still parses correctly. assertResult("f:unique('field1[DAY]','field2[DAY','HOUR]','field3[HOUR','MINUTE]','field4[ALL','MINUTE]','field5')", ""); assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY,HOUR],FIELD3[HOUR,MINUTE],FIELD4[ALL,MINUTE],FIELD5[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, null); - } - - @Test - public void testMostRecentUniqueFunction() throws ParseException { - // Verify an empty function results in an empty parameter value. - assertResult("f:most_recent_unique_by_day()", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, ""); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify that fields of no specified granularity are added with the default ALL granularity. - assertResult("f:most_recent_unique('field1','field2','field3')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[ALL],FIELD2[ALL],FIELD3[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify that fields with DAY granularity are added as such. - assertResult("f:most_recent_unique('field1[DAY]','field2[DAY]','field3[DAY]')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY],FIELD3[DAY]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify that fields with HOUR granularity are added as such. - assertResult("f:most_recent_unique('field1[HOUR]','field2[HOUR]','field3[HOUR]')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[HOUR],FIELD2[HOUR],FIELD3[HOUR]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify that fields with MINUTE granularity are added as such. - assertResult("f:most_recent_unique('field1[MINUTE]','field2[MINUTE]','field3[MINUTE]')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[MINUTE],FIELD2[MINUTE],FIELD3[MINUTE]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify that fields from multiple unique functions are merged together. - assertResult("f:most_recent_unique('field1','field2') AND f:unique('field2[DAY]','field3[DAY]') AND f:unique('field4')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[ALL],FIELD2[ALL,DAY],FIELD3[DAY],FIELD4[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Verify more complex fields with multiple granularity levels are merged together. - assertResult("f:most_recent_unique('field1[DAY]','field2[DAY,HOUR]','field3[HOUR,MINUTE]','field4[ALL,MINUTE]','field5')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY,HOUR],FIELD3[HOUR,MINUTE],FIELD4[ALL,MINUTE],FIELD5[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); - - // Lucene will parse comma-delimited granularity levels into separate strings. Ensure it still parses correctly. - assertResult("f:most_recent_unique('field1[DAY]','field2[DAY','HOUR]','field3[HOUR','MINUTE]','field4[ALL','MINUTE]','field5')", ""); - assertOption(QueryParameters.UNIQUE_FIELDS, "FIELD1[DAY],FIELD2[DAY,HOUR],FIELD3[HOUR,MINUTE],FIELD4[ALL,MINUTE],FIELD5[ALL]"); - assertOption(QueryParameters.MOST_RECENT_UNIQUE, "true"); } @Test diff --git a/warehouse/query-core/src/test/resources/datawave/query/QueryLogicFactory.xml b/warehouse/query-core/src/test/resources/datawave/query/QueryLogicFactory.xml index fdfced0fba9..1fd86d494e4 100644 --- a/warehouse/query-core/src/test/resources/datawave/query/QueryLogicFactory.xml +++ b/warehouse/query-core/src/test/resources/datawave/query/QueryLogicFactory.xml @@ -28,23 +28,11 @@ - + - - - - - - - - - - - - diff --git a/web-services/deploy/configuration/src/main/resources/datawave/query/QueryLogicFactory.xml b/web-services/deploy/configuration/src/main/resources/datawave/query/QueryLogicFactory.xml index 48d9b40df13..8c635216e5e 100644 --- a/web-services/deploy/configuration/src/main/resources/datawave/query/QueryLogicFactory.xml +++ b/web-services/deploy/configuration/src/main/resources/datawave/query/QueryLogicFactory.xml @@ -40,23 +40,15 @@ - + + - - - - - - - - -