/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.cassandra.db; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.filter.QueryPath; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.thrift.ColumnParent; import org.apache.cassandra.utils.ByteBufferUtil; public class SliceFromReadCommand extends ReadCommand { public final ByteBuffer start, finish; public final boolean reversed; public final int count; public SliceFromReadCommand(String table, ByteBuffer key, ColumnParent column_parent, ByteBuffer start, ByteBuffer finish, boolean reversed, int count) { this(table, key, new QueryPath(column_parent), start, finish, reversed, count); } public SliceFromReadCommand(String table, ByteBuffer key, QueryPath path, ByteBuffer start, ByteBuffer finish, boolean reversed, int count) { super(table, key, path, CMD_TYPE_GET_SLICE); this.start = start; this.finish = finish; this.reversed = reversed; this.count = count; } @Override public ReadCommand copy() { ReadCommand readCommand = new SliceFromReadCommand(table, key, queryPath, start, finish, reversed, count); readCommand.setDigestQuery(isDigestQuery()); return readCommand; } @Override public Row getRow(Table table) throws IOException { DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); return table.getRow(QueryFilter.getSliceFilter(dk, queryPath, start, finish, reversed, count)); } @Override public String toString() { return "SliceFromReadCommand(" + "table='" + table + '\'' + ", key='" + ByteBufferUtil.bytesToHex(key) + '\'' + ", column_parent='" + queryPath + '\'' + ", start='" + getComparator().getString(start) + '\'' + ", finish='" + getComparator().getString(finish) + '\'' + ", reversed=" + reversed + ", count=" + count + ')'; } } class SliceFromReadCommandSerializer extends ReadCommandSerializer { @Override public void serialize(ReadCommand rm, DataOutputStream dos) throws IOException { SliceFromReadCommand realRM = (SliceFromReadCommand)rm; dos.writeBoolean(realRM.isDigestQuery()); dos.writeUTF(realRM.table); ByteBufferUtil.writeWithShortLength(realRM.key, dos); realRM.queryPath.serialize(dos); ByteBufferUtil.writeWithShortLength(realRM.start, dos); ByteBufferUtil.writeWithShortLength(realRM.finish, dos); dos.writeBoolean(realRM.reversed); dos.writeInt(realRM.count); } @Override public ReadCommand deserialize(DataInputStream dis) throws IOException { boolean isDigest = dis.readBoolean(); SliceFromReadCommand rm = new SliceFromReadCommand(dis.readUTF(), ByteBufferUtil.readWithShortLength(dis), QueryPath.deserialize(dis), ByteBufferUtil.readWithShortLength(dis), ByteBufferUtil.readWithShortLength(dis), dis.readBoolean(), dis.readInt()); rm.setDigestQuery(isDigest); return rm; } }