Home / Class/ RedisArrayAggregator Class — netty Architecture

RedisArrayAggregator Class — netty Architecture

Architecture documentation for the RedisArrayAggregator class in RedisArrayAggregator.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  012bd3a5_4e03_f9eb_6cc8_66f49859fdf6["RedisArrayAggregator"]
  7430b3a8_ac7d_9a96_1860_df9731aa4c46["RedisArrayAggregator.java"]
  012bd3a5_4e03_f9eb_6cc8_66f49859fdf6 -->|defined in| 7430b3a8_ac7d_9a96_1860_df9731aa4c46
  86701e59_5466_bb8d_e87c_68514b4568f0["RedisArrayAggregator()"]
  012bd3a5_4e03_f9eb_6cc8_66f49859fdf6 -->|method| 86701e59_5466_bb8d_e87c_68514b4568f0
  043bb9bf_1443_0c42_e71e_b66949666a5e["decode()"]
  012bd3a5_4e03_f9eb_6cc8_66f49859fdf6 -->|method| 043bb9bf_1443_0c42_e71e_b66949666a5e
  36052a91_1ebd_bdfa_c856_32922cf0b94b["RedisMessage()"]
  012bd3a5_4e03_f9eb_6cc8_66f49859fdf6 -->|method| 36052a91_1ebd_bdfa_c856_32922cf0b94b

Relationship Graph

Source Code

codec-redis/src/main/java/io/netty/handler/codec/redis/RedisArrayAggregator.java lines 33–97

@UnstableApi
public final class RedisArrayAggregator extends MessageToMessageDecoder<RedisMessage> {

    private final Deque<AggregateState> depths = new ArrayDeque<AggregateState>(4);

    public RedisArrayAggregator() {
        super(RedisMessage.class);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, RedisMessage msg, List<Object> out) throws Exception {
        if (msg instanceof ArrayHeaderRedisMessage) {
            msg = decodeRedisArrayHeader((ArrayHeaderRedisMessage) msg);
            if (msg == null) {
                return;
            }
        } else {
            ReferenceCountUtil.retain(msg);
        }

        while (!depths.isEmpty()) {
            AggregateState current = depths.peek();
            current.children.add(msg);

            // if current aggregation completed, go to parent aggregation.
            if (current.children.size() == current.length) {
                msg = new ArrayRedisMessage(current.children);
                depths.pop();
            } else {
                // not aggregated yet. try next time.
                return;
            }
        }

        out.add(msg);
    }

    private RedisMessage decodeRedisArrayHeader(ArrayHeaderRedisMessage header) {
        if (header.isNull()) {
            return ArrayRedisMessage.NULL_INSTANCE;
        } else if (header.length() == 0L) {
            return ArrayRedisMessage.EMPTY_INSTANCE;
        } else if (header.length() > 0L) {
            // Currently, this codec doesn't support `long` length for arrays because Java's List.size() is int.
            if (header.length() > Integer.MAX_VALUE) {
                throw new CodecException("this codec doesn't support longer length than " + Integer.MAX_VALUE);
            }

            // start aggregating array
            depths.push(new AggregateState((int) header.length()));
            return null;
        } else {
            throw new CodecException("bad length: " + header.length());
        }
    }

    private static final class AggregateState {
        private final int length;
        private final List<RedisMessage> children;
        AggregateState(int length) {
            this.length = length;
            this.children = new ArrayList<RedisMessage>(length);
        }
    }
}

Frequently Asked Questions

What is the RedisArrayAggregator class?
RedisArrayAggregator is a class in the netty codebase, defined in codec-redis/src/main/java/io/netty/handler/codec/redis/RedisArrayAggregator.java.
Where is RedisArrayAggregator defined?
RedisArrayAggregator is defined in codec-redis/src/main/java/io/netty/handler/codec/redis/RedisArrayAggregator.java at line 33.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free