forked from JSQLParser/JSqlParser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUpsertDeParser.java
More file actions
108 lines (93 loc) · 3.56 KB
/
UpsertDeParser.java
File metadata and controls
108 lines (93 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2019 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.util.deparser;
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.statement.insert.ConflictActionType;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.upsert.Upsert;
@SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
public class UpsertDeParser extends AbstractDeParser<Upsert> {
private ExpressionDeParser expressionVisitor;
private SelectDeParser selectVisitor;
public UpsertDeParser(ExpressionDeParser expressionVisitor, SelectDeParser selectVisitor, StringBuilder buffer) {
super(buffer);
this.expressionVisitor = expressionVisitor;
this.expressionVisitor.setSelectVisitor(selectVisitor);
this.selectVisitor = selectVisitor;
this.selectVisitor.setExpressionVisitor(expressionVisitor);
}
@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public void deParse(Upsert upsert) {
switch (upsert.getUpsertType()) {
case REPLACE:
case REPLACE_SET:
builder.append("REPLACE ");
break;
case INSERT_OR_ABORT:
builder.append("INSERT OR ABORT ");
break;
case INSERT_OR_FAIL:
builder.append("INSERT OR FAIL ");
break;
case INSERT_OR_IGNORE:
builder.append("INSERT OR IGNORE ");
break;
case INSERT_OR_REPLACE:
builder.append("INSERT OR REPLACE ");
break;
case INSERT_OR_ROLLBACK:
builder.append("INSERT OR ROLLBACK ");
break;
case UPSERT:
default:
builder.append("UPSERT ");
}
if (upsert.isUsingInto()) {
builder.append("INTO ");
}
builder.append(upsert.getTable().getFullyQualifiedName());
if (upsert.getUpdateSets() != null) {
builder.append(" SET ");
deparseUpdateSets(upsert.getUpdateSets(), builder, expressionVisitor);
} else {
if (upsert.getColumns() != null) {
upsert.getColumns().accept(expressionVisitor, null);
}
if (upsert.getExpressions() != null) {
upsert.getExpressions().accept(expressionVisitor, null);
}
if (upsert.getSelect() != null) {
builder.append(" ");
upsert.getSelect().accept((SelectVisitor<StringBuilder>) selectVisitor, null);
}
if (upsert.getDuplicateAction() != null) {
builder.append(" ON DUPLICATE KEY UPDATE ");
if (ConflictActionType.DO_UPDATE.equals(upsert.getDuplicateAction().getConflictActionType())) {
deparseUpdateSets(upsert.getDuplicateUpdateSets(), builder, expressionVisitor);
} else {
upsert.getDuplicateAction().appendTo(builder);
}
}
}
}
public ExpressionVisitor<StringBuilder> getExpressionVisitor() {
return expressionVisitor;
}
public void setExpressionVisitor(ExpressionDeParser visitor) {
expressionVisitor = visitor;
}
public SelectVisitor<StringBuilder> getSelectVisitor() {
return selectVisitor;
}
public void setSelectVisitor(SelectDeParser visitor) {
selectVisitor = visitor;
}
}