Skip to content

Commit bb72668

Browse files
committed
- Tool expression connector included
1 parent 2ee7aa9 commit bb72668

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.sf.jsqlparser.util;
2+
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
import net.sf.jsqlparser.expression.BinaryExpression;
6+
import net.sf.jsqlparser.statement.select.AllColumns;
7+
import net.sf.jsqlparser.statement.select.AllTableColumns;
8+
import net.sf.jsqlparser.statement.select.PlainSelect;
9+
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
10+
import net.sf.jsqlparser.statement.select.SelectItem;
11+
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
12+
import net.sf.jsqlparser.statement.select.SelectVisitor;
13+
import net.sf.jsqlparser.statement.select.SetOperationList;
14+
15+
/**
16+
* Connect all selected expressions with a binary expression. Out of select a,b from table
17+
* one gets select a || b as expr from table. The type of binary expression is set by
18+
* overwriting this class abstract method createBinaryExpression.
19+
* @author tw
20+
*/
21+
public abstract class ConnectExpressionsVisitor implements SelectVisitor, SelectItemVisitor {
22+
23+
private String alias = "expr";
24+
private List<SelectExpressionItem> itemsExpr = new LinkedList<SelectExpressionItem>();
25+
26+
public ConnectExpressionsVisitor() {
27+
}
28+
29+
public ConnectExpressionsVisitor(String alias) {
30+
this.alias = alias;
31+
}
32+
33+
/**
34+
* Create instances of this binary expression that connects all selected columns.
35+
* @return
36+
*/
37+
protected abstract BinaryExpression createBinaryExpression();
38+
39+
@Override
40+
public void visit(PlainSelect plainSelect) {
41+
for (SelectItem item : plainSelect.getSelectItems()) {
42+
item.accept(this);
43+
}
44+
45+
if (itemsExpr.size() > 1) {
46+
BinaryExpression binExpr = createBinaryExpression();
47+
binExpr.setLeftExpression(itemsExpr.get(0).getExpression());
48+
for (int i = 1; i < itemsExpr.size() - 1; i++) {
49+
binExpr.setRightExpression(itemsExpr.get(i).getExpression());
50+
BinaryExpression binExpr2 = createBinaryExpression();
51+
binExpr2.setLeftExpression(binExpr);
52+
binExpr = binExpr2;
53+
}
54+
binExpr.setRightExpression(itemsExpr.get(itemsExpr.size() - 1).getExpression());
55+
56+
SelectExpressionItem sei = new SelectExpressionItem();
57+
sei.setExpression(binExpr);
58+
59+
plainSelect.getSelectItems().clear();
60+
plainSelect.getSelectItems().add(sei);
61+
}
62+
63+
((SelectExpressionItem)plainSelect.getSelectItems().get(0)).setAlias(alias);
64+
}
65+
66+
@Override
67+
public void visit(SetOperationList setOpList) {
68+
for (PlainSelect select : setOpList.getPlainSelects()) {
69+
select.accept(this);
70+
}
71+
}
72+
73+
@Override
74+
public void visit(AllColumns allColumns) {
75+
throw new UnsupportedOperationException("Not supported yet.");
76+
}
77+
78+
@Override
79+
public void visit(AllTableColumns allTableColumns) {
80+
throw new UnsupportedOperationException("Not supported yet.");
81+
}
82+
83+
@Override
84+
public void visit(SelectExpressionItem selectExpressionItem) {
85+
itemsExpr.add(selectExpressionItem);
86+
}
87+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package net.sf.jsqlparser.util;
2+
3+
import java.io.StringReader;
4+
import net.sf.jsqlparser.JSQLParserException;
5+
import net.sf.jsqlparser.expression.BinaryExpression;
6+
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
7+
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
8+
import net.sf.jsqlparser.parser.CCJSqlParserManager;
9+
import net.sf.jsqlparser.statement.select.Select;
10+
import org.junit.After;
11+
import org.junit.AfterClass;
12+
import org.junit.Before;
13+
import org.junit.BeforeClass;
14+
import org.junit.Test;
15+
import static org.junit.Assert.*;
16+
17+
/**
18+
*
19+
* @author tw
20+
*/
21+
public class ConnectExpressionsVisitorTest {
22+
23+
public ConnectExpressionsVisitorTest() {
24+
}
25+
26+
@BeforeClass
27+
public static void setUpClass() {
28+
}
29+
30+
@AfterClass
31+
public static void tearDownClass() {
32+
}
33+
34+
@Before
35+
public void setUp() {
36+
}
37+
38+
@After
39+
public void tearDown() {
40+
}
41+
42+
CCJSqlParserManager parserManager = new CCJSqlParserManager();
43+
44+
@Test
45+
public void testVisit_PlainSelect_concat() throws JSQLParserException {
46+
String sql = "select a,b,c from test";
47+
Select select = (Select) parserManager.parse( new StringReader(sql));
48+
ConnectExpressionsVisitor instance = new ConnectExpressionsVisitor() {
49+
50+
@Override
51+
protected BinaryExpression createBinaryExpression() {
52+
return new Concat();
53+
}
54+
};
55+
select.getSelectBody().accept(instance);
56+
57+
assertEquals("SELECT a || b || c AS expr FROM test", select.toString());
58+
}
59+
60+
@Test
61+
public void testVisit_PlainSelect_addition() throws JSQLParserException {
62+
String sql = "select a,b,c from test";
63+
Select select = (Select) parserManager.parse( new StringReader(sql));
64+
ConnectExpressionsVisitor instance = new ConnectExpressionsVisitor("testexpr") {
65+
66+
@Override
67+
protected BinaryExpression createBinaryExpression() {
68+
return new Addition();
69+
}
70+
};
71+
select.getSelectBody().accept(instance);
72+
73+
assertEquals("SELECT a + b + c AS testexpr FROM test", select.toString());
74+
}
75+
}

0 commit comments

Comments
 (0)