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 */
016
017package com.mybatisflex.core.update;
018
019import com.mybatisflex.core.query.QueryColumn;
020import com.mybatisflex.core.util.LambdaGetter;
021
022import java.util.function.BooleanSupplier;
023import java.util.function.Predicate;
024
025/**
026 * 属性设置接口。
027 *
028 * @param <R> 链式调用返回值类型
029 * @author 王帅
030 * @since 2023-08-16
031 */
032public interface PropertySetter<R> {
033
034    /**
035     * 设置字段对应参数值。
036     *
037     * @param property 字段名
038     * @param value    参数值
039     */
040    default R set(String property, Object value) {
041        return set(property, value, true);
042    }
043
044    /**
045     * 设置字段对应参数值。
046     *
047     * @param property    字段名
048     * @param value       参数值
049     * @param isEffective 是否生效
050     */
051    R set(String property, Object value, boolean isEffective);
052
053    /**
054     * 设置字段对应参数值。
055     *
056     * @param property    字段名
057     * @param value       参数值
058     * @param isEffective 是否生效
059     */
060    default R set(String property, Object value, BooleanSupplier isEffective) {
061        return set(property, value, isEffective.getAsBoolean());
062    }
063
064    /**
065     * 设置字段对应参数值。
066     *
067     * @param property    字段名
068     * @param value       参数值
069     * @param isEffective 是否生效
070     */
071    default <V> R set(String property, V value, Predicate<V> isEffective) {
072        return set(property, value, isEffective.test(value));
073    }
074
075    /**
076     * 设置字段对应参数值。
077     *
078     * @param property 字段名
079     * @param value    参数值
080     */
081    default R set(QueryColumn property, Object value) {
082        return set(property, value, true);
083    }
084
085    /**
086     * 设置字段对应参数值。
087     *
088     * @param property    字段名
089     * @param value       参数值
090     * @param isEffective 是否生效
091     */
092    R set(QueryColumn property, Object value, boolean isEffective);
093
094    /**
095     * 设置字段对应参数值。
096     *
097     * @param property    字段名
098     * @param value       参数值
099     * @param isEffective 是否生效
100     */
101    default R set(QueryColumn property, Object value, BooleanSupplier isEffective) {
102        return set(property, value, isEffective.getAsBoolean());
103    }
104
105    /**
106     * 设置字段对应参数值。
107     *
108     * @param property    字段名
109     * @param value       参数值
110     * @param isEffective 是否生效
111     */
112    default <V> R set(QueryColumn property, V value, Predicate<V> isEffective) {
113        return set(property, value, isEffective.test(value));
114    }
115
116    /**
117     * 设置字段对应参数值。
118     *
119     * @param property 字段名
120     * @param value    参数值
121     */
122    default <T> R set(LambdaGetter<T> property, Object value) {
123        return set(property, value, true);
124    }
125
126    /**
127     * 设置字段对应参数值。
128     *
129     * @param property    字段名
130     * @param value       参数值
131     * @param isEffective 是否生效
132     */
133    <T> R set(LambdaGetter<T> property, Object value, boolean isEffective);
134
135    /**
136     * 设置字段对应参数值。
137     *
138     * @param property    字段名
139     * @param value       参数值
140     * @param isEffective 是否生效
141     */
142    default <T> R set(LambdaGetter<T> property, Object value, BooleanSupplier isEffective) {
143        return set(property, value, isEffective.getAsBoolean());
144    }
145
146    /**
147     * 设置字段对应参数值。
148     *
149     * @param property    字段名
150     * @param value       参数值
151     * @param isEffective 是否生效
152     */
153    default <T, V> R set(LambdaGetter<T> property, V value, Predicate<V> isEffective) {
154        return set(property, value, isEffective.test(value));
155    }
156
157    /**
158     * 设置字段对应原生值。
159     *
160     * @param property 字段名
161     * @param value    原生值
162     */
163    default R setRaw(String property, Object value) {
164        return setRaw(property, value, true);
165    }
166
167    /**
168     * 设置字段对应原生值。
169     *
170     * @param property    字段名
171     * @param value       原生值
172     * @param isEffective 是否生效
173     */
174    R setRaw(String property, Object value, boolean isEffective);
175
176    /**
177     * 设置字段对应原生值。
178     *
179     * @param property    字段名
180     * @param value       原生值
181     * @param isEffective 是否生效
182     */
183    default R setRaw(String property, Object value, BooleanSupplier isEffective) {
184        return setRaw(property, value, isEffective.getAsBoolean());
185    }
186
187    /**
188     * 设置字段对应原生值。
189     *
190     * @param property    字段名
191     * @param value       原生值
192     * @param isEffective 是否生效
193     */
194    default <V> R setRaw(String property, V value, Predicate<V> isEffective) {
195        return setRaw(property, value, isEffective.test(value));
196    }
197
198    /**
199     * 设置字段对应原生值。
200     *
201     * @param property 字段名
202     * @param value    原生值
203     */
204    default R setRaw(QueryColumn property, Object value) {
205        return setRaw(property, value, true);
206    }
207
208    /**
209     * 设置字段对应原生值。
210     *
211     * @param property    字段名
212     * @param value       原生值
213     * @param isEffective 是否生效
214     */
215    R setRaw(QueryColumn property, Object value, boolean isEffective);
216
217    /**
218     * 设置字段对应原生值。
219     *
220     * @param property    字段名
221     * @param value       原生值
222     * @param isEffective 是否生效
223     */
224    default R setRaw(QueryColumn property, Object value, BooleanSupplier isEffective) {
225        return setRaw(property, value, isEffective.getAsBoolean());
226    }
227
228    /**
229     * 设置字段对应原生值。
230     *
231     * @param property    字段名
232     * @param value       原生值
233     * @param isEffective 是否生效
234     */
235    default <V> R setRaw(QueryColumn property, V value, Predicate<V> isEffective) {
236        return setRaw(property, value, isEffective.test(value));
237    }
238
239    /**
240     * 设置字段对应原生值。
241     *
242     * @param property 字段名
243     * @param value    原生值
244     */
245    default <T> R setRaw(LambdaGetter<T> property, Object value) {
246        return setRaw(property, value, true);
247    }
248
249    /**
250     * 设置字段对应原生值。
251     *
252     * @param property    字段名
253     * @param value       原生值
254     * @param isEffective 是否生效
255     */
256    <T> R setRaw(LambdaGetter<T> property, Object value, boolean isEffective);
257
258    /**
259     * 设置字段对应原生值。
260     *
261     * @param property    字段名
262     * @param value       原生值
263     * @param isEffective 是否生效
264     */
265    default <T> R setRaw(LambdaGetter<T> property, Object value, BooleanSupplier isEffective) {
266        return setRaw(property, value, isEffective.getAsBoolean());
267    }
268
269    /**
270     * 设置字段对应原生值。
271     *
272     * @param property    字段名
273     * @param value       原生值
274     * @param isEffective 是否生效
275     */
276    default <T, V> R setRaw(LambdaGetter<T> property, V value, Predicate<V> isEffective) {
277        return setRaw(property, value, isEffective.test(value));
278    }
279
280}