Skip to content

Commit f6315af

Browse files
committed
Added API for supporting Group By functionality
1 parent c60c24b commit f6315af

File tree

7 files changed

+140
-2
lines changed

7 files changed

+140
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package ai.chat2db.server.domain.api.param;
2+
3+
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.Data;
6+
7+
import java.util.List;
8+
9+
10+
@Data
11+
public class GroupByParam {
12+
13+
/**
14+
* console id
15+
*/
16+
@NotNull
17+
private Long consoleId;
18+
19+
/**
20+
* Data source id
21+
*/
22+
@NotNull
23+
private Long dataSourceId;
24+
25+
/**
26+
* databaseName
27+
*/
28+
private String databaseName;
29+
30+
31+
/**
32+
* schema name
33+
*/
34+
private String schemaName;
35+
36+
37+
/**
38+
* origin sql
39+
*/
40+
private String originSql;
41+
42+
43+
/**
44+
* sort field
45+
*/
46+
private List<String> groupByList;
47+
}

chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DlTemplateService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ai.chat2db.server.domain.api.param.UpdateSelectResultParam;
77
import ai.chat2db.spi.model.ExecuteResult;
88
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
9+
import ai.chat2db.server.domain.api.param.GroupByParam;
910

1011
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
1112

@@ -58,6 +59,13 @@ public interface DlTemplateService {
5859
*/
5960
DataResult<String> updateSelectResult(UpdateSelectResultParam param);
6061

62+
/**
63+
*
64+
* @param param
65+
* @return
66+
*/
67+
DataResult<String> getGroupBySql(GroupByParam param);
68+
6169
/**
6270
*
6371
* @param param

chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,22 @@ public DataResult<String> getOrderBySql(OrderByParam param) {
176176
return DataResult.of(orderSql);
177177
}
178178

179-
179+
180+
/**
181+
* The method getGroupBySql constructs a GROUP BY SQL query string from the provided parameters.
182+
*
183+
* @param param - a GroupByParam object containing the original SQL query and the list of columns to group by
184+
* @return DataResult<String> - a DataResult object containing the constructed GROUP BY SQL query string
185+
*/
186+
@Override
187+
public DataResult<String> getGroupBySql(GroupByParam param) {
188+
// - Retrieve the SqlBuilder instance from Chat2DBContext
189+
SqlBuilder sqlBuilder = Chat2DBContext.getSqlBuilder();
190+
// Build the GROUP BY SQL using the provided parameters
191+
String groupSql = sqlBuilder.buildGroupBySql(param.getOriginSql(), param.getGroupByList());
192+
// Return the built SQL as a DataResult
193+
return DataResult.of(groupSql);
194+
}
180195
private List<Header> setColumnInfo(List<Header> headers, String tableName, String schemaName, String databaseName) {
181196
try {
182197
TableQueryParam tableQueryParam = new TableQueryParam();

chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDmlController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import ai.chat2db.server.domain.api.model.Config;
1010
import ai.chat2db.server.domain.api.param.DlExecuteParam;
11+
import ai.chat2db.server.domain.api.param.GroupByParam;
1112
import ai.chat2db.server.domain.api.param.OrderByParam;
1213
import ai.chat2db.server.domain.api.param.UpdateSelectResultParam;
1314
import ai.chat2db.server.domain.api.service.ConfigService;
@@ -126,6 +127,14 @@ public DataResult<String> getUpdateSelectResultSql(@RequestBody SelectResultUpda
126127
}
127128

128129

130+
@RequestMapping(value = "/get_group_by_sql", method = {RequestMethod.POST, RequestMethod.PUT})
131+
public DataResult<String> getGroupBySql(@RequestBody GroupByRequest request) {
132+
133+
GroupByParam param = rdbWebConverter.request2param(request);
134+
135+
return dlTemplateService.getGroupBySql(param);
136+
}
137+
129138
@RequestMapping(value = "/get_order_by_sql", method = {RequestMethod.POST, RequestMethod.PUT})
130139
public DataResult<String> getOrderBySql(@RequestBody OrderByRequest request) {
131140

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ai.chat2db.server.web.api.controller.rdb.request;
2+
3+
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
4+
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequestInfo;
5+
import ai.chat2db.spi.model.OrderBy;
6+
import lombok.Data;
7+
8+
import java.util.List;
9+
10+
@Data
11+
public class GroupByRequest extends DataSourceBaseRequest implements DataSourceBaseRequestInfo {
12+
13+
/**
14+
* origin sql
15+
*/
16+
private String originSql;
17+
18+
/**
19+
* group by field
20+
*/
21+
22+
private List<String> groupByList;
23+
24+
}

chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ public interface SqlBuilder<T> {
7575
*/
7676
String buildOrderBySql(String originSql, List<OrderBy> orderByList);
7777

78+
/**
79+
* @param originSql
80+
* @param groupByList
81+
* @return
82+
*/
83+
String buildGroupBySql(String originSql, List<String> groupByList);
84+
7885

7986
/**
8087
* generate sql based on results

chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
1111
import net.sf.jsqlparser.statement.Statement;
1212
import net.sf.jsqlparser.statement.select.OrderByElement;
13+
import net.sf.jsqlparser.statement.select.GroupByElement;
1314
import net.sf.jsqlparser.statement.select.PlainSelect;
1415
import net.sf.jsqlparser.statement.select.Select;
1516
import org.apache.commons.collections4.CollectionUtils;
@@ -89,6 +90,33 @@ public String buildOrderBySql(String originSql, List<OrderBy> orderByList) {
8990
return originSql;
9091
}
9192

93+
@Override
94+
public String buildGroupBySql(String originSql, List<String> groupByList) {
95+
if (CollectionUtils.isEmpty(groupByList)) {
96+
return originSql;
97+
}
98+
try {
99+
Statement statement = CCJSqlParserUtil.parse(originSql);
100+
if (statement instanceof Select) {
101+
Select selectStatement = (Select) statement;
102+
PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody();
103+
104+
// Create a new GROUP BY clause
105+
// Replace the original GROUP BY clause
106+
GroupByElement grouByElement = new GroupByElement();
107+
grouByElement.setGroupingSets(groupByList);
108+
plainSelect.setGroupByElement(grouByElement);
109+
// Output the modified SQL
110+
return plainSelect.toString();
111+
}
112+
113+
} catch (Exception e) {
114+
}
115+
116+
return originSql;
117+
}
118+
119+
92120
@Override
93121
public String buildSqlByQuery(QueryResult queryResult) {
94122
List<Header> headerList = queryResult.getHeaderList();
@@ -305,4 +333,4 @@ private String getUpdateSql(String tableName, List<Header> headerList, List<Stri
305333
script.append(buildWhere(headerList, odlRow, metaSchema, keyColumns));
306334
return script.toString();
307335
}
308-
}
336+
}

0 commit comments

Comments
 (0)