Skip to content

Commit dca099d

Browse files
committed
implement insert clause
1 parent a26c4f2 commit dca099d

File tree

5 files changed

+117
-1
lines changed

5 files changed

+117
-1
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.github.eaxdev.jsonsql4j.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Value;
5+
6+
import java.util.Map;
7+
import java.util.Objects;
8+
9+
/**
10+
* @author eaxdev
11+
*/
12+
@Value
13+
public class Insert {
14+
15+
@JsonProperty(value = "table", required = true)
16+
Table table;
17+
18+
@JsonProperty(value = "values", required = true)
19+
Map<String, Object> values;
20+
21+
public String getIntoView() {
22+
return (Objects.isNull(table.getSchemaName()) || table.getSchemaName().isEmpty())
23+
? table.getTableName() : table.getSchemaName() + "." + table.getTableName();
24+
}
25+
}
26+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.github.eaxdev.jsonsql4j.query.insert;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.module.SimpleModule;
6+
import io.github.eaxdev.jsonsql4j.exception.JsonSQL4JParseException;
7+
import io.github.eaxdev.jsonsql4j.model.Insert;
8+
import io.github.eaxdev.jsonsql4j.model.target.TargetClause;
9+
import io.github.eaxdev.jsonsql4j.model.target.TargetClauseDeserializer;
10+
import io.github.eaxdev.jsonsql4j.query.Query;
11+
12+
import java.util.Objects;
13+
import java.util.stream.Collectors;
14+
15+
/**
16+
* @author eaxdev
17+
*/
18+
public class InsertQuery implements Query {
19+
20+
private static final ObjectMapper MAPPER = new ObjectMapper();
21+
22+
static {
23+
SimpleModule module = new SimpleModule();
24+
module.addDeserializer(TargetClause.class, new TargetClauseDeserializer(TargetClause.class));
25+
MAPPER.registerModule(module);
26+
}
27+
28+
private final Insert insert;
29+
30+
public InsertQuery(String jsonQuery) {
31+
//validate by schema
32+
try {
33+
this.insert = MAPPER.readValue(jsonQuery, Insert.class);
34+
} catch (JsonProcessingException e) {
35+
throw new JsonSQL4JParseException("Can not parse json query: [" + jsonQuery + "]", e);
36+
}
37+
}
38+
39+
@Override
40+
public String getQuery() {
41+
return "INSERT INTO " + insert.getIntoView() +
42+
" (" + String.join(", ", insert.getValues().keySet()) + ") " +
43+
"VALUES (" + constructValues() + ");";
44+
}
45+
46+
private String constructValues() {
47+
return insert.getValues().values().stream()
48+
.map(o -> {
49+
if (o instanceof String) {
50+
return "'" + o.toString() + "'";
51+
} else {
52+
return Objects.isNull(o) ? "" : o.toString();
53+
}
54+
})
55+
.collect(Collectors.joining(", "));
56+
}
57+
}

src/main/java/io/github/eaxdev/jsonsql4j/query/select/TargetClauseBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class TargetClauseBuilder implements ClauseBuilder {
1818
@Override
1919
public String build() {
2020
return targetClauses.stream()
21-
.map(t -> t.getQueryView())
21+
.map(TargetClause::getQueryView)
2222
.collect(Collectors.joining(", "));
2323
}
2424
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.github.eaxdev.jsonsql4j.query;
2+
3+
import io.github.eaxdev.jsonsql4j.TestUtil;
4+
import io.github.eaxdev.jsonsql4j.query.insert.InsertQuery;
5+
import io.github.eaxdev.jsonsql4j.query.select.SelectQuery;
6+
import org.junit.jupiter.api.DisplayName;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
class InsertTest {
12+
13+
@Test
14+
@DisplayName("Should get insert")
15+
void shouldGetSelect() {
16+
String json = TestUtil.readFileByPath("insert/Insert.json");
17+
Query insertQuery = new InsertQuery(json);
18+
assertEquals("INSERT INTO security.audit (eventType, eventDate, userId) " +
19+
"VALUES ('MODIFY', '2020-01-01T23:28:56.782Z', 100);", insertQuery.getQuery());
20+
}
21+
22+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"table": {
3+
"table": "audit",
4+
"schema": "security"
5+
},
6+
"values": {
7+
"eventType": "MODIFY",
8+
"eventDate": "2020-01-01T23:28:56.782Z",
9+
"userId": 100
10+
}
11+
}

0 commit comments

Comments
 (0)