From 09ea5db0ba8320e8984408c0af2507750b80f70a Mon Sep 17 00:00:00 2001 From: pisces <30692337+p1scess@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:46:52 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix(agent):=20=E5=8A=A9=E7=90=86=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=88=97=E8=A1=A8=E5=88=87=E6=8D=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E5=90=8E=E5=90=AF=E7=94=A8=E7=A6=81=E7=94=A8=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E9=94=99=E8=AF=AF=20(#1946)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/packages/supersonic-fe/src/pages/Agent/AgentsSection.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/packages/supersonic-fe/src/pages/Agent/AgentsSection.tsx b/webapp/packages/supersonic-fe/src/pages/Agent/AgentsSection.tsx index 23e8047c3..13e14e7b6 100644 --- a/webapp/packages/supersonic-fe/src/pages/Agent/AgentsSection.tsx +++ b/webapp/packages/supersonic-fe/src/pages/Agent/AgentsSection.tsx @@ -64,6 +64,7 @@ const AgentsSection: React.FC = ({ }} > { From 3db9a0dcec2a98f9fcf65c7f14014b5765197781 Mon Sep 17 00:00:00 2001 From: siriusbo <131440949+siriusbo@users.noreply.github.com> Date: Mon, 9 Dec 2024 22:13:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?[improvement][headless-core]=20=20=E6=8F=90?= =?UTF-8?q?=E5=8D=87join=E5=87=86=E7=A1=AE=E6=80=A7=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Djoin=E6=9D=A1=E4=BB=B6=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#1945)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/calcite/node/DataModelNode.java | 19 +++++++++++++------ .../parser/calcite/render/JoinRender.java | 10 ++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java index 75d32ad9f..95ea823b6 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/node/DataModelNode.java @@ -343,18 +343,25 @@ public class DataModelNode extends SemanticNode { Map orders = new HashMap<>(); joinDataModelNames.add(baseDataModel.getName()); orders.put(baseDataModel.getName(), 0L); + + // Adjust the order of tables in the data source to facilitate subsequent joins + ArrayList joinTables = new ArrayList<>(); for (JoinRelation joinRelation : ontology.getJoinRelations()) { if (joinDataModelNames.contains(joinRelation.getLeft()) && joinDataModelNames.contains(joinRelation.getRight())) { - orders.put(joinRelation.getLeft(), 0L); - orders.put(joinRelation.getRight(), 1L); + joinTables.add(joinRelation.getLeft()); + joinTables.add(joinRelation.getRight()); } } - orders.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(d -> { - joinDataModels.add(ontology.getDataModelMap().get(d.getKey())); - }); + for (String joinTable : joinTables) { + orders.put(joinTable, orders.getOrDefault(joinTable, 0L) + 1L); + } + orders.entrySet().stream() + .sorted((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())) // 倒序排序 + .forEach(d -> { + joinDataModels.add(ontology.getDataModelMap().get(d.getKey())); + }); } - return joinDataModels; } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/render/JoinRender.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/render/JoinRender.java index ba63fc91b..3ae790ce9 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/render/JoinRender.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/render/JoinRender.java @@ -306,6 +306,16 @@ public class JoinRender extends Renderer { r.getMiddle(), tableView.getAlias() + "." + r.getRight())) .collect(Collectors.toList())); matchJoinRelation.setJoinType(joinRelation.getJoinType()); + // Added join condition judgment to solve the problem of join condition order + } else if (joinRelation.getLeft() + .equalsIgnoreCase(tableView.getDataModel().getName()) + && before.containsKey(joinRelation.getRight())) { + matchJoinRelation.setJoinCondition(joinRelation.getJoinCondition().stream() + .map(r -> Triple.of( + before.get(joinRelation.getRight()) + "." + r.getRight(), + r.getMiddle(), tableView.getAlias() + "." + r.getLeft())) + .collect(Collectors.toList())); + matchJoinRelation.setJoinType(joinRelation.getJoinType()); } } } From a298c670ed065b81be0b2c38dee1cb5090a5853c Mon Sep 17 00:00:00 2001 From: mislayming <18808893@qq.com> Date: Tue, 10 Dec 2024 19:09:22 +0800 Subject: [PATCH 3/5] =?UTF-8?q?(improvement)(auth)=20=E5=A2=9E=E5=BC=BAUse?= =?UTF-8?q?rStrategy=E7=9A=84=E5=8F=AF=E9=85=8D=E7=BD=AE=E6=80=A7=20(#1949?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AuthenticationConfig.java | 3 +++ .../authentication/service/UserStrategy.java | 2 ++ .../strategy/FakeUserStrategy.java | 7 ++++++ .../strategy/HttpHeaderUserStrategy.java | 6 +++++ .../strategy/UserStrategyFactory.java | 23 ++++++++++++++++--- 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/config/AuthenticationConfig.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/config/AuthenticationConfig.java index c014524c6..e1d2b3cc9 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/config/AuthenticationConfig.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/config/AuthenticationConfig.java @@ -18,6 +18,9 @@ public class AuthenticationConfig { @Value("${s2.authentication.include.path:/api}") private String includePath; + @Value("${s2.authentication.strategy:http}") + private String strategy; + @Value("${s2.authentication.enable:false}") private boolean enabled; diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java index 60a1130b9..0ddb6567a 100644 --- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java +++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java @@ -7,6 +7,8 @@ import com.tencent.supersonic.common.pojo.User; public interface UserStrategy { + String getStrategyName(); + boolean accept(boolean isEnableAuthentication); User findUser(HttpServletRequest request, HttpServletResponse response); diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/FakeUserStrategy.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/FakeUserStrategy.java index 576f56d54..8008e2c24 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/FakeUserStrategy.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/FakeUserStrategy.java @@ -10,6 +10,13 @@ import org.springframework.stereotype.Service; @Service public class FakeUserStrategy implements UserStrategy { + public static final String STRATEGY_NAME = "fake"; + + @Override + public String getStrategyName() { + return STRATEGY_NAME; + } + @Override public boolean accept(boolean isEnableAuthentication) { return !isEnableAuthentication; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/HttpHeaderUserStrategy.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/HttpHeaderUserStrategy.java index 970392724..9d274964b 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/HttpHeaderUserStrategy.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/HttpHeaderUserStrategy.java @@ -15,12 +15,18 @@ import java.util.Optional; @Service public class HttpHeaderUserStrategy implements UserStrategy { + public static final String STRATEGY_NAME = "http"; private final TokenService tokenService; public HttpHeaderUserStrategy(TokenService tokenService) { this.tokenService = tokenService; } + @Override + public String getStrategyName() { + return STRATEGY_NAME; + } + @Override public boolean accept(boolean isEnableAuthentication) { return isEnableAuthentication; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/UserStrategyFactory.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/UserStrategyFactory.java index b7becf8cd..59e6db441 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/UserStrategyFactory.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/strategy/UserStrategyFactory.java @@ -9,6 +9,7 @@ import lombok.Data; import org.springframework.context.annotation.Configuration; import java.util.List; +import java.util.Optional; @Configuration @Data @@ -26,10 +27,26 @@ public class UserStrategyFactory { @PostConstruct public void setUserStrategy() { - for (UserStrategy userStrategy : userStrategyList) { - if (userStrategy.accept(authenticationConfig.isEnabled())) { - UserHolder.setStrategy(userStrategy); + + boolean enabled = authenticationConfig.isEnabled(); + if (!enabled) { + for (UserStrategy userStrategy : userStrategyList) { + if (userStrategy.accept(authenticationConfig.isEnabled())) { + UserHolder.setStrategy(userStrategy); + } } + return; + } + + String strategy = authenticationConfig.getStrategy(); + Optional strategyOptional = userStrategyList.stream() + .filter(t -> t.accept(true) && strategy.equalsIgnoreCase(t.getStrategyName())) + .findAny(); + + if (strategyOptional.isPresent()) { + UserHolder.setStrategy(strategyOptional.get()); + } else { + throw new IllegalStateException("strategy is not found: " + strategy); } } } From 848b4a1e44a559a3a1dc2ffed36e4a3beb7949ed Mon Sep 17 00:00:00 2001 From: mislayming <18808893@qq.com> Date: Tue, 10 Dec 2024 19:14:32 +0800 Subject: [PATCH 4/5] =?UTF-8?q?(fix)(chat-api)=20=E5=B0=8F=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E6=95=B4=E7=90=86=E4=B8=80=E4=B8=8Blombok=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=BB=98=E8=AE=A4=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=87=BD=E6=95=B0=E9=81=BF=E5=85=8D=E9=AB=98=E7=89=88?= =?UTF-8?q?=E6=9C=ACjson=E6=A1=86=E6=9E=B6=E6=97=A0=E6=B3=95=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=8C=96=E6=8A=A5=E9=94=99=20(#1951)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supersonic/chat/api/pojo/request/ChatConfigBaseReq.java | 1 - .../chat/api/pojo/request/ChatMemoryUpdateReq.java | 4 ++++ .../supersonic/chat/api/pojo/request/ItemNameVisibility.java | 1 - .../chat/api/pojo/request/ItemNameVisibilityInfo.java | 1 - .../supersonic/chat/api/pojo/request/ItemVisibility.java | 1 - .../chat/api/pojo/request/RecommendedQuestionReq.java | 1 - .../chat/api/pojo/response/DictLatestTaskResp.java | 1 - .../chat/api/pojo/response/RecommendQuestionResp.java | 2 ++ .../chat/api/pojo/response/SimilarQueryRecallResp.java | 4 ++++ .../chat/server/service/impl/ChatQueryServiceImpl.java | 5 +++-- 10 files changed, 13 insertions(+), 8 deletions(-) diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java index 1384f48b8..03c52119c 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java @@ -8,7 +8,6 @@ import java.util.List; /** extended information command about model */ @Data -@ToString public class ChatConfigBaseReq { private Long modelId; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryUpdateReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryUpdateReq.java index 9b68c10e5..7309e3275 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryUpdateReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryUpdateReq.java @@ -4,11 +4,15 @@ import javax.validation.constraints.NotNull; import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data @Builder +@NoArgsConstructor +@AllArgsConstructor public class ChatMemoryUpdateReq { @NotNull(message = "id不可为空") diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibility.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibility.java index d4910839b..f377ad87f 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibility.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibility.java @@ -4,7 +4,6 @@ import lombok.Data; import lombok.ToString; @Data -@ToString public class ItemNameVisibility { private ItemNameVisibilityInfo aggVisibilityInfo; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibilityInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibilityInfo.java index 0a5adeddb..d147766ac 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibilityInfo.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemNameVisibilityInfo.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; @Data -@ToString public class ItemNameVisibilityInfo { /** invisible dimensions */ diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemVisibility.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemVisibility.java index 8fac606d4..df3d2209f 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemVisibility.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ItemVisibility.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; @Data -@ToString public class ItemVisibility { /** invisible dimensions */ diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestionReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestionReq.java index 9f552b002..30e761293 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestionReq.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/RecommendedQuestionReq.java @@ -6,7 +6,6 @@ import lombok.NoArgsConstructor; import lombok.ToString; @Data -@ToString @AllArgsConstructor @NoArgsConstructor public class RecommendedQuestionReq { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DictLatestTaskResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DictLatestTaskResp.java index 8e04dcf5c..3e6e3519b 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DictLatestTaskResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DictLatestTaskResp.java @@ -6,7 +6,6 @@ import lombok.ToString; import java.util.Date; -@ToString @Data public class DictLatestTaskResp { diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java index 74dbda9d2..553bb82c4 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java @@ -3,10 +3,12 @@ package com.tencent.supersonic.chat.api.pojo.response; import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Data +@NoArgsConstructor @AllArgsConstructor public class RecommendQuestionResp { private Long modelId; diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SimilarQueryRecallResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SimilarQueryRecallResp.java index 53f67e834..bd1f08683 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SimilarQueryRecallResp.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SimilarQueryRecallResp.java @@ -1,10 +1,14 @@ package com.tencent.supersonic.chat.api.pojo.response; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data @Builder +@NoArgsConstructor +@AllArgsConstructor public class SimilarQueryRecallResp { private Long queryId; diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatQueryServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatQueryServiceImpl.java index 92a1b6a4d..c04a1c8f4 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatQueryServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatQueryServiceImpl.java @@ -230,7 +230,8 @@ public class ChatQueryServiceImpl implements ChatQueryService { return queryResult; } - private boolean checkMetricReplace(ChatQueryDataReq chatQueryDataReq, SemanticParseInfo parseInfo) { + private boolean checkMetricReplace(ChatQueryDataReq chatQueryDataReq, + SemanticParseInfo parseInfo) { List oriFields = getFieldsFromSql(parseInfo); Set metrics = chatQueryDataReq.getMetrics(); if (CollectionUtils.isEmpty(oriFields) || CollectionUtils.isEmpty(metrics)) { @@ -242,7 +243,7 @@ public class ChatQueryServiceImpl implements ChatQueryService { } private String replaceFilters(ChatQueryDataReq queryData, SemanticParseInfo parseInfo, - DataSetSchema dataSetSchema) { + DataSetSchema dataSetSchema) { String correctorSql = parseInfo.getSqlInfo().getCorrectedS2SQL(); log.info("correctorSql before replacing:{}", correctorSql); // get where filter and having filter From 4a6938956bb16716aab2765563e920d35edc2b45 Mon Sep 17 00:00:00 2001 From: Jun Zhang Date: Tue, 10 Dec 2024 21:15:38 +0800 Subject: [PATCH 5/5] [project]Only sanity test with JDK 21. (#1952) --- .github/workflows/centos-ci.yml | 2 +- .github/workflows/mac-ci.yml | 2 +- .github/workflows/ubuntu-ci.yml | 2 +- .github/workflows/windows-ci.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/centos-ci.yml b/.github/workflows/centos-ci.yml index c4a78ba8f..c08685695 100644 --- a/.github/workflows/centos-ci.yml +++ b/.github/workflows/centos-ci.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - java-version: [8, 11, 21] # 定义要测试的JDK版本 + java-version: [21] # 定义要测试的JDK版本 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/mac-ci.yml b/.github/workflows/mac-ci.yml index 3d8bb9407..ddc70c392 100644 --- a/.github/workflows/mac-ci.yml +++ b/.github/workflows/mac-ci.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - java-version: [8, 11, 21] # Define the JDK versions to test + java-version: [21] # Define the JDK versions to test steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/ubuntu-ci.yml b/.github/workflows/ubuntu-ci.yml index d5766b17c..502110659 100644 --- a/.github/workflows/ubuntu-ci.yml +++ b/.github/workflows/ubuntu-ci.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - java-version: [8, 11, 21] # 定义要测试的JDK版本 + java-version: [21] # 定义要测试的JDK版本 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 5856dabe7..939983ee8 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - java-version: [8, 11, 21] # Add JDK 21 to the matrix + java-version: [21] # Add JDK 21 to the matrix steps: - uses: actions/checkout@v2