diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java index 8592fbbb7b..9a31c09ec1 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java @@ -33,6 +33,7 @@ import org.apache.cassandra.cql3.functions.Function; import org.apache.cassandra.cql3.terms.Term; import org.apache.cassandra.cql3.terms.Terms; import org.apache.cassandra.db.filter.RowFilter; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.ListType; import org.apache.cassandra.index.Index; import org.apache.cassandra.index.IndexRegistry; @@ -402,7 +403,7 @@ public final class SimpleRestriction implements SingleRestriction private static ByteBuffer multiInputOperatorValues(ColumnMetadata column, List values) { - return ListType.getInstance(column.type, false).pack(values); + return ListType.getInstance(column.type, false).pack(values, ByteBufferAccessor.instance); } @Override diff --git a/src/java/org/apache/cassandra/cql3/selection/ColumnTimestamps.java b/src/java/org/apache/cassandra/cql3/selection/ColumnTimestamps.java index b3f3fa4ef7..713e85b77f 100644 --- a/src/java/org/apache/cassandra/cql3/selection/ColumnTimestamps.java +++ b/src/java/org/apache/cassandra/cql3/selection/ColumnTimestamps.java @@ -27,6 +27,7 @@ import com.google.common.collect.BoundType; import com.google.common.collect.Range; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.ListType; import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.db.marshal.UserType; @@ -384,7 +385,7 @@ abstract class ColumnTimestamps List buffers = new ArrayList<>(timestamps.size()); timestamps.forEach(timestamp -> buffers.add(type.toByteBuffer(timestamp))); - return LONG_LIST_TYPE.pack(buffers); + return LONG_LIST_TYPE.pack(buffers, ByteBufferAccessor.instance); } @Override diff --git a/src/java/org/apache/cassandra/cql3/selection/ListSelector.java b/src/java/org/apache/cassandra/cql3/selection/ListSelector.java index 3494b4b831..44849805d5 100644 --- a/src/java/org/apache/cassandra/cql3/selection/ListSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/ListSelector.java @@ -29,6 +29,7 @@ import org.apache.cassandra.cql3.terms.Lists; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.filter.ColumnFilter.Builder; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.ListType; import org.apache.cassandra.io.util.DataInputPlus; import org.apache.cassandra.io.util.DataOutputPlus; @@ -101,7 +102,7 @@ final class ListSelector extends Selector { buffers.add(elements.get(i).getOutput(protocolVersion)); } - return type.pack(buffers); + return type.pack(buffers, ByteBufferAccessor.instance); } public void reset() diff --git a/src/java/org/apache/cassandra/cql3/selection/SetSelector.java b/src/java/org/apache/cassandra/cql3/selection/SetSelector.java index a4cc5009af..03fd6ac71d 100644 --- a/src/java/org/apache/cassandra/cql3/selection/SetSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/SetSelector.java @@ -31,6 +31,7 @@ import org.apache.cassandra.cql3.terms.Sets; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.filter.ColumnFilter.Builder; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.SetType; import org.apache.cassandra.io.util.DataInputPlus; import org.apache.cassandra.io.util.DataOutputPlus; @@ -103,7 +104,7 @@ final class SetSelector extends Selector { buffers.add(elements.get(i).getOutput(protocolVersion)); } - return type.pack(new ArrayList<>(buffers)); + return type.pack(new ArrayList<>(buffers), ByteBufferAccessor.instance); } public void reset() diff --git a/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java b/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java index fd3071b1cd..65326fd01e 100644 --- a/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java @@ -29,6 +29,7 @@ import org.apache.cassandra.cql3.terms.Tuples; import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.db.filter.ColumnFilter.Builder; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.TupleType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.io.util.DataInputPlus; @@ -102,7 +103,7 @@ final class TupleSelector extends Selector { buffers.add(elements.get(i).getOutput(protocolVersion)); } - return type.pack(buffers); + return type.pack(buffers, ByteBufferAccessor.instance); } public void reset() diff --git a/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java b/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java index 6778cca964..af13ccbecd 100644 --- a/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java @@ -27,6 +27,7 @@ import java.util.Map.Entry; import com.google.common.base.Objects; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.cql3.ColumnSpecification; @@ -197,7 +198,7 @@ final class UserTypeSelector extends Selector Selector selector = fields.get(userType.fieldName(i)); buffers.add(selector == null ? null : selector.getOutput(protocolVersion)); } - return type.pack(buffers); + return type.pack(buffers, ByteBufferAccessor.instance); } public void reset() diff --git a/src/java/org/apache/cassandra/cql3/selection/VectorSelector.java b/src/java/org/apache/cassandra/cql3/selection/VectorSelector.java index f61d8d20d6..8dd66bb5d5 100644 --- a/src/java/org/apache/cassandra/cql3/selection/VectorSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/VectorSelector.java @@ -30,6 +30,7 @@ import org.apache.cassandra.cql3.terms.Lists; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.db.filter.ColumnFilter; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.ByteBufferAccessor; import org.apache.cassandra.db.marshal.VectorType; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.io.util.DataInputPlus; @@ -126,7 +127,7 @@ public class VectorSelector extends Selector for (int i = 0, m = elements.size(); i < m; i++) buffers.add(elements.get(i).getOutput(protocolVersion)); - return type.pack(buffers); + return type.pack(buffers, ByteBufferAccessor.instance); } @Override diff --git a/src/java/org/apache/cassandra/db/filter/RowFilter.java b/src/java/org/apache/cassandra/db/filter/RowFilter.java index e843fe8379..037f077a91 100644 --- a/src/java/org/apache/cassandra/db/filter/RowFilter.java +++ b/src/java/org/apache/cassandra/db/filter/RowFilter.java @@ -87,7 +87,7 @@ public class RowFilter implements Iterable private static final Logger logger = LoggerFactory.getLogger(RowFilter.class); public static final Serializer serializer = new Serializer(); - private static final RowFilter NONE = new RowFilter(Collections.emptyList(), false); + public static final RowFilter NONE = new RowFilter(Collections.emptyList(), false); protected final List expressions; diff --git a/src/java/org/apache/cassandra/db/marshal/CollectionType.java b/src/java/org/apache/cassandra/db/marshal/CollectionType.java index 3952ee137e..c54ad31e5e 100644 --- a/src/java/org/apache/cassandra/db/marshal/CollectionType.java +++ b/src/java/org/apache/cassandra/db/marshal/CollectionType.java @@ -350,15 +350,15 @@ public abstract class CollectionType extends MultiElementType } @Override - public ByteBuffer pack(List elements) + public V pack(List elements, ValueAccessor accessor) { - return getSerializer().pack(elements); + return getSerializer().pack(elements, accessor); } @Override - public List unpack(ByteBuffer input) + public List unpack(V value, ValueAccessor accessor) { - return getSerializer().unpack(input); + return getSerializer().unpack(value, accessor); } /** diff --git a/src/java/org/apache/cassandra/db/marshal/MultiElementType.java b/src/java/org/apache/cassandra/db/marshal/MultiElementType.java index d9c229c9e9..4519a43419 100644 --- a/src/java/org/apache/cassandra/db/marshal/MultiElementType.java +++ b/src/java/org/apache/cassandra/db/marshal/MultiElementType.java @@ -44,7 +44,28 @@ public abstract class MultiElementType extends AbstractType * @param elements the serialized values of the elements * @return the serialized representation of the value composed of the specified elements. */ - public abstract ByteBuffer pack(List elements); + public abstract V pack(List elements, ValueAccessor accessor); + + /** + * Returns the serialized representation of the value composed of the specified elements. + * + * @param elements the serialized values of the elements + * @return the serialized representation of the value composed of the specified elements. + */ + public ByteBuffer pack(List elements) + { + return pack(elements, ByteBufferAccessor.instance); + } + + public final ByteBuffer packBuffer(List elements) + { + return pack(elements, ByteBufferAccessor.instance); + } + + public final byte[] packArray(List elements) + { + return pack(elements, ByteArrayAccessor.instance); + } /** * Returns the serialized representation of the elements composing the specified value. @@ -52,7 +73,23 @@ public abstract class MultiElementType extends AbstractType * @param value a serialized value of this type * @return the serialized representation of the elements composing the specified value. */ - public abstract List unpack(ByteBuffer value); + /** + * Returns the serialized representation of the elements composing the specified value. + * + * @param value a serialized value of this type + * @return the serialized representation of the elements composing the specified value. + */ + public abstract List unpack(V value, ValueAccessor accessor); + + public final List unpack(byte[] value) + { + return unpack(value, ByteArrayAccessor.instance); + } + + public final List unpack(ByteBuffer value) + { + return unpack(value, ByteBufferAccessor.instance); + } /** * Checks if this type supports bind markers for its elements when the type value is provided through a literal. diff --git a/src/java/org/apache/cassandra/db/marshal/TupleType.java b/src/java/org/apache/cassandra/db/marshal/TupleType.java index ff0b943078..ede083ab39 100644 --- a/src/java/org/apache/cassandra/db/marshal/TupleType.java +++ b/src/java/org/apache/cassandra/db/marshal/TupleType.java @@ -295,11 +295,6 @@ public class TupleType extends MultiElementType } @Override - public List unpack(ByteBuffer value) - { - return unpack(value, ByteBufferAccessor.instance); - } - public List unpack(V value, ValueAccessor accessor) { int numberOfElements = size(); @@ -381,14 +376,14 @@ public class TupleType extends MultiElementType } @Override - public ByteBuffer pack(List components) + public V pack(List elements, ValueAccessor accessor) { - return pack(ByteBufferAccessor.instance, components); + return pack(accessor, elements); } public ByteBuffer pack(ByteBuffer... components) { - return pack(Arrays.asList(components)); + return pack(Arrays.asList(components), ByteBufferAccessor.instance); } @Override @@ -472,7 +467,7 @@ public class TupleType extends MultiElementType fields.add(type.fromString(fieldString)); } } - return pack(fields); + return pack(fields, ByteBufferAccessor.instance); } @Override @@ -613,7 +608,7 @@ public class TupleType extends MultiElementType for (AbstractType type : types) buffers.add(type.getMaskedValue()); - return serializer.serialize(pack(buffers)); + return serializer.serialize(pack(buffers, ByteBufferAccessor.instance)); } @Override diff --git a/src/java/org/apache/cassandra/db/marshal/UserType.java b/src/java/org/apache/cassandra/db/marshal/UserType.java index 15ab78e82a..d20da2c0ab 100644 --- a/src/java/org/apache/cassandra/db/marshal/UserType.java +++ b/src/java/org/apache/cassandra/db/marshal/UserType.java @@ -215,7 +215,7 @@ public class UserType extends TupleType implements SchemaElement while (components.size() < size()) components.add(null); - return pack(components); + return pack(components, ByteBufferAccessor.instance); } public void validateCell(Cell cell) throws MarshalException diff --git a/src/java/org/apache/cassandra/db/marshal/VectorType.java b/src/java/org/apache/cassandra/db/marshal/VectorType.java index ac4c0bfb94..e70857c5aa 100644 --- a/src/java/org/apache/cassandra/db/marshal/VectorType.java +++ b/src/java/org/apache/cassandra/db/marshal/VectorType.java @@ -137,12 +137,6 @@ public final class VectorType extends MultiElementType> return serializer; } - @Override - public List unpack(ByteBuffer buffer) - { - return unpack(buffer, ByteBufferAccessor.instance); - } - public List unpack(V buffer, ValueAccessor accessor) { return getSerializer().unpack(buffer, accessor); @@ -193,11 +187,6 @@ public final class VectorType extends MultiElementType> return buffer; } - public ByteBuffer pack(List elements) - { - return pack(elements, ByteBufferAccessor.instance); - } - public V pack(List elements, ValueAccessor accessor) { return getSerializer().pack(elements, accessor); diff --git a/src/java/org/apache/cassandra/service/accord/AccordKeyspace.java b/src/java/org/apache/cassandra/service/accord/AccordKeyspace.java index d0a593bf06..7491df1109 100644 --- a/src/java/org/apache/cassandra/service/accord/AccordKeyspace.java +++ b/src/java/org/apache/cassandra/service/accord/AccordKeyspace.java @@ -859,12 +859,12 @@ public class AccordKeyspace private static ByteBuffer serializeKey(PartitionKey key) { - return TupleType.pack(ByteBufferAccessor.instance, Arrays.asList(UUIDSerializer.instance.serialize(key.table().asUUID()), key.partitionKey().getKey())); + return KEY_TYPE.pack(UUIDSerializer.instance.serialize(key.table().asUUID()), key.partitionKey().getKey()); } private static ByteBuffer serializeTimestamp(Timestamp timestamp) { - return TupleType.pack(ByteBufferAccessor.instance, Arrays.asList(bytes(timestamp.msb), bytes(timestamp.lsb), bytes(timestamp.node.id))); + return TIMESTAMP_TYPE.pack(bytes(timestamp.msb), bytes(timestamp.lsb), bytes(timestamp.node.id)); } public interface TimestampFactory