Skip to content

Commit 56d6ed8

Browse files
committed
translate to script when using binaryOper on select
1 parent 1212e06 commit 56d6ed8

File tree

3 files changed

+121
-17
lines changed

3 files changed

+121
-17
lines changed

src/main/java/org/nlpcn/es4sql/Util.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ public static Object expr2Object(SQLExpr expr) throws SqlParseException {
4545
value = expr.toString();
4646
}else if (expr instanceof SQLAllColumnExpr) {
4747
value = "*";
48-
} else {
48+
} else if (expr instanceof SQLValuableExpr){
49+
value = ((SQLValuableExpr)expr).getValue();
50+
} else {
4951
throw new SqlParseException("can not support this type " + expr.getClass());
5052
}
5153
return value;

src/main/java/org/nlpcn/es4sql/parse/FieldMaker.java

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.nlpcn.es4sql.parse;
22

3+
import java.util.ArrayList;
34
import java.util.LinkedList;
45
import java.util.List;
56

@@ -19,21 +20,31 @@
1920
*/
2021
public class FieldMaker {
2122
public static Field makeField(SQLExpr expr, String alias,String tableAlias) throws SqlParseException {
22-
if (expr instanceof SQLIdentifierExpr || expr instanceof SQLPropertyExpr || expr instanceof SQLVariantRefExpr) {
23-
String name = expr.toString().replace("`", "");
24-
if(tableAlias==null) return new Field(name, alias);
25-
else if(tableAlias!=null){
26-
String aliasPrefix = tableAlias + ".";
27-
if(name.startsWith(aliasPrefix))
28-
{
29-
name = name.replaceFirst(aliasPrefix,"");
30-
return new Field(name, alias);
31-
}
32-
}
33-
return null;
34-
} else if (expr instanceof SQLQueryExpr) {
35-
throw new SqlParseException("unknow field name : " + expr);
36-
} else if (expr instanceof SQLAllColumnExpr) {
23+
if (expr instanceof SQLIdentifierExpr || expr instanceof SQLPropertyExpr || expr instanceof SQLVariantRefExpr) {
24+
return handleIdentifer(expr, alias, tableAlias);
25+
} else if (expr instanceof SQLQueryExpr) {
26+
throw new SqlParseException("unknow field name : " + expr);
27+
} else if (expr instanceof SQLBinaryOpExpr) {
28+
//make a SCRIPT method field;
29+
SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) expr;
30+
List<SQLExpr> params = new ArrayList<>();
31+
32+
String scriptFieldAlias;
33+
if(alias == null || alias.equals(""))
34+
scriptFieldAlias = binaryExpr.toString();
35+
else
36+
scriptFieldAlias = alias;
37+
params.add(new SQLCharExpr(scriptFieldAlias));
38+
39+
Object left = getScriptValue(binaryExpr.getLeft());
40+
Object right = getScriptValue(binaryExpr.getRight());
41+
String script = String.format("%s %s %s" , left ,binaryExpr.getOperator().getName() , right);
42+
43+
params.add(new SQLCharExpr(script));
44+
45+
return makeMethodField("script",params,null,null);
46+
47+
} else if (expr instanceof SQLAllColumnExpr) {
3748
} else if (expr instanceof SQLMethodInvokeExpr) {
3849
SQLMethodInvokeExpr mExpr = (SQLMethodInvokeExpr) expr;
3950
return makeMethodField(mExpr.getMethodName(), mExpr.getParameters(), null, alias);
@@ -46,7 +57,31 @@ else if(tableAlias!=null){
4657
return null;
4758
}
4859

49-
private static MethodField makeMethodField(String name, List<SQLExpr> arguments, SQLAggregateOption option, String alias) throws SqlParseException {
60+
private static Object getScriptValue(SQLExpr expr) throws SqlParseException {
61+
if (expr instanceof SQLIdentifierExpr || expr instanceof SQLPropertyExpr || expr instanceof SQLVariantRefExpr) {
62+
return "doc['" + expr.toString() + "'].value";
63+
}
64+
else if (expr instanceof SQLValuableExpr){
65+
return ((SQLValuableExpr)expr).getValue();
66+
}
67+
throw new SqlParseException("could not parse sqlBinaryOpExpr need to be identifier/valuable got" + expr.getClass().getTypeName() + " with value:" +expr.toString() );
68+
}
69+
70+
private static Field handleIdentifer(SQLExpr expr, String alias, String tableAlias) {
71+
String name = expr.toString().replace("`", "");
72+
if(tableAlias==null) return new Field(name, alias);
73+
else if(tableAlias!=null){
74+
String aliasPrefix = tableAlias + ".";
75+
if(name.startsWith(aliasPrefix))
76+
{
77+
name = name.replaceFirst(aliasPrefix,"");
78+
return new Field(name, alias);
79+
}
80+
}
81+
return null;
82+
}
83+
84+
private static MethodField makeMethodField(String name, List<SQLExpr> arguments, SQLAggregateOption option, String alias) throws SqlParseException {
5085
List<KVValue> paramers = new LinkedList<>();
5186
for (SQLExpr object : arguments) {
5287
if (object instanceof SQLBinaryOpExpr) {

src/test/java/org/nlpcn/es4sql/SqlParserTests.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.nlpcn.es4sql;
22

33
import com.alibaba.druid.sql.ast.SQLExpr;
4+
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
45
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
56
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
67
import org.junit.Assert;
@@ -415,6 +416,72 @@ public void indexWithDotsAndHyphen() throws SqlParseException {
415416
Assert.assertEquals("data-2015.08.22",select.getFrom().get(0).getIndex());
416417
}
417418

419+
@Test
420+
public void scriptFiledPlusLiteralTest() throws SqlParseException {
421+
String query = "SELECT field1 + 3 FROM index/type";
422+
SQLExpr sqlExpr = queryToExpr(query);
423+
Select select = parser.parseSelect((SQLQueryExpr) sqlExpr);
424+
List<Field> fields = select.getFields();
425+
Assert.assertEquals(1,fields.size());
426+
Field field = fields.get(0);
427+
Assert.assertTrue(field instanceof MethodField);
428+
MethodField scriptMethod = (MethodField) field;
429+
Assert.assertEquals("script",scriptMethod.getName().toLowerCase());
430+
Assert.assertEquals(2,scriptMethod.getParams().size());
431+
Assert.assertEquals("field1 + 3" ,scriptMethod.getParams().get(0).toString());
432+
Assert.assertEquals("doc['field1'].value + 3" ,scriptMethod.getParams().get(1).toString());
433+
}
434+
435+
@Test
436+
public void scriptFieldPlusFieldTest() throws SqlParseException {
437+
String query = "SELECT field1 + field2 FROM index/type";
438+
SQLExpr sqlExpr = queryToExpr(query);
439+
Select select = parser.parseSelect((SQLQueryExpr) sqlExpr);
440+
List<Field> fields = select.getFields();
441+
Assert.assertEquals(1,fields.size());
442+
Field field = fields.get(0);
443+
Assert.assertTrue(field instanceof MethodField);
444+
MethodField scriptMethod = (MethodField) field;
445+
Assert.assertEquals("script",scriptMethod.getName().toLowerCase());
446+
Assert.assertEquals(2,scriptMethod.getParams().size());
447+
Assert.assertEquals("field1 + field2" ,scriptMethod.getParams().get(0).toString());
448+
Assert.assertEquals("doc['field1'].value + doc['field2'].value" ,scriptMethod.getParams().get(1).toString());
449+
}
450+
451+
452+
@Test
453+
public void scriptLiteralPlusLiteralTest() throws SqlParseException {
454+
String query = "SELECT 1 + 2 FROM index/type";
455+
SQLExpr sqlExpr = queryToExpr(query);
456+
Select select = parser.parseSelect((SQLQueryExpr) sqlExpr);
457+
List<Field> fields = select.getFields();
458+
Assert.assertEquals(1,fields.size());
459+
Field field = fields.get(0);
460+
Assert.assertTrue(field instanceof MethodField);
461+
MethodField scriptMethod = (MethodField) field;
462+
Assert.assertEquals("script",scriptMethod.getName().toLowerCase());
463+
Assert.assertEquals(2,scriptMethod.getParams().size());
464+
Assert.assertEquals("1 + 2" ,scriptMethod.getParams().get(0).toString());
465+
Assert.assertEquals("1 + 2" ,scriptMethod.getParams().get(1).toString());
466+
}
467+
468+
@Test
469+
public void scriptFieldPlusFieldWithAliasTest() throws SqlParseException {
470+
String query = "SELECT field1 + field2 as myfield FROM index/type";
471+
SQLExpr sqlExpr = queryToExpr(query);
472+
Select select = parser.parseSelect((SQLQueryExpr) sqlExpr);
473+
List<Field> fields = select.getFields();
474+
Assert.assertEquals(1,fields.size());
475+
Field field = fields.get(0);
476+
Assert.assertTrue(field instanceof MethodField);
477+
MethodField scriptMethod = (MethodField) field;
478+
Assert.assertEquals("script",scriptMethod.getName().toLowerCase());
479+
Assert.assertEquals(2,scriptMethod.getParams().size());
480+
Assert.assertEquals("myfield" ,scriptMethod.getParams().get(0).toString());
481+
Assert.assertEquals("doc['field1'].value + doc['field2'].value" ,scriptMethod.getParams().get(1).toString());
482+
}
483+
484+
418485
private SQLExpr queryToExpr(String query) {
419486
return new ElasticSqlExprParser(query).expr();
420487
}

0 commit comments

Comments
 (0)