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 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 6c3ee2776..c9168b929 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 @@ -6,6 +6,8 @@ import jakarta.servlet.http.HttpServletResponse; 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 7e0dc4fdf..9cb2fa51c 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 @@ -9,6 +9,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 c29ce310a..11a4bb2c8 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 @@ -14,12 +14,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 ae01b3888..a35c94f68 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); } } } 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 e8ed60410..948b2e66b 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 @@ -3,11 +3,15 @@ package com.tencent.supersonic.chat.api.pojo.request; import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus; import jakarta.validation.constraints.NotNull; +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/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()); } } } 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 = ({ }} > {