2626import java .util .List ;
2727import java .util .Map ;
2828import java .util .StringJoiner ;
29+ import java .util .function .Consumer ;
2930import java .util .stream .Collectors ;
3031
3132/**
@@ -51,7 +52,8 @@ public class SqlVisitor implements ExpressionVisitor<StringBuilder> {
5152 }
5253 }};
5354
54- private final String prefix ;
55+ private final String tableName ;
56+ private final boolean withBackticks ;
5557 private final LinkedListStack <List <ConstantExpression >> arguments ;
5658
5759 /**
@@ -69,16 +71,18 @@ public class SqlVisitor implements ExpressionVisitor<StringBuilder> {
6971 e .printStackTrace ();
7072 }
7173 }};
74+
7275 private StringBuilder sb ;
7376 private Expression body ;
7477 private Expression javaMethodParameter ;
7578
76- SqlVisitor (String prefix ) {
77- this (prefix , new LinkedListStack <>());
79+ SqlVisitor (String tableName , boolean withBackTicks ) {
80+ this (tableName , withBackTicks , new LinkedListStack <>());
7881 }
7982
80- private SqlVisitor (String prefix , LinkedListStack <List <ConstantExpression >> arguments ) {
81- this .prefix = prefix ;
83+ private SqlVisitor (String tableName , boolean withBackticks , LinkedListStack <List <ConstantExpression >> arguments ) {
84+ this .tableName = tableName ;
85+ this .withBackticks = withBackticks ;
8286 this .arguments = arguments ;
8387 this .sb = new StringBuilder ();
8488 }
@@ -222,21 +226,22 @@ public StringBuilder visit(DelegateExpression e) {
222226 @ Override
223227 public StringBuilder visit (MemberExpression e ) {
224228 if (registeredMethods .containsKey (e .getMember ())) {
225- return Expression .binary (registeredMethods .get (e .getMember ()), e .getInstance (), javaMethodParameter ).accept (this );
229+ return Expression .binary (registeredMethods .get (e .getMember ()), e .getInstance (), this . javaMethodParameter ).accept (this );
226230 }
227231
228- if (complexMethods .containsKey (e .getMember ())) {
229- return sb .append (complexMethods .get (e .getMember ()).apply (e .getInstance (), javaMethodParameter , false ));
232+ if (this . complexMethods .containsKey (e .getMember ())) {
233+ return sb .append (this . complexMethods .get (e .getMember ()).apply (e .getInstance (), this . javaMethodParameter , false ));
230234 }
231235
232236 var nameArray = e .getMember ().getName ().replaceAll ("^(get)" , "" ).toCharArray ();
233237 nameArray [0 ] = Character .toLowerCase (nameArray [0 ]);
234238 var name = new String (nameArray );
235- if (prefix == null ) {
239+ if (this . tableName == null ) {
236240 return sb .append (name );
237241 }
238242
239- return sb .append (prefix ).append ("." ).append (name );
243+ String escape = this .withBackticks ? "`" : "" ;
244+ return sb .append (escape ).append (this .tableName ).append (escape ).append ("." ).append (escape ).append (name ).append (escape );
240245 }
241246
242247 /**
@@ -287,28 +292,30 @@ public StringBuilder visit(UnaryExpression e) {
287292
288293 //region Complex Java methods
289294
290- private StringBuilder stringStartsWith (Expression e , Expression e1 , boolean negated ) {
291- var valueBuilder = e1 .accept (new SqlVisitor (this .prefix , this .arguments ));
292- valueBuilder .insert (valueBuilder .length () - 1 , '%' );
293- return e .accept (new SqlVisitor (this .prefix , this .arguments )).append (negated ? " NOT" : "" ).append (" LIKE " ).append (valueBuilder );
295+ private StringBuilder stringStartsWith (Expression member , Expression argument , boolean negated ) {
296+ return doStringOperation (member , argument , negated , valueBuilder -> valueBuilder .insert (valueBuilder .length () - 1 , '%' ));
294297 }
295298
296- private StringBuilder stringEndsWith (Expression e , Expression e1 , boolean negated ) {
297- return e . accept ( new SqlVisitor ( this . prefix , this . arguments )). append ( negated ? " NOT" : "" ). append ( " LIKE " ). append ( e1 . accept ( new SqlVisitor ( this . prefix , this . arguments )) .insert (1 , '%' ));
299+ private StringBuilder stringEndsWith (Expression member , Expression argument , boolean negated ) {
300+ return doStringOperation ( member , argument , negated , valueBuilder -> valueBuilder .insert (1 , '%' ));
298301 }
299302
300- private StringBuilder stringContains (Expression e , Expression e1 , boolean negated ) {
301- var valueBuilder = e1 .accept (new SqlVisitor (this .prefix , this .arguments ));
302- valueBuilder .insert (1 , '%' ).insert (valueBuilder .length () - 1 , '%' );
303- return e .accept (new SqlVisitor (this .prefix , this .arguments )).append (negated ? " NOT" : "" ).append (" LIKE " ).append (valueBuilder );
303+ private StringBuilder stringContains (Expression member , Expression argument , boolean negated ) {
304+ return doStringOperation (member , argument , negated , valueBuilder -> valueBuilder .insert (1 , '%' ).insert (valueBuilder .length () - 1 , '%' ));
304305 }
305306
306- private StringBuilder listContains (Expression e , Expression e1 , boolean negated ) {
307- List l = (List ) arguments .pop ().get (((ParameterExpression ) e ).getIndex ()).getValue ();
307+ private StringBuilder listContains (Expression listAsArgument , Expression argument , boolean negated ) {
308+ List l = (List ) arguments .pop ().get (((ParameterExpression ) listAsArgument ).getIndex ()).getValue ();
308309 var joiner = new StringJoiner (", " , "(" , ")" );
309310 l .forEach (x -> joiner .add (x .toString ()));
310- return e1 .accept (new SqlVisitor (this .prefix , this .arguments )).append (negated ? " NOT" : "" ).append (" IN " ).append (joiner .toString ());
311+ return argument .accept (new SqlVisitor (this .tableName , this . withBackticks , this .arguments )).append (negated ? " NOT" : "" ).append (" IN " ).append (joiner .toString ());
311312 }
312313
313314 //endregion
315+
316+ private StringBuilder doStringOperation (Expression member , Expression argument , boolean negated , Consumer <StringBuilder > modifier ) {
317+ var valueBuilder = argument .accept (new SqlVisitor (this .tableName , this .withBackticks , this .arguments ));
318+ modifier .accept (valueBuilder );
319+ return member .accept (new SqlVisitor (this .tableName , this .withBackticks , this .arguments )).append (negated ? " NOT" : "" ).append (" LIKE " ).append (valueBuilder );
320+ }
314321}
0 commit comments