bereng commented on code in PR #2436: URL: https://github.com/apache/cassandra/pull/2436#discussion_r1257850291
########## src/java/org/apache/cassandra/cql3/functions/types/VectorCodec.java: ########## @@ -0,0 +1,211 @@ +/* + * 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.cql3.functions.types; + +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.List; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; + +import org.apache.cassandra.cql3.functions.types.exceptions.InvalidTypeException; +import org.apache.cassandra.transport.ProtocolVersion; +import org.apache.cassandra.utils.vint.VIntCoding; + +/** + * {@link TypeCodec} for the CQL type {@code vector}. Vectors are represented as {@link List}s for convenience, since + * it's probably easier for UDFs trying to return a newly created vector to create it as a standard Java list, rather + * than using a custom, not-standard vector class. + * + * @param <E> The type of the vector elements. + */ +public abstract class VectorCodec<E> extends TypeCodec<List<E>> +{ + protected final VectorType type; + protected final TypeCodec<E> subtypeCodec; + + private VectorCodec(VectorType type, TypeCodec<E> subtypeCodec) + { + super(type, TypeTokens.vectorOf(subtypeCodec.getJavaType())); + this.type = type; + this.subtypeCodec = subtypeCodec; + } + + public static <E> VectorCodec<E> of(VectorType type, TypeCodec<E> subtypeCodec) + { + return subtypeCodec.isValueLengthFixed() + ? new FixedLength<>(type, subtypeCodec) + : new VariableLength<>(type, subtypeCodec); + } + + @Override + public List<E> parse(String value) throws InvalidTypeException + { + if (value == null || value.isEmpty() || value.equalsIgnoreCase("NULL")) return null; + + ImmutableList.Builder<E> values = ImmutableList.builder(); + for (String element : Splitter.on(", ").split(value.substring(1, value.length() - 1))) + { + values.add(subtypeCodec.parse(element)); + } + + return values.build(); + } + + @Override + public String format(List<E> value) throws InvalidTypeException + { + return value == null ? "NULL" : Iterables.toString(value); + } + + /** + * {@link VectorCodec} for vectors of elements using a fixed-length encoding. + */ + private static class FixedLength<E> extends VectorCodec<E> + { + public FixedLength(VectorType type, TypeCodec<E> subtypeCodec) + { + super(type, subtypeCodec); + } + + @Override + public boolean isValueLengthFixed() + { + return true; + } + + @Override + public ByteBuffer serialize(List<E> value, ProtocolVersion protocolVersion) throws InvalidTypeException + { + if (value == null || type.getDimensions() <= 0) Review Comment: Given you know in advance the number of elements and their sizes can't you collapse both loops into a single one? Similar to what you do in deserialize? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

