001/*
002 *  Copyright (c) 2022-2025, Mybatis-Flex (fuhai999@gmail.com).
003 *  <p>
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *  <p>
008 *  http://www.apache.org/licenses/LICENSE-2.0
009 *  <p>
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package com.mybatisflex.core.query;
017
018import com.mybatisflex.core.constant.SqlConnector;
019import com.mybatisflex.core.dialect.IDialect;
020import com.mybatisflex.core.util.CollectionUtil;
021import com.mybatisflex.core.util.StringUtil;
022
023import java.util.List;
024import java.util.Map;
025
026/**
027 * Cross Package Invoke
028 * 跨包调用工具类,这么设计的原因,是需要保证 QueryWrapper 方法对于用户的纯净性
029 * 而 framework 又可以通过 CPI 来调用 QueryWrapper 的其他方法
030 */
031
032public class CPI {
033
034    private CPI() {
035    }
036
037    public static Object[] getValueArray(QueryWrapper queryWrapper) {
038        return queryWrapper.getAllValueArray();
039    }
040
041    public static Object[] getJoinValueArray(QueryWrapper queryWrapper) {
042        return queryWrapper.getJoinValueArray();
043    }
044
045    public static Object[] getConditionValueArray(QueryWrapper queryWrapper) {
046        return queryWrapper.getConditionValueArray();
047    }
048
049    public static Object[] getConditionParams(QueryCondition queryCondition) {
050        return WrapperUtil.getValues(queryCondition);
051    }
052
053    public static List<QueryWrapper> getChildSelect(QueryWrapper queryWrapper) {
054        return queryWrapper.getChildSelect();
055    }
056
057
058    public static With getWith(QueryWrapper queryWrapper) {
059        return queryWrapper.with;
060    }
061
062    public static List<QueryTable> getQueryTables(QueryWrapper queryWrapper) {
063        return queryWrapper.getQueryTables();
064    }
065
066    public static void setQueryTable(QueryWrapper queryWrapper, List<QueryTable> queryTables) {
067        queryWrapper.setQueryTables(queryTables);
068    }
069
070    public static String getDataSource(QueryWrapper queryWrapper) {
071        return queryWrapper.getDataSource();
072    }
073
074    public static void setDataSource(QueryWrapper queryWrapper, String datasource) {
075        queryWrapper.setDataSource(datasource);
076    }
077
078    public static String getHint(QueryWrapper queryWrapper) {
079        return queryWrapper.getHint();
080    }
081
082    public static void setHint(QueryWrapper queryWrapper, String hint) {
083        queryWrapper.setHint(hint);
084    }
085
086    public static List<QueryColumn> getSelectColumns(QueryWrapper queryWrapper) {
087        return queryWrapper.getSelectColumns();
088    }
089
090    public static void setSelectColumns(QueryWrapper queryWrapper, List<QueryColumn> selectColumns) {
091        queryWrapper.setSelectColumns(selectColumns);
092    }
093
094    public static void setSelectColumnsIfNecessary(QueryWrapper queryWrapper, List<QueryColumn> selectColumns) {
095        if (CollectionUtil.isEmpty(queryWrapper.getSelectColumns())
096            && CollectionUtil.isNotEmpty(selectColumns)
097            && CollectionUtil.isEmpty(CPI.getJoinTables(queryWrapper))
098        ) {
099            queryWrapper.setSelectColumns(selectColumns);
100        }
101    }
102
103    public static List<Join> getJoins(QueryWrapper queryWrapper) {
104        return queryWrapper.getJoins();
105    }
106
107    public static void setJoins(QueryWrapper queryWrapper, List<Join> joins) {
108        queryWrapper.setJoins(joins);
109    }
110
111    public static String getJoinType(Join join) {
112        return join.type;
113    }
114
115    public static QueryTable getJoinQueryTable(Join join) {
116        return join.getQueryTable();
117    }
118
119    public static QueryCondition getJoinQueryCondition(Join join) {
120        return join.on;
121    }
122
123    public static void setJoinQueryCondition(Join join, QueryCondition queryCondition) {
124        join.on = queryCondition;
125    }
126
127
128    public static List<QueryTable> getJoinTables(QueryWrapper queryWrapper) {
129        return queryWrapper.getJoinTables();
130    }
131
132    public static void setJoinTables(QueryWrapper queryWrapper, List<QueryTable> joinTables) {
133        queryWrapper.setJoinTables(joinTables);
134    }
135
136    public static void addJoin(QueryWrapper queryWrapper, Join join) {
137        queryWrapper.addJoinTable(join.getQueryTable());
138        queryWrapper.addJoin(join);
139    }
140
141    public static QueryCondition getPrevEffectiveCondition(QueryCondition queryCondition) {
142        return queryCondition.getPrevEffectiveCondition();
143    }
144
145    public static QueryCondition getNextCondition(QueryCondition queryCondition) {
146        return queryCondition.getNextEffectiveCondition();
147    }
148
149    public static QueryCondition getWhereQueryCondition(QueryWrapper queryWrapper) {
150        return queryWrapper.getWhereQueryCondition();
151    }
152    public static void setWhereQueryCondition(QueryWrapper queryWrapper, QueryCondition queryCondition) {
153        queryWrapper.setWhereQueryCondition(queryCondition);
154    }
155    public static void addWhereQueryCondition(QueryWrapper queryWrapper, QueryCondition queryCondition) {
156        queryWrapper.addWhereQueryCondition(queryCondition);
157    }
158
159    public static void addWhereQueryCondition(QueryWrapper queryWrapper, QueryCondition queryCondition, SqlConnector connector) {
160        queryWrapper.addWhereQueryCondition(queryCondition, connector);
161    }
162
163    public static List<QueryColumn> getGroupByColumns(QueryWrapper queryWrapper) {
164        return queryWrapper.getGroupByColumns();
165    }
166
167    public static void setGroupByColumns(QueryWrapper queryWrapper, List<QueryColumn> groupByColumns) {
168        queryWrapper.setGroupByColumns(groupByColumns);
169    }
170
171    public static QueryCondition getHavingQueryCondition(QueryWrapper queryWrapper) {
172        return queryWrapper.getHavingQueryCondition();
173    }
174
175    public static void setHavingQueryCondition(QueryWrapper queryWrapper, QueryCondition havingQueryCondition) {
176        queryWrapper.setHavingQueryCondition(havingQueryCondition);
177    }
178
179    public static List<QueryOrderBy> getOrderBys(QueryWrapper queryWrapper) {
180        return queryWrapper.getOrderBys();
181    }
182
183    public static void setOrderBys(QueryWrapper queryWrapper, List<QueryOrderBy> orderBys) {
184        queryWrapper.setOrderBys(orderBys);
185    }
186
187    public static List<UnionWrapper> getUnions(QueryWrapper queryWrapper) {
188        return queryWrapper.getUnions();
189    }
190
191    public static void setUnions(QueryWrapper queryWrapper, List<UnionWrapper> unions) {
192        queryWrapper.setUnions(unions);
193    }
194
195
196    public static Long getLimitOffset(QueryWrapper queryWrapper) {
197        return queryWrapper.getLimitOffset();
198    }
199
200    public static void setLimitOffset(QueryWrapper queryWrapper, Long limitOffset) {
201        queryWrapper.setLimitOffset(limitOffset);
202    }
203
204    public static Long getLimitRows(QueryWrapper queryWrapper) {
205        return queryWrapper.getLimitRows();
206    }
207
208    public static void setLimitRows(QueryWrapper queryWrapper, Long limitRows) {
209        queryWrapper.setLimitRows(limitRows);
210    }
211
212    public static List<String> getEndFragments(QueryWrapper queryWrapper) {
213        return queryWrapper.getEndFragments();
214    }
215
216    public static void setEndFragments(QueryWrapper queryWrapper, List<String> endFragments) {
217        queryWrapper.setEndFragments(endFragments);
218    }
219
220
221    public static Map<String, Object> getContext(QueryWrapper queryWrapper) {
222        return queryWrapper.getContext();
223    }
224
225    public static void setContext(QueryWrapper queryWrapper, Map<String, Object> context) {
226        queryWrapper.setContext(context);
227    }
228
229    public static void putContext(QueryWrapper queryWrapper, String key, Object value) {
230        queryWrapper.putContext(key, value);
231    }
232
233
234    public static <R> R getContext(QueryWrapper queryWrapper, String key) {
235        return queryWrapper.getContext(key);
236    }
237
238
239    public static String toConditionSql(QueryColumn queryColumn, List<QueryTable> queryTables, IDialect dialect) {
240        return queryColumn.toConditionSql(queryTables, dialect);
241    }
242
243    public static String toSelectSql(QueryColumn queryColumn, List<QueryTable> queryTables, IDialect dialect) {
244        return queryColumn.toSelectSql(queryTables, dialect);
245    }
246
247    public static void setFromIfNecessary(QueryWrapper queryWrapper, String tableName) {
248        if (StringUtil.hasText(tableName)
249            && CollectionUtil.isEmpty(queryWrapper.getQueryTables())) {
250            queryWrapper.from(tableName);
251        }
252    }
253
254    public static void setFromIfNecessary(QueryWrapper queryWrapper, String schema, String tableName) {
255        if (StringUtil.hasText(tableName)
256            && CollectionUtil.isEmpty(queryWrapper.getQueryTables())) {
257            queryWrapper.from(new QueryTable(schema, tableName));
258        }
259    }
260
261    public static boolean containsTable(QueryCondition condition, String... tables) {
262        return condition != null && condition.containsTable(tables);
263    }
264
265    public static QueryWrapper getQueryWrapper(SelectQueryColumn selectQueryColumn) {
266        return selectQueryColumn.getQueryWrapper();
267    }
268
269    public static boolean isSameTable(QueryTable queryTable, QueryTable otherTable) {
270        return queryTable.isSameTable(otherTable);
271    }
272
273}