/**
* 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;
}
}