Files
meta-kit/src/main/java/net/tccn/base/arango/Doc.java
2019-04-02 14:31:34 +08:00

246 lines
6.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package net.tccn.base.arango;
import com.arangodb.ArangoCollection;
import com.arangodb.ArangoDBException;
import com.arangodb.ArangoDatabase;
import com.arangodb.entity.DocumentCreateEntity;
import javax.persistence.Table;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
* @author: liangxianyou at 2018/12/1 22:59.
*/
public abstract class Doc<T extends Doc> {
private HashMap attr = new HashMap();
private String _id;
private String _key;
private Set<String> _shows;
private Map _order;
public String getId() {
return _id;
}
public void setId(String id) {
this._id = id;
}
public String getKey() {
return _key;
}
public void setKey(String key) {
this._key = key;
}
public Doc<T> set(String k, Object v) {
attr.put(k, v);
return this;
}
public <V> V get(String k) {
return (V)attr.get(k);
}
/*public T setShows(String... show) {
if (_shows == null) {
_shows = new HashSet<>();
}
for (String s : show) {
_shows.add(s);
}
return (T) this;
}*/
public Set<String> get_Shows() {
return _shows;
}
/*public void set_Shows(Set<String> shows) {
this._shows = shows;
}*/
public T setOrder(String col, int desc) {
if (_order == null) {
_order = new LinkedHashMap();
}
_order.put(col, desc);
return (T) this;
}
public Map<String, Integer> getOrder() {
return _order;
}
/*public void setOrder(Map order) {
this._order = order;
}*/
/*@Override
public String toString() {
//convert.
String doc = convert.convertTo(this);
if (attr.size() == 0) {
return doc;
}
StringBuilder builder = new StringBuilder();
if (attr.size() != 0) {
String attrStr = convert.convertTo(attr);
builder.append("{");
builder.append(attrStr, 1, attrStr.length() - 1);
builder.append(",");
builder.append(doc, 1, doc.length()); //builder.append(doc.substring(1));
}
return builder.toString();
}*/
private Function<String, String> fieldName = (s) -> {
return s.replace("get", "").substring(0, 1).toLowerCase() + s.substring(4);
};
/**
* 提取Doc 属性到 Map用于存贮到Arango中
* 提取规则:
* 1、将doc中自带非空 !=null 属性提取都map中
* 2、将attr中属性覆盖到map中如果attr中存在同名属性attr为主
* @return
*/
public Map toDoc() {
HashMap clone = (HashMap) attr.clone();
Class<? extends Doc> type = this.getClass();
Method[] methods = type.getDeclaredMethods();
for (Method method : methods) {
String name = method.getName();
if (name.startsWith("get") && method.getParameterCount() == 0) {
//Type mt = method.getAnnotatedReturnType().getType();
try {
//System.out.println(method.getName());
Object v = method.invoke(this);
if (v != null) {
clone.put(fieldName.apply(name), v);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
return clone;
}
//---------------------------------------------------------------------------------------------------
private ArangoSource arangoSource;
private ArangoDatabase db;
private ArangoCollection collection;
private static ConcurrentHashMap<Class, Doc> daos = new ConcurrentHashMap();
public Doc() {
Table table = this.getClass().getAnnotation(Table.class);
String sourceName = null;
Source source = this.getClass().getAnnotation(Source.class);
if (source != null) {
sourceName = source.name();
}
arangoSource = ArangoSource.use(sourceName);
this.db = arangoSource.db(table.catalog());
this.collection = arangoSource.collection(this);
}
public final static <T extends Doc> T dao(Class<T> type) {
if (daos.get(type) == null) {
try {
daos.put(type, type.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return (T) daos.get(type);
}
//ok
public T save() {
DocumentCreateEntity<Map> tmap = collection.insertDocument(this.toDoc());
this.setId(tmap.getId());
this.setKey(tmap.getKey());
return (T) this;
}
//ok
public void update() {
collection.updateDocument(this.getKey(), this.toDoc());
}
public T findFirst(T t) {
return findFirst(arangoSource.parseAql(t, 0, 1), (Class<T>) t.getClass());
}
public List<T> find() {
return find((T) this, 0, 1000);
}
public List<T> find(T t) {
return find(t, 0, 1000);
}
public <T extends Doc> List<T> find(T t, int offset, int pn) {
return find(arangoSource.parseAql(t, offset, pn), (Class<T>)this.getClass());
}
public <T> List<T> find(String aql, Class<T> clazz) {
try {
return db.query(aql, clazz).asListRemaining();
} catch (ArangoDBException e) {
System.out.println(aql);
e.printStackTrace();
ArangoSource.init();
}
return db.query(aql, clazz).asListRemaining();
}
public <T> T findFirst(String aql, Class<T> clazz) {
try {
return db.query(aql, clazz).first();
} catch (ArangoDBException e) {
System.out.println(aql);
e.printStackTrace();
ArangoSource.init();
}
return db.query(aql, clazz).first();
}
public long count() {
return count(this);
}
public <T extends Doc> long count(T t) {
return db.query(arangoSource.parseAqlCount(t), long.class).first();
}
//ok
public <T extends Doc> T findByKey(Object key) {
return (T) collection.getDocument(String.valueOf(key), this.getClass());
}
//ok
public void delete() {
collection.deleteDocument(getKey());
}
public void delete(Collection<String> key) {
collection.deleteDocuments(key);
}
}