Skip to content

Commit 83e524d

Browse files
committed
update csv format
1 parent e74277d commit 83e524d

File tree

3 files changed

+60
-6
lines changed

3 files changed

+60
-6
lines changed

pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@
6363
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
6464
<version>2.5.0</version>
6565
</dependency>
66+
<dependency>
67+
<groupId>org.apache.commons</groupId>
68+
<artifactId>commons-csv</artifactId>
69+
<version>1.12.0</version>
70+
</dependency>
71+
<dependency>
72+
<groupId>org.junit.jupiter</groupId>
73+
<artifactId>junit-jupiter-api</artifactId>
74+
<scope>test</scope>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.mockito</groupId>
78+
<artifactId>mockito-core</artifactId>
79+
<scope>test</scope>
80+
</dependency>
6681
</dependencies>
6782

6883
<build>

src/main/java/com/javaaidev/text2sql/tool/RunSqlQueryTool.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.javaaidev.text2sql.tool;
22

3+
import java.io.IOException;
34
import java.util.Map;
45
import java.util.Objects;
56
import java.util.function.Function;
67
import java.util.stream.Collectors;
8+
import org.apache.commons.csv.CSVFormat;
9+
import org.apache.commons.csv.CSVPrinter;
710
import org.slf4j.Logger;
811
import org.slf4j.LoggerFactory;
912
import org.springframework.jdbc.core.simple.JdbcClient;
@@ -40,14 +43,19 @@ private String runQuery(String query) {
4043
if (CollectionUtils.isEmpty(rows)) {
4144
return "";
4245
}
43-
var fields = rows.getFirst().keySet();
46+
var fields = rows.getFirst().keySet().stream().sorted().toList();
47+
var printer = CSVFormat.DEFAULT.builder()
48+
.setHeader(fields.toArray(new String[0]))
49+
.setSkipHeaderRecord(false)
50+
.setRecordSeparator('\n')
51+
.build();
4452
var builder = new StringBuilder();
45-
builder.append(String.join(", ", fields));
4653
for (Map<String, Object> row : rows) {
47-
var rowString = fields.stream().map(row::get)
48-
.map(value -> Objects.toString(value, "") )
49-
.collect(Collectors.joining(", "));
50-
builder.append(rowString);
54+
try {
55+
printer.printRecord(builder, fields.stream().map(row::get).toArray());
56+
} catch (IOException e) {
57+
throw new RuntimeException(e);
58+
}
5159
}
5260
return builder.toString();
5361
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.javaaidev.text2sql.tool;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import static org.junit.jupiter.api.Assertions.*;
6+
import org.junit.jupiter.api.Test;
7+
import static org.mockito.ArgumentMatchers.any;
8+
import static org.mockito.Mockito.when;
9+
import static org.mockito.Mockito.when;
10+
import org.mockito.Mockito;
11+
import org.springframework.jdbc.core.simple.JdbcClient;
12+
import org.springframework.jdbc.core.simple.JdbcClient.ResultQuerySpec;
13+
import org.springframework.jdbc.core.simple.JdbcClient.StatementSpec;
14+
15+
class RunSqlQueryToolTest {
16+
@Test
17+
void testCsvFormat() {
18+
var mock = Mockito.mock(JdbcClient.class);
19+
var resultQuerySpecMock = Mockito.mock(ResultQuerySpec.class);
20+
when(resultQuerySpecMock.listOfRows()).thenReturn(List.of(
21+
Map.of("v1", "Hello", "v2", 123),
22+
Map.of("v1", "World","v2", 456)
23+
));
24+
var statementSpecMock = Mockito.mock(StatementSpec.class);
25+
when(statementSpecMock.query()).thenReturn(resultQuerySpecMock);
26+
when(mock.sql(any())).thenReturn(statementSpecMock);
27+
var tool = new RunSqlQueryTool(mock);
28+
var response = tool.apply(new RunSqlQueryRequest("select 1"));
29+
assertEquals("Hello,123\nWorld,456\n", response.result());
30+
}
31+
}

0 commit comments

Comments
 (0)