feat: 保证整体结构稳定

This commit is contained in:
wangyu 2022-08-05 15:56:40 +08:00
parent 208ca062c6
commit 4742c1d50c
20 changed files with 723 additions and 113 deletions

View File

@ -1,34 +0,0 @@
package com.flyfish.framework.adaptor;
import com.flyfish.framework.adaptor.spi.CriteriaAdaptorFactory;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import java.util.List;
/**
* 可以通过该工具类快速创建适配器
*
* @author wangyu
*/
public final class CriteriaAdaptors {
private static final List<CriteriaAdaptorFactory> FACTORIES =
SpringFactoriesLoader.loadFactories(CriteriaAdaptorFactory.class, null);
public static CriteriaAdaptor getAdaptor() {
return FACTORIES.stream()
.findFirst()
.map(CriteriaAdaptorFactory::produce)
.orElseThrow(() -> new InvalidDataAccessApiUsageException("未实现当前查询的适配工厂!"));
}
public static CriteriaAdaptor getAdaptor(Object criteria) {
return FACTORIES.stream()
.filter(factory -> factory.criteriaType().isAssignableFrom(criteria.getClass()))
.findFirst()
.map(CriteriaAdaptorFactory::produce)
.orElseThrow(() -> new InvalidDataAccessApiUsageException("未实现当前查询的适配工厂!"));
}
}

View File

@ -1,26 +0,0 @@
package com.flyfish.framework.adaptor.spi;
import com.flyfish.framework.adaptor.CriteriaAdaptor;
/**
* 查询适配器
* 基于spi提供实现类最终返回对应的
*
* @author wangyu
*/
public interface CriteriaAdaptorFactory {
/**
* 生产适配器
*
* @return 结果
*/
CriteriaAdaptor produce();
/**
* 查询类型
*
* @return 结果
*/
Class<?> criteriaType();
}

View File

