# 一、需求场景

ebuilder表单在开启分表和开启微搜后，查询业务数据时都需要到es里查询，不再到DB里进行查询。

# 二、方案设计

鉴于目前查询业务数据场景很多，且基本都是动态SQL，按照常规的1:1用微搜方式复写当前业务，难以实现覆盖存量的功能，且后续迭代支持将处于一直更新和追赶走SQL的实现方式。基于此我们计划实现一个mybatis拦截器，将上层传来的SQL等价的转换成微搜的Dto，通过查询微搜接口，并封装成DB一样的返回数据格式，这样有2个好处：

1. 上层业务可以继续基于SQL实现业务逻辑，查询走微搜对开发迭代透明。
2. 微搜查询从具体业务场景中抽象出来，具有很强的通用性，无需业务上一一对接就可以覆盖大部分的查询场景。

# 三、配置方式

目前支持2种配置，对应2种场景，让Dao查询走微搜：

## 3.1 业务固定的Dao — 通过配置走微搜查询

在weaver-publish-api,properties中配置好需要走微搜的Dao方法签名，这种情况适用于特定场景的Dao，比如查询列表数据Dao、统计列表数据Dao，即他的SQL格式固定，场景可以经过检验走微搜都没问题。

> ```properties
> # {"type":"fixed"}
> weaver.publishkit.allowEsMappers=com.weaver.ebuilder.form.base.dao.EbBaseDao.executePageSelectSql,com.weaver.ebuilder.form.data.dao.PhysicalTableDataDao.getDetailDatasByFormDataIdsForPage
> ```

## 3.2 通用型Dao — 通过设置上下文走微搜查询

即走该Dao的场景和SQL形式不可知，可执行任意的SQL，比如com.weaver.ebuilder.form.base.dao.EbBaseDao.executeSelectSql，在任何需要执行动态SQL的场景都会调用它。这类Dao如果在特定场景验证已支持要走微搜，需要通过代码设置上下文方式来实现走微搜。

```java
public static final String EB_BASE_DAO_EXECUTE_SELECT_SQL = "com.weaver.ebuilder.form.base.dao.EbBaseDao.executeSelectSql";

try (ESHintManager esHintManager = ESHintManager.getInstance()) { // 明确设置好要走微搜的Dao，在这个闭包内该Dao都走微搜
    esHintManager.setESQueryDao(EB_BASE_DAO_EXECUTE_SELECT_SQL);
    dataResult = ebBaseSelectService.executeSelectSql(realSql, realParams, obj, user);
}
```
