/** * 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 java.util.*; 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 SliceByNamesReadCommand extends ReadCommand { public final SortedSet<ByteBuffer> columnNames; public SliceByNamesReadCommand(String table, ByteBuffer key, ColumnParent column_parent, Collection<ByteBuffer> columnNames) { this(table, key, new QueryPath(column_parent), columnNames); } public SliceByNamesReadCommand(String table, ByteBuffer key, QueryPath path, Collection<ByteBuffer> columnNames) { super(table, key, path, CMD_TYPE_GET_SLICE_BY_NAMES); this.columnNames = new TreeSet<ByteBuffer>(getComparator()); this.columnNames.addAll(columnNames); } @Override public ReadCommand copy() { ReadCommand readCommand= new SliceByNamesReadCommand(table, key, queryPath, columnNames); readCommand.setDigestQuery(isDigestQuery()); return readCommand; } @Override public Row getRow(Table table) throws IOException { DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); return table.getRow(QueryFilter.getNamesFilter(dk, queryPath, columnNames)); } @Override public String toString() { return "SliceByNamesReadCommand(" + "table='" + table + '\'' + ", key=" + ByteBufferUtil.bytesToHex(key) + ", columnParent='" + queryPath + '\'' + ", columns=[" + getComparator().getString(columnNames) + "]" + ')'; } } class SliceByNamesReadCommandSerializer extends ReadCommandSerializer { @Override public void serialize(ReadCommand rm, DataOutputStream dos) throws IOException { SliceByNamesReadCommand realRM = (SliceByNamesReadCommand)rm; dos.writeBoolean(realRM.isDigestQuery()); dos.writeUTF(realRM.table); ByteBufferUtil.writeWithShortLength(realRM.key, dos); realRM.queryPath.serialize(dos); dos.writeInt(realRM.columnNames.size()); if (realRM.columnNames.size() > 0) { for (ByteBuffer cName : realRM.columnNames) { ByteBufferUtil.writeWithShortLength(cName, dos); } } } @Override public ReadCommand deserialize(DataInputStream dis) throws IOException { boolean isDigest = dis.readBoolean(); String table = dis.readUTF(); ByteBuffer key = ByteBufferUtil.readWithShortLength(dis); QueryPath columnParent = QueryPath.deserialize(dis); int size = dis.readInt(); List<ByteBuffer> columns = new ArrayList<ByteBuffer>(); for (int i = 0; i < size; ++i) { columns.add(ByteBufferUtil.readWithShortLength(dis)); } SliceByNamesReadCommand rm = new SliceByNamesReadCommand(table, key, columnParent, columns); rm.setDigestQuery(isDigest); return rm; } }