private Object doExecutor(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        String fullMethodName = mappedStatement.getId();
        if (!MultiTenantQueryFilter.isMultiTenantQuery(fullMethodName.split(InlongConstants.UNDERSCORE)[0])) {
            return invocation.proceed();
        }
        this.setExpressionCache();
        try {
            Object[] args = invocation.getArgs();
            MappedStatement ms = (MappedStatement) args[0];
            Object parameter = args[1];
            BoundSql boundSql;
            if (args.length == 4) {
                // 4 params
                boundSql = ms.getBoundSql(parameter);
            } else {
                // 6 params
                boundSql = (BoundSql) args[5];
            }
            List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();

            this.setTenantMapping(parameterMappings);
            // new param mapping
            Object newParameter = makeNewParameters(parameter, parameterMappings);
            // update params
            invocation.getArgs()[1] = newParameter;

            return invocation.proceed();
        } catch (Exception e) {
            log.error("failed to do executor in MultiTenantInterceptor", e);
            throw e;
        }
    }
This interceptor intercept those queries annotated by {@link MultiTenantQuery}.

<p>The main idea of MultiTenantInterceptor is that developer define sql template
support multiple tenant in mapper.xml, but no need to pass the tenant explicitly in mapper.java.</p>

<p>MultiTenantInterceptor will insert <strong>tenant</strong> into the parameter maps in
{@link Executor} and {@link ParameterHandler} stages.</p>
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/interceptor/MultiTenantInterceptor.java