All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gu.sql2java.redis.cache.RedisCacheReader Maven / Gradle / Ivy

package gu.sql2java.redis.cache;

import gu.simplemq.Channel;
import gu.simplemq.redis.JedisPoolLazy;
import gu.simplemq.redis.RedisFactory;
import gu.simplemq.redis.RedisTable;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.util.TypeUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;

import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static gu.sql2java.redis.cache.RedisCaches.getCacheKeyPrefix;
import static com.google.common.base.Strings.isNullOrEmpty;


/**
 * 基于REDIS的数据库表记录缓存访问实现用于读取{@link RedisCache}保存在REDIS中的数据
 * @author guyadong
 *
 */
public class RedisCacheReader{
	private final RedisTable table;
	private final Channel channel;
	/**
	 * 构造方法
	 * @param keyPrefix KEY的统一前缀,为{@code null}或空使用默认值{@link RedisCaches#getCacheKeyPrefix() }
	 * @param beanClassName 数据库记录对象
	 * @param columnName 用作REDIS key的字段名
	 */
	RedisCacheReader(String keyPrefix,String beanClassName,String columnName) {
		if(isNullOrEmpty(keyPrefix)){
			keyPrefix = getCacheKeyPrefix();
		}
		checkArgument(!isNullOrEmpty(beanClassName),"beanClassName is null or empty");
		checkArgument(!isNullOrEmpty(columnName),"columnName is null or empty");
		String channelName = RedisCaches.channelNameOf(keyPrefix, beanClassName, columnName);
		channel = new Channel<>(channelName, JSONObject.class);
		table =  RedisFactory.getTable(channel, JedisPoolLazy.getDefaultInstance());
	}
	/**
	 * 构造方法
	 * @param beanClassName 数据库记录对象
	 * @param columnName 用作REDIS key的字段名
	 */
	RedisCacheReader(String beanClassName,String columnName) {
		this(null, beanClassName, columnName);
	}

	/**
	 * @since 3.21.1
	 */
	public RedisTable getTable() {
		return table;
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象
	 * @param key
	 */
	public JSONObject get(Object key) {
		return table.get(String.valueOf(key));
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录返回{@code defaultValue}
	 * @param key 主键值
	 * @param fieldName 字段名
	 * @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
	 */
	public Object getField(Object key,String fieldName,Object defaultValue) {
		JSONObject json = get(key);
		Object v;
		if(null != json && (null != (v = json.get(fieldName)))){
			return v;
		}		
		return defaultValue;
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录返回{@code null}
	 * @param key 主键值
	 * @param fieldName 字段名
	 */
	public Object getField(Object key,String fieldName) {
		return getField(fieldName,null);
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
	 * @param key 主键值
	 * @param fieldName 字段名
	 * @param targetType 字段类型
	 * @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
	 * @see TypeUtils#cast(Object, Class, ParserConfig)
	 */
	public  T getField(Object key,String fieldName,Class targetType, T defaultValue) {
		JSONObject json = get(key);
		Object v;
		if(null != json && (null != (v = json.get(fieldName)))){
			return TypeUtils.cast(v,checkNotNull(targetType,"targetType is null"),ParserConfig.global);
		}
		return defaultValue;
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录返回{@code null},否则将返回字段值转换为指定的字段类型
	 * @param key 主键值
	 * @param fieldName 字段名
	 * @param targetType 字段类型
	 */
	public  T getField(Object key,String fieldName,Class targetType) {
		return getField(key,fieldName,targetType,null);
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录对应的字段值返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
	 * @param fieldName 字段名
	 * @param targetType 字段类型
	 * @param defaultValue 没找到记录或字段值为{@code null}时的返回的默认值
	 * @param keys 主键值列表
	 * @see TypeUtils#cast(Object, Class, ParserConfig)
	 */
	public  Map getField(String fieldName,Class targetType,T defaultValue,Iterable keys) {
		Map values = get(keys);
		return Maps.transformValues(values, r->{
					Object v = r.get(fieldName);
					return null == v ? defaultValue : TypeUtils.cast(v,targetType,ParserConfig.global);
				});
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录对应的字段值返回{@code defaultValue},否则将返回字段值转换为指定的字段类型
	 * @see #getField(String, Class, Object, Iterable)
	 */
	@SuppressWarnings("unchecked")
	public  Map getField(String fieldName,Class targetType,T defaultValue, K... keys) {
		return getField(fieldName,targetType,defaultValue,null != keys ? Arrays.asList(keys) : Collections.emptyList());
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录对应的字段值返回{@code null},否则将返回字段值转换为指定的字段类型
	 * @see #getField(String, Class, Object, Iterable)
	 */
	public  Map getField(String fieldName,Class targetType,Iterable keys) {
		return getField(fieldName, targetType, null,keys);
	}
	/**
	 * 返回主键或索引键返回指定的数据库记录对象的指定字段值,
	 * 如果不存在指定记录对应的字段值返回{@code null},否则将返回字段值转换为指定的字段类型
	 * @see #getField(String, Class, Object, Iterable)
	 */
	@SuppressWarnings("unchecked")
	public  Map getField(String fieldName,Class targetType,K... keys) {
		return getField(fieldName, targetType, null,keys);
	}
	public Map get(String... keys) {
		return table.get(keys);
	}
	/**
	 * 以T-JSON映射形式返回主键或索引键返回指定的数据库记录对象
	 * @param keys
	 */
	public  Map get(Iterable keys) {
		return table.get(keys);
	}
	/**
	 * 以T-JSON映射形式返回主键或索引键返回指定的数据库记录对象
	 * @param keys
	 */
	@SuppressWarnings("unchecked")
	public  Map get(T... keys) {
		return table.get(keys);
	}

	/**
	 * 遍历表中所有key执行指定的{@code action}
	 * @param action
	 * @return 返回{@code action}执行为{@code true}的数量
	 */
	public int foreach(Predicate action) {
		return table.foreach(null, action);
	}
	/**
	 * 遍历表所有元素执行指定的{@code action}
	 * @param action
	 * @return 返回{@code action}执行为{@code true}的数量
	 * @since 3.21.1
	 */
	public int foreachValue(Predicate action) {
		return table.foreachValue(null, action);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy