redis数据集插件。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

103 lines
3.3 KiB

package com.fr.plugin.db.redis.core;
import com.fr.general.GeneralUtils;
import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.script.ScriptFactory;
import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by richie on 2017/6/5.
*/
public class DataWrapper<T> {
public static <T> DataWrapper<T> create(List<List<T>> data, String[] columnNames) {
return new DataWrapper<T>(data, columnNames);
}
public static DataWrapper EMPTY = new DataWrapper(null, RedisConstants.DEFAULT_COLUMN_NAMES);
private List<List<T>> data;
private String[] columnNames;
private DataWrapper(List<List<T>> data, String[] columnNames) {
this.data = data;
this.columnNames = columnNames;
}
public String[] getColumnNames() {
if (columnNames == null) {
return RedisConstants.DEFAULT_COLUMN_NAMES;
}
return columnNames;
}
public List<List<T>> getData() {
return data;
}
public void transform(String script) throws ScriptException {
if (StringUtils.isBlank(script)) {
return;
}
String scriptText = null;
if (script.startsWith("file:///")) {
try {
FileInputStream in = new FileInputStream(new File(readAndRenderScriptFile(script)));
scriptText = IOUtils.inputStream2String(in);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
} else {
scriptText = String.format("(function(){%s})()", script);
}
ScriptEngine scriptEngine = ScriptFactory.newScriptEngine();
scriptEngine.put("$content", data);
scriptEngine.put("$column", columnNames);
Object r = scriptEngine.eval(scriptText);
if (r instanceof Map) {
Map<String, Object> map = (Map<String, Object>)r;
if (map.containsKey("column") && map.containsKey("content")) {
Object vector = map.get("column");
List<String> names = new ArrayList<String>();
for (Object name : ((Map)vector).values()) {
names.add(GeneralUtils.objectToString(name));
}
columnNames = names.toArray(new String[0]);
Object content = map.get("content");
if (content instanceof Map) {
List<List<T>> list = new ArrayList<List<T>>();
for (Object element : ((Map)content).values()) {
list.add(object2List(element));
}
data = list;
}
}
}
}
private List<T> object2List(Object obj) {
List<T> list = new ArrayList<T>();
if (obj instanceof Map) {
for (Object element : ((Map)obj).values()) {
list.add((T)element);
}
} else {
list.add((T)obj);
}
return list;
}
private String readAndRenderScriptFile(String filePath) {
return filePath.replaceFirst("\\$ENV_HOME", WorkContext.getCurrent().getPath());
}
}