class FetchRequest extends TransportRequest {

        private final UUID jobId;
        private final int fetchPhaseId;
        private final boolean closeContext;

        @Nullable
        private final IntObjectMap<IntArrayList> toFetch;

        private FetchRequest(UUID jobId,
                     int fetchPhaseId,
                     boolean closeContext,
                     IntObjectMap<IntArrayList> toFetch) {
            this.jobId = jobId;
            this.fetchPhaseId = fetchPhaseId;
            this.closeContext = closeContext;
            if (toFetch.isEmpty()) {
                this.toFetch = null;
            } else {
                this.toFetch = toFetch;
            }
        }

        public UUID jobId() {
            return jobId;
        }

        public int fetchPhaseId() {
            return fetchPhaseId;
        }

        public boolean isCloseContext() {
            return closeContext;
        }

        @Nullable
        public IntObjectMap<IntArrayList> toFetch() {
            return toFetch;
        }

        public FetchRequest(StreamInput in) throws IOException {
            super(in);
            jobId = new UUID(in.readLong(), in.readLong());
            fetchPhaseId = in.readVInt();
            closeContext = in.readBoolean();
            int numReaders = in.readVInt();
            if (numReaders > 0) {
                IntObjectHashMap<IntArrayList> toFetch = new IntObjectHashMap<>(numReaders);
                for (int i = 0; i < numReaders; i++) {
                    int readerId = in.readVInt();
                    int numDocs = in.readVInt();
                    IntArrayList docs = new IntArrayList(numDocs);
                    toFetch.put(readerId, docs);
                    for (int j = 0; j < numDocs; j++) {
                        docs.add(in.readInt());
                    }
                }
                this.toFetch = toFetch;
            } else {
                this.toFetch = null;
            }
        }

        @Override
        public void writeTo(StreamOutput out) throws IOException {<FILL_FUNCTION_BODY>}
    }

            super.writeTo(out);
            out.writeLong(jobId.getMostSignificantBits());
            out.writeLong(jobId.getLeastSignificantBits());
            out.writeVInt(fetchPhaseId);
            out.writeBoolean(closeContext);
            if (toFetch == null) {
                out.writeVInt(0);
            } else {
                out.writeVInt(toFetch.size());
                for (IntObjectCursor<? extends IntContainer> toFetchCursor : toFetch) {
                    out.writeVInt(toFetchCursor.key);
                    out.writeVInt(toFetchCursor.value.size());
                    for (IntCursor docCursor : toFetchCursor.value) {
                        out.writeInt(docCursor.value);
                    }
                }
            }
        
<methods>public void <init>(java.lang.String, io.crate.execution.engine.fetch.NodeFetchRequest.FetchRequest) ,public void <init>(org.elasticsearch.common.io.stream.StreamInput) throws java.io.IOException,public io.crate.execution.engine.fetch.NodeFetchRequest.FetchRequest innerRequest() ,public java.lang.String nodeId() ,public void writeTo(org.elasticsearch.common.io.stream.StreamOutput) throws java.io.IOException<variables>private final non-sealed io.crate.execution.engine.fetch.NodeFetchRequest.FetchRequest innerRequest,private final non-sealed java.lang.String nodeId