diff --git a/uno-core/src/main/java/cc/allio/uno/core/reflect/ReflectTools.java b/uno-core/src/main/java/cc/allio/uno/core/reflect/ReflectTools.java index aaa881a1..45c356dc 100644 --- a/uno-core/src/main/java/cc/allio/uno/core/reflect/ReflectTools.java +++ b/uno-core/src/main/java/cc/allio/uno/core/reflect/ReflectTools.java @@ -50,6 +50,7 @@ public static Class getGenericType(@NonNull Object obj, @NonNull Class sup /** * get specific generic type by index * + * @param index determinate generic type index, ignore if indistinct * @return index generic type or null * @see #obtainGenericTypes(Class, Class) */ @@ -123,7 +124,11 @@ public static Class[] obtainGenericTypes(Class objClass, Class superCla if (superType instanceof ParameterizedType parameterizedSuperType) { Type[] actualTypeArguments = parameterizedSuperType.getActualTypeArguments(); try { - return Arrays.stream(actualTypeArguments).map(Class.class::cast).toArray(Class[]::new); + return Arrays.stream(actualTypeArguments) + // t must be class type + .filter(t -> Class.class.isAssignableFrom(t.getClass())) + .map(Class.class::cast) + .toArray(Class[]::new); } catch (Throwable ex) { log.error("obtain generic type by obj class {} from super class {}, happen class cast error", objClass.getName(), superClassOrInterface.getName(), ex); return new Class[0]; @@ -183,6 +188,5 @@ static List findGenericTypes(Class clazz) { static class BinaryClassKey { private final Class cls1; private final Class cls2; - } } diff --git a/uno-core/src/main/java/cc/allio/uno/core/util/template/ExpressionTemplate.java b/uno-core/src/main/java/cc/allio/uno/core/util/template/ExpressionTemplate.java index dc3de448..4cff25a7 100644 --- a/uno-core/src/main/java/cc/allio/uno/core/util/template/ExpressionTemplate.java +++ b/uno-core/src/main/java/cc/allio/uno/core/util/template/ExpressionTemplate.java @@ -48,7 +48,7 @@ public interface ExpressionTemplate { * @param v1 模板变量v * @return 解析完成的字符串 */ - default String paresTemplate(String template, String k1, Object v1) { + default String parseTemplate(String template, String k1, Object v1) { return parseTemplate(template, Tuples.of(k1, v1)); } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/Operator.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/Operator.java index 5cdfde48..bc3d697a 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/Operator.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/Operator.java @@ -57,6 +57,29 @@ default Object getValueIfNull(Object originalValue) { return Objects.requireNonNullElse(originalValue, ValueWrapper.EMPTY_VALUE); } + /** + * according to operator type, this type maybe is subtype, so translate specifies operator type + *

rules

+ * + * + * @param operatorType operatorType + * @return {@link Operator} or parent type + */ + static Class> getHireachialType(Class> operatorType) { + if (!operatorType.isInterface()) { + Class[] interfaces = operatorType.getInterfaces(); + for (Class hireachial : interfaces) { + if (Operator.class.isAssignableFrom(hireachial)) { + return (Class>) hireachial; + } + } + } + return operatorType; + } + /** * Operator 分组注解 */ diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/OperatorGroup.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/OperatorGroup.java index cc6e9207..2dd95757 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/OperatorGroup.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/OperatorGroup.java @@ -38,6 +38,13 @@ default QueryOperator query() { */ QueryOperator query(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getQueryOperator(Class queryOperatorClass, OperatorKey operatorKey) { + return getOperator(queryOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -62,6 +69,13 @@ default InsertOperator insert() { */ InsertOperator insert(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getInsertOperator(Class insertOperatorClass, OperatorKey operatorKey) { + return getOperator(insertOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -86,6 +100,13 @@ default UpdateOperator update() { */ UpdateOperator update(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getUpdateOperator(Class updateOperatorClass, OperatorKey operatorKey) { + return getOperator(updateOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -109,6 +130,13 @@ default DeleteOperator delete() { */ DeleteOperator delete(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getDeleteOperator(Class deleteOperatorClass, OperatorKey operatorKey) { + return getOperator(deleteOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -135,6 +163,13 @@ default CreateTableOperator createTable() { */ CreateTableOperator createTable(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getCreateTableOperator(Class createTableOperatorClass, OperatorKey operatorKey) { + return getOperator(createTableOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -159,6 +194,13 @@ default DropTableOperator dropTable() { */ DropTableOperator dropTable(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getDropTableOperator(Class dropTableOperatorClass, OperatorKey operatorKey) { + return getOperator(dropTableOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -183,6 +225,13 @@ default ExistTableOperator existTable() { */ ExistTableOperator existTable(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getExistTableOperator(Class existTableOperatorClass, OperatorKey operatorKey) { + return getOperator(existTableOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -207,6 +256,13 @@ default ShowColumnsOperator showColumns() { */ ShowColumnsOperator showColumns(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getShowColumnsOperator(Class showColumnsOperatorClass, OperatorKey operatorKey) { + return getOperator(showColumnsOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -231,6 +287,13 @@ default ShowTablesOperator showTables() { */ ShowTablesOperator showTables(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getShowTablesOperator(Class showTablesOperatorClass, OperatorKey operatorKey) { + return getOperator(showTablesOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -253,6 +316,13 @@ default AlterTableOperator alterTables() { */ AlterTableOperator alterTables(DBType dbType); + /** + * @see #getOperator(Class, OperatorKey, DBType) + */ + static T getAlterTableOperator(Class alterTableOperatorClass, OperatorKey operatorKey) { + return getOperator(alterTableOperatorClass, operatorKey, null); + } + /** * @see #getOperator(Class, OperatorKey, DBType) */ @@ -261,9 +331,9 @@ static T getAlterTableOperator(Class alterTabl } /** - * 获取当前系统的SQL Operator + * 获取当前系统的OperatorGroup * - * @return OperatorMetadata or DruidOperatorMetadata + * @see #getOperatorGroup(OperatorKey) */ static OperatorGroup getSystemOperatorGroup() { OperatorKey systemOperatorKey = OperatorKey.getSystemOperatorKey(); @@ -273,6 +343,11 @@ static OperatorGroup getSystemOperatorGroup() { return getOperatorGroup(systemOperatorKey); } + /** + * base on operator key gain {@link OperatorGroup} + * + * @return {@link OperatorGroup} or null + */ static OperatorGroup getOperatorGroup(OperatorKey operatorKey) { if (operatorKey != null) { return new OperatorGroupImpl(operatorKey); diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelper.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelper.java index d03cf4d5..b6b19333 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelper.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelper.java @@ -116,28 +116,42 @@ private static T ifNullThenAgain(SupplierAction action, VoidConsumer comp /** * 基于SPI加载{@link Operator}的类型,放入缓存 */ - private static void loadOperatorBySPI(Class> operatorClazz) { - ServiceLoader.load(operatorClazz, ClassLoader.getSystemClassLoader()) - .stream() - .forEach(provider -> { - Class> type = provider.type(); - Operator.Group group = AnnotationUtils.findAnnotation(type, Operator.Group.class); - if (group == null) { - throw new IllegalArgumentException(String.format("Operator %s without Annotation @SQLOperator.Group", type.getName())); - } - String groupKey = group.value(); - Lock writeLock = lock.writeLock(); - writeLock.lock(); - try { - OperatorTraitGroup operatorTraitGroup = OTG_CACHES.computeIfAbsent(OperatorKey.returnKey(groupKey), k -> new OperatorTraitGroup()); - if (log.isDebugEnabled()) { - log.debug("Through SPI load Operator Type [{}]", type.getName()); + private static void loadOperatorBySPI(Class> operatorClass) { + ServiceLoader> loader = ServiceLoader.load(operatorClass, ClassLoader.getSystemClassLoader()); + boolean present = loader.stream().findAny().isPresent(); + if (!present) { + Class[] interfaces = operatorClass.getInterfaces(); + for (Class hierachical : interfaces) { + // recursion of find parent class + // requirement parent class must be interfaces and subtype of Operator + if (Operator.class.isAssignableFrom(hierachical)) { + loadOperatorBySPI((Class>) hierachical); + break; + } + } + } else { + loader.reload(); + loader.stream() + .forEach(provider -> { + Class> type = provider.type(); + Operator.Group group = AnnotationUtils.findAnnotation(type, Operator.Group.class); + if (group == null) { + throw new IllegalArgumentException(String.format("Operator %s without Annotation @SQLOperator.Group", type.getName())); } - operatorTraitGroup.append(type); - } finally { - writeLock.unlock(); - } - }); + String groupKey = group.value(); + Lock writeLock = lock.writeLock(); + writeLock.lock(); + try { + OperatorTraitGroup operatorTraitGroup = OTG_CACHES.computeIfAbsent(OperatorKey.returnKey(groupKey), k -> new OperatorTraitGroup()); + if (log.isDebugEnabled()) { + log.debug("Through SPI load Operator Type [{}]", type.getName()); + } + operatorTraitGroup.append(type); + } finally { + writeLock.unlock(); + } + }); + } } static class OperatorTraitGroup { @@ -148,17 +162,33 @@ public OperatorTraitGroup() { this.traits = Sets.newConcurrentHashSet(); } + /** + * by the operator class find OperatorTrait + * + * @param operatorClazz operatorClazz + * @return OperatorTrait or null + */ public OperatorTrait find(Class> operatorClazz) { + // find operator class parent + Class> parent = Operator.getHireachialType(operatorClazz); return this.traits.stream() - .filter(trait -> trait.getSuperClazz().equals(operatorClazz)) + .filter(trait -> trait.getParent().equals(parent)) .findFirst() .orElse(null); } + /** + * @see #append(OperatorTrait) + */ public void append(Class> implClazz) { this.append(new OperatorTrait(implClazz)); } + /** + * with group append {@link OperatorTrait} instance + * + * @param trait trait must not nul + */ public void append(OperatorTrait trait) { if (trait == null) { throw new IllegalArgumentException("parameter OperatorTrait is null"); @@ -171,26 +201,27 @@ public void append(OperatorTrait trait) { } @Data - @EqualsAndHashCode(of = "superClazz") + @EqualsAndHashCode(of = "parent") static class OperatorTrait { private final Class> clazz; - private Class> superClazz; + private Class> parent; public OperatorTrait(Class> clazz) { this.clazz = clazz; - Class[] interfaces = this.clazz.getInterfaces(); - for (Class in : interfaces) { - if (Operator.class.isAssignableFrom(in)) { - this.superClazz = (Class>) in; - break; - } - } - if (superClazz == null) { - throw new DSLException(String.format("operator impl %s not implement any SQLOperator", clazz.getName())); + this.parent = Operator.getHireachialType(clazz); + if (this.parent == null) { + throw new DSLException(String.format("operator impl %s not implement any Operator", clazz.getName())); } } + /** + * new Operator instance by dbtype + * + * @param dbType dbType + * @param generic Operator type + * @return Operator instance + */ public > T newInstance(DBType dbType) { Operator sqlOperator; try { @@ -200,7 +231,7 @@ public > T newInstance(DBType dbType) { sqlOperator = ClassUtils.newInstance(clazz, dbType); } } catch (Throwable ex) { - throw new DSLException(String.format("Instance SQLOperator %s failed, please invoke method Is it right?", clazz.getName()), ex); + throw new DSLException(String.format("Instance Operator %s failed, please invoke method Is it right?", clazz.getName()), ex); } return (T) sqlOperator; } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/AbstractCommandExecutor.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/AbstractCommandExecutor.java index cf5701e0..6cf1c040 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/AbstractCommandExecutor.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/AbstractCommandExecutor.java @@ -1,5 +1,7 @@ package cc.allio.uno.data.orm.executor; +import cc.allio.uno.data.orm.dsl.ddl.ShowColumnsOperator; +import cc.allio.uno.data.orm.dsl.ddl.ShowTablesOperator; import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.interceptor.*; @@ -8,7 +10,8 @@ import cc.allio.uno.data.orm.dsl.dml.QueryOperator; import cc.allio.uno.data.orm.executor.internal.InnerCommandExecutorManager; import cc.allio.uno.data.orm.executor.internal.QOInnerCommandExecutor; -import cc.allio.uno.data.orm.executor.internal.SPIInnerCommandScanner; +import cc.allio.uno.data.orm.executor.internal.SCOInnerCommandExecutor; +import cc.allio.uno.data.orm.executor.internal.STInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorOptions; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -59,10 +62,12 @@ protected boolean doBool(Operator operator, CommandType commandType, ResultSe case CREATE_TABLE -> manager.getCreateTable().exec(operator, resultSetHandler); case DELETE_TABLE -> manager.getDeleteTable().exec(operator, resultSetHandler); case EXIST_TABLE -> manager.getExistTable().exec(operator, resultSetHandler); + case ALERT_TABLE -> manager.getAlter().exec(operator, resultSetHandler); case INSERT -> manager.getInsert().exec(operator, resultSetHandler); case UPDATE -> manager.getUpdate().exec(operator, resultSetHandler); case DELETE -> manager.getDelete().exec(operator, resultSetHandler); - default -> false; + default -> throw new DSLException(String.format("unknown command type in bool %s, accepted " + + "'CREATE_TABLE', 'DELETE_TABLE', 'EXIST_TABLE', 'ALERT_TABLE', 'INSERT', 'UPDATE', 'DELETE'", commandType)); }; } catch (Throwable ex) { throw new DSLException(String.format("exec operator %s has err", operator.getClass().getName()), ex); @@ -70,27 +75,37 @@ protected boolean doBool(Operator operator, CommandType commandType, ResultSe } @Override - public List queryList(QueryOperator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler) { + public List queryList(Operator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler) { return aspect(queryOperator, commandType, () -> doQueryList(queryOperator, commandType, resultSetHandler)); } /** * 子类实现 * - * @param queryOperator QueryOperator + * @param 返回结果类型 + * @param operator operator * @param commandType 命令类型 * @param resultSetHandler 结果集处理器 - * @param 返回结果类型 * @return List * @throws DSLException query failed throw */ - protected List doQueryList(QueryOperator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler) { + protected List doQueryList(Operator operator, CommandType commandType, ListResultSetHandler resultSetHandler) { InnerCommandExecutorManager manager = getManager(); if (manager == null) { throw new DSLException("inner command executor manager is null, can't execute operator"); } + try { - return manager.>getQuery().exec(queryOperator, resultSetHandler); + return switch (commandType) { + case SHOW_TABLES -> + manager.>getShowTable().exec(operator, resultSetHandler); + case SHOW_COLUMNS -> + manager.>getShowColumn().exec(operator, resultSetHandler); + case SELECT -> + manager.>getQuery().exec(operator, resultSetHandler); + default -> + throw new DSLException(String.format("unknown command type in queryList %s, accepted 'SHOW_TABLES', 'SHOW_COLUMNS', 'SELECT'", commandType)); + }; } catch (Throwable ex) { throw new DSLException("exec query list has err", ex); } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandExecutor.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandExecutor.java index 17a0b806..ef537d23 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandExecutor.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandExecutor.java @@ -68,7 +68,7 @@ default boolean bool(Operator operator, CommandType command) { * @return List * @throws DSLException query failed throw */ - List queryList(QueryOperator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler); + List queryList(Operator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler); /** * 检查给定的集合是否只有一个元素 diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandType.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandType.java index 5f65750a..c5810a77 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandType.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/CommandType.java @@ -22,7 +22,7 @@ public enum CommandType { UNKNOWN(null), ALERT_TABLE(AlterTableOperator.class), CREATE_TABLE(CreateTableOperator.class), - DELETE_TABLE(DeleteOperator.class), + DELETE_TABLE(DropTableOperator.class), EXIST_TABLE(ExistTableOperator.class), INSERT(InsertOperator.class), UPDATE(UpdateOperator.class), @@ -45,11 +45,13 @@ public static > CommandType getByOperatorClass(Class o) if (o == null) { return null; } + // try get hirachical + Class> hireachialType = Operator.getHireachialType(o); for (CommandType commandType : values()) { - if (commandType.operatorClass == null) { - return null; + if (commandType == UNKNOWN || commandType == FLUSH) { + continue; } - if (commandType.operatorClass.isAssignableFrom(o)) { + if (commandType.operatorClass.isAssignableFrom(hireachialType)) { return commandType; } } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/DDLCommandExecutor.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/DDLCommandExecutor.java index 387221f1..fc1e892c 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/DDLCommandExecutor.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/DDLCommandExecutor.java @@ -284,7 +284,7 @@ default List showColumns(UnaryOperator func) { * @return ColumnDef */ default List showColumns(ShowColumnsOperator showColumnsOperator) { - return queryList(showColumnsOperator.toQueryOperator(), CommandType.SHOW_COLUMNS, getOptions().obtainColumnDefListResultSetHandler()); + return queryList(showColumnsOperator, CommandType.SHOW_COLUMNS, getOptions().obtainColumnDefListResultSetHandler()); } /** @@ -333,7 +333,7 @@ default List showTables(UnaryOperator func) { * @return List
*/ default List
showTables(ShowTablesOperator showTablesOperator) { - return queryList(showTablesOperator.toQueryOperator(), CommandType.SHOW_TABLES, getOptions().obtainTableListResultSetHandler()); + return queryList(showTablesOperator, CommandType.SHOW_TABLES, getOptions().obtainTableListResultSetHandler()); } /** diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/ResultGroup.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/ResultGroup.java index 1058f2a3..99157bab 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/ResultGroup.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/ResultGroup.java @@ -405,4 +405,4 @@ public K getValue(DSLName columnName, Function transfer, Suppl .map(adjuster) .orElse(null); } -} +} \ No newline at end of file diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/MapResultSetHandler.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/MapResultSetHandler.java index ca4d3b5a..751110d5 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/MapResultSetHandler.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/MapResultSetHandler.java @@ -13,12 +13,8 @@ */ public class MapResultSetHandler extends ExecutorOptionsAwareImpl implements ResultSetHandler> { - public MapResultSetHandler() { - } - @Override public Map apply(ResultGroup resultGroup) { return resultGroup.toMap(); } - } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/TableListResultSetHandler.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/TableListResultSetHandler.java index 8db6dda2..60180cc6 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/TableListResultSetHandler.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/handler/TableListResultSetHandler.java @@ -17,10 +17,10 @@ */ public class TableListResultSetHandler extends ExecutorOptionsAwareImpl implements ListResultSetHandler
{ - private static final DSLName TABLE_CATALOG_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_CATALOG_FILED, DSLName.HUMP_FEATURE); - private static final DSLName TABLE_SCHEMA_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_SCHEMA_FILED, DSLName.HUMP_FEATURE); - private static final DSLName TABLE_NAME_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_NAME_FILED, DSLName.HUMP_FEATURE); - private static final DSLName TABLE_TYPE_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_TYPE_FILED, DSLName.HUMP_FEATURE); + public static final DSLName TABLE_CATALOG_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_CATALOG_FILED, DSLName.HUMP_FEATURE); + public static final DSLName TABLE_SCHEMA_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_SCHEMA_FILED, DSLName.HUMP_FEATURE); + public static final DSLName TABLE_NAME_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_NAME_FILED, DSLName.HUMP_FEATURE); + public static final DSLName TABLE_TYPE_DSL_NAME = DSLName.of(ShowTablesOperator.TABLE_TYPE_FILED, DSLName.HUMP_FEATURE); @Override public List
apply(ResultSet resultSet) { diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/InnerCommandExecutorManager.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/InnerCommandExecutorManager.java index d1623c4a..4c24f657 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/InnerCommandExecutorManager.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/InnerCommandExecutorManager.java @@ -40,11 +40,11 @@ public class InnerCommandExecutorManager { * @param {@link InnerCommandExecutor} operator */ public , H> void set(Class operatorType, InnerCommandExecutor executor) { - registry.put(operatorType, executor); CommandType commandType = CommandType.getByOperatorClass(operatorType); if (commandType != null) { commandExecutorMap.put(commandType, executor); } + registry.put(operatorType, executor); } /** @@ -80,7 +80,7 @@ public > InnerListCommandExecutor getList(Class {@link InnerCommandExecutor#exec(Operator, Object)} return type @@ -183,13 +183,27 @@ public > E ge * @param sub-type {@link SCOInnerCommandExecutor} * @return SCOInnerCommandExecutor instance or null */ - public > E getShowColumn() { + public > E getShowColumn() { if (commandExecutorMap.containsKey(CommandType.SHOW_COLUMNS)) { return (E) commandExecutorMap.get(CommandType.SHOW_COLUMNS); } return null; } + /** + * get {@link STInnerCommandExecutor} if exist + * + * @param sub-type {@link ShowTablesOperator} + * @param sub-type {@link STInnerCommandExecutor} + * @return SCOInnerCommandExecutor instance or null + */ + public > E getShowTable() { + if (commandExecutorMap.containsKey(CommandType.SHOW_TABLES)) { + return (E) commandExecutorMap.get(CommandType.SHOW_TABLES); + } + return null; + } + /** * get {@link UOInnerCommandExecutor} if exist * diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SCOInnerCommandExecutor.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SCOInnerCommandExecutor.java index 7a678026..04edd9cf 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SCOInnerCommandExecutor.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SCOInnerCommandExecutor.java @@ -11,10 +11,10 @@ * @date 2024/3/15 04:36 * @since 1.1.7 */ -public interface SCOInnerCommandExecutor extends InnerListCommandExecutor { +public interface SCOInnerCommandExecutor extends InnerListCommandExecutor { @Override default Class getRealityOperatorType() { - return (Class) ReflectTools.getGenericType(this, SCOInnerCommandExecutor.class); + return (Class) ReflectTools.getGenericType(this, SCOInnerCommandExecutor.class, 1); } } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScanner.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScanner.java index 1d610d69..335b9a78 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScanner.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScanner.java @@ -33,9 +33,9 @@ public final class SPIInnerCommandScanner { INNER_COMMAND_EXECUTOR_CLASSES.add(SCOInnerCommandExecutor.class); INNER_COMMAND_EXECUTOR_CLASSES.add(UOInnerCommandExecutor.class); INNER_COMMAND_EXECUTOR_CLASSES.add(ATOInnerCommandExecutor.class); + INNER_COMMAND_EXECUTOR_CLASSES.add(STInnerCommandExecutor.class); } - public SPIInnerCommandScanner(ExecutorKey executorKey) { this.executorKey = executorKey; } @@ -63,6 +63,7 @@ public InnerCommandExecutorManager scan(Object... args) { .map(ServiceLoader.Provider::get) .toList(); + // set for (var innerCommandExecutor : innerCommandExecutors) { manager.set(innerCommandExecutor.getRealityOperatorType(), innerCommandExecutor); } diff --git a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/STInnerCommandExecutor.java b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/STInnerCommandExecutor.java index 1acf0ff6..52dcdc6a 100644 --- a/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/STInnerCommandExecutor.java +++ b/uno-data/uno-data-api/src/main/java/cc/allio/uno/data/orm/executor/internal/STInnerCommandExecutor.java @@ -11,10 +11,10 @@ * @date 2024/3/15 11:22 * @since 1.1.7 */ -public interface STInnerCommandExecutor extends InnerListCommandExecutor { +public interface STInnerCommandExecutor extends InnerListCommandExecutor { @Override default Class getRealityOperatorType() { - return (Class) ReflectTools.getGenericType(this, STInnerCommandExecutor.class); + return (Class) ReflectTools.getGenericType(this, STInnerCommandExecutor.class, 1); } } diff --git a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisSQLInsertOperator.java b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisInsertOperator.java similarity index 95% rename from uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisSQLInsertOperator.java rename to uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisInsertOperator.java index dd9d3155..ff797976 100644 --- a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisSQLInsertOperator.java +++ b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/RedisInsertOperator.java @@ -10,7 +10,7 @@ @AutoService(InsertOperator.class) @Operator.Group(OperatorKey.REDIS_LITERAL) -public class RedisSQLInsertOperator implements InsertOperator { +public class RedisInsertOperator implements InsertOperator { @Override public String getDSL() { return null; diff --git a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelperTest.java b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelperTest.java index d7446236..4a4f06f9 100644 --- a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelperTest.java +++ b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/dsl/SPIOperatorHelperTest.java @@ -8,7 +8,7 @@ import cc.allio.uno.test.BaseTestCase; import org.junit.jupiter.api.Test; -public class SPIOperatorHelperTest extends BaseTestCase { +class SPIOperatorHelperTest extends BaseTestCase { @Test void testJustFindOne() { @@ -40,4 +40,10 @@ void testSameKeySecondOperator() { void testNotFoundOperator() { assertThrows(DSLException.class, () -> SPIOperatorHelper.lazyGet(UpdateOperator.class, OperatorKey.SQL)); } + + @Test + void testFindHireachicalOperator() { + var show = SPIOperatorHelper.lazyGet(RedisShowColumnsOperator.class, OperatorKey.REDIS); + assertNotNull(show); + } } diff --git a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisInsertCommandExecutor.java b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisInsertCommandExecutor.java new file mode 100644 index 00000000..dbb49860 --- /dev/null +++ b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisInsertCommandExecutor.java @@ -0,0 +1,17 @@ +package cc.allio.uno.data.orm.executor.internal; + +import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.data.orm.dsl.RedisInsertOperator; +import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; +import cc.allio.uno.data.orm.executor.options.ExecutorKey; + +@AutoService(IOInnerCommandExecutor.class) +@CommandExecutor.Group(ExecutorKey.REDIS_LITERAL) +public class RedisInsertCommandExecutor implements IOInnerCommandExecutor{ + + @Override + public Boolean doExec(RedisInsertOperator operator, ResultSetHandler handler) throws Throwable { + return null; + } +} diff --git a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisShowColumnCommandExecutor.java b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisShowColumnCommandExecutor.java new file mode 100644 index 00000000..f221e3b5 --- /dev/null +++ b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/RedisShowColumnCommandExecutor.java @@ -0,0 +1,20 @@ +package cc.allio.uno.data.orm.executor.internal; + +import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.data.orm.dsl.ColumnDef; +import cc.allio.uno.data.orm.dsl.RedisShowColumnsOperator; +import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; +import cc.allio.uno.data.orm.executor.options.ExecutorKey; + +import java.util.List; + +@AutoService(SCOInnerCommandExecutor.class) +@CommandExecutor.Group(ExecutorKey.REDIS_LITERAL) +public class RedisShowColumnCommandExecutor implements SCOInnerCommandExecutor { + + @Override + public List doExec(RedisShowColumnsOperator operator, ListResultSetHandler handler) throws Throwable { + return null; + } +} diff --git a/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScannerTest.java b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScannerTest.java new file mode 100644 index 00000000..7a3673f8 --- /dev/null +++ b/uno-data/uno-data-api/src/test/java/cc/allio/uno/data/orm/executor/internal/SPIInnerCommandScannerTest.java @@ -0,0 +1,46 @@ +package cc.allio.uno.data.orm.executor.internal; + +import cc.allio.uno.data.orm.dsl.RedisInsertOperator; +import cc.allio.uno.data.orm.dsl.RedisShowColumnsOperator; +import cc.allio.uno.data.orm.dsl.dml.DeleteOperator; +import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +class SPIInnerCommandScannerTest extends BaseTestCase { + + @Test + void testScanDirectlyType() { + SPIInnerCommandScanner scanner = new SPIInnerCommandScanner(ExecutorKey.REDIS); + var manager = scanner.scan(); + assertNotNull(manager); + + var showColumn = manager.getShowColumn(); + assertNotNull(showColumn); + var showByGet = manager.get(RedisShowColumnsOperator.class); + assertEquals(showColumn, showByGet); + + var insert = manager.getInsert(); + assertNotNull(insert); + var insertByGet = manager.get(RedisInsertOperator.class); + assertEquals(insert, insertByGet); + + // test null + var query = manager.getQuery(); + assertNull(query); + } + + @Test + void testIndeterminateType() { + SPIInnerCommandScanner scanner = new SPIInnerCommandScanner(ExecutorKey.NEO4j); + + assertDoesNotThrow(() -> { + InnerCommandExecutorManager manager = scanner.scan(); + assertNotNull(manager); + + DOInnerCommandExecutor delete = manager.getDelete(); + assertNull(delete); + }); + + } +} diff --git a/uno-data/uno-data-db/src/main/java/cc/allio/uno/data/orm/executor/db/DbCommandExecutor.java b/uno-data/uno-data-db/src/main/java/cc/allio/uno/data/orm/executor/db/DbCommandExecutor.java index 3f9fce9c..f3aae9b8 100644 --- a/uno-data/uno-data-db/src/main/java/cc/allio/uno/data/orm/executor/db/DbCommandExecutor.java +++ b/uno-data/uno-data-db/src/main/java/cc/allio/uno/data/orm/executor/db/DbCommandExecutor.java @@ -4,10 +4,12 @@ import cc.allio.uno.core.api.Adapter; import cc.allio.uno.core.util.ClassUtils; import cc.allio.uno.core.util.id.IdGenerator; +import cc.allio.uno.data.orm.dsl.ddl.ShowColumnsOperator; +import cc.allio.uno.data.orm.dsl.ddl.ShowTablesOperator; +import cc.allio.uno.data.orm.dsl.dml.QueryOperator; import cc.allio.uno.data.orm.dsl.exception.DSLException; import cc.allio.uno.data.orm.executor.*; import cc.allio.uno.data.orm.dsl.*; -import cc.allio.uno.data.orm.dsl.dml.QueryOperator; import cc.allio.uno.data.orm.dsl.type.IntegerJavaType; import cc.allio.uno.data.orm.executor.handler.BoolResultHandler; import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; @@ -147,7 +149,18 @@ protected boolean doBool(Operator operator, CommandType commandType, ResultSe } @Override - protected List doQueryList(QueryOperator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler) { + protected List doQueryList(Operator operator, CommandType commandType, ListResultSetHandler resultSetHandler) { + QueryOperator queryOperator; + if (commandType == CommandType.SELECT) { + queryOperator = (QueryOperator) operator; + } else if (commandType == CommandType.SHOW_TABLES) { + queryOperator = ((ShowTablesOperator) operator).toQueryOperator(); + } else if (commandType == CommandType.SHOW_COLUMNS) { + queryOperator = ((ShowColumnsOperator) operator).toQueryOperator(); + } else { + throw new DSLException(String.format("un accept command to Db query list %s", commandType)); + } + String querySQL = queryOperator.getPrepareDSL(); SqlSource sqlSource = languageDriver.createSqlSource(configuration, querySQL, null); // 构建ResultMap对象 diff --git a/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/EsCommandExecutor.java b/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/EsCommandExecutor.java index b762d843..27e1d30d 100644 --- a/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/EsCommandExecutor.java +++ b/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/EsCommandExecutor.java @@ -3,7 +3,6 @@ import cc.allio.uno.data.orm.dsl.exception.DSLException; import cc.allio.uno.data.orm.executor.*; import cc.allio.uno.data.orm.dsl.*; -import cc.allio.uno.data.orm.dsl.ddl.ShowColumnsOperator; import cc.allio.uno.data.orm.executor.internal.InnerCommandExecutorManager; import cc.allio.uno.data.orm.executor.internal.SPIInnerCommandScanner; import cc.allio.uno.data.orm.executor.options.ExecutorKey; @@ -19,7 +18,6 @@ import java.io.IOException; import java.net.SocketTimeoutException; -import java.util.List; /** * 基于es的SQL执行器 @@ -45,15 +43,6 @@ public EsCommandExecutor(ExecutorOptions options, RestClientBuilder restClientBu this.manager = scanner.scan(new ElasticsearchIndicesClient(transport), new ElasticsearchClient(transport)); } - @Override - public List showColumns(ShowColumnsOperator operator) { - try { - return manager.getShowColumn().exec(operator, getOptions().obtainColumnDefListResultSetHandler()); - } catch (Throwable ex) { - throw new DSLException("exec show columns has err", ex); - } - } - @Override public boolean check() throws SocketTimeoutException { return restClient.isRunning(); diff --git a/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/internal/EsShowColumnCommandExecutor.java b/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/internal/EsShowColumnCommandExecutor.java index 51d8943f..f73fc334 100644 --- a/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/internal/EsShowColumnCommandExecutor.java +++ b/uno-data/uno-data-elasticsearch/src/main/java/cc/allio/uno/data/orm/executor/elasticsearch/internal/EsShowColumnCommandExecutor.java @@ -34,7 +34,7 @@ @Slf4j @AutoService(SCOInnerCommandExecutor.class) @CommandExecutor.Group(ExecutorKey.ELASTICSEARCH_LITERAL) -public class EsShowColumnCommandExecutor implements SCOInnerCommandExecutor { +public class EsShowColumnCommandExecutor implements SCOInnerCommandExecutor { private final ElasticsearchIndicesClient indicesClient; diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbAlterCollectionOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbAlterCollectionOperator.java index d146edf6..24255dcf 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbAlterCollectionOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbAlterCollectionOperator.java @@ -6,6 +6,9 @@ import cc.allio.uno.data.orm.dsl.ddl.AlterTableOperator; import cc.allio.uno.data.orm.dsl.type.DBType; import lombok.Getter; +import org.bson.BsonBoolean; +import org.bson.BsonDocument; +import org.bson.BsonString; import java.util.Collection; @@ -24,9 +27,16 @@ public class MongodbAlterCollectionOperator implements AlterTableOperator { private Table fromColl; private Table toColl; + // @see https://www.mongodb.com/docs/manual/reference/command/renameCollection/ @Override public String getDSL() { - throw Exceptions.unOperate("getDSL"); + if (fromColl == null || toColl == null) { + throw Exceptions.unNull("from coll is null or to coll is null"); + } + BsonDocument bson = + new BsonDocument("renameCollection", new BsonString(fromColl.getName().format())) + .append("to", new BsonString(toColl.getName().format())); + return bson.toJson(); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperator.java index f55c61e7..08cf40da 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperator.java @@ -9,6 +9,8 @@ import cc.allio.uno.data.orm.dsl.ddl.CreateTableOperator; import cc.allio.uno.data.orm.dsl.type.DBType; import lombok.Getter; +import org.bson.BsonDocument; +import org.bson.BsonString; /** * mongodb create collection operator @@ -17,16 +19,21 @@ * @date 2024/3/12 00:57 * @since 1.1.7 */ +@Getter @AutoService(CreateTableOperator.class) @Operator.Group(OperatorKey.MONGODB_LITERAL) public class MongodbCreateCollectionOperator implements CreateTableOperator { - @Getter private Table fromColl; + // @see https://www.mongodb.com/docs/mongodb-vscode/playground-databases/ @Override public String getDSL() { - throw Exceptions.unOperate("getDSL"); + if (fromColl == null) { + throw Exceptions.unNull("from coll is null"); + } + BsonDocument bson = new BsonDocument("create", new BsonString(fromColl.getName().format())); + return bson.toJson(); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperator.java index 2e7daedc..fa5d7076 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperator.java @@ -7,6 +7,9 @@ import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.ddl.DropTableOperator; import cc.allio.uno.data.orm.dsl.type.DBType; +import com.mongodb.internal.operation.DropCollectionOperation; +import org.bson.BsonDocument; +import org.bson.BsonString; /** * mongodb drop collection operator @@ -23,7 +26,11 @@ public class MongodbDropCollectionOperator implements DropTableOperator { @Override public String getDSL() { - throw Exceptions.unOperate("getDSL"); + if (fromColl == null) { + throw Exceptions.unNull("from coll is null"); + } + BsonDocument bson = new BsonDocument("drop", new BsonString(fromColl.getName().format())); + return bson.toJson(); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperator.java index f8c6bb92..c935a509 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperator.java @@ -8,6 +8,9 @@ import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.ddl.ExistTableOperator; import cc.allio.uno.data.orm.dsl.type.DBType; +import org.bson.BsonDocument; +import org.bson.BsonInt32; +import org.bson.BsonString; import java.util.List; @@ -24,9 +27,16 @@ public class MongodbExistCollectionOperator implements ExistTableOperator { private Table fromColl; + // @see https://www.mongodb.com/docs/manual/reference/command/listCollections/#std-label-list-collection-output @Override public String getDSL() { - throw Exceptions.unOperate("getDSL"); + if (fromColl == null) { + throw Exceptions.unNull("from coll is null"); + } + BsonDocument bson = new BsonDocument("listCollections", new BsonInt32(1)); + BsonDocument filter = new BsonDocument("name", new BsonDocument("$eq", new BsonString(fromColl.getName().format()))); + bson.append("filter", filter); + return bson.toJson(); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperator.java index bd9e36db..6e229101 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperator.java @@ -8,6 +8,10 @@ import cc.allio.uno.data.orm.dsl.type.DBType; import com.google.common.collect.Lists; import lombok.Getter; +import org.bson.BsonArray; +import org.bson.BsonDocument; +import org.bson.BsonInt32; +import org.bson.BsonString; import java.util.List; @@ -18,14 +22,13 @@ * @date 2024/3/12 01:11 * @since 1.1.7 */ +@Getter @AutoService(ShowTablesOperator.class) @Operator.Group(OperatorKey.MONGODB_LITERAL) public class MongodbShowCollectionsOperator implements ShowTablesOperator { - @Getter private Database fromDb; - @Getter private final List
tables = Lists.newArrayList(); @Override @@ -34,9 +37,21 @@ public ShowTablesOperator database(Database database) { return self(); } + // @see https://www.mongodb.com/docs/manual/reference/command/listCollections/#std-label-list-collection-output @Override public String getDSL() { - throw Exceptions.unOperate("getDSL"); + if (tables.isEmpty()) { + throw Exceptions.unOperate("check collections is empty"); + } + BsonDocument bson = new BsonDocument("listCollections", new BsonInt32(1)); + + BsonArray collections = new BsonArray(); + for (Table table : tables) { + collections.add(new BsonString(table.getName().format())); + } + BsonDocument filter = new BsonDocument("name", new BsonDocument("$eq", collections)); + bson.append("filter", filter); + return bson.toJson(); } @Override @@ -62,7 +77,7 @@ public DBType getDBType() { @Override public String getPrepareDSL() { - throw Exceptions.unOperate("getPrepareDSL"); + return getDSL(); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperator.java index 02130785..596d2529 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperator.java @@ -26,13 +26,15 @@ @Operator.Group(OperatorKey.MONGODB_LITERAL) public class MongodbInsertOperator implements InsertOperator { - private final List docs; + @Getter + private List docs; @Getter private List columns; private Table fromColl; public MongodbInsertOperator() { this.docs = Lists.newArrayList(); + this.columns = Lists.newArrayList(); } @Override @@ -49,8 +51,8 @@ public InsertOperator parse(String dsl) { @Override public void reset() { - this.docs.clear(); - this.columns = null; + this.docs = Lists.newArrayList(); + this.columns = Lists.newArrayList(); this.fromColl = null; } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbQueryOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbQueryOperator.java index 1123f4dc..5508fca5 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbQueryOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbQueryOperator.java @@ -28,7 +28,7 @@ public class MongodbQueryOperator extends MongodbWhereOperatorImpl implements QueryOperator { private Table fromColl; - private final List orders; + private List orders; @Getter private Bson bsonOrder; @Getter @@ -43,7 +43,6 @@ public MongodbQueryOperator() { @Override public String getDSL() { - return null; } @@ -56,7 +55,7 @@ public QueryOperator parse(String dsl) { public void reset() { clear(); this.fromColl = null; - this.orders.clear(); + this.orders = Lists.newArrayList(); this.bsonOrder = null; this.bsonWindow = null; } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperator.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperator.java index ecebf946..2f8a2048 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperator.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperator.java @@ -41,12 +41,14 @@ public MongodbUpdateOperator() { @Override public String getDSL() { - return null; + + + return update.toBsonDocument().toJson(); } @Override public UpdateOperator parse(String dsl) { - return null; + throw Exceptions.unOperate("parse"); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbWhereOperatorImpl.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbWhereOperatorImpl.java index ad09b498..1489da27 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbWhereOperatorImpl.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbWhereOperatorImpl.java @@ -10,6 +10,7 @@ import lombok.Getter; import org.bson.conversions.Bson; +import java.util.ArrayList; import java.util.List; /** @@ -24,7 +25,7 @@ public class MongodbWhereOperatorImpl> implements Whe @Getter protected Bson filter; private MongodbLogical logical; - private final List expression; + private List expression; public MongodbWhereOperatorImpl() { this.filter = Filters.empty(); @@ -198,7 +199,11 @@ public T notLike(DSLName dslName, Object value) { @Override public T or() { - this.expression.clear(); + // 采用 this.expression.clear() 在重新添加filter,将会报下面错误: + // *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at open/src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 884 + // 并且将会产生StackOverflow + // 没有找到解决原因 https://stackoverflow.com/questions/60526670/what-is-the-meaning-cause-of-java-lang-instrument-assertion-failed-er + this.expression = Lists.newArrayList(); this.expression.add(filter); this.logical = new MongodbOrLogical(); this.filter = this.logical.doAccept(expression); @@ -207,7 +212,7 @@ public T or() { @Override public T and() { - this.expression.clear(); + this.expression = Lists.newArrayList(); this.expression.add(filter); this.logical = new MongodbAndLogical(); this.filter = this.logical.doAccept(expression); @@ -216,7 +221,7 @@ public T and() { @Override public T nor() { - this.expression.clear(); + this.expression = Lists.newArrayList(); this.expression.add(filter); this.logical = new MongodbNorLogical(); this.filter = this.logical.doAccept(expression); @@ -226,7 +231,7 @@ public T nor() { protected void clear() { this.filter = null; this.logical = new MongodbAndLogical(); - this.expression.clear(); + this.expression = new ArrayList<>(); } interface MongodbLogical extends BiLogical> { diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutor.java index be9b5a47..422bcac4 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutor.java @@ -1,15 +1,11 @@ package cc.allio.uno.data.orm.executor.mongodb; +import cc.allio.uno.core.util.StringUtils; import cc.allio.uno.core.util.template.ExpressionTemplate; -import cc.allio.uno.data.orm.dsl.Operator; import cc.allio.uno.data.orm.dsl.OperatorGroup; import cc.allio.uno.data.orm.dsl.OperatorKey; -import cc.allio.uno.data.orm.dsl.dml.QueryOperator; import cc.allio.uno.data.orm.executor.AbstractCommandExecutor; import cc.allio.uno.data.orm.executor.AggregateCommandExecutor; -import cc.allio.uno.data.orm.executor.CommandType; -import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; -import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.internal.InnerCommandExecutorManager; import cc.allio.uno.data.orm.executor.internal.SPIInnerCommandScanner; import cc.allio.uno.data.orm.executor.options.ExecutorKey; @@ -19,7 +15,6 @@ import com.mongodb.client.MongoDatabase; import java.net.SocketTimeoutException; -import java.util.List; /** * command executor for document database mongodb implementation @@ -30,7 +25,8 @@ */ public class MongodbCommandExecutor extends AbstractCommandExecutor implements AggregateCommandExecutor { - private static final String MONGO_CONNECTION_TEMPLATE = "mongodb://#{username}:#{password}@#{address}/?retryWrites=true&w=majority"; + private static final String MONGO_CONNECTION_TEMPLATE = "mongodb://#{username}:#{password}@#{address}/?retryWrites=true&w=majority&directConnection=true&serverSelectionTimeoutMS=2000"; + private static final String NO_AUTH_MONGO_CONNECTION_TEMPLATE = "mongodb://#{address}/?retryWrites=true&w=majority&directConnection=true&serverSelectionTimeoutMS=2000"; private static final ExpressionTemplate TEMPLATE_PARSER = ExpressionTemplate.defaultTemplate(); private final MongoClient mongoClient; @@ -44,13 +40,19 @@ public MongodbCommandExecutor(ExecutorOptions options) { String username = options.getUsername(); String password = options.getPassword(); String address = options.getAddress(); - String url = TEMPLATE_PARSER.parseTemplate(MONGO_CONNECTION_TEMPLATE, "username", username, "password", password, "address", address); + String url; + if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { + url = TEMPLATE_PARSER.parseTemplate(NO_AUTH_MONGO_CONNECTION_TEMPLATE, "address", address); + } else { + + url = TEMPLATE_PARSER.parseTemplate(MONGO_CONNECTION_TEMPLATE, "username", username, "password", password, "address", address); + } String databaseName = options.getDatabase(); this.mongoClient = MongoClients.create(url); this.database = mongoClient.getDatabase(databaseName); - this.operatorGroup = OperatorGroup.getOperatorGroup(OperatorKey.ELASTICSEARCH); + this.operatorGroup = OperatorGroup.getOperatorGroup(OperatorKey.MONGODB); SPIInnerCommandScanner scanner = options.getScanner(); - this.manager = scanner.scan(database); + this.manager = scanner.scan(database, mongoClient); } @Override diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbAlterCollectionCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbAlterCollectionCommandExecutor.java index 319171cb..5c75245b 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbAlterCollectionCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbAlterCollectionCommandExecutor.java @@ -13,6 +13,7 @@ import cc.allio.uno.data.orm.executor.options.ExecutorKey; import com.mongodb.MongoNamespace; import com.mongodb.client.MongoDatabase; +import com.mongodb.internal.operation.RenameCollectionOperation; import lombok.extern.slf4j.Slf4j; /** @@ -21,6 +22,7 @@ * @author j.x * @date 2024/3/15 10:51 * @since 1.1.7 + * @see RenameCollectionOperation */ @Slf4j @AutoService(ATOInnerCommandExecutor.class) diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbCreateCollectionCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbCreateCollectionCommandExecutor.java index f8b15b6d..632ac39b 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbCreateCollectionCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbCreateCollectionCommandExecutor.java @@ -12,6 +12,7 @@ import cc.allio.uno.data.orm.executor.internal.CTOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; import com.mongodb.client.MongoDatabase; +import com.mongodb.internal.operation.CreateCollectionOperation; import lombok.extern.slf4j.Slf4j; /** @@ -19,6 +20,7 @@ * * @author j.x * @date 2024/3/15 10:59 + * @see CreateCollectionOperation * @since 1.1.7 */ @Slf4j diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDeleteCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDeleteCommandExecutor.java index 9f8f3ccb..cd32d5a7 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDeleteCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDeleteCommandExecutor.java @@ -1,16 +1,24 @@ package cc.allio.uno.data.orm.executor.mongodb.internal; import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.core.exception.Exceptions; +import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.mongodb.dml.MongodbDeleteOperator; import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.orm.executor.ResultRow; +import cc.allio.uno.data.orm.executor.handler.BoolResultHandler; import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.internal.DOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.client.result.DeleteResult; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; /** - * mongodb insert command executor + * mongodb delete command executor * * @author j.x * @date 2024/3/15 11:30 @@ -29,6 +37,19 @@ public MongodbDeleteCommandExecutor(MongoDatabase database) { @Override public Boolean doExec(MongodbDeleteOperator operator, ResultSetHandler handler) throws Throwable { - return null; + Table fromColl = operator.getTable(); + if (fromColl == null) { + throw Exceptions.unNull("from collection is empty"); + } + ResultGroup resultGroup = new ResultGroup(); + ResultRow.ResultRowBuilder builder = ResultRow.builder(); + builder.column(BoolResultHandler.GUESS_UPDATE_OR_UPDATE); + MongoCollection collection = database.getCollection(fromColl.getName().format()); + DeleteResult deleteResult = collection.deleteMany(operator.getFilter()); + boolean success = deleteResult.wasAcknowledged() && deleteResult.getDeletedCount() > 0; + builder.value(success); + ResultRow row = builder.build(); + resultGroup.addRow(row); + return handler.apply(resultGroup); } } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDropCollectionCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDropCollectionCommandExecutor.java index 26a08318..b788f602 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDropCollectionCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbDropCollectionCommandExecutor.java @@ -13,6 +13,7 @@ import cc.allio.uno.data.orm.executor.options.ExecutorKey; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.internal.operation.DropCollectionOperation; import lombok.extern.slf4j.Slf4j; import org.bson.Document; @@ -21,6 +22,7 @@ * * @author j.x * @date 2024/3/15 11:17 + * @see DropCollectionOperation * @since 1.1.7 */ @Slf4j diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbExistCollectionCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbExistCollectionCommandExecutor.java index f3b4f39e..9432ebf8 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbExistCollectionCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbExistCollectionCommandExecutor.java @@ -11,8 +11,11 @@ import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.internal.ETOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.google.common.collect.Lists; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; +import com.mongodb.internal.operation.ListCollectionsOperation; import lombok.extern.slf4j.Slf4j; import org.bson.Document; @@ -21,6 +24,7 @@ * * @author j.x * @date 2024/3/15 11:20 + * @see ListCollectionsOperation * @since 1.1.7 */ @Slf4j @@ -42,8 +46,10 @@ public Boolean doExec(MongodbExistCollectionOperator operator, ResultSetHandler< ResultRow.ResultRowBuilder builder = ResultRow.builder(); builder.column(BoolResultHandler.GUESS_UPDATE_OR_UPDATE); try { - MongoCollection collection = database.getCollection(fromColl.getName().format()); - builder.value(collection != null); + boolean present = Lists.newArrayList(database.listCollectionNames()) + .stream() + .anyMatch(c -> c.equals(fromColl.getName().format())); + builder.value(present); } catch (Throwable ex) { log.error("mongodb exist collection has error", ex); builder.value(false); diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbInsertCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbInsertCommandExecutor.java index ef5a7502..5be14134 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbInsertCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbInsertCommandExecutor.java @@ -1,13 +1,23 @@ package cc.allio.uno.data.orm.executor.mongodb.internal; import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.core.util.Requires; +import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.mongodb.dml.MongodbInsertOperator; import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.orm.executor.ResultRow; +import cc.allio.uno.data.orm.executor.handler.BoolResultHandler; import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.internal.IOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.client.result.InsertManyResult; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; + +import java.util.List; /** * mongodb insert command executor @@ -29,6 +39,28 @@ public MongodbInsertCommandExecutor(MongoDatabase database) { @Override public Boolean doExec(MongodbInsertOperator operator, ResultSetHandler handler) throws Throwable { - return null; + Table fromColl = operator.getTable(); + Requires.isNotNull(fromColl, "from collection"); + + // initial result group + ResultGroup resultGroup = new ResultGroup(); + ResultRow.ResultRowBuilder builder = ResultRow.builder(); + builder.column(BoolResultHandler.GUESS_UPDATE_OR_UPDATE); + + List docs = operator.getDocs(); + MongoCollection collection = database.getCollection(fromColl.getName().format()); + + try { + InsertManyResult insertManyResult = collection.insertMany(docs); + // ack and insert id is not empty + builder.value(insertManyResult.wasAcknowledged() && !insertManyResult.getInsertedIds().isEmpty()); + } catch (Throwable ex) { + log.error("Failed to mongodb insert document. the docs {}", docs, ex); + builder.value(false); + } + + ResultRow insertRow = builder.build(); + resultGroup.addRow(insertRow); + return handler.apply(resultGroup); } } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbQueryCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbQueryCommandExecutor.java index 0926c5fe..fa4fc493 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbQueryCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbQueryCommandExecutor.java @@ -1,15 +1,27 @@ package cc.allio.uno.data.orm.executor.mongodb.internal; import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.core.util.Requires; +import cc.allio.uno.data.orm.dsl.DSLName; +import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.mongodb.dml.MongodbQueryOperator; import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.orm.executor.ResultRow; +import cc.allio.uno.data.orm.executor.ResultSet; import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; import cc.allio.uno.data.orm.executor.internal.QOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.google.common.collect.Lists; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.bson.conversions.Bson; import java.util.List; +import java.util.Map; /** * mongodb query command executor @@ -31,6 +43,31 @@ public MongodbQueryCommandExecutor(MongoDatabase database) { @Override public List doExec(MongodbQueryOperator operator, ListResultSetHandler handler) throws Throwable { - return null; + // validate + Table fromColl = operator.getTable(); + Requires.isNotNull(fromColl, "from collection"); + + MongoCollection collection = database.getCollection(fromColl.getName().format()); + Bson filter = operator.getFilter(); + FindIterable documents = collection.find(filter); + + List resultGroups = + Lists.newArrayList(documents) + .stream() + .map(document -> { + ResultGroup resultGroup = new ResultGroup(); + for (Map.Entry dEntry : document.entrySet()) { + ResultRow row = ResultRow.builder() + .column(DSLName.of(dEntry.getKey())) + .value(dEntry.getValue()) + .build(); + resultGroup.addRow(row); + } + return resultGroup; + }) + .toList(); + ResultSet resultSet = new ResultSet(); + resultSet.setResultGroups(resultGroups); + return handler.apply(resultSet); } } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbShowCollectionCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbShowCollectionCommandExecutor.java index b844264d..90cf65d3 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbShowCollectionCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbShowCollectionCommandExecutor.java @@ -2,19 +2,27 @@ import cc.allio.uno.auto.service.AutoService; import cc.allio.uno.core.util.Requires; +import cc.allio.uno.data.orm.dsl.DSLName; import cc.allio.uno.data.orm.dsl.Database; import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.mongodb.ddl.MongodbShowCollectionsOperator; import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.orm.executor.ResultRow; +import cc.allio.uno.data.orm.executor.ResultSet; import cc.allio.uno.data.orm.executor.handler.ListResultSetHandler; import cc.allio.uno.data.orm.executor.internal.STInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.google.common.collect.Lists; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import java.util.List; +import java.util.stream.Collectors; + +import static cc.allio.uno.data.orm.executor.handler.TableListResultSetHandler.*; /** * mongodb show collections command executor @@ -26,7 +34,7 @@ @Slf4j @AutoService(STInnerCommandExecutor.class) @CommandExecutor.Group(ExecutorKey.MONGODB_LITERAL) -public class MongodbShowCollectionCommandExecutor implements STInnerCommandExecutor { +public class MongodbShowCollectionCommandExecutor implements STInnerCommandExecutor { final MongoClient mongoClient; @@ -39,11 +47,53 @@ public List
doExec(MongodbShowCollectionsOperator operator, ListResultSet Database fromDb = operator.getFromDb(); Requires.isNotNull(fromDb, "fromDb"); List
tables = operator.getTables(); + List filterTableNames = + tables.stream() + .map(Table::getName) + .map(DSLName::format) + .toList(); MongoDatabase database = mongoClient.getDatabase(fromDb.getName().format()); - for (Document document : database.listCollections()) { - } - + List resultGroups = Lists.newArrayList(database.listCollections()) + .stream() + .filter(document -> { + if (filterTableNames.isEmpty()) { + return true; + } + // filter exist name + String collectionName = document.getString("name"); + return filterTableNames.contains(collectionName); + }) + .map(document -> { + ResultGroup resultGroup = new ResultGroup(); + // set database name + ResultRow rowDb = + ResultRow.builder() + .column(TABLE_CATALOG_DSL_NAME) + .value(database.getName()) + .build(); + resultGroup.addRow(rowDb); + // set collection name + String collectionName = document.getString("name"); + ResultRow rowName = + ResultRow.builder() + .column(TABLE_NAME_DSL_NAME) + .value(collectionName) + .build(); + resultGroup.addRow(rowName); + // set collection type + String collectionType = document.getString("type"); + ResultRow rowType = + ResultRow.builder() + .column(TABLE_TYPE_DSL_NAME) + .value(collectionType) + .build(); + resultGroup.addRow(rowType); + return resultGroup; + }) + .toList(); - return null; + ResultSet resultSet = new ResultSet(); + resultSet.setResultGroups(resultGroups); + return handler.apply(resultSet); } } diff --git a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbUpdateCommandExecutor.java b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbUpdateCommandExecutor.java index 538f14da..cf24672f 100644 --- a/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbUpdateCommandExecutor.java +++ b/uno-data/uno-data-mongodb/src/main/java/cc/allio/uno/data/orm/executor/mongodb/internal/MongodbUpdateCommandExecutor.java @@ -1,13 +1,22 @@ package cc.allio.uno.data.orm.executor.mongodb.internal; import cc.allio.uno.auto.service.AutoService; +import cc.allio.uno.core.util.Requires; +import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.mongodb.dml.MongodbUpdateOperator; import cc.allio.uno.data.orm.executor.CommandExecutor; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.orm.executor.ResultRow; +import cc.allio.uno.data.orm.executor.handler.BoolResultHandler; import cc.allio.uno.data.orm.executor.handler.ResultSetHandler; import cc.allio.uno.data.orm.executor.internal.UOInnerCommandExecutor; import cc.allio.uno.data.orm.executor.options.ExecutorKey; +import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.client.result.UpdateResult; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.bson.conversions.Bson; /** * mongodb update command executor @@ -29,6 +38,27 @@ public MongodbUpdateCommandExecutor(MongoDatabase database) { @Override public Boolean doExec(MongodbUpdateOperator operator, ResultSetHandler handler) throws Throwable { - return null; + // validate + Table fromColl = operator.getTable(); + Requires.isNotNull(fromColl, "from collection"); + + // initial result group + ResultGroup resultGroup = new ResultGroup(); + ResultRow.ResultRowBuilder builder = ResultRow.builder(); + builder.column(BoolResultHandler.GUESS_UPDATE_OR_UPDATE); + + Bson filter = operator.getFilter(); + Bson update = operator.getUpdate(); + MongoCollection collection = database.getCollection(fromColl.getName().format()); + try { + UpdateResult updateResult = collection.updateMany(filter, update); + builder.value(updateResult.wasAcknowledged() && updateResult.getModifiedCount() > 0); + } catch (Throwable ex) { + log.error("Failed to mongodb update document. the filter bson is {}, update bson is {}", filter, update, ex); + builder.value(false); + } + ResultRow updateRow = builder.build(); + resultGroup.addRow(updateRow); + return handler.apply(resultGroup); } } diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongoAlterCollectionOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongoAlterCollectionOperatorTest.java index 07709c3d..1967d62a 100644 --- a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongoAlterCollectionOperatorTest.java +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongoAlterCollectionOperatorTest.java @@ -2,6 +2,7 @@ import cc.allio.uno.data.orm.dsl.OperatorGroup; import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.data.orm.dsl.Table; import cc.allio.uno.data.orm.dsl.type.DBType; import cc.allio.uno.data.orm.executor.options.ExecutorKey; import cc.allio.uno.test.BaseTestCase; @@ -11,8 +12,11 @@ class MongoAlterCollectionOperatorTest extends BaseTestCase { @Test void testRename() { - MongodbAlterCollectionOperator alterTableOperator = OperatorGroup.getAlterTableOperator(MongodbAlterCollectionOperator.class, OperatorKey.MONGODB, DBType.MONGODB); - + MongodbAlterCollectionOperator alterTableOperator = OperatorGroup.getAlterTableOperator(MongodbAlterCollectionOperator.class, OperatorKey.MONGODB); assertNotNull(alterTableOperator); + alterTableOperator.from(Table.of("a")).rename(Table.of("b")); + + String dsl = alterTableOperator.getDSL(); + assertEquals("{\"renameCollection\": \"a\", \"to\": \"b\"}", dsl); } } diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperatorTest.java new file mode 100644 index 00000000..446ec8e5 --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbCreateCollectionOperatorTest.java @@ -0,0 +1,20 @@ +package cc.allio.uno.data.orm.dsl.mongodb.ddl; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.data.orm.dsl.Table; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +public class MongodbCreateCollectionOperatorTest extends BaseTestCase { + + @Test + void testCrate() { + MongodbCreateCollectionOperator createTableOperator = OperatorGroup.getCreateTableOperator(MongodbCreateCollectionOperator.class, OperatorKey.MONGODB); + assertNotNull(createTableOperator); + + String dsl = createTableOperator.from(Table.of("dual")).getDSL(); + assertEquals("{\"create\": \"dual\"}", dsl); + + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperatorTest.java new file mode 100644 index 00000000..f4126b5f --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbDropCollectionOperatorTest.java @@ -0,0 +1,23 @@ +package cc.allio.uno.data.orm.dsl.mongodb.ddl; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.data.orm.dsl.Table; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +public class MongodbDropCollectionOperatorTest extends BaseTestCase { + + @Test + void testDropCollection() { + + MongodbDropCollectionOperator dropTableOperator = OperatorGroup.getDropTableOperator(MongodbDropCollectionOperator.class, OperatorKey.MONGODB); + + assertNotNull(dropTableOperator); + + String dsl = dropTableOperator.from(Table.of("dual")).getDSL(); + + assertEquals("{\"drop\": \"dual\"}", dsl); + + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperatorTest.java new file mode 100644 index 00000000..1b3703e1 --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbExistCollectionOperatorTest.java @@ -0,0 +1,20 @@ +package cc.allio.uno.data.orm.dsl.mongodb.ddl; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.data.orm.dsl.Table; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +class MongodbExistCollectionOperatorTest extends BaseTestCase { + + @Test + void testExistCollection() { + MongodbExistCollectionOperator existTableOperator = OperatorGroup.getExistTableOperator(MongodbExistCollectionOperator.class, OperatorKey.MONGODB); + + assertNotNull(existTableOperator); + + String dsl = existTableOperator.from(Table.of("dual")).getDSL(); + assertEquals("{\"listCollections\": 1, \"filter\": {\"name\": {\"$eq\": \"dual\"}}}", dsl); + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperatorTest.java new file mode 100644 index 00000000..f74b8d16 --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/ddl/MongodbShowCollectionsOperatorTest.java @@ -0,0 +1,19 @@ +package cc.allio.uno.data.orm.dsl.mongodb.ddl; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +class MongodbShowCollectionsOperatorTest extends BaseTestCase { + + @Test + void testShowCollections() { + MongodbShowCollectionsOperator showTablesOperator = OperatorGroup.getShowTablesOperator(MongodbShowCollectionsOperator.class, OperatorKey.MONGODB); + assertNotNull(showTablesOperator); + + String dsl = showTablesOperator.from("dual1").from("dual2").getDSL(); + + assertEquals("{\"listCollections\": 1, \"filter\": {\"name\": {\"$eq\": [\"dual1\", \"dual2\"]}}}", dsl); + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbDeleteOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbDeleteOperatorTest.java new file mode 100644 index 00000000..136954a3 --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbDeleteOperatorTest.java @@ -0,0 +1,47 @@ +package cc.allio.uno.data.orm.dsl.mongodb.dml; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; + +class MongodbDeleteOperatorTest extends BaseTestCase { + + @Test + void testEqDelete() { + MongodbDeleteOperator deleteOperator = OperatorGroup.getDeleteOperator(MongodbDeleteOperator.class, OperatorKey.MONGODB); + + assertNotNull(deleteOperator); + + String dsl = deleteOperator.eq("a", "a").getDSL(); + + assertEquals("{\"$and\": [{\"a\": \"a\"}]}", dsl); + } + + @Test + void testEqAndLtAndGtDelete() { + MongodbDeleteOperator deleteOperator = OperatorGroup.getDeleteOperator(MongodbDeleteOperator.class, OperatorKey.MONGODB); + + assertNotNull(deleteOperator); + String dsl = deleteOperator.eq("a", "a").lt("b", "b").gt("c", "c").getDSL(); + assertEquals("{\"$and\": [{\"a\": \"a\"}, {\"b\": {\"$lt\": \"b\"}}, {\"c\": {\"$gt\": \"c\"}}]}", dsl); + } + + @Test + void testLikeDelete() { + MongodbDeleteOperator deleteOperator = OperatorGroup.getDeleteOperator(MongodbDeleteOperator.class, OperatorKey.MONGODB); + assertNotNull(deleteOperator); + + String dsl = deleteOperator.like("a", "a").$like("b", "b").getDSL(); + assertEquals("{\"$and\": [{\"a\": {\"$regularExpression\": {\"pattern\": \"a\", \"options\": \"im\"}}}, {\"b\": {\"$regularExpression\": {\"pattern\": \"^b\", \"options\": \"im\"}}}]}", dsl); + } + + @Test + void testAlternateLogicalDelete() { + MongodbDeleteOperator deleteOperator = OperatorGroup.getDeleteOperator(MongodbDeleteOperator.class, OperatorKey.MONGODB); + assertNotNull(deleteOperator); + + String dsl = deleteOperator.eq("a", "a").or().eq("b", "b").nor().eq("c", "c").getDSL(); + assertEquals("{\"$nor\": [{\"$or\": [{\"$and\": [{\"a\": \"a\"}]}, {\"b\": \"b\"}]}, {\"c\": \"c\"}]}", dsl); + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperatorTest.java new file mode 100644 index 00000000..3bdc1b3c --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbInsertOperatorTest.java @@ -0,0 +1,52 @@ +package cc.allio.uno.data.orm.dsl.mongodb.dml; + +import cc.allio.uno.data.orm.dsl.OperatorGroup; +import cc.allio.uno.data.orm.dsl.OperatorKey; +import cc.allio.uno.test.BaseTestCase; +import org.junit.jupiter.api.Test; +import reactor.util.function.Tuples; + +class MongodbInsertOperatorTest extends BaseTestCase { + + @Test + void testSimplyInsert() { + MongodbInsertOperator insertOperator = OperatorGroup.getInsertOperator(MongodbInsertOperator.class, OperatorKey.MONGODB); + String dsl = insertOperator.insert("a", "a", "b", "b").getDSL(); + assertEquals("[ {\n" + + " \"a\" : \"a\",\n" + + " \"b\" : \"b\"\n" + + "} ]", dsl); + } + + @Test + void testBatchInsert() { + + MongodbInsertOperator insertOperator = OperatorGroup.getInsertOperator(MongodbInsertOperator.class, OperatorKey.MONGODB); + for (int i = 0; i < 5; i++) { + insertOperator.insert(Tuples.of("a" + i, "a" + i)); + } + + String dsl = insertOperator.getDSL(); + assertEquals("[ {\n" + + " \"a0\" : \"a0\"\n" + + "}, {\n" + + " \"a1\" : \"a1\"\n" + + "}, {\n" + + " \"a2\" : \"a2\"\n" + + "}, {\n" + + " \"a3\" : \"a3\"\n" + + "}, {\n" + + " \"a4\" : \"a4\"\n" + + "} ]", dsl); + } + + @Test + void testStrictFill() { + MongodbInsertOperator insertOperator = OperatorGroup.getInsertOperator(MongodbInsertOperator.class, OperatorKey.MONGODB); + String dsl = insertOperator.insert("a", "a").strictFill("a", "b").getDSL(); + + assertEquals("[ {\n" + + " \"a\" : \"b\"\n" + + "} ]", dsl); + } +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperatorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperatorTest.java new file mode 100644 index 00000000..1f63d598 --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/dsl/mongodb/dml/MongodbUpdateOperatorTest.java @@ -0,0 +1,8 @@ +package cc.allio.uno.data.orm.dsl.mongodb.dml; + +import cc.allio.uno.test.BaseTestCase; + + class MongodbUpdateOperatorTest extends BaseTestCase { + + +} diff --git a/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutorTest.java b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutorTest.java new file mode 100644 index 00000000..bfc9280b --- /dev/null +++ b/uno-data/uno-data-mongodb/src/test/java/cc/allio/uno/data/orm/executor/mongodb/MongodbCommandExecutorTest.java @@ -0,0 +1,103 @@ +package cc.allio.uno.data.orm.executor.mongodb; + +import cc.allio.uno.data.orm.dsl.Table; +import cc.allio.uno.data.orm.dsl.ddl.AlterTableOperator; +import cc.allio.uno.data.orm.dsl.dml.InsertOperator; +import cc.allio.uno.data.orm.dsl.dml.UpdateOperator; +import cc.allio.uno.data.orm.executor.ResultGroup; +import cc.allio.uno.data.test.executor.CommandExecutorSetter; +import cc.allio.uno.test.BaseTestCase; +import cc.allio.uno.test.RunTest; +import cc.allio.uno.test.testcontainers.ContainerType; +import cc.allio.uno.test.testcontainers.RunContainer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +@RunTest +@RunContainer(ContainerType.Mongodb) +class MongodbCommandExecutorTest extends BaseTestCase implements CommandExecutorSetter { + + private MongodbCommandExecutor executor; + + @BeforeEach + void createDual() { + boolean success = executor.createTable(o -> o.from("dual")); + assertTrue(success); + } + + @Test + void testShowCollection() { + List
tables = executor.showTables(); + assertEquals(1, tables.size()); + assertEquals("dual", tables.get(0).getName().format()); + } + + @Test + void testInsertDocument() { + InsertOperator insertOperator = executor.getOperatorGroup().insert(); + insertOperator.insert("a", "a", "b", "b").from("dual"); + boolean success = executor.insert(insertOperator); + + assertTrue(success); + } + + @Test + void testUpdateDocument() { + prepareValues(); + + UpdateOperator updateOperator = executor.getOperatorGroup().update(); + updateOperator.from("dual").update("a", "c").eq("a", "a"); + boolean success = executor.update(updateOperator); + assertTrue(success); + } + + @Test + void testRenameAndDropCollection() { + AlterTableOperator alterTableOperator = executor.getOperatorGroup().alterTables(); + alterTableOperator.from("dual").rename("dual2"); + + boolean success = executor.alertTable(alterTableOperator); + assertTrue(success); + + boolean existed = executor.existTable("dual2"); + assertTrue(existed); + + success = executor.dropTable(o -> o.from("dual2")); + assertTrue(success); + + // exist + existed = executor.existTable("dual2"); + assertFalse(existed); + } + + @Test + void testQuery() { + prepareValues(); + + List resultGroups = executor.queryList(o -> o.from("dual")); + assertEquals(1, resultGroups.size()); + Map map = resultGroups.get(0).toMap(); + assertEquals("a", map.get("a")); + + } + + void prepareValues() { + InsertOperator insertOperator = executor.getOperatorGroup().insert(); + insertOperator.insert("a", "a", "b", "b").from("dual"); + executor.insert(insertOperator); + } + + @AfterEach + void deleteDual() { + executor.dropTable(o -> o.from("dual")); + } + + @Override + public void setCommandExecutor(MongodbCommandExecutor executor) { + this.executor = executor; + } +} diff --git a/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/FakeCommandExecutor.java b/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/FakeCommandExecutor.java index f64d838a..36caa2a2 100644 --- a/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/FakeCommandExecutor.java +++ b/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/FakeCommandExecutor.java @@ -22,7 +22,7 @@ public boolean bool(Operator operator, CommandType commandType, ResultSetHand } @Override - public List queryList(QueryOperator queryOperator, CommandType commandType, ListResultSetHandler resultSetHandler) { + public List queryList(Operator operator, CommandType commandType, ListResultSetHandler resultSetHandler) { throw Exceptions.unOperate("queryList"); } diff --git a/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/translator/MongodbTranslator.java b/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/translator/MongodbTranslator.java index b8de4838..376b2a5b 100644 --- a/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/translator/MongodbTranslator.java +++ b/uno-data/uno-data-test/src/main/java/cc/allio/uno/data/test/executor/translator/MongodbTranslator.java @@ -5,6 +5,8 @@ import cc.allio.uno.data.orm.dsl.type.DBType; import cc.allio.uno.data.orm.executor.options.ExecutorKey; import cc.allio.uno.test.testcontainers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.MongoDBContainer; /** * mongodb impl translator @@ -15,6 +17,8 @@ */ public class MongodbTranslator implements ContainerExecutorOptionsTranslator { + private static final int MONGODB_INTERNAL_PORT = 27017; + @Override public DBType withDBType(Container testContainer) { return DBType.MONGODB; @@ -30,6 +34,12 @@ public OperatorKey withOperatorKey(Container testContainer) { return OperatorKey.MONGODB; } + @Override + public String withAddress(Container testContainer) { + GenericContainer internal = testContainer.getInternal(); + return internal.getHost() + ":" + internal.getMappedPort(MONGODB_INTERNAL_PORT); + } + @Override public String withDatabase(Container testContainer) { return "test"; diff --git a/uno-sequential/src/main/java/cc/allio/uno/sequnetial/process/DefaultProcessor.java b/uno-sequential/src/main/java/cc/allio/uno/sequnetial/process/DefaultProcessor.java index 699b5178..b2a31558 100644 --- a/uno-sequential/src/main/java/cc/allio/uno/sequnetial/process/DefaultProcessor.java +++ b/uno-sequential/src/main/java/cc/allio/uno/sequnetial/process/DefaultProcessor.java @@ -91,7 +91,7 @@ public void process(SequentialContext context) { */ private void onDispatch(SequentialContext context) { Sequential sequential = context.getRealSequential(); - String topic = TOPIC_TEMPLATE_PARSER.paresTemplate(TOPIC_TEMPLATE, "type", sequential.getType().getCode()); + String topic = TOPIC_TEMPLATE_PARSER.parseTemplate(TOPIC_TEMPLATE, "type", sequential.getType().getCode()); Mono.justOrEmpty(sequential).filter(s -> typeManager.contains(s.getType())) .then(Mono.defer(() -> // 判断是否存在指定主题,如果不存在则创建订阅关系,随后向该订阅关系发布时序数据