From 8c77013a9ad11dfc693da6896f113d1b7e5669f8 Mon Sep 17 00:00:00 2001 From: Moriarty <22225248+apmoriarty@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:39:11 +0000 Subject: [PATCH 1/2] Migrate ExecutableExpansionVisitorTest from Arquillian to AbstractQueryTest Drops the Arquillian container deployment and the ShardRangeExecutableExpansion/ DocumentRange nested subclasses in favor of extending AbstractQueryTest directly. This file mixes two very different kinds of tests: - ~19 integration-style tests that ingest data and call runTestQuery (renamed here to use givenQuery/expectUUIDs/planAndExecuteQuery), which are parameterized over SHARD/DOCUMENT range via @ParameterizedTest, with a couple using @MethodSource where the original looped over multiple query-string/expected-UUID cases. Ingestion for both ranges happens once in @BeforeAll. - ~13 pure unit tests of ExecutableExpansionVisitor/ExecutableDeterminationVisitor against Mockito-mocked ShardQueryConfiguration/MetadataHelper that never touch the ingested data or query logic at all. These are left as plain single @Test methods with no range parameter, since the old ShardRange/DocumentRange split needlessly ran them twice for no reason - range was never relevant to them. Query plan assertion is disabled by default; a handful of tests that originally asserted the final planned query tree via manual TreeEqualityVisitor calls keep doing so directly in the test body after planAndExecuteQuery(), since that maps onto exactly what AbstractQueryTest's own plan assertion already does internally. Co-Authored-By: Claude Sonnet 5 --- .../ExecutableExpansionVisitorTest.java | 770 +++++++----------- 1 file changed, 293 insertions(+), 477 deletions(-) diff --git a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java index 8b5f7bb054a..9e36261113d 100644 --- a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java +++ b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java @@ -2,29 +2,26 @@ import static datawave.query.jexl.nodes.QueryPropertyMarker.MarkerType.EXCEEDED_OR; import static datawave.query.jexl.nodes.QueryPropertyMarker.MarkerType.EXCEEDED_VALUE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; +import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; -import java.util.TimeZone; import java.util.TreeSet; -import java.util.UUID; - -import javax.inject.Inject; +import java.util.stream.Stream; import org.apache.accumulo.core.client.AccumuloClient; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.security.Authorizations; import org.apache.commons.jexl3.parser.ASTAndNode; import org.apache.commons.jexl3.parser.ASTJexlScript; @@ -33,272 +30,154 @@ import org.apache.commons.jexl3.parser.ASTReferenceExpression; import org.apache.commons.jexl3.parser.JexlNode; import org.apache.commons.jexl3.parser.ParserTreeConstants; -import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.asset.StringAsset; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; -import datawave.configuration.spring.SpringBean; -import datawave.core.query.configuration.GenericQueryConfiguration; import datawave.data.type.GeometryType; import datawave.data.type.Type; import datawave.helpers.PrintUtility; -import datawave.ingest.data.TypeRegistry; -import datawave.microservice.query.QueryImpl; import datawave.query.QueryTestTableHelper; -import datawave.query.attributes.Attribute; -import datawave.query.attributes.Document; -import datawave.query.attributes.PreNormalizedAttribute; -import datawave.query.attributes.TypeAttribute; import datawave.query.config.ShardQueryConfiguration; import datawave.query.exceptions.DatawaveFatalQueryException; -import datawave.query.function.deserializer.KryoDocumentDeserializer; import datawave.query.jexl.JexlASTHelper; import datawave.query.jexl.nodes.ExceededOr; import datawave.query.jexl.nodes.QueryPropertyMarker; import datawave.query.planner.DefaultQueryPlanner; import datawave.query.tables.ShardQueryLogic; -import datawave.query.tables.edge.DefaultEdgeEventQueryLogic; +import datawave.query.util.AbstractQueryTest; import datawave.query.util.MetadataHelper; import datawave.query.util.MockMetadataHelper; import datawave.query.util.WiseGuysIngest; +import datawave.query.util.WiseGuysIngest.WhatKindaRange; import datawave.table.constants.TableName; -import datawave.webservice.edgedictionary.RemoteEdgeDictionary; -public abstract class ExecutableExpansionVisitorTest { - @RunWith(Arquillian.class) - public static class ShardRangeExecutableExpansion extends ExecutableExpansionVisitorTest { - protected static AccumuloClient client = null; +@ExtendWith(SpringExtension.class) +@ComponentScan(basePackages = "datawave.query") +// @formatter:off +@ContextConfiguration(locations = { + "classpath:datawave/query/QueryLogicFactory.xml", + "classpath:beanRefContext.xml", + "classpath:MarkingFunctionsContext.xml", + "classpath:MetadataHelperContext.xml", + "classpath:CacheContext.xml"}) +// @formatter:on +public class ExecutableExpansionVisitorTest extends AbstractQueryTest { - @BeforeClass - public static void setUp() throws Exception { + private static final Logger log = Logger.getLogger(ExecutableExpansionVisitorTest.class); + private static final Authorizations auths = new Authorizations("ALL"); - QueryTestTableHelper qtth = new QueryTestTableHelper(ExecutableExpansionVisitorTest.ShardRangeExecutableExpansion.class.toString(), log); - client = qtth.client; - Logger.getLogger(PrintUtility.class).setLevel(Level.DEBUG); + private static final Map clients = new EnumMap<>(WhatKindaRange.class); - WiseGuysIngest.writeItAll(client, WiseGuysIngest.WhatKindaRange.SHARD); - Authorizations auths = new Authorizations("ALL"); - PrintUtility.printTable(client, auths, TableName.SHARD); - PrintUtility.printTable(client, auths, TableName.SHARD_INDEX); - PrintUtility.printTable(client, auths, QueryTestTableHelper.METADATA_TABLE_NAME); - PrintUtility.printTable(client, auths, QueryTestTableHelper.MODEL_TABLE_NAME); - } + @Autowired + @Qualifier("EventQuery") + protected ShardQueryLogic logic; - @Before - public void setup() { - super.setup(); - logic.setCollapseUids(true); - } + @Override + public ShardQueryLogic getLogic() { + return logic; + } - @Override - protected void runTestQuery(List expected, String querystr, Date startDate, Date endDate, Map extraParms) - throws ParseException, Exception { - super.runTestQuery(expected, querystr, startDate, endDate, extraParms, client); - } + @Override + public Authorizations getAuths() { + return auths; } - @RunWith(Arquillian.class) - public static class DocumentRange extends ExecutableExpansionVisitorTest { - protected static AccumuloClient client = null; + @Override + protected void extraConfigurations() { + disableQueryPlanAssertion(); + } - @BeforeClass - public static void setUp() throws Exception { + @Override + protected void extraAssertions() { + // no-op + } - QueryTestTableHelper qtth = new QueryTestTableHelper(ExecutableExpansionVisitorTest.DocumentRange.class.toString(), log); - client = qtth.client; + @BeforeAll + public static void beforeAll() throws Exception { + for (WhatKindaRange range : WhatKindaRange.values()) { + QueryTestTableHelper qtth = new QueryTestTableHelper(ExecutableExpansionVisitorTest.class.toString() + "-" + range, log); + AccumuloClient client = qtth.client; - WiseGuysIngest.writeItAll(client, WiseGuysIngest.WhatKindaRange.DOCUMENT); - Authorizations auths = new Authorizations("ALL"); + WiseGuysIngest.writeItAll(client, range); PrintUtility.printTable(client, auths, TableName.SHARD); PrintUtility.printTable(client, auths, TableName.SHARD_INDEX); PrintUtility.printTable(client, auths, QueryTestTableHelper.METADATA_TABLE_NAME); PrintUtility.printTable(client, auths, QueryTestTableHelper.MODEL_TABLE_NAME); - } - @Before - public void setup() { - super.setup(); - logic.setCollapseUids(false); - } - - @Override - protected void runTestQuery(List expected, String querystr, Date startDate, Date endDate, Map extraParms) - throws ParseException, Exception { - super.runTestQuery(expected, querystr, startDate, endDate, extraParms, client); + clients.put(range, client); } } - private static final Logger log = Logger.getLogger(ExecutableExpansionVisitorTest.class); - - protected Authorizations auths = new Authorizations("ALL"); - - protected Set authSet = Collections.singleton(auths); - - @Inject - @SpringBean(name = "EventQuery") - protected ShardQueryLogic logic; - - protected KryoDocumentDeserializer deserializer; - - private final DateFormat format = new SimpleDateFormat("yyyyMMdd"); - - @Deployment - public static JavaArchive createDeployment() throws Exception { - // basically this is avoiding WELD exceptions for beans that cannot be created because of various injection points - // that would be null in this environment. For example the QueryMetricQueryLogic would fail to be created because - // we do not have a caller principal, and the io.astefunutti.metrics.cdi classes are not available to this test case. - // Also we are adding the beans.xml to enable resolving some beans. The MockAlternative is a placeholder for any - // mock bean alternatives we may use if annotated as such. - return ShrinkWrap.create(JavaArchive.class) - .addPackages(true, "org.apache.deltaspike", "io.astefanutti.metrics.cdi", "datawave.query", "org.jboss.logging", - "datawave.webservice.query.result.event") - .deleteClass(DefaultEdgeEventQueryLogic.class).deleteClass(RemoteEdgeDictionary.class) - .deleteClass(datawave.query.metrics.QueryMetricQueryLogic.class) - .deleteClass(datawave.query.tables.edge.DefaultEdgeEventQueryLogic.class) - .addAsManifestResource(new StringAsset( - "" + "datawave.query.tables.edge.MockAlternative" + ""), - "beans.xml"); - } - - @AfterClass - public static void teardown() { - TypeRegistry.reset(); - } - - @Before - public void setup() { - TimeZone.setDefault(TimeZone.getTimeZone("GMT")); - + private void setupLogic(WhatKindaRange range) { + setClientForTest(clients.get(range)); logic.setFullTableScanEnabled(false); logic.setMaxDepthThreshold(11); logic.setInitialMaxTermThreshold(12); logic.setFinalMaxTermThreshold(12); - deserializer = new KryoDocumentDeserializer(); + logic.setCollapseUids(range == WhatKindaRange.SHARD); } - protected abstract void runTestQuery(List expected, String querystr, Date startDate, Date endDate, Map extraParms) - throws ParseException, Exception; - - protected void runTestQuery(List expected, String querystr, Date startDate, Date endDate, Map extraParms, AccumuloClient client) - throws ParseException, Exception { - log.debug("runTestQuery"); - log.trace("Creating QueryImpl"); - QueryImpl settings = new QueryImpl(); - settings.setBeginDate(startDate); - settings.setEndDate(endDate); - settings.setPagesize(Integer.MAX_VALUE); - settings.setQueryAuthorizations(auths.serialize()); - settings.setQuery(querystr); - settings.setParameters(extraParms); - settings.setId(UUID.randomUUID()); - - log.debug("query: " + settings.getQuery()); - log.debug("logic: " + settings.getQueryLogicName()); - - GenericQueryConfiguration config = logic.initialize(client, settings, authSet); - logic.setupQuery(config); - - HashSet expectedSet = new HashSet(expected); - HashSet resultSet; - resultSet = new HashSet(); - Set docs = new HashSet(); - for (Map.Entry entry : logic) { - Document d = deserializer.apply(entry).getValue(); - - log.trace(entry.getKey() + " => " + d); - - Attribute attr = d.get("UUID"); - if (attr == null) - attr = d.get("UUID.0"); - - Assert.assertNotNull("Result Document did not contain a 'UUID'", attr); - Assert.assertTrue("Expected result to be an instance of DatwawaveTypeAttribute, was: " + attr.getClass().getName(), - attr instanceof TypeAttribute || attr instanceof PreNormalizedAttribute); - - TypeAttribute UUIDAttr = (TypeAttribute) attr; - - String UUID = UUIDAttr.getType().getDelegate().toString(); - Assert.assertTrue("Received unexpected UUID: " + UUID, expected.contains(UUID)); - - resultSet.add(UUID); - docs.add(d); - } - - if (expected.size() > resultSet.size()) { - expectedSet.addAll(expected); - expectedSet.removeAll(resultSet); - - for (String s : expectedSet) { - log.warn("Missing: " + s); - } + private void runTestQuery(List expected, String querystr, Map extraParms) throws Exception { + givenDate("20091231", "20150101"); + givenQuery(querystr); + givenParameters(extraParms); + expectResultCount(expected.size()); + if (!expected.isEmpty()) { + expectUUIDs(new HashSet<>(expected)); } - if (!expected.containsAll(resultSet)) { - log.error("Expected results " + expected + " differ form actual results " + resultSet); - } - Assert.assertTrue("Expected results " + expected + " differ form actual results " + resultSet, expected.containsAll(resultSet)); - Assert.assertEquals("Unexpected number of records", expected.size(), resultSet.size()); + planAndExecuteQuery(); } - @Test(expected = DatawaveFatalQueryException.class) - public void testMixedIndexOnly() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testMixedIndexOnly(WhatKindaRange range) { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testMixedIndexOnly"); - } - String[] queryStrings = {"filter:isNull(LOCATION) || LOCATION == 'chicago'"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList(), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - Assert.fail("should not have gotten here"); - } + assertThrows(DatawaveFatalQueryException.class, + () -> runTestQuery(Arrays.asList(), "filter:isNull(LOCATION) || LOCATION == 'chicago'", extraParameters)); } - @Test - public void testExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && (filter:isNull(MAGIC) || LOCATION == 'chicago')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:isNull(MAGIC) || LOCATION == 'chicago')", extraParameters); } - @Test - public void testGeowaveExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testGeowaveExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testGeowaveExpansion"); - } - MockMetadataHelper helper = new MockMetadataHelper(); Multimap> dataTypes = ArrayListMultimap.create(); dataTypes.put("GEO", new GeometryType()); @@ -323,306 +202,265 @@ public void testGeowaveExpansion() throws Exception { // @formatter:on String expandedQuery = JexlStringBuildingVisitor .buildQuery(FunctionIndexQueryExpansionVisitor.expandFunctions(logic.getConfig(), helper, null, JexlASTHelper.parseJexlQuery(query))); - String[] queryStrings = {expandedQuery}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList(), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + + runTestQuery(Arrays.asList(), expandedQuery, extraParameters); String finalQuery = JexlStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertNotEquals( - "GENDER == 'male' && (NOME == 'this' || NOME == 'that') && !filter:includeRegex(ETA, 'blah') && (LOCATION == 'chicago' || LOCATION == 'newyork' || LOCATION == 'newjersey')", + assertNotEquals("GENDER == 'male' && (NOME == 'this' || NOME == 'that') && !filter:includeRegex(ETA, 'blah') && (LOCATION == 'chicago' || LOCATION == 'newyork' || LOCATION == 'newjersey')", finalQuery); ASTJexlScript expectedQuery = JexlASTHelper.parseJexlQuery( "GENDER == 'male' && (NOME == 'that' || NOME == 'this') && (LOCATION == 'chicago' || LOCATION == 'newjersey' || LOCATION == 'newyork') && (GEO == '00' || GEO == '0202' || GEO == '020b' || GEO == '1f200a80a80a80a80a' || GEO == '1f202a02a02a02a02a' || GEO == '1f2088888888888888') && geowave:intersects(GEO, 'POLYGON((-180 -90, 180 -90, 180 90, -180 90, -180 -90))') && !filter:includeRegex(ETA, 'blah') && ((_Bounded_ = true) && (NUMBER >= '0' && NUMBER <= '1000'))"); - // "((((_Bounded_ = true) && (NUMBER >= '0' && NUMBER <= '1000')) && geowave:intersects(GEO, 'POLYGON((-180 -90, 180 -90, 180 90, -180 90, -180 -90))') - // && (GEO == '00' || GEO == '0202' || GEO == '020b' || GEO == '1f202a02a02a02a02a' || GEO == '1f2088888888888888' || GEO == '1f200a80a80a80a80a') && - // (GEO == '00' || GEO == '0202' || GEO == '020b' || GEO == '1f202a02a02a02a02a' || GEO == '1f2088888888888888' || GEO == '1f200a80a80a80a80a')) || - // (((_Bounded_ = true) && (NUMBER >= '0' && NUMBER <= '1000')) && geowave:intersects(GEO, 'POLYGON((-180 -90, 180 -90, 180 90, -180 90, -180 -90))') && - // (GEO == '00' || GEO == '0202' || GEO == '020b' || GEO == '1f202a02a02a02a02a' || GEO == '1f2088888888888888' || GEO == '1f200a80a80a80a80a') && (GEO - // == '00' || GEO == '0202' || GEO == '020b' || GEO == '1f202a02a02a02a02a' || GEO == '1f2088888888888888' || GEO == '1f200a80a80a80a80a'))) && GENDER - // == 'male' && (NOME == 'this' || NOME == 'that') && !filter:includeRegex(ETA, 'blah') && (LOCATION == 'chicago' || LOCATION == 'newyork' || LOCATION - // == 'newjersey')"); - - Assert.assertTrue(TreeEqualityVisitor.isEqual(expectedQuery, logic.getConfig().getQueryTree())); + + assertTrue(TreeEqualityVisitor.isEqual(expectedQuery, logic.getConfig().getQueryTree())); } - @Test - public void testNestedOrExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testNestedOrExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testNestedOrExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && ( LOCATION == 'newyork' || (filter:isNull(MAGIC) || LOCATION == 'chicago'))"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && ( LOCATION == 'newyork' || (filter:isNull(MAGIC) || LOCATION == 'chicago'))", + extraParameters); } - @Test - public void testMethodNoExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testMethodNoExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testMethodNoExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && ( AGE.size() > 1 || AGE == '18')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && ( AGE.size() > 1 || AGE == '18')", extraParameters); } - @Test - public void testNumericExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testNumericExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testNumericExpansion"); - } - String[] queryStrings = {"BAIL=~'12340.*?'"}; - @SuppressWarnings("unchecked") // SOPRANO is the only one with a 0 after the 1234 - List[] expectedLists = new List[] {Arrays.asList("SOPRANO")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("SOPRANO"), "BAIL=~'12340.*?'", extraParameters); String expectedQueryStr = "(BAIL == '+eE1.2345' || BAIL == '+fE1.23401') && ((_Eval_ = true) && (BAIL =~ '12340.*?'))"; String plan = JexlFormattedStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertTrue("Expected equality: " + expectedQueryStr + " vs " + plan, - TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree())); + assertTrue(TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree()), + "Expected equality: " + expectedQueryStr + " vs " + plan); } - @Test - public void testNumericExpansionIndexOnly() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testNumericExpansionIndexOnly(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testNumericExpansionIndexOnly"); - } - String[] queryStrings = {"SENTENCE_DAYS=~'4015\\.0*'"}; - @SuppressWarnings("unchecked") // SOPRANO is the only one with a 0 after the 1234 - List[] expectedLists = new List[] {Arrays.asList("CAPONE")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "SENTENCE_DAYS=~'4015\\.0*'", extraParameters); String expectedQueryStr = "SENTENCE_DAYS == '+dE4.015'"; String plan = JexlFormattedStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertTrue("Expected equality: " + expectedQueryStr + " vs " + plan, - TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree())); + assertTrue(TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree()), + "Expected equality: " + expectedQueryStr + " vs " + plan); } - @Test - public void testAnyfieldNumericExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testAnyfieldNumericExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); logic.getConfig().setExcludeUnfieldedTypes(Collections.emptyList()); - if (log.isDebugEnabled()) { - log.debug("testAnyfieldNumericExpansion"); - } - String[] queryStrings = {"_ANYFIELD_ =~'12340.*?'"}; - @SuppressWarnings("unchecked") // SOPRANO is the only one with a 0 after the 1234 - List[] expectedLists = new List[] {Arrays.asList("SOPRANO")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("SOPRANO"), "_ANYFIELD_ =~'12340.*?'", extraParameters); String expectedQueryStr = "(BAIL == '+eE1.2345' || BAIL == '+fE1.23401') && ((_Eval_ = true) && (_ANYFIELD_ =~ '12340.*?'))"; String plan = JexlFormattedStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertTrue("Expected equality: " + expectedQueryStr + " vs " + plan, - TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree())); + assertTrue(TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree()), + "Expected equality: " + expectedQueryStr + " vs " + plan); } - @Test - public void testAnyfieldTypeExclusion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testAnyfieldTypeExclusion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testAnyfieldNumericExpansion"); - } - String[] queryStrings = {"_ANYFIELD_ =~'12340.*?'"}; // ANYFIELD numeric regex normalization is no longer used, so expect no results for this query - List expectedLists = new ArrayList<>(); - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists, queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(new ArrayList<>(), "_ANYFIELD_ =~'12340.*?'", extraParameters); // No longer expect normalized numeric regexes for ANYFIELD String expectedQueryStr = "_NOFIELD_ =~ '12340.*?'"; String plan = JexlFormattedStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertTrue("Expected equality: " + expectedQueryStr + " vs " + plan, - TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree())); + assertTrue(TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree()), + "Expected equality: " + expectedQueryStr + " vs " + plan); } - @Test - public void testLeadingNumericExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testLeadingNumericExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testLeadingNumericExpansion"); - } - String[] queryStrings = {"(UUID == 'capone' || UUID == 'soprano') && BAIL=~'.*?05'"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "(UUID == 'capone' || UUID == 'soprano') && BAIL=~'.*?05'", extraParameters); String expectedQueryStr = "(UUID == 'capone' || UUID == 'soprano') && ((_Eval_ = true) && (BAIL =~ '.*?05'))"; String plan = JexlFormattedStringBuildingVisitor.buildQuery(logic.getConfig().getQueryTree()); - Assert.assertTrue("Expected equality: " + expectedQueryStr + " vs " + plan, - TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree())); + assertTrue(TreeEqualityVisitor.isEqual(JexlASTHelper.parseJexlQuery(expectedQueryStr), logic.getConfig().getQueryTree()), + "Expected equality: " + expectedQueryStr + " vs " + plan); } - @Test - public void testMethodExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testMethodExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testMethodExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && ( QUOTE.size() == 1 || QUOTE == 'kind')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && ( QUOTE.size() == 1 || QUOTE == 'kind')", extraParameters); } - @Test - public void testNonEventExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testNonEventExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testNonEventExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && (QUOTE == 'kind'|| BIRTH_DATE == '123')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (QUOTE == 'kind'|| BIRTH_DATE == '123')", extraParameters); } - @Test - public void testFilterExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testFilterExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testFilterExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind')", extraParameters); } - @Test - public void testDisableExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testDisableExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); ((DefaultQueryPlanner) logic.getQueryPlanner()).setExecutableExpansion(false); - if (log.isDebugEnabled()) { - log.debug("testDisableExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind')", extraParameters); } - @Test - public void testDelayedBridgeExpansion() throws Exception { + private static Stream delayedBridgeExpansionArgs() { + // @formatter:off + Object[][] cases = { + {"UUID == 'capone' && ( LOCATION == 'newyork' || !(filter:isNull(MAGIC) || LOCATION == 'chicago'))", Arrays.asList()}, + {"UUID == 'capone' && ( LOCATION == 'newyork' || !filter:isNull(MAGIC) || LOCATION == 'chicago')", Arrays.asList("CAPONE")}, + }; + // @formatter:on + return Stream.of(WhatKindaRange.values()).flatMap(range -> Stream.of(cases).map(c -> Arguments.of(range, c[0], c[1]))); + } + + @ParameterizedTest + @MethodSource("delayedBridgeExpansionArgs") + public void testDelayedBridgeExpansion(WhatKindaRange range, String query, List expected) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testDelayedBridgeExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && ( LOCATION == 'newyork' || !(filter:isNull(MAGIC) || LOCATION == 'chicago'))", - "UUID == 'capone' && ( LOCATION == 'newyork' || !filter:isNull(MAGIC) || LOCATION == 'chicago')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList(), Arrays.asList("CAPONE")}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(expected, query, extraParameters); } - @Test - public void testMultipleExpansionsRequired() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testMultipleExpansionsRequired(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); logic.setIntermediateMaxTermThreshold(15); - if (log.isDebugEnabled()) { - log.debug("testMultipleExpansionsRequired"); - } - String[] queryStrings = {"UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind') && (QUOTE == 'kind'|| BIRTH_DATE == '123')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), + "UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind') && (QUOTE == 'kind'|| BIRTH_DATE == '123')", + extraParameters); } - @Test - public void testMinimumExpansion() throws Exception { + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testMinimumExpansion(WhatKindaRange range) throws Exception { + setupLogic(range); + Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); extraParameters.put("hit.list", "true"); - if (log.isDebugEnabled()) { - log.debug("testMinimumExpansion"); - } - String[] queryStrings = {"UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind' || BIRTH_DATE == '123')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } + runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind' || BIRTH_DATE == '123')", + extraParameters); + } + + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testIndexOnlyNoType(WhatKindaRange range) throws Exception { + setupLogic(range); + + Map extraParameters = new HashMap<>(); + extraParameters.put("include.grouping.context", "true"); + extraParameters.put("hit.list", "true"); + + runTestQuery(Arrays.asList("CAPONE"), "(UUID == 'capone' && SENTENCE == '11y')", extraParameters); + } + + @ParameterizedTest + @EnumSource(WhatKindaRange.class) + public void testTypedAndNotIndexed(WhatKindaRange range) throws Exception { + setupLogic(range); + + Map extraParameters = new HashMap<>(); + extraParameters.put("include.grouping.context", "true"); + extraParameters.put("hit.list", "true"); + + runTestQuery(Arrays.asList("CAPONE"), "(UUID == 'capone' && BIRTH_DATE == '1910-12-28T00:00:05.000Z')", extraParameters); } + // The tests below are pure unit tests of ExecutableExpansionVisitor/ExecutableDeterminationVisitor against + // mocked configuration/metadata - they never touch the ingested data or query logic, so unlike the tests + // above there is no SHARD/DOCUMENT range to parameterize over. + @Test public void testMinimumExpansionParse() throws Exception { // make sure this works when references/referenceExpressions are/aren't included @@ -642,9 +480,9 @@ public void testMinimumExpansionParse() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); - Assert.assertFalse(JexlStringBuildingVisitor.buildQuery(queryTree).equals(JexlStringBuildingVisitor.buildQuery(newTree))); + assertFalse(JexlStringBuildingVisitor.buildQuery(queryTree).equals(JexlStringBuildingVisitor.buildQuery(newTree))); String expected = "(QUOTE == 'kind' && UUID == 'capone') || ((filter:includeRegex(QUOTE, '.*kind.*') || BIRTH_DATE == '123') && UUID == 'capone')"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQuery(newTree)); + assertEquals(expected, JexlStringBuildingVisitor.buildQuery(newTree)); } } @@ -669,7 +507,7 @@ public void testArbitraryNodeExpansionFailNoFlatten() throws Exception { ExecutableExpansionVisitor visitor = new ExecutableExpansionVisitor(config, helper); Object data = queryTree.jjtGetChild(0).childrenAccept(visitor, null); - Assert.assertFalse(data instanceof ExecutableExpansionVisitor.ExpansionTracker); + assertFalse(data instanceof ExecutableExpansionVisitor.ExpansionTracker); } } @@ -696,7 +534,7 @@ public void testArbitraryNodeExpansionFlatten() throws Exception { rebuilt.jjtGetChild(0).jjtAccept(visitor, null); String expected = "(QUOTE == 'kind' && UUID == 'capone') || ((filter:includeRegex(QUOTE, '.*kind.*') || BIRTH_DATE == '123') && UUID == 'capone')"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQuery(rebuilt)); + assertEquals(expected, JexlStringBuildingVisitor.buildQuery(rebuilt)); } } @@ -722,9 +560,9 @@ public void testNestedExpansionWithFailures() throws Exception { ASTJexlScript rebuilt = TreeFlatteningRebuildingVisitor.flatten(queryTree); rebuilt.jjtGetChild(0).jjtAccept(visitor, null); - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(rebuilt, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(rebuilt, config, helper)); String expected = "(QUOTE == 'kind' && UUID == 'A') || (BIRTH_DATE == '123' && QUOTE == 'kind' && !(filter:includeRegex(QUOTE, '.*unkind.*') || BIRTH_DATE == '555') && UUID == 'A') || (BIRTH_DATE == '234' && UUID == 'A')"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(rebuilt)); + assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(rebuilt)); } } @@ -755,17 +593,18 @@ public void testExceededThresholdExpansionExternal() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), JexlStringBuildingVisitor.buildQuery(queryTree).equals( - "((_Value_ = true) && (UUID == 'capone')) && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || BIRTH_DATE == '123')")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree).equals( + "((_Value_ = true) && (UUID == 'capone')) && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || BIRTH_DATE == '123')"), + JexlStringBuildingVisitor.buildQuery(queryTree)); // not executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // it looks like what we'd expect String expected = "(QUOTE == 'kind' && ((_Value_ = true) && (UUID == 'capone'))) || " + "((filter:includeRegex(QUOTE, '.*kind.*') || BIRTH_DATE == '123') && ((_Value_ = true) && (UUID == 'capone')))"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); + assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); } } @@ -803,19 +642,19 @@ public void testExceededThresholdExpansionInternal() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), - JexlStringBuildingVisitor.buildQuery(queryTree) - .equals("UUID == 'capone' && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || " - + "((_Value_ = true) && (BIRTH_DATE == '123')))")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree) + .equals("UUID == 'capone' && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || " + + "((_Value_ = true) && (BIRTH_DATE == '123')))"), + JexlStringBuildingVisitor.buildQuery(queryTree)); // not executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // it looks like what we'd expect String expected = "(QUOTE == 'kind' && UUID == 'capone') || " + "(((_Value_ = true) && (BIRTH_DATE == '123')) && UUID == 'capone') || " + "(filter:includeRegex(QUOTE, '.*kind.*') && UUID == 'capone')"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); + assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); } } @@ -859,13 +698,13 @@ public void testExceededOrThresholdExpansion() throws Exception { String id = queryString.substring(queryString.indexOf("id = '") + 6, queryString.indexOf("') && (field")); // included ExceededValueThresholdMarker before - Assert.assertTrue(queryString, queryString.equals("UUID == 'capone' && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || " - + "((_List_ = true) && ((id = '" + id + "') && (field = 'BIRTH_DATE') && (params = '{\"values\":[\"123\",\"234\",\"345\"]}'))))")); + assertTrue(queryString.equals("UUID == 'capone' && (filter:includeRegex(QUOTE, '.*kind.*') || QUOTE == 'kind' || " + "((_List_ = true) && ((id = '" + + id + "') && (field = 'BIRTH_DATE') && (params = '{\"values\":[\"123\",\"234\",\"345\"]}'))))"), queryString); // not executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); queryString = JexlStringBuildingVisitor.buildQuery(newTree); id = queryString.substring(queryString.indexOf("id = '") + 6, queryString.indexOf("') && (field")); @@ -875,7 +714,7 @@ public void testExceededOrThresholdExpansion() throws Exception { String expected = "(QUOTE == 'kind' && UUID == 'capone') || " + "(((_List_ = true) && ((id = '" + id + "') && (field = 'BIRTH_DATE') && (params = '{\"values\":[\"123\",\"234\",\"345\"]}'))) && UUID == 'capone') || " + "(filter:includeRegex(QUOTE, '.*kind.*') && UUID == 'capone')"; - Assert.assertEquals(expected, queryString); + assertEquals(expected, queryString); } } @@ -900,21 +739,23 @@ public void testExceededOrThresholdCannotExpand() throws Exception { if (queryTree == origQueryTree) { // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), JexlStringBuildingVisitor.buildQuery(queryTree).equals( - "UUID == 'capone' && (((_List_ = true) && (((id = 'some-bogus-id') && (field = 'QUOTE') && (params = '{\"values\":[\"a\",\"b\",\"c\"]}')))))")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree).equals( + "UUID == 'capone' && (((_List_ = true) && (((id = 'some-bogus-id') && (field = 'QUOTE') && (params = '{\"values\":[\"a\",\"b\",\"c\"]}')))))"), + JexlStringBuildingVisitor.buildQuery(queryTree)); } else { // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), JexlStringBuildingVisitor.buildQuery(queryTree).equals( - "UUID == 'capone' && (_List_ = true) && (id = 'some-bogus-id') && (field = 'QUOTE') && (params = '{\"values\":[\"a\",\"b\",\"c\"]}')")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree).equals( + "UUID == 'capone' && (_List_ = true) && (id = 'some-bogus-id') && (field = 'QUOTE') && (params = '{\"values\":[\"a\",\"b\",\"c\"]}')"), + JexlStringBuildingVisitor.buildQuery(queryTree)); } // starts off executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(newTree), - JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree))); + assertTrue(JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree)), + JexlStringBuildingVisitor.buildQuery(newTree)); } } @@ -943,16 +784,17 @@ public void testDelayed() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), JexlStringBuildingVisitor.buildQuery(queryTree) - .equals("UUID == 'capone' && (QUOTE == 'kind' || " + "((_Delayed_ = true) && BIRTH_DATE == '123'))")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree) + .equals("UUID == 'capone' && (QUOTE == 'kind' || " + "((_Delayed_ = true) && BIRTH_DATE == '123'))"), + JexlStringBuildingVisitor.buildQuery(queryTree)); // starts off executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing String expected = "(QUOTE == 'kind' && UUID == 'capone') || (((_Delayed_ = true) && BIRTH_DATE == '123') && UUID == 'capone')"; - Assert.assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); + assertEquals(expected, JexlStringBuildingVisitor.buildQueryWithoutParse(newTree)); } } @@ -983,16 +825,17 @@ public void testDelayedDoubleExpansion() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // included ExceededValueThresholdMarker before - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree), JexlStringBuildingVisitor.buildQuery(queryTree) - .equals("UUID == 'capone' && (((_Delayed_ = true) && QUOTE == 'kind') || " + "((_Delayed_ = true) && BIRTH_DATE == '123'))")); + assertTrue(JexlStringBuildingVisitor.buildQuery(queryTree) + .equals("UUID == 'capone' && (((_Delayed_ = true) && QUOTE == 'kind') || " + "((_Delayed_ = true) && BIRTH_DATE == '123'))"), + JexlStringBuildingVisitor.buildQuery(queryTree)); // starts off executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(newTree), - JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree))); + assertTrue(JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree)), + JexlStringBuildingVisitor.buildQuery(newTree)); } } @@ -1026,12 +869,12 @@ public void testSingleOr() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // starts executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(newTree), - JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree))); + assertTrue(JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree)), + JexlStringBuildingVisitor.buildQuery(newTree)); } } @@ -1069,12 +912,12 @@ public void testSingleOrNonExecutableCantFix() throws Exception { ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); // starts executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); // what came out is executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(newTree), - JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree))); + assertTrue(JexlStringBuildingVisitor.buildQuery(newTree).equals(JexlStringBuildingVisitor.buildQuery(queryTree)), + JexlStringBuildingVisitor.buildQuery(newTree)); } } @@ -1087,7 +930,7 @@ public void testNoReferenceOrReferenceExpressions() throws Exception { for (ASTJexlScript queryTree : Arrays.asList(origQueryTree, derefQueryTree)) { // strip reference/referenceExpressions - queryTree = TreeFlatteningRebuildingVisitor.flattenAll(queryTree); + ASTJexlScript flattened = TreeFlatteningRebuildingVisitor.flattenAll(queryTree); ShardQueryConfiguration config = Mockito.mock(ShardQueryConfiguration.class); MetadataHelper helper = Mockito.mock(MetadataHelper.class); @@ -1098,44 +941,17 @@ public void testNoReferenceOrReferenceExpressions() throws Exception { Mockito.doReturn(indexedFields).when(config).getIndexedFields(); - ASTJexlScript newTree = ExecutableExpansionVisitor.expand(queryTree, config, helper); + ASTJexlScript newTree = ExecutableExpansionVisitor.expand(flattened, config, helper); // starts executable - Assert.assertFalse(ExecutableDeterminationVisitor.isExecutable(queryTree, config, helper)); + assertFalse(ExecutableDeterminationVisitor.isExecutable(flattened, config, helper)); // what came out is executable - Assert.assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); + assertTrue(ExecutableDeterminationVisitor.isExecutable(newTree, config, helper)); // the visitor changed nothing - Assert.assertTrue(JexlStringBuildingVisitor.buildQuery(newTree), - JexlStringBuildingVisitor.buildQuery(newTree).equals("(QUOTE == 'kind' && UUID == 'capone') || " - + "((filter:includeRegex(QUOTE, '.*kind.*') || BIRTH_DATE == '123') && UUID == 'capone')")); - } - } - - @Test - public void testIndexOnlyNoType() throws Exception { - Map extraParameters = new HashMap<>(); - extraParameters.put("include.grouping.context", "true"); - extraParameters.put("hit.list", "true"); - - String[] queryStrings = {"(UUID == 'capone' && SENTENCE == '11y')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); - } - } - - @Test - public void testTypedAndNotIndexed() throws Exception { - Map extraParameters = new HashMap<>(); - extraParameters.put("include.grouping.context", "true"); - extraParameters.put("hit.list", "true"); - - String[] queryStrings = {"(UUID == 'capone' && BIRTH_DATE == '1910-12-28T00:00:05.000Z')"}; - @SuppressWarnings("unchecked") - List[] expectedLists = new List[] {Arrays.asList("CAPONE"), Arrays.asList()}; - for (int i = 0; i < queryStrings.length; i++) { - runTestQuery(expectedLists[i], queryStrings[i], format.parse("20091231"), format.parse("20150101"), extraParameters); + assertTrue(JexlStringBuildingVisitor.buildQuery(newTree) + .equals("(QUOTE == 'kind' && UUID == 'capone') || " + + "((filter:includeRegex(QUOTE, '.*kind.*') || BIRTH_DATE == '123') && UUID == 'capone')"), + JexlStringBuildingVisitor.buildQuery(newTree)); } } From a31b4bd695c359809a8dd26ab59589915afb7461 Mon Sep 17 00:00:00 2001 From: Moriarty <22225248+apmoriarty@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:01:49 +0000 Subject: [PATCH 2/2] Drive ExecutableExpansionVisitorTest variants via index table types, not WhatKindaRange The prior migration ingested both WhatKindaRange variants into cached AccumuloClients and threaded a range parameter through the data-driven @ParameterizedTest methods, duplicating variance that AbstractQueryTest already provides by iterating index table types. Ingest data once and drop the range parameter; the data-driven methods convert back to plain @Test methods, and testDelayedBridgeExpansion keeps only its query/expected parameterization dimension. The pure unit tests against mocked configuration were already unaffected by range and are left unchanged. Co-Authored-By: Claude Sonnet 5 --- .../ExecutableExpansionVisitorTest.java | 160 ++++++++---------- 1 file changed, 67 insertions(+), 93 deletions(-) diff --git a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java index 9e36261113d..ba2b3aec7ef 100644 --- a/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java +++ b/warehouse/query-core/src/test/java/datawave/query/jexl/visitors/ExecutableExpansionVisitorTest.java @@ -11,7 +11,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -36,7 +35,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -63,7 +61,6 @@ import datawave.query.util.MetadataHelper; import datawave.query.util.MockMetadataHelper; import datawave.query.util.WiseGuysIngest; -import datawave.query.util.WiseGuysIngest.WhatKindaRange; import datawave.table.constants.TableName; @ExtendWith(SpringExtension.class) @@ -81,7 +78,7 @@ public class ExecutableExpansionVisitorTest extends AbstractQueryTest { private static final Logger log = Logger.getLogger(ExecutableExpansionVisitorTest.class); private static final Authorizations auths = new Authorizations("ALL"); - private static final Map clients = new EnumMap<>(WhatKindaRange.class); + private static AccumuloClient sharedClient; @Autowired @Qualifier("EventQuery") @@ -109,27 +106,22 @@ protected void extraAssertions() { @BeforeAll public static void beforeAll() throws Exception { - for (WhatKindaRange range : WhatKindaRange.values()) { - QueryTestTableHelper qtth = new QueryTestTableHelper(ExecutableExpansionVisitorTest.class.toString() + "-" + range, log); - AccumuloClient client = qtth.client; + QueryTestTableHelper qtth = new QueryTestTableHelper(ExecutableExpansionVisitorTest.class.toString(), log); + sharedClient = qtth.client; - WiseGuysIngest.writeItAll(client, range); - PrintUtility.printTable(client, auths, TableName.SHARD); - PrintUtility.printTable(client, auths, TableName.SHARD_INDEX); - PrintUtility.printTable(client, auths, QueryTestTableHelper.METADATA_TABLE_NAME); - PrintUtility.printTable(client, auths, QueryTestTableHelper.MODEL_TABLE_NAME); - - clients.put(range, client); - } + WiseGuysIngest.writeItAll(sharedClient, WiseGuysIngest.WhatKindaRange.DOCUMENT); + PrintUtility.printTable(sharedClient, auths, TableName.SHARD); + PrintUtility.printTable(sharedClient, auths, TableName.SHARD_INDEX); + PrintUtility.printTable(sharedClient, auths, QueryTestTableHelper.METADATA_TABLE_NAME); + PrintUtility.printTable(sharedClient, auths, QueryTestTableHelper.MODEL_TABLE_NAME); } - private void setupLogic(WhatKindaRange range) { - setClientForTest(clients.get(range)); + private void setupLogic() { + setClientForTest(sharedClient); logic.setFullTableScanEnabled(false); logic.setMaxDepthThreshold(11); logic.setInitialMaxTermThreshold(12); logic.setFinalMaxTermThreshold(12); - logic.setCollapseUids(range == WhatKindaRange.SHARD); } private void runTestQuery(List expected, String querystr, Map extraParms) throws Exception { @@ -144,10 +136,9 @@ private void runTestQuery(List expected, String querystr, Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -157,10 +148,9 @@ public void testMixedIndexOnly(WhatKindaRange range) { () -> runTestQuery(Arrays.asList(), "filter:isNull(LOCATION) || LOCATION == 'chicago'", extraParameters)); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -169,10 +159,9 @@ public void testExpansion(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:isNull(MAGIC) || LOCATION == 'chicago')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testGeowaveExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testGeowaveExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -215,10 +204,9 @@ public void testGeowaveExpansion(WhatKindaRange range) throws Exception { assertTrue(TreeEqualityVisitor.isEqual(expectedQuery, logic.getConfig().getQueryTree())); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testNestedOrExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testNestedOrExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -228,10 +216,9 @@ public void testNestedOrExpansion(WhatKindaRange range) throws Exception { extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testMethodNoExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testMethodNoExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -240,10 +227,9 @@ public void testMethodNoExpansion(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && ( AGE.size() > 1 || AGE == '18')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testNumericExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testNumericExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -258,10 +244,9 @@ public void testNumericExpansion(WhatKindaRange range) throws Exception { "Expected equality: " + expectedQueryStr + " vs " + plan); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testNumericExpansionIndexOnly(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testNumericExpansionIndexOnly() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -276,10 +261,9 @@ public void testNumericExpansionIndexOnly(WhatKindaRange range) throws Exception "Expected equality: " + expectedQueryStr + " vs " + plan); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testAnyfieldNumericExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testAnyfieldNumericExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -296,10 +280,9 @@ public void testAnyfieldNumericExpansion(WhatKindaRange range) throws Exception "Expected equality: " + expectedQueryStr + " vs " + plan); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testAnyfieldTypeExclusion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testAnyfieldTypeExclusion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -315,10 +298,9 @@ public void testAnyfieldTypeExclusion(WhatKindaRange range) throws Exception { "Expected equality: " + expectedQueryStr + " vs " + plan); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testLeadingNumericExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testLeadingNumericExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -332,10 +314,9 @@ public void testLeadingNumericExpansion(WhatKindaRange range) throws Exception { "Expected equality: " + expectedQueryStr + " vs " + plan); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testMethodExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testMethodExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -344,10 +325,9 @@ public void testMethodExpansion(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && ( QUOTE.size() == 1 || QUOTE == 'kind')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testNonEventExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testNonEventExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -356,10 +336,9 @@ public void testNonEventExpansion(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (QUOTE == 'kind'|| BIRTH_DATE == '123')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testFilterExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testFilterExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -368,10 +347,9 @@ public void testFilterExpansion(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "UUID == 'capone' && (filter:includeRegex(QUOTE,'.*kind.*') || QUOTE == 'kind')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testDisableExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testDisableExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -389,13 +367,13 @@ private static Stream delayedBridgeExpansionArgs() { {"UUID == 'capone' && ( LOCATION == 'newyork' || !filter:isNull(MAGIC) || LOCATION == 'chicago')", Arrays.asList("CAPONE")}, }; // @formatter:on - return Stream.of(WhatKindaRange.values()).flatMap(range -> Stream.of(cases).map(c -> Arguments.of(range, c[0], c[1]))); + return Stream.of(cases).map(c -> Arguments.of(c[0], c[1])); } @ParameterizedTest @MethodSource("delayedBridgeExpansionArgs") - public void testDelayedBridgeExpansion(WhatKindaRange range, String query, List expected) throws Exception { - setupLogic(range); + public void testDelayedBridgeExpansion(String query, List expected) throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -404,10 +382,9 @@ public void testDelayedBridgeExpansion(WhatKindaRange range, String query, List< runTestQuery(expected, query, extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testMultipleExpansionsRequired(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testMultipleExpansionsRequired() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -420,10 +397,9 @@ public void testMultipleExpansionsRequired(WhatKindaRange range) throws Exceptio extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testMinimumExpansion(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testMinimumExpansion() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -433,10 +409,9 @@ public void testMinimumExpansion(WhatKindaRange range) throws Exception { extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testIndexOnlyNoType(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testIndexOnlyNoType() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true"); @@ -445,10 +420,9 @@ public void testIndexOnlyNoType(WhatKindaRange range) throws Exception { runTestQuery(Arrays.asList("CAPONE"), "(UUID == 'capone' && SENTENCE == '11y')", extraParameters); } - @ParameterizedTest - @EnumSource(WhatKindaRange.class) - public void testTypedAndNotIndexed(WhatKindaRange range) throws Exception { - setupLogic(range); + @Test + public void testTypedAndNotIndexed() throws Exception { + setupLogic(); Map extraParameters = new HashMap<>(); extraParameters.put("include.grouping.context", "true");