From 6278dcaca5c7a97aeb0d9ae7af926b1a5e3c092e Mon Sep 17 00:00:00 2001 From: Gertjan Al <12525070+gertjanal@users.noreply.github.com> Date: Thu, 23 Oct 2025 21:28:28 +0200 Subject: [PATCH] Added `isExecuteImmediate` selector to resource groups. Requires resource group DB update for table `selectors`: `is_execute_immediate VARCHAR(6)` --- .../io/trino/dispatcher/DispatchManager.java | 3 +- .../io/trino/execution/QueryPreparer.java | 16 +++++++- .../spi/resourcegroups/SelectionCriteria.java | 11 +++++- docs/src/main/sphinx/admin/resource-groups.md | 5 +++ .../AbstractResourceConfigurationManager.java | 1 + .../plugin/resourcegroups/SelectorSpec.java | 15 +++++++- .../plugin/resourcegroups/StaticSelector.java | 4 ++ .../DbResourceGroupConfigurationManager.java | 1 + .../resourcegroups/db/ResourceGroupsDao.java | 3 +- .../resourcegroups/db/SelectorRecord.java | 13 ++++++- ...FileResourceGroupConfigurationManager.java | 17 +++++---- .../TestResourceGroupIdTemplate.java | 20 +++++----- .../resourcegroups/TestStaticSelector.java | 38 ++++++++++++++++++- .../resourcegroups/TestingResourceGroups.java | 5 +++ ...stDbResourceGroupConfigurationManager.java | 11 +++--- .../db/TestDbSourceExactMatchSelector.java | 10 ++--- .../db/TestResourceGroupsDao.java | 13 +++++-- 17 files changed, 146 insertions(+), 40 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/dispatcher/DispatchManager.java b/core/trino-main/src/main/java/io/trino/dispatcher/DispatchManager.java index b1d05563ad28..11fdbf34890a 100644 --- a/core/trino-main/src/main/java/io/trino/dispatcher/DispatchManager.java +++ b/core/trino-main/src/main/java/io/trino/dispatcher/DispatchManager.java @@ -235,7 +235,8 @@ private void createQueryInternal(QueryId queryId, Span querySpan, Slug slug, sessionContext.getSource(), sessionContext.getClientTags(), sessionContext.getResourceEstimates(), - queryType)); + queryType, + preparedQuery.isExecuteImmediate())); // apply system default session properties (does not override user set properties) session = sessionPropertyDefaults.newSessionWithDefaultProperties(session, queryType, selectionContext.getResourceGroupId()); diff --git a/core/trino-main/src/main/java/io/trino/execution/QueryPreparer.java b/core/trino-main/src/main/java/io/trino/execution/QueryPreparer.java index dc093feb4a01..aa68d5cc2542 100644 --- a/core/trino-main/src/main/java/io/trino/execution/QueryPreparer.java +++ b/core/trino-main/src/main/java/io/trino/execution/QueryPreparer.java @@ -60,11 +60,13 @@ public PreparedQuery prepareQuery(Session session, Statement wrappedStatement) { Statement statement = wrappedStatement; Optional prepareSql = Optional.empty(); + boolean isExecuteImmediate = false; if (statement instanceof Execute executeStatement) { prepareSql = Optional.of(session.getPreparedStatementFromExecute(executeStatement)); statement = sqlParser.createStatement(prepareSql.get()); } else if (statement instanceof ExecuteImmediate executeImmediateStatement) { + isExecuteImmediate = true; statement = sqlParser.createStatement( executeImmediateStatement.getStatement().getValue(), executeImmediateStatement.getStatement().getLocation().orElseThrow()); @@ -86,7 +88,7 @@ else if (wrappedStatement instanceof ExecuteImmediate executeImmediateStatement) } validateParameters(statement, parameters); - return new PreparedQuery(statement, parameters, prepareSql); + return new PreparedQuery(statement, parameters, prepareSql, isExecuteImmediate); } private static void validateParameters(Statement node, List parameterValues) @@ -105,12 +107,19 @@ public static class PreparedQuery private final Statement statement; private final List parameters; private final Optional prepareSql; + private final boolean isExecuteImmediate; public PreparedQuery(Statement statement, List parameters, Optional prepareSql) + { + this(statement, parameters, prepareSql, false); + } + + public PreparedQuery(Statement statement, List parameters, Optional prepareSql, boolean isExecuteImmediate) { this.statement = requireNonNull(statement, "statement is null"); this.parameters = ImmutableList.copyOf(requireNonNull(parameters, "parameters is null")); this.prepareSql = requireNonNull(prepareSql, "prepareSql is null"); + this.isExecuteImmediate = isExecuteImmediate; } public Statement getStatement() @@ -127,5 +136,10 @@ public Optional getPrepareSql() { return prepareSql; } + + public boolean isExecuteImmediate() + { + return isExecuteImmediate; + } } } diff --git a/core/trino-spi/src/main/java/io/trino/spi/resourcegroups/SelectionCriteria.java b/core/trino-spi/src/main/java/io/trino/spi/resourcegroups/SelectionCriteria.java index 20cd7b5a2d10..6eceeafe5a9c 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/resourcegroups/SelectionCriteria.java +++ b/core/trino-spi/src/main/java/io/trino/spi/resourcegroups/SelectionCriteria.java @@ -32,6 +32,7 @@ public final class SelectionCriteria private final Set clientTags; private final ResourceEstimates resourceEstimates; private final Optional queryType; + private final boolean isExecuteImmediate; public SelectionCriteria( boolean authenticated, @@ -42,7 +43,8 @@ public SelectionCriteria( Optional source, Set clientTags, ResourceEstimates resourceEstimates, - Optional queryType) + Optional queryType, + boolean isExecuteImmediate) { this.authenticated = authenticated; this.user = requireNonNull(user, "user is null"); @@ -53,6 +55,7 @@ public SelectionCriteria( this.clientTags = Set.copyOf(requireNonNull(clientTags, "clientTags is null")); this.resourceEstimates = requireNonNull(resourceEstimates, "resourceEstimates is null"); this.queryType = requireNonNull(queryType, "queryType is null"); + this.isExecuteImmediate = isExecuteImmediate; } public boolean isAuthenticated() @@ -100,6 +103,11 @@ public Optional getQueryType() return queryType; } + public boolean isExecuteImmediate() + { + return isExecuteImmediate; + } + @Override public String toString() { @@ -113,6 +121,7 @@ public String toString() .add("clientTags=" + clientTags) .add("resourceEstimates=" + resourceEstimates) .add("queryType=" + queryType) + .add("isExecuteImmediate=" + isExecuteImmediate) .toString(); } } diff --git a/docs/src/main/sphinx/admin/resource-groups.md b/docs/src/main/sphinx/admin/resource-groups.md index ff408d4eaa26..7c266b30f636 100644 --- a/docs/src/main/sphinx/admin/resource-groups.md +++ b/docs/src/main/sphinx/admin/resource-groups.md @@ -206,6 +206,11 @@ documentation](https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java - `clientTags` (optional): list of tags. To match, every tag in this list must be in the list of client-provided tags associated with the query. +- `isExecuteImmediate` (optional): Some clients use `EXECUTE IMMEDIATE ...` + to run quick queries directly. Use `true` when this selector should match a + `EXECUTE IMMEDIATE '...'` query. Use `false` to match all other + queries, omit to match any. + - `group` (required): the group these queries will run in. All rules within a single selector are combined using a logical `AND`. Therefore diff --git a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/AbstractResourceConfigurationManager.java b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/AbstractResourceConfigurationManager.java index 974efca926df..3ff7b3f62dbb 100644 --- a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/AbstractResourceConfigurationManager.java +++ b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/AbstractResourceConfigurationManager.java @@ -108,6 +108,7 @@ protected List buildSelectors(ManagerSpec managerSpec) spec.getClientTags(), spec.getResourceEstimate(), spec.getQueryType(), + spec.isExecuteImmediate(), spec.getGroup())); } return selectors.build(); diff --git a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/SelectorSpec.java b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/SelectorSpec.java index 3797e015207b..17675a015451 100644 --- a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/SelectorSpec.java +++ b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/SelectorSpec.java @@ -34,6 +34,7 @@ public class SelectorSpec private final Optional queryType; private final Optional> clientTags; private final Optional selectorResourceEstimate; + private final Optional isExecuteImmediate; private final ResourceGroupIdTemplate group; @JsonCreator @@ -46,6 +47,7 @@ public SelectorSpec( @JsonProperty("queryType") Optional queryType, @JsonProperty("clientTags") Optional> clientTags, @JsonProperty("selectorResourceEstimate") Optional selectorResourceEstimate, + @JsonProperty("isExecuteImmediate") Optional isExecuteImmediate, @JsonProperty("group") ResourceGroupIdTemplate group) { this.userRegex = requireNonNull(userRegex, "userRegex is null"); @@ -56,6 +58,7 @@ public SelectorSpec( this.queryType = requireNonNull(queryType, "queryType is null"); this.clientTags = requireNonNull(clientTags, "clientTags is null"); this.selectorResourceEstimate = requireNonNull(selectorResourceEstimate, "selectorResourceEstimate is null"); + this.isExecuteImmediate = requireNonNull(isExecuteImmediate, "isExecuteImmediate is null"); this.group = requireNonNull(group, "group is null"); } @@ -99,6 +102,11 @@ public Optional getResourceEstimate() return selectorResourceEstimate; } + public Optional isExecuteImmediate() + { + return isExecuteImmediate; + } + public ResourceGroupIdTemplate getGroup() { return group; @@ -125,7 +133,8 @@ public boolean equals(Object other) sourceRegex.map(Pattern::pattern).equals(that.sourceRegex.map(Pattern::pattern))) && sourceRegex.map(Pattern::flags).equals(that.sourceRegex.map(Pattern::flags)) && queryType.equals(that.queryType) && - clientTags.equals(that.clientTags); + clientTags.equals(that.clientTags) && + isExecuteImmediate.equals(that.isExecuteImmediate); } @Override @@ -144,7 +153,8 @@ public int hashCode() sourceRegex.map(Pattern::pattern), sourceRegex.map(Pattern::flags), queryType, - clientTags); + clientTags, + isExecuteImmediate); } @Override @@ -164,6 +174,7 @@ public String toString() .add("sourceFlags", sourceRegex.map(Pattern::flags)) .add("queryType", queryType) .add("clientTags", clientTags) + .add("isExecuteImmediate", isExecuteImmediate) .toString(); } } diff --git a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/StaticSelector.java b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/StaticSelector.java index d29d3eea2ec2..2b682701edd0 100644 --- a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/StaticSelector.java +++ b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/StaticSelector.java @@ -54,6 +54,7 @@ public StaticSelector( Optional> clientTags, Optional selectorResourceEstimate, Optional queryType, + Optional isExecuteImmediate, ResourceGroupIdTemplate group) { this.userRegex = requireNonNull(userRegex, "userRegex is null"); @@ -64,6 +65,7 @@ public StaticSelector( requireNonNull(clientTags, "clientTags is null"); requireNonNull(selectorResourceEstimate, "selectorResourceEstimate is null"); requireNonNull(queryType, "queryType is null"); + requireNonNull(isExecuteImmediate, "isExecuteImmediate is null"); this.group = requireNonNull(group, "group is null"); HashSet variableNames = new HashSet<>(ImmutableList.of(USER_VARIABLE, SOURCE_VARIABLE)); @@ -92,6 +94,8 @@ public StaticSelector( new BasicMatcher(criteria -> selectorResourceEstimateValue.match(criteria.getResourceEstimates())))) .add(clientTags.map(clientTagsValue -> new BasicMatcher(criteria -> criteria.getTags().containsAll(clientTagsValue)))) + .add(isExecuteImmediate.map(isExecuteImmediateValue -> + new BasicMatcher(criteria -> isExecuteImmediateValue == criteria.isExecuteImmediate()))) .build() .stream() .flatMap(Optional::stream) // remove any empty optionals diff --git a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/DbResourceGroupConfigurationManager.java b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/DbResourceGroupConfigurationManager.java index 0cef0299738d..9d9e1dadfd69 100644 --- a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/DbResourceGroupConfigurationManager.java +++ b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/DbResourceGroupConfigurationManager.java @@ -391,6 +391,7 @@ private synchronized Map.Entry getResourceGroups(@Bind("environment") String environment); - @SqlQuery("SELECT S.resource_group_id, S.priority, S.user_regex, S.source_regex, S.original_user_regex, S.authenticated_user_regex, S.query_type, S.client_tags, S.selector_resource_estimate, S.user_group_regex\n" + + @SqlQuery("SELECT S.resource_group_id, S.priority, S.user_regex, S.source_regex, S.original_user_regex, S.authenticated_user_regex, S.query_type, S.client_tags, S.selector_resource_estimate, S.user_group_regex, S.is_execute_immediate\n" + "FROM selectors S\n" + "JOIN resource_groups R ON (S.resource_group_id = R.resource_group_id)\n" + "WHERE R.environment = :environment\n" + @@ -81,6 +81,7 @@ public interface ResourceGroupsDao " query_type VARCHAR(512),\n" + " client_tags VARCHAR(512),\n" + " selector_resource_estimate VARCHAR(1024),\n" + + " is_execute_immediate VARCHAR(6),\n" + " FOREIGN KEY (resource_group_id) REFERENCES resource_groups (resource_group_id)\n" + ")") void createSelectorsTable(); diff --git a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/SelectorRecord.java b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/SelectorRecord.java index 75528647ecbb..8f657e703fd4 100644 --- a/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/SelectorRecord.java +++ b/plugin/trino-resource-group-managers/src/main/java/io/trino/plugin/resourcegroups/db/SelectorRecord.java @@ -41,6 +41,7 @@ public class SelectorRecord private final Optional queryType; private final Optional> clientTags; private final Optional selectorResourceEstimate; + private final Optional isExecuteImmediate; public SelectorRecord( long resourceGroupId, @@ -52,7 +53,8 @@ public SelectorRecord( Optional sourceRegex, Optional queryType, Optional> clientTags, - Optional selectorResourceEstimate) + Optional selectorResourceEstimate, + Optional isExecuteImmediate) { this.resourceGroupId = resourceGroupId; this.priority = priority; @@ -64,6 +66,7 @@ public SelectorRecord( this.queryType = requireNonNull(queryType, "queryType is null"); this.clientTags = clientTags.map(ImmutableList::copyOf); this.selectorResourceEstimate = requireNonNull(selectorResourceEstimate, "selectorResourceEstimate is null"); + this.isExecuteImmediate = requireNonNull(isExecuteImmediate, "isExecuteImmediate is null"); } public long getResourceGroupId() @@ -116,6 +119,11 @@ public Optional getSelectorResourceEstimate() return selectorResourceEstimate; } + public Optional isExecuteImmediate() + { + return isExecuteImmediate; + } + public static class Mapper implements RowMapper { @@ -136,7 +144,8 @@ public SelectorRecord map(ResultSet resultSet, StatementContext context) Optional.ofNullable(resultSet.getString("source_regex")).map(Pattern::compile), Optional.ofNullable(resultSet.getString("query_type")), Optional.ofNullable(resultSet.getString("client_tags")).map(LIST_STRING_CODEC::fromJson), - Optional.ofNullable(resultSet.getString("selector_resource_estimate")).map(SELECTOR_RESOURCE_ESTIMATE_JSON_CODEC::fromJson)); + Optional.ofNullable(resultSet.getString("selector_resource_estimate")).map(SELECTOR_RESOURCE_ESTIMATE_JSON_CODEC::fromJson), + Optional.ofNullable(resultSet.getString("is_execute_immediate")).map(Boolean::parseBoolean)); } } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestFileResourceGroupConfigurationManager.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestFileResourceGroupConfigurationManager.java index 62c3165636c4..7aae3df58f50 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestFileResourceGroupConfigurationManager.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestFileResourceGroupConfigurationManager.java @@ -264,7 +264,8 @@ public void testDocsExample() Optional.of("jdbc#powerfulbi"), ImmutableSet.of("hipri"), EMPTY_RESOURCE_ESTIMATES, - Optional.of("select"))); + Optional.of("select"), + false)); assertThat(selectionContext.getResourceGroupId().toString()).isEqualTo("global.adhoc.bi-powerfulbi.Alice"); TestingResourceGroup resourceGroup = new TestingResourceGroup(selectionContext.getResourceGroupId()); manager.configure(resourceGroup, selectionContext); @@ -281,7 +282,8 @@ public void testDocsExample() Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, - Optional.empty())); + Optional.empty(), + false)); assertThat(selectionContext.getResourceGroupId().toString()).isEqualTo("global.adhoc.other.Amanda"); resourceGroup = new TestingResourceGroup(selectionContext.getResourceGroupId()); manager.configure(resourceGroup, selectionContext); @@ -339,7 +341,7 @@ private static ManagerSpec parseManagerSpec(String fileName) private static SelectionCriteria userAndSourceSelectionCriteria(String user, String source) { - return new SelectionCriteria(true, user, ImmutableSet.of(), user, Optional.empty(), Optional.of(source), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, user, ImmutableSet.of(), user, Optional.empty(), Optional.of(source), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } private static SelectionCriteria userSelectionCriteria(String user) @@ -349,17 +351,17 @@ private static SelectionCriteria userSelectionCriteria(String user) private static SelectionCriteria identitySelectionCriteria(String user, String originalUser, Optional authenticatedUser) { - return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, authenticatedUser, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, authenticatedUser, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } private static SelectionCriteria queryTypeSelectionCriteria(String queryType) { - return new SelectionCriteria(true, "test_user", ImmutableSet.of(), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.of(queryType)); + return new SelectionCriteria(true, "test_user", ImmutableSet.of(), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.of(queryType), false); } private static SelectionCriteria userGroupsSelectionCriteria(String... groups) { - return new SelectionCriteria(true, "test_user", ImmutableSet.copyOf(groups), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, "test_user", ImmutableSet.copyOf(groups), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } private static SelectionCriteria userAndUserGroupsSelectionCriteria(String user, String group, String... groups) @@ -375,6 +377,7 @@ private static SelectionCriteria userAndUserGroupsSelectionCriteria(String user, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, - Optional.empty()); + Optional.empty(), + false); } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestResourceGroupIdTemplate.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestResourceGroupIdTemplate.java index 2c6c62ab63bf..a090c82014d9 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestResourceGroupIdTemplate.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestResourceGroupIdTemplate.java @@ -48,8 +48,8 @@ public void testExtraction() ResourceGroupId expected = new ResourceGroupId(new ResourceGroupId(new ResourceGroupId(new ResourceGroupId("test"), "pipeline"), "job_testpipeline_user:user"), "user"); Pattern sourcePattern = Pattern.compile("scheduler.important.(?[^\\[]*).*"); - StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), template); - SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); + SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); assertThat(selector.match(context).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(expected)); } @@ -61,8 +61,8 @@ public void testNoSource() ResourceGroupId expected = new ResourceGroupId(new ResourceGroupId(new ResourceGroupId(new ResourceGroupId("test"), "pipeline"), "testpipeline"), "_s"); Pattern userPattern = Pattern.compile("scheduler.important.(?[^\\[]*).*"); - StaticSelector selector = new StaticSelector(Optional.of(userPattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); - SelectionCriteria context = new SelectionCriteria(true, "scheduler.important.testpipeline[5]", ImmutableSet.of(), "user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + StaticSelector selector = new StaticSelector(Optional.of(userPattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); + SelectionCriteria context = new SelectionCriteria(true, "scheduler.important.testpipeline[5]", ImmutableSet.of(), "user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); assertThat(selector.match(context).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(expected)); } @@ -72,8 +72,8 @@ public void testNoMatch() { ResourceGroupIdTemplate template = new ResourceGroupIdTemplate("test.pipeline.${pipeline}.${USER}"); Pattern sourcePattern = Pattern.compile("scheduler.important.(?[^\\[]*).*"); - StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); - SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); + SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); assertThat(selector.match(context)).isEmpty(); } @@ -84,8 +84,8 @@ public void testUnresolvedVariableLoadTime() assertThatThrownBy(() -> { ResourceGroupIdTemplate template = new ResourceGroupIdTemplate("test.pipeline.${pipeline}.${user}"); Pattern sourcePattern = Pattern.compile("scheduler.important.(?[^\\[]*).*"); - StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); - SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); + SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); selector.match(context); }) .isInstanceOf(IllegalArgumentException.class) @@ -98,8 +98,8 @@ public void testUnresolvedVariableRunTime() assertThatThrownBy(() -> { ResourceGroupIdTemplate template = new ResourceGroupIdTemplate("test.pipeline.${pipeline}.${USER}"); Pattern sourcePattern = Pattern.compile("scheduler.important.(testpipeline\\[|(?[^\\[]*)).*"); - StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), template); - SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + StaticSelector selector = new StaticSelector(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(sourcePattern), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), template); + SelectionCriteria context = new SelectionCriteria(true, "user", ImmutableSet.of(), "user", Optional.empty(), Optional.of("scheduler.important.testpipeline[5]"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); selector.match(context); }) .isInstanceOf(IllegalArgumentException.class) diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestStaticSelector.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestStaticSelector.java index 3f0c2a9afef7..58aaf2eeaee8 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestStaticSelector.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestStaticSelector.java @@ -50,6 +50,7 @@ public void testUserRegex() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); assertThat(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); @@ -69,6 +70,7 @@ public void testUserRegexCustomGroup() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo_${USER}_${suffix}")); assertThat(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES))).hasValueSatisfying(context -> { assertThat(context.getResourceGroupId()).isEqualTo(resourceGroupId); @@ -89,6 +91,7 @@ public void testOriginalUserRegex() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteriaUsers("userA", "originalUserA", null)).map(SelectionContext::getResourceGroupId)).hasValue(resourceGroupId); assertThat(selector.match(newSelectionCriteriaUsers("userA", "originalUserB", null)).map(SelectionContext::getResourceGroupId)).hasValue(resourceGroupId); @@ -108,6 +111,7 @@ public void testOriginalUserRegexCustomGroup() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo_${original}_${suffix}")); assertThat(selector.match(newSelectionCriteriaUsers("userA", "originalUserA", null))).hasValueSatisfying(context -> { assertThat(context.getResourceGroupId()).isEqualTo(resourceGroupId); @@ -128,6 +132,7 @@ public void testAuthenticatedUserRegex() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteriaUsers("userA", "userA", "authenticatedUserA")).map(SelectionContext::getResourceGroupId)).hasValue(resourceGroupId); assertThat(selector.match(newSelectionCriteriaUsers("userA", "userA", "authenticatedUserB")).map(SelectionContext::getResourceGroupId)).hasValue(resourceGroupId); @@ -147,6 +152,7 @@ public void testAuthenticatedUserRegexCustomGroup() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo_${auth}_${suffix}")); assertThat(selector.match(newSelectionCriteriaUsers("userA", "userA", "authenticatedUserA"))).hasValueSatisfying(context -> { assertThat(context.getResourceGroupId()).isEqualTo(resourceGroupId); @@ -167,6 +173,7 @@ public void testSourceRegex() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES))).isEqualTo(Optional.empty()); assertThat(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); @@ -186,6 +193,7 @@ public void testSourceRegexEmptyMatch() Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteria("user", null, ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); assertThat(selector.match(newSelectionCriteria("user", "", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); @@ -205,6 +213,7 @@ public void testClientTags() Optional.of(ImmutableList.of("tag1", "tag2")), Optional.empty(), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1", "tag2"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); assertThat(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES))).isEqualTo(Optional.empty()); @@ -212,6 +221,24 @@ public void testClientTags() assertThat(selector.match(newSelectionCriteria("A.user", "a source b", ImmutableSet.of("tag1", "tag2", "tag3"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); } + @Test + public void testIsExecuteImmediate() + { + ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo"); + StaticSelector selector = new StaticSelector( + Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.of(ImmutableList.of("tag1", "tag2")), + Optional.empty(), + Optional.empty(), + Optional.of(true), + new ResourceGroupIdTemplate("global.foo")); + assertThat(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, true)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId)); + } + @Test public void testSelectorResourceEstimate() { @@ -233,6 +260,7 @@ public void testSelectorResourceEstimate() Optional.empty(), Optional.of(DataSize.valueOf("500MB")))))), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(smallQuerySelector.match( @@ -282,6 +310,7 @@ public void testSelectorResourceEstimate() Optional.of(DataSize.valueOf("5TB")), Optional.empty())))), Optional.empty(), + Optional.empty(), new ResourceGroupIdTemplate("global.foo")); assertThat(largeQuerySelector.match( @@ -320,11 +349,16 @@ public void testSelectorResourceEstimate() private SelectionCriteria newSelectionCriteria(String user, String source, Set tags, ResourceEstimates resourceEstimates) { - return new SelectionCriteria(true, user, ImmutableSet.of(), user, Optional.empty(), Optional.ofNullable(source), tags, resourceEstimates, Optional.empty()); + return newSelectionCriteria(user, source, tags, resourceEstimates, false); + } + + private SelectionCriteria newSelectionCriteria(String user, String source, Set tags, ResourceEstimates resourceEstimates, boolean isExecuteImmediate) + { + return new SelectionCriteria(true, user, ImmutableSet.of(), user, Optional.empty(), Optional.ofNullable(source), tags, resourceEstimates, Optional.empty(), isExecuteImmediate); } private SelectionCriteria newSelectionCriteriaUsers(String user, String originalUser, String authenticatedUser) { - return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, Optional.ofNullable(authenticatedUser), Optional.empty(), Set.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, Optional.ofNullable(authenticatedUser), Optional.empty(), Set.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestingResourceGroups.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestingResourceGroups.java index fde78121abd0..c0bac1a68192 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestingResourceGroups.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/TestingResourceGroups.java @@ -82,6 +82,7 @@ public static SelectorSpecBuilder selectorSpec(ResourceGroupIdTemplate groupIdTe Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), groupIdTemplate)); } @@ -113,6 +114,7 @@ public SelectorSpecBuilder users(String... users) spec.getQueryType(), spec.getClientTags(), spec.getResourceEstimate(), + spec.isExecuteImmediate(), spec.getGroup())); } @@ -128,6 +130,7 @@ public SelectorSpecBuilder userGroups(String... groups) spec.getQueryType(), spec.getClientTags(), spec.getResourceEstimate(), + spec.isExecuteImmediate(), spec.getGroup())); } @@ -143,6 +146,7 @@ public SelectorSpecBuilder originalUserPattern(String originalUserPattern) spec.getQueryType(), spec.getClientTags(), spec.getResourceEstimate(), + spec.isExecuteImmediate(), spec.getGroup())); } @@ -158,6 +162,7 @@ public SelectorSpecBuilder authenticatedUserPattern(String authenticatedUserPatt spec.getQueryType(), spec.getClientTags(), spec.getResourceEstimate(), + spec.isExecuteImmediate(), spec.getGroup())); } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupConfigurationManager.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupConfigurationManager.java index 146074732a03..8717cd3366fc 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupConfigurationManager.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbResourceGroupConfigurationManager.java @@ -90,7 +90,7 @@ public void testEnvironments() assertEqualsResourceGroup(prodGlobal, "10MB", 1000, 100, 100, WEIGHTED, DEFAULT_WEIGHT, true, Duration.ofHours(1), Duration.ofDays(1), "5MB"); assertThat(manager.getSelectors()).hasSize(1); ResourceGroupSelector prodSelector = manager.getSelectors().get(0); - ResourceGroupId prodResourceGroupId = prodSelector.match(new SelectionCriteria(true, "prod_user", ImmutableSet.of(), "prod_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty())).get().getResourceGroupId(); + ResourceGroupId prodResourceGroupId = prodSelector.match(new SelectionCriteria(true, "prod_user", ImmutableSet.of(), "prod_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false)).get().getResourceGroupId(); assertThat(prodResourceGroupId.toString()).isEqualTo("prod_global"); // check the dev configuration @@ -101,7 +101,7 @@ public void testEnvironments() assertEqualsResourceGroup(devGlobal, "1MB", 1000, 100, 100, WEIGHTED, DEFAULT_WEIGHT, true, Duration.ofHours(1), Duration.ofDays(1), "5MB"); assertThat(manager.getSelectors()).hasSize(1); ResourceGroupSelector devSelector = manager.getSelectors().get(0); - ResourceGroupId devResourceGroupId = devSelector.match(new SelectionCriteria(true, "dev_user", ImmutableSet.of(), "dev_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty())).get().getResourceGroupId(); + ResourceGroupId devResourceGroupId = devSelector.match(new SelectionCriteria(true, "dev_user", ImmutableSet.of(), "dev_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false)).get().getResourceGroupId(); assertThat(devResourceGroupId.toString()).isEqualTo("dev_global"); } @@ -516,7 +516,7 @@ private static void assertEqualsResourceGroup( private static SelectionCriteria userGroupsSelectionCriteria(String... groups) { - return new SelectionCriteria(true, "test_user", ImmutableSet.copyOf(groups), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, "test_user", ImmutableSet.copyOf(groups), "test_user", Optional.empty(), Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } private static SelectionCriteria userAndUserGroupsSelectionCriteria(String user, String group, String... groups) @@ -532,11 +532,12 @@ private static SelectionCriteria userAndUserGroupsSelectionCriteria(String user, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, - Optional.empty()); + Optional.empty(), + false); } private static SelectionCriteria identitySelectionCriteria(String user, String originalUser, Optional authenticatedUser) { - return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, authenticatedUser, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty()); + return new SelectionCriteria(true, user, ImmutableSet.of(), originalUser, authenticatedUser, Optional.empty(), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false); } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbSourceExactMatchSelector.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbSourceExactMatchSelector.java index 7bbd7f20864b..4c18dfa0dd7e 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbSourceExactMatchSelector.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestDbSourceExactMatchSelector.java @@ -53,11 +53,11 @@ public void testMatch() DbSourceExactMatchSelector selector = new DbSourceExactMatchSelector("test", dao); - assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.empty()))).isEqualTo(Optional.empty()); - assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(INSERT.name()))).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId1)); - assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(SELECT.name()))).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId2)); - assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(DELETE.name())))).isEqualTo(Optional.empty()); + assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.empty(), false))).isEqualTo(Optional.empty()); + assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(INSERT.name()), false)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId1)); + assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(SELECT.name()), false)).map(SelectionContext::getResourceGroupId)).isEqualTo(Optional.of(resourceGroupId2)); + assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_pipeline"), ImmutableSet.of("tag"), EMPTY_RESOURCE_ESTIMATES, Optional.of(DELETE.name()), false))).isEqualTo(Optional.empty()); - assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_new"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.of(INSERT.name())))).isEqualTo(Optional.empty()); + assertThat(selector.match(new SelectionCriteria(true, "testuser", ImmutableSet.of(), "testuser", Optional.empty(), Optional.of("@test@test_new"), ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.of(INSERT.name()), false))).isEqualTo(Optional.empty()); } } diff --git a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestResourceGroupsDao.java b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestResourceGroupsDao.java index 1389b4a884c2..5c6bfa9fbd7c 100644 --- a/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestResourceGroupsDao.java +++ b/plugin/trino-resource-group-managers/src/test/java/io/trino/plugin/resourcegroups/db/TestResourceGroupsDao.java @@ -131,6 +131,7 @@ private static void testSelectorInsert(H2ResourceGroupsDao dao, Map map) { - SelectorRecord updated = new SelectorRecord(2, 3L, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); + SelectorRecord updated = new SelectorRecord(2, 3L, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); map.put(2L, updated); dao.updateSelector(2, null, null, null, null, null, null, "ping.*", "ping_gr.*", "ping_original.*", "ping_auth.*", "ping_source", LIST_STRING_CODEC.toJson(ImmutableList.of("tag1"))); compareSelectors(map, dao.getSelectors(ENVIRONMENT)); @@ -203,6 +207,7 @@ private static void testSelectorUpdateNull(H2ResourceGroupsDao dao, Map map) { dao.updateSelector(3, null, null, null, null, null, null, "admin_user", "admin_group", "admin_original_user", "admin_auth_user", ".*", LIST_STRING_CODEC.toJson(ImmutableList.of("tag1", "tag2"))); - SelectorRecord nullRegexes = new SelectorRecord(3L, 2L, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); + SelectorRecord nullRegexes = new SelectorRecord(3L, 2L, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); map.put(3L, nullRegexes); compareSelectors(map, dao.getSelectors(ENVIRONMENT)); dao.deleteSelector(3, null, null, null, null, null, null); @@ -244,6 +249,7 @@ private static void testSelectorMultiDelete(H2ResourceGroupsDao dao, Map map, List