package com.easyooo.framework.cache.transaction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.easyooo.framework.cache.CacheLevel;
import com.easyooo.framework.cache.transaction.Command.Operation;
/**
* 缓冲区集合操检索类
*
* @author Killer
*/
public final class BufferedCollectionUtil {
/**
* 替换member,当缓存队列存在该缓存时,使用新值替换老值
* @param bufferCmds
* @param members
* @param groupKey
*/
public void replaceMembersFromBufferd(Collection<Command> bufferCmds,
Set<String> members, String groupKey) {
if(bufferCmds == null || bufferCmds.size() == 0){
return;
}
// filter group commands
List<Command> memberCmds = new ArrayList<>();
for (Command cmd : bufferCmds) {
if(!groupKey.equals(cmd.getCacheGroupKey())){
continue;
}
// Find the target
if(cmd.getOp() == Operation.ADD_MEMBERS ||
cmd.getOp() == Operation.DEL_MEMBERS){
memberCmds.add(cmd);
}
}
// replace membership by group commands
for (Command cmd : memberCmds) {
switch (cmd.getOp()) {
case ADD_MEMBERS:
appendMembers(members, cmd.getGroupValues());
break;
case DEL_MEMBERS:
removeMembers(members, cmd.getGroupValues());
break;
default:
break;
}
}
}
private void appendMembers(Set<String> set, String[] members){
for (String member : members) {
set.add(member);
}
}
private void removeMembers(Set<String> set, String[] members){
for (String member : members) {
set.remove(member);
}
}
/**
* 根据一组缓存KEY,从缓冲区获取一组最后一条命令, 按照传入的顺序返回,
* 不存在的cache返回返回null补位
* @return
*/
public List<Command> getLastFromBufferd(Collection<Command> bufferCmds,
CacheLevel level, String... cacheKeys) {
List<Command> lastCommands = new ArrayList<Command>();
for (String key : cacheKeys) {
lastCommands.add(getLastFromBufferd(bufferCmds, key, level));
}
return lastCommands;
}
/**
* 根据缓存KEY,从缓冲区获取最后一条命令
*
* @param bufferCmds
* @param cacheKey
* @return
*/
public Command getLastFromBufferd(Collection<Command> bufferCmds,
String cacheKey, CacheLevel level) {
if(bufferCmds == null || bufferCmds.size() == 0){
return null;
}
// asc each
List<Command> sameCommands = new ArrayList<>();
for (Command command : bufferCmds) {
//if sets operation
if(command.getOp() == Operation.SETS){
String[] keyvalues = command.getKeyvalues();
for (int i = 0; i < keyvalues.length ; i+=2) {
if(keyvalues[i].equals(cacheKey)){
// To simulate a set command
sameCommands.add(Command.newSetCommand(cacheKey, keyvalues[i+1], level));
}
}
}
if(cacheKey.equals(command.getCacheKey())){
sameCommands.add(command);
}
}
// return the last command
if(sameCommands.size() > 0){
return sameCommands.get(sameCommands.size() - 1);
}
return null;
}
}