@ -1,9 +1,12 @@
package com.flyfish.framework.query;
import com.flyfish.framework.domain.base.Domain;
import com.flyfish.framework.domain.base.Qo;
import com.flyfish.framework.query.spi.QueryChainFactory;
import com.flyfish.framework.query.support.DomainFunction;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.dao.InvalidDataAccessApiUsageException;
import java.util.function.Function;
import java.util.List;
/**
* 查询工具类
@ -15,15 +18,8 @@ import java.util.function.Function;
*/
public final class Queries {
/**
* 通过qo快速创建一个绑定上下文
*
* @param qo 查询实体
* @return 结果
*/
public static NamedQueryChain of(Qo<?> qo) {
return (NamedQueryChain) new Object();
}
private static final List<QueryChainFactory> FACTORIES =
SpringFactoriesLoader.loadFactories(QueryChainFactory.class, null);
/**
* 创建基于字符串字段名的查询
@ -32,7 +28,8 @@ public final class Queries {
* @return 结果
*/
public static QueryCondition<NamedQueryChain> where(String column) {
return (QueryCondition<NamedQueryChain>) new Object();
NamedQueryChain chain = getFactory(NamedQueryChain.class).produce();
return chain.and(column);
}
/**
@ -41,8 +38,9 @@ public final class Queries {
* @param getter 列引用
* @return 结果
*/
public static <T extends Domain> QueryCondition<LambdaQueryChain<T>> where(Function<T, Object> getter) {
return (QueryCondition<LambdaQueryChain<T>>) new Object();
public static <T extends Domain> QueryCondition<LambdaQueryChain<T>> where(DomainFunction<T> getter) {
LambdaQueryChain<T> chain = getFactory(LambdaQueryChain.class).produce();
return chain.and(getter);
}
/**
@ -52,7 +50,8 @@ public final class Queries {
* @return 结果
*/
public static NamedQueryChain within(NamedQueryChain chain) {
return (NamedQueryChain) new Object();
NamedQueryChain created = getFactory(LambdaQueryChain.class).produce();
return created.and(chain);
}
@ -63,7 +62,21 @@ public final class Queries {
* @return 结果
*/
public static <T extends Domain> LambdaQueryChain<T> within(LambdaQueryChain<T> chain) {
return (LambdaQueryChain<T>) new Object();
LambdaQueryChain<T> created = getFactory(LambdaQueryChain.class).produce();
return created.and(chain);
}
/**
* 通过特定产出类获取工厂
*
* @param targetType 目标类型
* @return 匹配的工厂
*/
private static QueryChainFactory getFactory(Class<?> targetType) {
return FACTORIES.stream()
.filter(factory -> factory.supports(targetType))
.findFirst()
.orElseThrow(() -> new InvalidDataAccessApiUsageException("未实现当前查询的适配工厂!"));
}
/**
@ -81,5 +94,4 @@ public final class Queries {
LEFT, RIGHT, ALL
}
}

View File

@ -28,7 +28,7 @@ public interface QueryChain<C extends QueryChain<C, P>, P> extends QueryDefiniti
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @param <T> 泛型支持其他类型的链
* @param <V> 泛型支持其他类型的链
* @return 结果
*/
<V extends QueryChain<V, ?>> C and(Supplier<QueryChain<V, ?>> supplier);

View File

@ -1,4 +1,4 @@
package com.flyfish.framework.adaptor;
package com.flyfish.framework.query.adaptor;
import org.bson.BsonRegularExpression;
import org.springframework.data.domain.Example;

View File

@ -0,0 +1,29 @@
package com.flyfish.framework.query.spi;
import com.flyfish.framework.query.QueryChain;
/**
* 查询链创建抽象工厂
* 基于spi提供实现类最终返回真正实例化的内容
* 根据引入的jar包自动加载无需手动处理
*
* @author wangyu
*/
public interface QueryChainFactory<C extends QueryChain<C, ?>> {
/**
* 生产适配器
* 此接口为高度抽象接口目的是兼容更多的查询链类型便于后续扩展
*
* @return 生产结果
*/
C produce();
/**
* 判定是否支持特定的实例类型
*
* @param targetType 工厂目标类型
* @return 是否匹配
*/
boolean supports(Class<?> targetType);
}

View File

@ -0,0 +1,38 @@
package com.flyfish.framework.mongodb.query.factory;
import com.flyfish.framework.domain.base.Domain;
import com.flyfish.framework.mongodb.query.impl.MongoLambdaQueryChain;
import com.flyfish.framework.mongodb.query.impl.MongoNamedQueryChain;
import com.flyfish.framework.query.LambdaQueryChain;
import com.flyfish.framework.query.QueryChain;
import com.flyfish.framework.query.spi.QueryChainFactory;
/**
* mongo lambda 查询工厂
*
* @author wangyu
*/
public class MongoLambdaQueryFactory<T extends Domain> implements QueryChainFactory<LambdaQueryChain<T>> {
/**
* 生产适配器
* 此接口为高度抽象接口目的是兼容更多的查询链类型便于后续扩展
*
* @return 生产结果
*/
@Override
public LambdaQueryChain<T> produce() {
return new MongoLambdaQueryChain<>();
}
/**
* 判定是否支持特定的实例类型
*
* @param targetType 工厂目标类型
* @return 是否匹配
*/
@Override
public boolean supports(Class<?> targetType) {
return targetType.isAssignableFrom(MongoLambdaQueryChain.class);
}
}

View File

@ -0,0 +1,35 @@
package com.flyfish.framework.mongodb.query.factory;
import com.flyfish.framework.mongodb.query.impl.MongoNamedQueryChain;
import com.flyfish.framework.query.NamedQueryChain;
import com.flyfish.framework.query.spi.QueryChainFactory;
/**
* mongo名称查询工厂
*
* @author wangyu
*/
public class MongoNamedQueryFactory implements QueryChainFactory<NamedQueryChain> {
/**
* 生产适配器
* 此接口为高度抽象接口目的是兼容更多的查询链类型便于后续扩展
*
* @return 生产结果
*/
@Override
public NamedQueryChain produce() {
return new MongoNamedQueryChain();
}
/**
* 判定是否支持特定的实例类型
*
* @param targetType 工厂目标类型
* @return 是否匹配
*/
@Override
public boolean supports(Class<?> targetType) {
return targetType.isAssignableFrom(MongoNamedQueryChain.class);
}
}

View File

@ -0,0 +1,106 @@
package com.flyfish.framework.mongodb.query.impl;
import com.flyfish.framework.domain.base.Domain;
import com.flyfish.framework.query.*;
import com.flyfish.framework.query.support.DomainFunction;
import java.util.List;
import java.util.function.Supplier;
/**
* mongodb实现的基于lambda的查询链
*
* @author wangyu
*/
public class MongoLambdaQueryChain<T extends Domain> extends MongoQueryDefinition implements LambdaQueryChain<T> {
/**
* 以且连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<LambdaQueryChain<T>> and(DomainFunction<T> column) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> LambdaQueryChain<T> and(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
/**
* 条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public LambdaQueryChain<T> and(LambdaQueryChain<T> chain) {
return null;
}
/**
* 多个嵌套子条件列表
*
* @param lambdaQueryChains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public LambdaQueryChain<T> and(List<LambdaQueryChain<T>> lambdaQueryChains, Queries.Combinator combinator) {
return null;
}
/**
* 以或连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<LambdaQueryChain<T>> or(DomainFunction<T> column) {
return null;
}
/**
* 以或连接条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public LambdaQueryChain<T> or(LambdaQueryChain<T> chain) {
return null;
}
/**
* 以或连接嵌套多个子条件列表
*
* @param lambdaQueryChains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public LambdaQueryChain<T> or(List<LambdaQueryChain<T>> lambdaQueryChains, Queries.Combinator combinator) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> LambdaQueryChain<T> or(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
}

View File

@ -0,0 +1,107 @@
package com.flyfish.framework.mongodb.query.impl;
import com.flyfish.framework.query.NamedQueryChain;
import com.flyfish.framework.query.Queries;
import com.flyfish.framework.query.QueryChain;
import com.flyfish.framework.query.QueryCondition;
import java.util.List;
import java.util.function.Supplier;
/**
* mongodb实现的基于名称的查询链
*
* @author wangyu
*/
public class MongoNamedQueryChain extends MongoQueryDefinition implements NamedQueryChain {
/**
* 以且连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<NamedQueryChain> and(String column) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> NamedQueryChain and(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
/**
* 条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public NamedQueryChain and(NamedQueryChain chain) {
return null;
}
/**
* 多个嵌套子条件列表
*
* @param chains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public NamedQueryChain and(List<NamedQueryChain> chains, Queries.Combinator combinator) {
return null;
}
/**
* 以或连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<NamedQueryChain> or(String column) {
return null;
}
/**
* 以或连接条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public NamedQueryChain or(NamedQueryChain chain) {
return null;
}
/**
* 以或连接嵌套多个子条件列表
*
* @param chains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public NamedQueryChain or(List<NamedQueryChain> chains, Queries.Combinator combinator) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> NamedQueryChain or(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
}

View File

@ -0,0 +1,42 @@
package com.flyfish.framework.mongodb.query.impl;
import com.flyfish.framework.query.QueryDefinition;
import com.flyfish.framework.query.QueryMutation;
/**
* mongo的查询定义
*
* @author wangyu
*/
public class MongoQueryDefinition implements QueryDefinition {
/**
* 构建
*
* @return 构建结果
*/
@Override
public <T> T build() {
return null;
}
/**
* 修改此修改会直接接着查询条件进行拼接
*
* @return 修改句柄
*/
@Override
public QueryMutation mutate() {
return null;
}
/**
* 会直接添加嵌套查询到当前查询末尾
*
* @return 修改句柄
*/
@Override
public QueryMutation within() {
return null;
}
}

View File

@ -0,0 +1,3 @@
com.flyfish.framework.query.spi.QueryChainFactory=\
com.flyfish.framework.mongodb.query.factory.MongoNamedQueryFactory,\
com.flyfish.framework.mongodb.query.factory.MongoLambdaQueryFactory

View File

@ -1,34 +0,0 @@
package com.flyfish.framework.r2dbc.adaptor;
import com.flyfish.framework.adaptor.CriteriaAdaptor;
import com.flyfish.framework.adaptor.spi.CriteriaAdaptorFactory;
import org.springframework.data.relational.core.query.Criteria;
/**
* 实现适配层和底层的转化
*
* @author wangyu
*/
public class R2DbcCriteriaAdaptorFactory implements CriteriaAdaptorFactory {
/**
* 生产适配器
*
* @return 结果
*/
@Override
public CriteriaAdaptor produce() {
return null;
}
/**
* 查询类型
*
* @return 结果
*/
@Override
public Class<?> criteriaType() {
return Criteria.class;
}
}

View File

@ -0,0 +1,36 @@
package com.flyfish.framework.r2dbc.query.factory;
import com.flyfish.framework.domain.base.Domain;
import com.flyfish.framework.query.LambdaQueryChain;
import com.flyfish.framework.query.spi.QueryChainFactory;
import com.flyfish.framework.r2dbc.query.impl.R2dbcLambdaQueryChain;
/**
* mongo lambda 查询工厂
*
* @author wangyu
*/
public class R2dbcLambdaQueryFactory<T extends Domain> implements QueryChainFactory<LambdaQueryChain<T>> {
/**
* 生产适配器
* 此接口为高度抽象接口目的是兼容更多的查询链类型便于后续扩展
*
* @return 生产结果
*/
@Override
public LambdaQueryChain<T> produce() {
return new R2dbcLambdaQueryChain<>();
}
/**
* 判定是否支持特定的实例类型
*
* @param targetType 工厂目标类型
* @return 是否匹配
*/
@Override
public boolean supports(Class<?> targetType) {
return targetType.isAssignableFrom(R2dbcLambdaQueryChain.class);
}
}

View File

@ -0,0 +1,35 @@
package com.flyfish.framework.r2dbc.query.factory;
import com.flyfish.framework.query.NamedQueryChain;
import com.flyfish.framework.query.spi.QueryChainFactory;
import com.flyfish.framework.r2dbc.query.impl.R2dbcNamedQueryChain;
/**
* mongo名称查询工厂
*
* @author wangyu
*/
public class R2dbcNamedQueryFactory implements QueryChainFactory<NamedQueryChain> {
/**
* 生产适配器
* 此接口为高度抽象接口目的是兼容更多的查询链类型便于后续扩展
*
* @return 生产结果
*/
@Override
public NamedQueryChain produce() {
return new R2dbcNamedQueryChain();
}
/**
* 判定是否支持特定的实例类型
*
* @param targetType 工厂目标类型
* @return 是否匹配
*/
@Override
public boolean supports(Class<?> targetType) {
return targetType.isAssignableFrom(R2dbcNamedQueryChain.class);
}
}

View File

@ -0,0 +1,109 @@
package com.flyfish.framework.r2dbc.query.impl;
import com.flyfish.framework.domain.base.Domain;
import com.flyfish.framework.query.LambdaQueryChain;
import com.flyfish.framework.query.Queries;
import com.flyfish.framework.query.QueryChain;
import com.flyfish.framework.query.QueryCondition;
import com.flyfish.framework.query.support.DomainFunction;
import java.util.List;
import java.util.function.Supplier;
/**
* mongodb实现的基于lambda的查询链
*
* @author wangyu
*/
public class R2dbcLambdaQueryChain<T extends Domain> extends R2dbcQueryDefinition implements LambdaQueryChain<T> {
/**
* 以且连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<LambdaQueryChain<T>> and(DomainFunction<T> column) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> LambdaQueryChain<T> and(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
/**
* 条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public LambdaQueryChain<T> and(LambdaQueryChain<T> chain) {
return null;
}
/**
* 多个嵌套子条件列表
*
* @param lambdaQueryChains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public LambdaQueryChain<T> and(List<LambdaQueryChain<T>> lambdaQueryChains, Queries.Combinator combinator) {
return null;
}
/**
* 以或连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<LambdaQueryChain<T>> or(DomainFunction<T> column) {
return null;
}
/**
* 以或连接条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public LambdaQueryChain<T> or(LambdaQueryChain<T> chain) {
return null;
}
/**
* 以或连接嵌套多个子条件列表
*
* @param lambdaQueryChains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public LambdaQueryChain<T> or(List<LambdaQueryChain<T>> lambdaQueryChains, Queries.Combinator combinator) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> LambdaQueryChain<T> or(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
}

View File

@ -0,0 +1,107 @@
package com.flyfish.framework.r2dbc.query.impl;
import com.flyfish.framework.query.NamedQueryChain;
import com.flyfish.framework.query.Queries;
import com.flyfish.framework.query.QueryChain;
import com.flyfish.framework.query.QueryCondition;
import java.util.List;
import java.util.function.Supplier;
/**
* mongodb实现的基于名称的查询链
*
* @author wangyu
*/
public class R2dbcNamedQueryChain extends R2dbcQueryDefinition implements NamedQueryChain {
/**
* 以且连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<NamedQueryChain> and(String column) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> NamedQueryChain and(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
/**
* 条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public NamedQueryChain and(NamedQueryChain chain) {
return null;
}
/**
* 多个嵌套子条件列表
*
* @param chains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public NamedQueryChain and(List<NamedQueryChain> chains, Queries.Combinator combinator) {
return null;
}
/**
* 以或连接下一个字段
*
* @param column
* @return 查询条件
*/
@Override
public QueryCondition<NamedQueryChain> or(String column) {
return null;
}
/**
* 以或连接条件列表
*
* @param chain 多个条件们
* @return 结果
*/
@Override
public NamedQueryChain or(NamedQueryChain chain) {
return null;
}
/**
* 以或连接嵌套多个子条件列表
*
* @param chains 多条链
* @param combinator 各个链条之间的连接方式
* @return 结果
*/
@Override
public NamedQueryChain or(List<NamedQueryChain> chains, Queries.Combinator combinator) {
return null;
}
/**
* 直接拼接提供者此处懒加载最终build才会执行
*
* @param supplier 提供者
* @return 结果
*/
@Override
public <V extends QueryChain<V, ?>> NamedQueryChain or(Supplier<QueryChain<V, ?>> supplier) {
return null;
}
}

View File

@ -0,0 +1,42 @@
package com.flyfish.framework.r2dbc.query.impl;
import com.flyfish.framework.query.QueryDefinition;
import com.flyfish.framework.query.QueryMutation;
/**
* mongo的查询定义
*
* @author wangyu
*/
public class R2dbcQueryDefinition implements QueryDefinition {
/**
* 构建
*
* @return 构建结果
*/
@Override
public <T> T build() {
return null;
}
/**
* 修改此修改会直接接着查询条件进行拼接
*
* @return 修改句柄
*/
@Override
public QueryMutation mutate() {
return null;
}
/**
* 会直接添加嵌套查询到当前查询末尾
*
* @return 修改句柄
*/
@Override
public QueryMutation within() {
return null;
}
}

View File

@ -0,0 +1,3 @@
com.flyfish.framework.query.spi.QueryChainFactory=\
com.flyfish.framework.r2dbc.query.factory.R2dbcLambdaQueryFactory,\
com.flyfish.framework.r2dbc.query.factory.R2dbcNamedQueryFactory