forked from fanruan/demo-tabledata-es
richie
4 years ago
12 changed files with 296 additions and 14 deletions
Binary file not shown.
@ -0,0 +1,93 @@
|
||||
package com.fr.plugin.db.es.fun.query; |
||||
|
||||
import com.fanruan.api.cal.ParameterKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.script.ScriptKit; |
||||
import com.fanruan.api.util.GeneralKit; |
||||
import com.fanruan.api.util.RenderKit; |
||||
import com.fr.general.FArray; |
||||
import com.fr.plugin.db.es.fun.help.RenderUtils; |
||||
import com.fr.plugin.db.es.fun.type.ParaType; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.ParameterProvider; |
||||
|
||||
import javax.script.ScriptException; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2020/9/11 |
||||
*/ |
||||
public class QueryBuilder { |
||||
|
||||
public String build(ParameterProvider[] ps, String query, ParaType paraType) { |
||||
if (ParaType.PLAIN == paraType) { |
||||
return RenderUtils.renderPlainText(query, ps); |
||||
} |
||||
int len = ArrayUtils.getLength(ps); |
||||
StringBuilder sb = new StringBuilder(); |
||||
sb.append("JSON.stringify((function("); |
||||
String[] paras = new String[len]; |
||||
Object[] values = new Object[len]; |
||||
for (int i = 0; i < len;i ++) { |
||||
paras[i] = ps[i].getName(); |
||||
Object value = ps[i].getValue(); |
||||
if (value instanceof String) { |
||||
values[i] = "\"" + value + "\""; |
||||
} else if (value instanceof Iterable) { |
||||
List<Object> objects = new ArrayList<>(); |
||||
((Iterable)value).forEach(el-> { |
||||
if (el instanceof String) { |
||||
objects.add("\"" + el + "\""); |
||||
} else { |
||||
objects.add(el); |
||||
} |
||||
}); |
||||
values[i] = "[" + GeneralKit.join(objects.toArray(new Object[0]), ",") + "]"; |
||||
} else { |
||||
values[i] = value; |
||||
} |
||||
} |
||||
sb.append(GeneralKit.join(paras, ",")); |
||||
sb.append("){"); |
||||
sb.append(renderQuery(ps, query)); |
||||
sb.append("}("); |
||||
sb.append(GeneralKit.join(values, ",")); |
||||
sb.append(")))"); |
||||
try { |
||||
return GeneralKit.objectToString(ScriptKit.newScriptEngine().eval(sb.toString())); |
||||
} catch (ScriptException e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
return RenderUtils.renderPlainText(query, ps); |
||||
} |
||||
|
||||
private String renderQuery(ParameterProvider[] ps, String query) { |
||||
int len = ArrayUtils.getLength(ps); |
||||
Map<String, Object> map = new HashMap<>(); |
||||
for (int i = 0; i < len; i ++) { |
||||
map.put(ps[i].getName(), ps[i].getName()); |
||||
} |
||||
try { |
||||
return RenderKit.renderParameter4Tpl(query, map); |
||||
} catch (Exception e) { |
||||
return query; |
||||
} |
||||
} |
||||
|
||||
public static void main(String... args) { |
||||
ParameterProvider[] ps = new ParameterProvider[] { |
||||
ParameterKit.newParameter("aa", 1), |
||||
ParameterKit.newParameter("bb", "xxx"), |
||||
ParameterKit.newParameter("cc", null), |
||||
ParameterKit.newParameter("dd", new FArray(new String[]{"qqq","qq","zzz"})), |
||||
}; |
||||
QueryBuilder builder = new QueryBuilder(); |
||||
String r = builder.build(ps, "return {\"aa\":aa};", ParaType.ECMASCRIPT); |
||||
System.out.println(r); |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.fr.plugin.db.es.fun.type; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2020/9/11 |
||||
*/ |
||||
public enum ParaType { |
||||
|
||||
PLAIN("PLAIN"), ECMASCRIPT("SCRIPT"); |
||||
|
||||
private String type; |
||||
|
||||
ParaType(String type) { |
||||
this.type = type; |
||||
} |
||||
|
||||
public String getType() { |
||||
return type; |
||||
} |
||||
|
||||
public static ParaType parse(String text) { |
||||
for (ParaType qt : values()) { |
||||
if (qt.type.equals(text)) { |
||||
return qt; |
||||
} |
||||
} |
||||
return PLAIN; |
||||
} |
||||
} |
Loading…
Reference in new issue