package net.tccn.base.arango; import com.arangodb.ArangoCollection; import com.arangodb.ArangoDB; import com.arangodb.ArangoDatabase; import com.arangodb.entity.DocumentCreateEntity; import com.arangodb.entity.DocumentDeleteEntity; import com.arangodb.entity.MultiDocumentEntity; import net.tccn.base.MetaListenter; import net.tccn.base.Utils; import javax.annotation.Resource; import javax.persistence.Table; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; import static java.util.Arrays.asList; /** * 管理 数据源连接对象 * * @author: liangxianyou at 2018/12/15 11:35. */ public class ArangoSource { @Resource(name = "property.arango.host") private String host = "127.0.0.1"; @Resource(name = "property.arango.user") private String user = "root"; @Resource(name = "property.arango.password") private String password = "123456"; @Resource(name = "property.arango.port") private int port = 8529; public Logger logger = Logger.getLogger(this.getClass().getSimpleName()); private ArangoDB arangoDb; private static Map sourceMap = new HashMap(); private ArangoSource() { MetaListenter.resourceFactory.inject(this); arangoDb = new ArangoDB.Builder().host(host, port).user(user).password(password).timeout(1000*15).build(); } private ArangoSource(ArangoDB arangoDb) { MetaListenter.resourceFactory.inject(this); this.arangoDb = arangoDb; } public static ArangoSource use(String unit) { ArangoSource arangoSource = new ArangoSource(); return arangoSource; } public ArangoDatabase db(String db) { return arangoDb.db(db); } public ArangoCollection collection(Doc doc) { return collection(doc.getClass()); } public ArangoCollection collection(Class type) { Table table = type.getAnnotation(Table.class); //createDb(table.catalog()); return arangoDb.db(table.catalog()).collection(table.name()); } public boolean createDb(String db) { ArangoDatabase database = arangoDb.db(db); if (!database.exists()) { return database.create(); } logger.log(Level.INFO, "arango database exists"); return true; } public ArangoCollection createDocument(Doc doc) { Class type = doc.getClass(); Table table = type.getAnnotation(Table.class); ArangoDatabase database = arangoDb.db(table.catalog()); if (!database.exists()) { database.create(); } ArangoCollection collection = database.collection(table.name()); if (!collection.exists()) { collection.create(); } return collection; } // 首字母大写 private static Function upFirst = (s) -> { return s.substring(0, 1).toUpperCase() + s.substring(1); }; /** * Doc 转为查询对象 * * @param t * @param * @return */ private Function filterBuilder = (t) -> { Table table = t.getClass().getAnnotation(Table.class); StringBuilder buf = new StringBuilder(); buf.append("for d in ").append(table.name()); buf.append(" filter 1==1"); t.toDoc().forEach((k, v) -> { if (v != null && (v.getClass() == String.class || v instanceof Number)) { buf.append(" and d.").append(k).append("=="); } if (v.getClass() == String.class) { buf.append("'").append(v).append("'"); } else if (v instanceof Number) { buf.append(v); } }); return buf; }; private Function orderBuilder = (t) -> { StringBuilder buf = new StringBuilder(); Map order = t.getOrder(); if (Utils.isEmpty(order)) { return buf.append(" sort d._key desc"); } buf.append(" sort "); order.forEach((k, v) -> { buf.append("d.").append(k).append(v == 1 ? " desc," : " asc,"); }); buf.deleteCharAt(buf.length() - 1); return buf; }; private Function returnBuilder = (t) -> { StringBuilder buf = new StringBuilder(); if (Utils.isEmpty(t.get_Shows())) { return buf.append(" return d"); } buf.append(" return {"); t.get_Shows().forEach(x -> { buf.append(x).append(":d.").append(x).append(","); }); buf.deleteCharAt(buf.length() - 1).append("}"); return buf; }; public String parseAqlCount(T t) { StringBuilder buf = new StringBuilder(); buf.append(filterBuilder.apply(t)); buf.append(" COLLECT WITH COUNT INTO total"); buf.append(" return total"); //logger.log(Level.INFO, buf.toString()); return buf.toString(); } public String parseAql(T t, int offset, int ps) { if (offset < 0) offset = 0; if (ps <= 0) ps = 1000; StringBuilder buf = new StringBuilder(); buf.append(filterBuilder.apply(t)); buf.append(orderBuilder.apply(t)); buf.append(" limit ").append(offset).append(",").append(ps); buf.append(returnBuilder.apply(t)); //logger.log(Level.INFO, buf.toString()); return buf.toString(); } //---------------------------------------- //ok public T save(T doc) { DocumentCreateEntity tmap = collection(doc).insertDocument(doc.toDoc()); doc.setKey(tmap.getKey()); doc.setId(tmap.getId()); return doc; } //ok public void update(T doc) { collection(doc).updateDocument(doc.getKey(), doc.toDoc()); } //ok public T getDoc(Object key, Class type) { return collection(type).getDocument(String.valueOf(key), type); } //ok public DocumentDeleteEntity delete(String key, Class type) { return collection(type).deleteDocument(key); } //ok public MultiDocumentEntity> deleteAll(Doc... docs) { return collection(docs[0]).deleteDocuments(asList(docs)); } public MultiDocumentEntity find(Collection keys, Class type) { return collection(type).getDocuments(keys, type); } }