本文主要研究一下claudb的list command
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPushCommand.java
@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class LeftPushCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { ImmutableList<SafeString> values = request.getParams().asList().tail().reverse(); DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values), (oldValue, newValue) -> list(newValue.getList().appendAll(oldValue.getList()))); return RedisToken.integer(result.size()); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPopCommand.java
@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class LeftPopCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { List<SafeString> removed = new LinkedList<>(); db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST, (oldValue, newValue) -> { ImmutableList<SafeString> list = oldValue.getList(); list.head().stream().forEach(removed::add); return list(list.tail()); }); if (removed.isEmpty()) { return nullString(); } else { return string(removed.remove(0)); } }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPushCommand.java
@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class RightPushCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { ImmutableList<SafeString> values = request.getParams().asList().tail(); DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values), (oldValue, newValue) -> list(oldValue.getList().appendAll(newValue.getList()))); return integer(result.size()); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPopCommand.java
@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class RightPopCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { List<SafeString> removed = new LinkedList<>(); db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST, (oldValue, newValue) -> { ImmutableList<SafeString> list = oldValue.getList(); list.reverse().head().stream().forEach(removed::add); return list(list.reverse().tail().reverse()); }); if (removed.isEmpty()) { return nullString(); } else { return string(removed.remove(0)); } }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListLengthCommand.java
@ReadOnly@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class ListLengthCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { ImmutableList<SafeString> list = db.getList(request.getParam(0)); return integer(list.size()); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListRangeCommand.java
@ReadOnly@Command(&34;)@ParamLength(3)@ParamType(DataType.LIST)public class ListRangeCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { try { DatabaseValue value = db.getOrDefault(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST); ImmutableList<SafeString> list = value.getList(); int from = Integer.parseInt(request.getParam(1).toString()); if (from < 0) { from = list.size() + from; } int to = Integer.parseInt(request.getParam(2).toString()); if (to < 0) { to = list.size() + to; } int min = Math.min(from, to); int max = Math.max(from, to); // TODO: use Array ImmutableList<SafeString> result = ImmutableList.from(list.stream().skip(min).limit((max - min) + 1)); return convert(result); } catch (NumberFormatException e) { return error(&34;); } }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListIndexCommand.java
@ReadOnly@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class ListIndexCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { try { ImmutableList<SafeString> list = db.getList(request.getParam(0)); int index = Integer.parseInt(request.getParam(1).toString()); if (index < 0) { index = list.size() + index; } // TODO: fix asArray return string(list.asArray().get(index)); } catch (NumberFormatException e) { return error(&34;); } catch (IndexOutOfBoundsException e) { return nullString(); } }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListSetCommand.java
@Command(&34;)@ParamLength(3)@ParamType(DataType.LIST)public class ListSetCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { try { int index = Integer.parseInt(request.getParam(1).toString()); db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST, (oldValue, newValue) -> { ImmutableList<SafeString> oldList = oldValue.getList(); // TODO: use Array List<SafeString> array = new ArrayList<>(oldList.toList()); array.set(index > -1 ? index : array.size() + index, request.getParam(2)); return list(array); }); return status(&34;); } catch (NumberFormatException e) { return error(&34;); } catch (IndexOutOfBoundsException e) { return error(&34;); } }}
claudb list相關的command有LeftPushCommand、LeftPopCommand、RightPushCommand、RightPopCommand、ListLengthCommand、ListRangeCommand、ListIndexCommand、ListSetCommand