From bd64bf1f62e5b15504329e6bce87dcf9d50fb915 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Thu, 27 Feb 2025 21:53:14 +0800 Subject: [PATCH 01/12] (improvement)(headless)Optimize relationship probe in translation of multi-table join scenarios. --- headless/core/pom.xml | 4 + .../translator/parser/calcite/SqlBuilder.java | 111 +++++++++++++++--- pom.xml | 6 + 3 files changed, 102 insertions(+), 19 deletions(-) diff --git a/headless/core/pom.xml b/headless/core/pom.xml index d261b6e2f..d4e829879 100644 --- a/headless/core/pom.xml +++ b/headless/core/pom.xml @@ -133,6 +133,10 @@ io.trino trino-jdbc + + org.jgrapht + jgrapht-core + diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java index 508d2fa90..1dd87d34f 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.headless.core.translator.parser.calcite; +import com.google.common.collect.Sets; import com.tencent.supersonic.common.calcite.Configuration; import com.tencent.supersonic.common.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.Dimension; @@ -9,17 +10,26 @@ import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp; import com.tencent.supersonic.headless.api.pojo.response.DimSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp; import com.tencent.supersonic.headless.api.pojo.response.ModelResp; -import com.tencent.supersonic.headless.core.pojo.*; +import com.tencent.supersonic.headless.core.pojo.JoinRelation; +import com.tencent.supersonic.headless.core.pojo.Ontology; +import com.tencent.supersonic.headless.core.pojo.OntologyQuery; +import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.translator.parser.Constants; import lombok.extern.slf4j.Slf4j; import org.apache.calcite.sql.*; import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Triple; -import org.springframework.util.CollectionUtils; +import org.jgrapht.Graph; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.DefaultUndirectedGraph; import java.util.*; import java.util.stream.Collectors; @@ -37,6 +47,8 @@ public class SqlBuilder { public String buildOntologySql(QueryStatement queryStatement) throws Exception { OntologyQuery ontologyQuery = queryStatement.getOntologyQuery(); + Ontology ontology = queryStatement.getOntology(); + if (ontologyQuery.getLimit() == null) { ontologyQuery.setLimit(0L); } @@ -46,7 +58,14 @@ public class SqlBuilder { throw new Exception("data model not found"); } - TableView tableView = render(ontologyQuery, new ArrayList<>(dataModels), scope, schema); + TableView tableView; + if (!CollectionUtils.isEmpty(ontology.getJoinRelations()) && dataModels.size() > 1) { + Set models = probeRelatedModels(dataModels, queryStatement.getOntology()); + tableView = render(ontologyQuery, models, scope, schema); + } else { + tableView = render(ontologyQuery, dataModels, scope, schema); + } + SqlNode parserNode = tableView.build(); DatabaseResp database = queryStatement.getOntology().getDatabase(); EngineType engineType = EngineType.fromString(database.getType()); @@ -54,7 +73,58 @@ public class SqlBuilder { return SemanticNode.getSql(parserNode, engineType); } - private SqlNode optimizeParseNode(SqlNode parserNode, EngineType engineType) { + private Set probeRelatedModels(Set dataModels, Ontology ontology) { + List joinRelations = ontology.getJoinRelations(); + Graph graph = buildGraph(joinRelations); + DijkstraShortestPath dijkstraAlg = new DijkstraShortestPath<>(graph); + Set queryModels = + dataModels.stream().map(ModelResp::getName).collect(Collectors.toSet()); + GraphPath selectedGraphPath = null; + for (String fromModel : queryModels) { + for (String toModel : queryModels) { + if (fromModel != toModel) { + GraphPath path = dijkstraAlg.getPath(fromModel, toModel); + if (isGraphPathContainsAll(path, queryModels)) { + selectedGraphPath = path; + break; + } + } + } + } + Set modelNames = Sets.newHashSet(); + for (DefaultEdge edge : selectedGraphPath.getEdgeList()) { + modelNames.add(selectedGraphPath.getGraph().getEdgeSource(edge)); + modelNames.add(selectedGraphPath.getGraph().getEdgeTarget(edge)); + } + return modelNames.stream().map(m -> ontology.getModelMap().get(m)) + .collect(Collectors.toSet()); + } + + private boolean isGraphPathContainsAll(GraphPath graphPath, + Set vertex) { + Set allVertex = Sets.newHashSet(); + for (DefaultEdge edge : graphPath.getEdgeList()) { + allVertex.add(graphPath.getGraph().getEdgeSource(edge)); + allVertex.add(graphPath.getGraph().getEdgeTarget(edge)); + } + Collection intersect = + org.apache.commons.collections.CollectionUtils.intersection(vertex, allVertex); + + return intersect.size() == vertex.size() ? true : false; + } + + private Graph buildGraph(List joinRelations) { + Graph directedGraph = new DefaultUndirectedGraph<>(DefaultEdge.class); + for (JoinRelation joinRelation : joinRelations) { + directedGraph.addVertex(joinRelation.getLeft()); + directedGraph.addVertex(joinRelation.getRight()); + directedGraph.addEdge(joinRelation.getLeft(), joinRelation.getRight()); + } + return directedGraph; + } + + private SqlNode optimizeParseNode(SqlNode parserNode, EngineType engineType) + throws SqlParseException { if (Objects.isNull(schema.getRuntimeOptions()) || Objects.isNull(schema.getRuntimeOptions().getEnableOptimize()) || !schema.getRuntimeOptions().getEnableOptimize()) { @@ -62,14 +132,10 @@ public class SqlBuilder { } SqlNode optimizeNode = null; - try { - SqlNode sqlNode = SqlParser.create(SemanticNode.getSql(parserNode, engineType), - Configuration.getParserConfig(engineType)).parseStmt(); - if (Objects.nonNull(sqlNode)) { - optimizeNode = SemanticNode.optimize(scope, schema, sqlNode, engineType); - } - } catch (Exception e) { - log.error("optimize error {}", e); + SqlNode sqlNode = SqlParser.create(SemanticNode.getSql(parserNode, engineType), + Configuration.getParserConfig(engineType)).parseStmt(); + if (Objects.nonNull(sqlNode)) { + optimizeNode = SemanticNode.optimize(scope, schema, sqlNode, engineType); } if (Objects.nonNull(optimizeNode)) { @@ -79,7 +145,7 @@ public class SqlBuilder { return parserNode; } - private TableView render(OntologyQuery ontologyQuery, List dataModels, + private TableView render(OntologyQuery ontologyQuery, Set dataModels, SqlValidatorScope scope, S2CalciteSchema schema) throws Exception { SqlNode left = null; TableView leftTable = null; @@ -88,8 +154,7 @@ public class SqlBuilder { Map beforeModels = new HashMap<>(); EngineType engineType = EngineType.fromString(schema.getOntology().getDatabase().getType()); - for (int i = 0; i < dataModels.size(); i++) { - final ModelResp dataModel = dataModels.get(i); + for (ModelResp dataModel : dataModels) { final Set queryDimensions = ontologyQuery.getDimensionsByModel(dataModel.getName()); final Set queryMetrics = @@ -141,7 +206,8 @@ public class SqlBuilder { SqlLiteral sqlLiteral = SemanticNode.getJoinSqlLiteral(""); JoinRelation matchJoinRelation = getMatchJoinRelation(before, rightTable, schema); SqlNode joinRelationCondition; - if (!CollectionUtils.isEmpty(matchJoinRelation.getJoinCondition())) { + if (!org.apache.commons.collections.CollectionUtils + .isEmpty(matchJoinRelation.getJoinCondition())) { sqlLiteral = SemanticNode.getJoinSqlLiteral(matchJoinRelation.getJoinType()); joinRelationCondition = getCondition(matchJoinRelation, scope, engineType); condition = joinRelationCondition; @@ -170,12 +236,19 @@ public class SqlBuilder { } else if (joinRelation.getLeft() .equalsIgnoreCase(tableView.getDataModel().getName()) && before.containsKey(joinRelation.getRight())) { - matchJoinRelation.setJoinCondition(joinRelation.getJoinCondition().stream() + List> candidateJoinCon = 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()); + .collect(Collectors.toList()); + // added by jerryjzhang on 20250214 + // use the one with the most conditions to join left and right tables + if (matchJoinRelation.getJoinCondition() == null || candidateJoinCon + .size() > matchJoinRelation.getJoinCondition().size()) { + matchJoinRelation.setJoinCondition(candidateJoinCon); + matchJoinRelation.setJoinType(joinRelation.getJoinType()); + } } } } diff --git a/pom.xml b/pom.xml index e3947fdc9..f48c65a83 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,7 @@ false 4.2.1 1.12.780 + 1.5.2 @@ -236,6 +237,11 @@ aws-java-sdk ${aws-java-sdk.version} + + org.jgrapht + jgrapht-core + ${jgrapht.version} + From 90c2f8b37494fa6d25459f8b2e763e5eb708daf8 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Fri, 28 Feb 2025 17:11:05 +0800 Subject: [PATCH 02/12] (fix)(headless)Fix occasional NPE in SqlBuilder. --- .../headless/core/translator/parser/calcite/SqlBuilder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java index 1dd87d34f..3617d6df4 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java @@ -91,6 +91,9 @@ public class SqlBuilder { } } } + if (selectedGraphPath == null) { + return dataModels; + } Set modelNames = Sets.newHashSet(); for (DefaultEdge edge : selectedGraphPath.getEdgeList()) { modelNames.add(selectedGraphPath.getGraph().getEdgeSource(edge)); From 1746db53c1e5f255b0be4c6d8f0f28071861798a Mon Sep 17 00:00:00 2001 From: williamhliu <137068196+williamhliu@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:16:29 +0800 Subject: [PATCH 03/12] (fix)(supersonic-fe) fix the issue where adding, deleting, and modifying domain and model do not automatically update data (#2116) --- .../packages/supersonic-fe/config/config.ts | 21 ------------ .../public/icons/icon-128x128.png | Bin 1329 -> 0 bytes .../public/icons/icon-192x192.png | Bin 1856 -> 0 bytes .../public/icons/icon-512x512.png | Bin 5082 -> 0 bytes webapp/packages/supersonic-fe/src/app.tsx | 4 +-- .../SemanticModel/components/DomainList.tsx | 31 +++++++++--------- .../SemanticModel/components/ModelTable.tsx | 3 ++ .../src/pages/SemanticModel/index.tsx | 26 +++------------ .../pages/SemanticModel/models/domainData.ts | 2 +- 9 files changed, 26 insertions(+), 61 deletions(-) delete mode 100644 webapp/packages/supersonic-fe/public/icons/icon-128x128.png delete mode 100644 webapp/packages/supersonic-fe/public/icons/icon-192x192.png delete mode 100644 webapp/packages/supersonic-fe/public/icons/icon-512x512.png diff --git a/webapp/packages/supersonic-fe/config/config.ts b/webapp/packages/supersonic-fe/config/config.ts index cbb160b86..3390eb348 100644 --- a/webapp/packages/supersonic-fe/config/config.ts +++ b/webapp/packages/supersonic-fe/config/config.ts @@ -155,29 +155,8 @@ export default defineConfig({ //================ pro 插件配置 ================= presets: ['umi-presets-pro'], - /** - * @name openAPI 插件的配置 - * @description 基于 openapi 的规范生成serve 和mock,能减少很多样板代码 - * @doc https://pro.ant.design/zh-cn/docs/openapi/ - */ - // openAPI: [ - // { - // requestLibPath: "import { request } from '@umijs/max'", - // // 或者使用在线的版本 - // // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json" - // schemaPath: join(__dirname, 'oneapi.json'), - // mock: false, - // }, - // { - // requestLibPath: "import { request } from '@umijs/max'", - // schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json', - // projectName: 'swagger', - // }, - // ], - // 将insights-flow相关包排除出mfsu编译,在pnpm link 模式下保持热更新 mfsu: { strategy: 'normal', - // exclude: ['supersonic-insights-flow-components', 'supersonic-insights-flow-core'], }, requestRecord: {}, exportStatic: {}, diff --git a/webapp/packages/supersonic-fe/public/icons/icon-128x128.png b/webapp/packages/supersonic-fe/public/icons/icon-128x128.png deleted file mode 100644 index 48d0e2339a60a637b94319c65e8654289b4f4b6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 zcmV-11C0002qP)t-s01zMl z|Nj6D8~_Fu01Fxg6ePmN$p8o!Wo~x>2^n*Hg!uURG(b#MUupdO{0J2!4IC;FATIs> z{@dN(0umtr1r+b_@!;a*CNn?_87S=S?pR`MN>yMYFg?=M*UQe)wYk2qw7Hs~re<$= zUubdX=<2(_!=9w6l9``_ijrw^dn`Fc6(TV7_4V=c^R2SBrmV4+ouiMHoQsl~euj;D zf{I&ZZXPQ+87DQ^+ugv!$3;(CLQPmWL{HY)+rGlaqNuHRe}`^&fKXdyK1x+FK1#;P z&4`be_4fDTmuWjt2mKnbI+d3dfa z_PK3Vs;zn;Ot~u#==o*X;a^nmOa{(_o(tmupuw*`!> z#lUp|BbBD0;J$!S0To9DO4Z9XkCjq#?=s{WNE{XLCFmLibLLfxLm3nt7Wj-&k{L;X zo_Y$L6(Ax^@lhJo2uNHK09we3_>jt`DV`HX8L^}WDJO|ULbS4T1b_}iycq`oGqNH4 zQJi@^@H`%ly#;k8%FIH(J#9^VH>(ITJX3)9M7)?mVD;pNM){2bV!rABC{yFeZXJ$q ztx`Yw*~Rj#FGR_Att-g zD?cOlXM^rD8S|s+a(LB7MePP8cKc zywqQW@o0gm8Qu`-)UW-9#K*uQ5WQT5&CGnc%phPyF4p1{wj=@#5xikX3uI#(QrZ2A z66>Nxz+a;r*Km#iEGXxR4BFJu%9#^UG{?XqFlA~7sH!J&2X_C6*P7#50#^tYfm`)p zW2Pupno-5;QoKQ)pCj;SS_MKc4Ai#W7h-YyLi$8b7l@8b3KjwX8wCk}6<4mh7hj6_ z@bnBUa)|InAVBSV)+C{3Cf$?e`b2@nQysp0$(swOoN^Eg(SO9p-Q1JJAAwzQCMaKm&bGV`U^9&pp0Gf^+nkRf5 zTo3@>xi{%p{gIpTF5iJBic@aIws^IC=-v{M~W@Y%aj8G0o!r2b|HdROb8D$LP+n;FWCW`~3a=G(k;6PFes57kh(>00a~S6Cwx} zCE()Z^7Hf|E zp{K0H$jr97ziM-QXK;BCA1!ozgl>0$_4f8XNmSCn^FkCmKwfQVshbU{p46e2L| z?Ct65?BnI;*4f+4&(glZ#fXoVgo~3^UusNOVjC$ov9`LWtg%K>TsK2c$;{8e#mKwA z!>qBksjjnFVr-b6q?4MUQCw!>t&JT300tCEL_t(|+U?tESK2@nfZ>~&tE5s!683!u zK~Xjr+;FLD`~QDWsaSMof{9Cdrsv$}Q$GacB{NB8tUw4Mgb+dqA%qY@2qA(L2bqdsgXsNTkuvsd$l2J=n5?~ND zV51VpX8=z3{QjGMB}&;~4lO{w(%Zazp$0@daWIEhfP~dcYQd#z&@Au`02`W0K*FSZ zfqww-)R9s!Ht2yOKmf3z60nW%2IP#}oH2Xl0XAm~+{S+rP&t$X9^nbbm-x&1;@!yj zY%9B7sWA>ZWO1jKtCah(e))TD=Eenv9so{D4rn_thqYd2VK|ELzaOufx!t$^NZw>p z+Iyj>U-gQu^kN;GPyD#d{Hh5IJ3uJYc+Z77Ufo$Ggo+WA3Y*@1Ky13)LZP31QSeOBPQ+XWH1FRE< znBBKzO$T4zWLDa@R>>EuJj^qYQEmht0qwfj(!SqQ@iKSEQ|m2>2OGl+_^GUFJOcJ= zXWHkFZpC2%v9sp4{dDSJXp{It8QP8>kQnV+s>T(A1*ey{eEoDWoB-?=l!qbE1M&?^ zlg>TQVZNQW0vG^>5+Gs?WoT;w-lorADbq%mw`k7}=L`%i*#i$2a3L12&mCI9?2mZ} z0W6}7?qr1p3pjZ?4xKwIs2_Fw@&LQuwzS(*uz)OwIWgMMHdb!T{tPE4SL`S{H8xBn!v4)5iQu&kynG zu&g>v%A749U2|<^9&fVG1>_^~CFZ7LP5t_J?7+%^=uNif%+;?)oeFwB$`&F5UWnO^ z@}M}gKew%NvbE6ZWlDEPmWMOGGN93O87@!W;veOx{0)tnve;1G63u~Z#6xV7>iY035`Xj%Y> z^Q5IJ+!Y6p_dlYRYQ(^}0Dwm;s0$Yi48Tdj3g$4vO$-3uKeU2KKGd0O0O0VXbm7s4;+l9&n%p_`cvI z?LB&meH%ahXIS9}0Jn2n$9YS(u{W#$gO9RPz0KE#GlYO}vMs$dg#n^%CpUU*6%xDq zjs0(lqaT-@s*4=qi*zHU+H4m-VgiXywKHFAtzxV0RWJzsovKI0FJxD0TBWR9R(cUae(Kj zsHF%%MItH28Xp(4*{bSm0T9Fm0Q3xia~uV&0pKeFz=jn7(rEx(_sVL}lf@aG=xQ21 z0F-Q4EcX2Td}n9x&+_W8>Dj@bW1Zc-_04UCC6!U}srDWLO4_FE!gBaD92g8{VR7ke zeM?AW92o=O(D2yXclnR)y=d4(E-o&bT05P*g06FjUtV6efBWI#2OS@uWaJd^OFd|4 zX;(M2f>E+f{F>2!?AX@%T}(mq>gp=@<7Y-5siUJ~-_R&H)yX)dzBXt+ zw3(irC-{#uAUx*V_rCAF0|y6(^qk`23R+NfVtI9aeo@&CE(t4VpY6XpJmUB8uHDiy zwv9=Ab9i`ka&k&{ODsM)GxBB9kG{dJ?Y|`SJP2xb|L_=>Cn3tZ=GbsG#NjrD{p8lZ+I*;#ZnN-&`)3V#iUD zMPI6J3dwTaR#efm@D7ZSx~Kc$)0fQLLZ9GgMwTwT5=zbJZ|@6AUcO3G4f|Pz+YOkF zhRS^y7A`o43kXqaS`P?+li?F^ab$DRnFBz%pmtx;FkotX)-fdI0SkIBo$3`kjGW}D zZoDeqLtS3Q2M@@N^6~Cb6R{D+s3aFqxA6=o*eHod92P`F`24wEin51>RC@xG+Cw7; zO)`T9mP{{KyOZ{F0<#_c5Bhd4GTu4*uXH<{{3_)6x4r)lr){`JohSKG%?$A}zhMc= zW|@O)q8WsJQ6EdzmKROG;U@_#(HhDuk8bo;Ho`*6l-2u9HLE*dOv$E=6gvnZLNCqP zprds6w}?9hZO+b`b-ggB&>$s;nRQSt|AE@)FA7Ls_I33&;P}~m=VyWbcR}f(OIN21 zGvpB_DYkJ<3MQsNhOEYodj;5({(pE0$4P!F$)xqVIwo83~69g=48RK+49na7Q(C zC7>Jw*DbzEje?QUe|LGt3nX|7Uz)%oP2zR&b4Op@R)(SMB<|5c3@$a63w&>G*}*

*C7T$?5!b= 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 { height: location.pathname.includes('chat') ? 'calc(100vh - 56px)' : undefined, }} > - - {/* {dom} */} + {/* */} + {dom} {history.location.pathname !== '/chat' && !isMobile && ( )} diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx index 59306b816..c62714fe4 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx @@ -1,9 +1,9 @@ import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons'; -import { Input, message, Popconfirm, Tooltip, Row, Col, Button, Menu } from 'antd'; +import { Input, message, Popconfirm, Tooltip, Row, Col, Button, Menu, MenuProps } from 'antd'; import type { DataNode } from 'antd/lib/tree'; import { useEffect, useState } from 'react'; import type { FC } from 'react'; -import { useModel } from '@umijs/max'; +import { useModel, history } from '@umijs/max'; import { createDomain, updateDomain, deleteDomain } from '../service'; import DomainInfoForm from './DomainInfoForm'; import styles from './style.less'; @@ -71,6 +71,7 @@ const DomainListTree: FC = ({ message.success('编辑分类成功'); setProjectInfoModalVisible(false); onTreeDataUpdate?.(); + window.location.reload(); } else { message.error(res.msg); } @@ -78,10 +79,13 @@ const DomainListTree: FC = ({ const domainSubmit = async (values: any) => { if (values.modelType === 'add') { - const { code, data } = await createDomain(values); - // if (code === 200 && values.type === 'top') { - // await createDefaultModelSet(data.id); - // } + const { code, data, msg } = await createDomain(values); + if (code === 200) { + history.push(`/model/domain/${data.id}`); + window.location.reload(); + } else { + message.error(msg); + } } else if (values.modelType === 'edit') { await editProject(values); } @@ -95,6 +99,7 @@ const DomainListTree: FC = ({ message.success('删除成功'); setProjectInfoModalVisible(false); onTreeDataUpdate?.(); + window.location.reload(); } else { message.error(res.msg); } @@ -104,12 +109,7 @@ const DomainListTree: FC = ({ const { id, name, path, hasEditPermission, parentId, hasModel } = node as any; const type = parentId === 0 ? 'top' : 'normal'; return ( -

{ - // handleSelect(id); - // }} - > +
{name} {createDomainBtnVisible && hasEditPermission && ( @@ -175,13 +175,12 @@ const DomainListTree: FC = ({ return { key: domain.id, label: titleRender(domain), - // icon: , }; }); - const getLevelKeys = (items1: LevelKeysProps[]) => { + const getLevelKeys = (items1: any[]) => { const key: Record = {}; - const func = (items2: LevelKeysProps[], level = 1) => { + const func = (items2: any[], level = 1) => { items2.forEach((item) => { if (item.key) { key[item.key] = level; @@ -194,7 +193,7 @@ const DomainListTree: FC = ({ func(items1); return key; }; - const levelKeys = getLevelKeys(items as LevelKeysProps[]); + const levelKeys = getLevelKeys(items as any[]); const [stateOpenKeys, setStateOpenKeys] = useState(['2', '23']); const onOpenChange: MenuProps['onOpenChange'] = (openKeys) => { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx index 15641e66a..484497f9e 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx @@ -82,6 +82,7 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC }); if (code === 200) { onModelChange?.(); + window.location.reload(); return; } message.error(msg); @@ -198,6 +199,7 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC const { code, msg } = await deleteModel(record.id); if (code === 200) { onModelChange?.(); + window.location.reload(); } else { message.error(msg); } @@ -292,6 +294,7 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC onModelChange?.(); setIsEditing(false); setCreateDataSourceModalOpen(false); + window.location.reload(); }} onCancel={() => { setIsEditing(false); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx index 11dda227f..4926719dd 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx @@ -1,11 +1,8 @@ import { message } from 'antd'; -import React, { useEffect, useState } from 'react'; -import { history, useParams, useModel, Outlet } from '@umijs/max'; -import DomainListTree from './components/DomainList'; -import styles from './components/style.less'; -import { LeftOutlined, RightOutlined } from '@ant-design/icons'; +import React, { useEffect } from 'react'; +import { useParams, useModel, Outlet } from '@umijs/max'; import { ISemantic } from './data'; -import { getDomainList, getDataSetList, getModelDetail } from './service'; +import { getDomainList, getModelDetail } from './service'; import PageBreadcrumb from './PageBreadcrumb'; type Props = {}; @@ -17,20 +14,10 @@ const SemanticModel: React.FC = ({}) => { const domainModel = useModel('SemanticModel.domainData'); const modelModel = useModel('SemanticModel.modelData'); const databaseModel = useModel('SemanticModel.databaseData'); - const metricModel = useModel('SemanticModel.metricData'); - const { setSelectDomain, setDomainList, selectDomainId } = domainModel; - const { selectModel, setSelectModel, setModelTableHistoryParams, MrefreshModelList } = modelModel; + const { setSelectDomain, setDomainList } = domainModel; + const { selectModel, setSelectModel } = modelModel; const { MrefreshDatabaseList } = databaseModel; - const { selectMetric, setSelectMetric } = metricModel; - - // useEffect(() => { - - // return () => { - // setSelectMetric(undefined); - // } - // }, []) - const initSelectedDomain = (domainList: ISemantic.IDomainItem[]) => { const targetNode = domainList.filter((item: any) => { return `${item.id}` === domainId; @@ -40,9 +27,7 @@ const SemanticModel: React.FC = ({}) => { return item.parentId === 0; })[0]; if (firstRootNode) { - const { id } = firstRootNode; setSelectDomain(firstRootNode); - // pushUrlMenu(id, menuKey); } } else { setSelectDomain(targetNode); @@ -87,7 +72,6 @@ const SemanticModel: React.FC = ({}) => {
- {/* */}
); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/models/domainData.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/models/domainData.ts index 160bfbc3b..867965a0c 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/models/domainData.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/models/domainData.ts @@ -3,7 +3,7 @@ import { useState, useEffect } from 'react'; import { useModel } from '@umijs/max'; export default function Domain() { - const [selectDomain, setSelectDomain] = useState( + const [selectDomain, setSelectDomain] = useState( {} as ISemantic.IDomainItem, ); const [selectDataSet, setSelectDataSet] = useState(); From ea7238304df6c3d2be6ce9dbefece8aae0f7f6b3 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Sat, 1 Mar 2025 22:13:20 +0800 Subject: [PATCH 04/12] (fix)(docker)Fix Dockerfile by removing apt-get install. (fix)(docker)Fix Dockerfile. (fix)(docker)Fix Dockerfile. --- docker/Dockerfile | 13 ------------- docker/docker-compose.yml | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 72caa801f..c2681a60a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -7,19 +7,6 @@ WORKDIR /usr/src/app # Argument to pass in the supersonic version at build time ARG SUPERSONIC_VERSION -# Install necessary packages, including Postgres client -RUN apt-get update && apt-get install -y postgresql-client - -# Install the vim editor. -RUN apt-get update && apt-get install -y vim && \ - rm -rf /var/lib/apt/lists/* - -# Update the package list and install iputils-ping. -RUN apt-get update && apt-get install -y iputils-ping - -# 更新包列表并安装 dnsutils 包 -RUN apt-get update && apt-get install -y dnsutils - # Copy the supersonic standalone zip file into the container COPY assembly/build/supersonic-standalone-${SUPERSONIC_VERSION}.zip . diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 6b9ea2da0..8f7d67267 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -21,7 +21,7 @@ services: - 8.8.4.4 healthcheck: test: ["CMD-SHELL", "sh -c 'pg_isready -U supersonic_user -d postgres'"] - interval: 30s + interval: 10s timeout: 10s retries: 5 From 3ca48e1ca145281a6468c7575309de60ff7804f5 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Sun, 2 Mar 2025 11:56:23 +0800 Subject: [PATCH 05/12] (release)Release 0.9.10. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f48c65a83..1c9623f23 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ - 0.9.10-SNAPSHOT + 0.9.10 21 21 21 From b871ae542a89b6d7fe402d4c927813218f5c8000 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Sun, 2 Mar 2025 18:36:02 +0800 Subject: [PATCH 06/12] (fix)(assembly)Fix windows daemon script. --- assembly/bin/supersonic-daemon.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assembly/bin/supersonic-daemon.bat b/assembly/bin/supersonic-daemon.bat index 64e07244d..0882ad6c9 100644 --- a/assembly/bin/supersonic-daemon.bat +++ b/assembly/bin/supersonic-daemon.bat @@ -55,8 +55,8 @@ if "%command%"=="restart" ( set "webDir=%baseDir%\webapp" set "logDir=%baseDir%\logs" set "classpath=%baseDir%;%webDir%;%libDir%\*;%confDir%" - set "java-command=-Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 -Dspring.profiles.active=%profile% -Xms1024m - -Xmx1024m -cp %CLASSPATH% %MAIN_CLASS%" + set "property=-Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 -Dspring.profiles.active=%profile%" + set "java-command=%property% -Xms1024m -Xmx1024m -cp %CLASSPATH% %MAIN_CLASS%" if not exist %logDir% mkdir %logDir% start /B java %java-command% >nul 2>&1 timeout /t 10 >nul From 6eba69398236ec704737242d148fd62b236e358a Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Sun, 2 Mar 2025 20:33:55 +0800 Subject: [PATCH 07/12] (fix)(docker)Fix Dockerfile. (fix)(docker)Fix Dockerfile. --- docker/Dockerfile | 7 +++++-- .../standalone/src/main/resources/application-docker.yaml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index c2681a60a..e74861da3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,9 +1,12 @@ -# Use an official OpenJDK runtime as a parent image -FROM openjdk:21-jdk-bullseye +FROM supersonicbi/supersonic:0.9.10-SNAPSHOT # Set the working directory in the container WORKDIR /usr/src/app +# Delete old supersonic installation directory and the symbolic link +RUN rm -rf /usr/src/app/supersonic-standalone-0.9.10-SNAPSHOT +RUN rm -f /usr/src/app/supersonic-standalone-latest + # Argument to pass in the supersonic version at build time ARG SUPERSONIC_VERSION diff --git a/launchers/standalone/src/main/resources/application-docker.yaml b/launchers/standalone/src/main/resources/application-docker.yaml index 8ec7476d5..326af1d99 100644 --- a/launchers/standalone/src/main/resources/application-docker.yaml +++ b/launchers/standalone/src/main/resources/application-docker.yaml @@ -4,9 +4,9 @@ spring: url: jdbc:postgresql://${DB_HOST}:${DB_PORT:5432}/${DB_NAME}?stringtype=unspecified username: ${DB_USERNAME} password: ${DB_PASSWORD} - sql: init: + continue-on-error: true mode: always username: ${DB_USERNAME} password: ${DB_PASSWORD} From f8104687cc133370bddc227ae45106d9285025d6 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Mon, 3 Mar 2025 11:12:49 +0800 Subject: [PATCH 08/12] (fix)(launcher)Fix mysql schema DDL. --- .../src/main/resources/db/schema-mysql.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index 8d18fa8d4..f9d330177 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -5,21 +5,21 @@ CREATE TABLE IF NOT EXISTS `s2_agent` ( `examples` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, `status` tinyint DEFAULT NULL, `model` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, - `tool_config` varchar(6000) COLLATE utf8_unicode_ci DEFAULT NULL, - `llm_config` varchar(2000) COLLATE utf8_unicode_ci DEFAULT NULL, + `tool_config` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, + `llm_config` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, `chat_model_config` text COLLATE utf8_unicode_ci DEFAULT NULL, - `visual_config` varchar(2000) COLLATE utf8_unicode_ci DEFAULT NULL, + `visual_config` TEXT COLLATE utf8_unicode_ci DEFAULT NULL, `enable_search` tinyint DEFAULT 1, `enable_feedback` tinyint DEFAULT 1, `created_by` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_by` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `updated_at` datetime DEFAULT NULL, - `admin` varchar(3000) DEFAULT NULL COMMENT '管理员', - `admin_org` varchar(3000) DEFAULT NULL COMMENT '管理员组织', + `admin` varchar(1000) DEFAULT NULL COMMENT '管理员', + `admin_org` varchar(1000) DEFAULT NULL COMMENT '管理员组织', `is_open` tinyint DEFAULT NULL COMMENT '是否公开', - `viewer` varchar(3000) DEFAULT NULL COMMENT '可用用户', - `view_org` varchar(3000) DEFAULT NULL COMMENT '可用组织', + `viewer` varchar(1000) DEFAULT NULL COMMENT '可用用户', + `view_org` varchar(1000) DEFAULT NULL COMMENT '可用组织', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; From f7ce9480bb6f9a99db40342a9087cb3cdb6a78b5 Mon Sep 17 00:00:00 2001 From: zyclove Date: Mon, 3 Mar 2025 16:56:23 +0800 Subject: [PATCH 09/12] fix:java.io.NotSerializableException: com.tencent.supersonic.common.pojo.Order (#2121) --- .../main/java/com/tencent/supersonic/common/pojo/Order.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java index d26ad2c4a..3aace69e1 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java @@ -3,11 +3,13 @@ package com.tencent.supersonic.common.pojo; import com.google.common.base.Objects; import jakarta.validation.constraints.NotBlank; import lombok.Data; +import java.io.Serializable; import static com.tencent.supersonic.common.pojo.Constants.ASC_UPPER; @Data -public class Order { +public class Order implements Serializable { + private static final long serialVersionUID = 1L; @NotBlank(message = "Invalid order column") private String column; From f532088e38294281fa58e0f80ae54f4dc96e0c81 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Tue, 4 Mar 2025 10:11:00 +0800 Subject: [PATCH 10/12] (feature)(releaes)Start 1.0.0-SNAPSHOT release. --- .../main/java/com/tencent/supersonic/common/pojo/Order.java | 1 + .../headless/core/translator/DefaultSemanticTranslator.java | 3 ++- .../supersonic/headless/server/rest/DataSetController.java | 2 ++ .../headless/server/service/impl/DataSetServiceImpl.java | 4 ++-- pom.xml | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java index 3aace69e1..c607f78fb 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Order.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.common.pojo; import com.google.common.base.Objects; import jakarta.validation.constraints.NotBlank; import lombok.Data; + import java.io.Serializable; import static com.tencent.supersonic.common.pojo.Constants.ASC_UPPER; diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/DefaultSemanticTranslator.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/DefaultSemanticTranslator.java index f61d2f8bb..c6b2c8abe 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/DefaultSemanticTranslator.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/DefaultSemanticTranslator.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.headless.core.translator; import com.tencent.supersonic.common.calcite.SqlMergeWithUtils; +import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper; import com.tencent.supersonic.common.pojo.enums.EngineType; import com.tencent.supersonic.headless.api.pojo.response.QueryState; import com.tencent.supersonic.headless.core.pojo.OntologyQuery; @@ -73,7 +74,7 @@ public class DefaultSemanticTranslator implements SemanticTranslator { String finalSql = null; if (sqlQuery.isSupportWith()) { EngineType engineType = queryStatement.getOntology().getDatabaseType(); - if (!SqlMergeWithUtils.hasWith(engineType, ontologyOuterSql)) { + if (!SqlSelectHelper.hasWith(ontologyOuterSql)) { finalSql = "with " + tables.stream() .map(t -> String.format("%s as (%s)", t.getLeft(), t.getRight())) .collect(Collectors.joining(",")) + "\n" + ontologyOuterSql; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DataSetController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DataSetController.java index 3d3822da9..796cef2e0 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DataSetController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DataSetController.java @@ -2,6 +2,7 @@ package com.tencent.supersonic.headless.server.rest; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.common.pojo.User; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.headless.api.pojo.MetaFilter; import com.tencent.supersonic.headless.api.pojo.request.DataSetReq; import com.tencent.supersonic.headless.api.pojo.response.DataSetResp; @@ -51,6 +52,7 @@ public class DataSetController { public List getDataSetList(@RequestParam("domainId") Long domainId) { MetaFilter metaFilter = new MetaFilter(); metaFilter.setDomainId(domainId); + metaFilter.setStatus(StatusEnum.ONLINE.getCode()); return dataSetService.getDataSetList(metaFilter); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java index 3df28ce9f..9c1fee36e 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java @@ -56,9 +56,9 @@ public class DataSetServiceImpl extends ServiceImpl public DataSetResp save(DataSetReq dataSetReq, User user) { dataSetReq.createdBy(user.getName()); DataSetDO dataSetDO = convert(dataSetReq); - dataSetDO.setStatus(StatusEnum.ONLINE.getCode()); + dataSetDO.setStatus(dataSetReq.getStatus() != null ? dataSetReq.getStatus() + : StatusEnum.ONLINE.getCode()); DataSetResp dataSetResp = convert(dataSetDO); - // conflictCheck(dataSetResp); save(dataSetDO); dataSetResp.setId(dataSetDO.getId()); return dataSetResp; diff --git a/pom.xml b/pom.xml index 1c9623f23..954ff9cc7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ - 0.9.10 + 1.0.0-SNAPSHOT 21 21 21 From 8f361f99320918cf262bfd635547fb9b5ea0473b Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Tue, 4 Mar 2025 17:18:51 +0800 Subject: [PATCH 11/12] (improvement)(auth)Use interface in place of impl class. --- .../interceptor/AuthenticationInterceptor.java | 4 ++-- .../interceptor/DefaultAuthenticationInterceptor.java | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/AuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/AuthenticationInterceptor.java index a395c2aac..24ff43318 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/AuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/AuthenticationInterceptor.java @@ -1,7 +1,7 @@ package com.tencent.supersonic.auth.authentication.interceptor; import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; -import com.tencent.supersonic.auth.authentication.service.UserServiceImpl; +import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.auth.authentication.utils.TokenService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -16,7 +16,7 @@ public abstract class AuthenticationInterceptor implements HandlerInterceptor { protected AuthenticationConfig authenticationConfig; - protected UserServiceImpl userServiceImpl; + protected UserService userService; protected TokenService tokenService; diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java index 47886aa94..0942305c5 100644 --- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java +++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.auth.authentication.interceptor; import com.tencent.supersonic.auth.api.authentication.annotation.AuthenticationIgnore; import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig; import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword; -import com.tencent.supersonic.auth.authentication.service.UserServiceImpl; +import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.auth.authentication.utils.TokenService; import com.tencent.supersonic.common.pojo.exception.AccessException; import com.tencent.supersonic.common.util.ContextUtils; @@ -16,12 +16,7 @@ import org.springframework.web.method.HandlerMethod; import java.lang.reflect.Method; import java.util.Optional; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_IS_ADMIN; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_DISPLAY_NAME; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_EMAIL; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_ID; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_NAME; -import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.TOKEN_USER_PASSWORD; +import static com.tencent.supersonic.auth.api.authentication.constant.UserConstants.*; @Slf4j public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor { @@ -30,7 +25,7 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws AccessException { authenticationConfig = ContextUtils.getBean(AuthenticationConfig.class); - userServiceImpl = ContextUtils.getBean(UserServiceImpl.class); + userService = ContextUtils.getBean(UserService.class); tokenService = ContextUtils.getBean(TokenService.class); if (!authenticationConfig.isEnabled()) { return true; From f1bc18ef651d85062664f03e83cc1476027dee16 Mon Sep 17 00:00:00 2001 From: coosir Date: Wed, 5 Mar 2025 08:36:04 +0800 Subject: [PATCH 12/12] Update docker-compose.yml (#2127) fix data persistence issue --- docker/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8f7d67267..174fcff4d 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -12,7 +12,7 @@ services: ports: - "15432:5432" # volumes: -# - postgres_data:/var/lib/postgresql +# - postgres_data:/var/lib/postgresql/data networks: - supersonic_network dns: @@ -62,4 +62,4 @@ services: # supersonic_data: networks: - supersonic_network: \ No newline at end of file + supersonic_network: