From e5a41765b4bcfa205e79f7abba6cd04de2b93b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=AF=E6=85=95=E7=81=B5?= <56398475+1985312383@users.noreply.github.com> Date: Wed, 11 Jun 2025 10:29:13 +0800 Subject: [PATCH 1/3] fix windows daemon.bat path configuration (#2289) --- assembly/bin/supersonic-daemon.bat | 60 +++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/assembly/bin/supersonic-daemon.bat b/assembly/bin/supersonic-daemon.bat index 0b6b66789..388bb9748 100644 --- a/assembly/bin/supersonic-daemon.bat +++ b/assembly/bin/supersonic-daemon.bat @@ -20,7 +20,9 @@ if "%profile%"=="" ( set "model_name=%service%" -cd %baseDir% +REM fix path configuration - point to the correct release package directory +set "releaseDir=%buildDir%\supersonic-%service%-1.0.0-SNAPSHOT" +cd %releaseDir% if "%command%"=="restart" ( call :stop @@ -50,20 +52,58 @@ if "%command%"=="restart" ( :runJavaService echo 'java service starting, see logs in logs/' - set "libDir=%baseDir%\lib" - set "confDir=%baseDir%\conf" - set "webDir=%baseDir%\webapp" - set "logDir=%baseDir%\logs" - set "classpath=%baseDir%;%webDir%;%libDir%\*;%confDir%" - 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 -Xmx2048m -cp %CLASSPATH% %MAIN_CLASS%" + echo 'Using release directory: %releaseDir%' + + REM use release package directory as base path + set "libDir=%releaseDir%\lib" + set "confDir=%releaseDir%\conf" + set "webDir=%releaseDir%\webapp" + set "logDir=%releaseDir%\logs" + + REM fix variable name matching problem + set "CLASSPATH=%releaseDir%;%webDir%;%libDir%\*;%confDir%" + set "MAIN_CLASS=%main_class%" + + REM add port configuration + set "property=-Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 -Dspring.profiles.active=%profile% -Dserver.port=9080" + set "java_command=%property% -Xms1024m -Xmx2048m -cp "%CLASSPATH%" %MAIN_CLASS%" + if not exist %logDir% mkdir %logDir% - start /B java %java-command% >nul 2>&1 - timeout /t 10 >nul + + REM check if the main jar file exists + if not exist "%libDir%\launchers-standalone-1.0.0-SNAPSHOT.jar" ( + echo "Error: Main jar file not found in %libDir%" + echo "Please make sure the application has been built and packaged correctly." + goto :EOF + ) + + echo 'Main Class: %MAIN_CLASS%' + echo 'Profile: %profile%' + echo 'Starting Java service...' + + REM start service and save logs + start /B java %java_command% > "%logDir%\supersonic.log" 2>&1 + timeout /t 15 >nul + + REM check service status + netstat -an | findstr ":9080" >nul + if errorlevel 1 ( + echo "Warning: Port 9080 is not listening" + echo "Please check the log file: %logDir%\supersonic.log" + if exist "%logDir%\supersonic.log" ( + echo "Recent log entries:" + powershell -Command "Get-Content '%logDir%\supersonic.log' | Select-Object -Last 10" + ) + ) else ( + echo "Service started successfully on port 9080" + echo "You can access the application at: http://localhost:9080" + ) + echo 'java service started' goto :EOF :stopJavaService + echo 'Stopping Java service...' for /f "tokens=2" %%i in ('tasklist ^| findstr /i "java"') do ( taskkill /PID %%i /F echo "java service (PID = %%i) is killed." From 303392f492a5e763d837048e3a000dadd6282494 Mon Sep 17 00:00:00 2001 From: Willy-J <32266792+Willy-J@users.noreply.github.com> Date: Thu, 12 Jun 2025 13:56:22 +0800 Subject: [PATCH 2/3] (fix)(headless) use database name as catalog when catalog is empty (#2291) --- .../headless/server/service/impl/DatabaseServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DatabaseServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DatabaseServiceImpl.java index bf2aced6d..29ee81d22 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DatabaseServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DatabaseServiceImpl.java @@ -282,6 +282,7 @@ public class DatabaseServiceImpl extends ServiceImpl getColumns(Long id, String catalog, String db, String table) throws SQLException { DatabaseResp databaseResp = getDatabase(id); + catalog = StringUtils.isEmpty(catalog) ? db : catalog; return getColumns(databaseResp, catalog, db, table); } From 0721df2e66950ea675fc3ecc7395c810651f9953 Mon Sep 17 00:00:00 2001 From: supersonicbi <15744192+supersonicbi@user.noreply.gitee.com> Date: Sun, 15 Jun 2025 15:15:54 +0800 Subject: [PATCH 3/3] (fix)(headless)Add null handling to avoid NPEs. --- .../chat/server/service/impl/MemoryServiceImpl.java | 5 +++-- .../supersonic/headless/chat/parser/llm/PromptHelper.java | 3 ++- .../headless/core/adaptor/db/BaseDbAdaptor.java | 4 ++-- .../headless/core/adaptor/db/DuckdbAdaptor.java | 8 +++++++- .../core/translator/parser/calcite/DataModelNode.java | 4 ++-- .../supersonic/headless/server/utils/ModelConverter.java | 6 +++++- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java index 1cdbcd6f3..6ceeb1127 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java @@ -71,8 +71,9 @@ public class MemoryServiceImpl implements MemoryService, CommandLineRunner { chatMemoryDO.setS2sql(chatMemoryUpdateReq.getS2sql()); chatMemoryDO.setDbSchema(chatMemoryUpdateReq.getDbSchema()); enableMemory(chatMemoryDO); - } else if ((MemoryStatus.DISABLED.equals(chatMemoryUpdateReq.getStatus())||MemoryStatus.PENDING.equals(chatMemoryUpdateReq.getStatus())) && hadEnabled) { - // Remove from vector DB when transitioning: launched→disabled OR enabled→pending + } else if ((MemoryStatus.DISABLED.equals(chatMemoryUpdateReq.getStatus()) + || MemoryStatus.PENDING.equals(chatMemoryUpdateReq.getStatus())) && hadEnabled) { + // Remove from vector DB when transitioning: launched→disabled OR enabled→pending disableMemory(chatMemoryDO); } LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java index c5d935b3b..a319b8491 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java @@ -52,7 +52,8 @@ public class PromptHelper { for (int i = 0; i < selfConsistencyNumber; i++) { List shuffledList = new ArrayList<>(exemplars); // only shuffle the exemplars from config - List subList=shuffledList.subList(llmReq.getDynamicExemplars().size(),shuffledList.size()); + List subList = + shuffledList.subList(llmReq.getDynamicExemplars().size(), shuffledList.size()); Collections.shuffle(subList); results.add(shuffledList.subList(0, Math.min(shuffledList.size(), fewShotNumber))); } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/BaseDbAdaptor.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/BaseDbAdaptor.java index 2637a1a7f..4eac4b3c2 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/BaseDbAdaptor.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/BaseDbAdaptor.java @@ -5,7 +5,6 @@ import com.tencent.supersonic.headless.api.pojo.DBColumn; import com.tencent.supersonic.headless.api.pojo.enums.FieldType; import com.tencent.supersonic.headless.core.pojo.ConnectInfo; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import java.sql.*; import java.util.ArrayList; @@ -148,7 +147,8 @@ public abstract class BaseDbAdaptor implements DbAdaptor { String url = connectionInfo.getUrl().toLowerCase(); // 设置通用属性 - properties.setProperty("user", connectionInfo.getUserName()); + String userName = Optional.ofNullable(connectionInfo.getUserName()).orElse(""); + properties.setProperty("user", userName); String password = Optional.ofNullable(connectionInfo.getPassword()).orElse(""); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DuckdbAdaptor.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DuckdbAdaptor.java index 0d3481faf..dfa8d8ed7 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DuckdbAdaptor.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DuckdbAdaptor.java @@ -10,6 +10,7 @@ import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Properties; @Slf4j public class DuckdbAdaptor extends DefaultDbAdaptor { @@ -23,7 +24,7 @@ public class DuckdbAdaptor extends DefaultDbAdaptor { String tableName) throws SQLException { List dbColumns = Lists.newArrayList(); DatabaseMetaData metaData = getDatabaseMetaData(connectInfo); - ResultSet columns = metaData.getColumns(schemaName, null, tableName, null); + ResultSet columns = metaData.getColumns(null, schemaName, tableName, null); while (columns.next()) { String columnName = columns.getString("COLUMN_NAME"); String dataType = columns.getString("TYPE_NAME"); @@ -42,4 +43,9 @@ public class DuckdbAdaptor extends DefaultDbAdaptor { return sql.replaceAll("`", ""); } + @Override + public Properties getProperties(ConnectInfo connectionInfo) { + return new Properties(); + } + } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java index f401ed500..1b1146e1b 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java @@ -36,8 +36,8 @@ public class DataModelNode extends SemanticNode { && !dataModel.getModelDetail().getSqlQuery().isEmpty()) { sqlTable = dataModel.getModelDetail().getSqlQuery(); // if model has sqlVariables, parse sqlVariables - if (Objects.nonNull(dataModel.getModelDetail().getSqlVariables()) && - !(CollectionUtils.isEmpty(dataModel.getModelDetail().getSqlVariables()))) { + if (Objects.nonNull(dataModel.getModelDetail().getSqlVariables()) + && !(CollectionUtils.isEmpty(dataModel.getModelDetail().getSqlVariables()))) { sqlTable = SqlVariableParseUtils.parse(sqlTable, dataModel.getModelDetail().getSqlVariables(), Lists.newArrayList()); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java index 5f4a6cdf6..2ef90fb66 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/ModelConverter.java @@ -156,7 +156,11 @@ public class ModelConverter { modelDetail.setSqlQuery(modelBuildReq.getSql()); } else { modelDetail.setQueryType(ModelDefineType.TABLE_QUERY.getName()); - modelDetail.setTableQuery(String.format("%s.%s", modelBuildReq.getDb(), tableName)); + if (modelBuildReq.getDb() != null) { + modelDetail.setTableQuery(String.format("%s.%s", modelBuildReq.getDb(), tableName)); + } else { + modelDetail.setTableQuery(tableName); + } } List fields = new ArrayList<>(); for (SemanticColumn semanticColumn : modelSchema.getSemanticColumns()) {