dcapwell commented on code in PR #2310: URL: https://github.com/apache/cassandra/pull/2310#discussion_r1228365357
########## src/java/org/apache/cassandra/cql3/Vectors.java: ########## @@ -0,0 +1,231 @@ +/* + * 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; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.cassandra.cql3.functions.Function; +import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.db.marshal.VectorType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.transport.ProtocolVersion; +import org.apache.cassandra.utils.ByteBufferUtil; + +public class Vectors +{ + private Vectors() {} + + private static AbstractType<?> elementsType(AbstractType<?> type) + { + return ((VectorType<?>) type.unwrap()).getElementsType(); + } + + private static ColumnSpecification valueSpecOf(ColumnSpecification column) + { + return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), elementsType(column.type)); + } + + /** + * Tests that the list with the specified elements can be assigned to the specified column. + * + * @param receiver the receiving column + * @param elements the list elements + */ + public static AssignmentTestable.TestResult testVectorAssignment(ColumnSpecification receiver, + List<? extends AssignmentTestable> elements) + { + if (!(receiver.type instanceof VectorType)) + return AssignmentTestable.TestResult.NOT_ASSIGNABLE; + + // If there is no elements, we can't say it's an exact match (an empty list if fundamentally polymorphic). + if (elements.isEmpty()) + return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE; + + ColumnSpecification valueSpec = valueSpecOf(receiver); + return AssignmentTestable.TestResult.testAll(receiver.ksName, valueSpec, elements); + } + + /** + * Returns the exact ListType from the items if it can be known. + * + * @param items the items mapped to the list elements + * @param mapper the mapper used to retrieve the element types from the items + * @return the exact ListType from the items if it can be known or <code>null</code> + */ + public static <T> VectorType<?> getExactListTypeIfKnown(List<T> items, + java.util.function.Function<T, AbstractType<?>> mapper) + { + // TODO - this doesn't feel right... if you are dealing with a literal then the value is `null`, so we will ignore + // if there are multiple times, we randomly select the first? This logic matches Lists.getExactListTypeIfKnown but feels flawed + Optional<AbstractType<?>> type = items.stream().map(mapper).filter(Objects::nonNull).findFirst(); + return type.isPresent() ? VectorType.getInstance(type.get(), items.size()) : null; + } + + public static <T> VectorType<?> getPreferredCompatibleType(List<T> items, + java.util.function.Function<T, AbstractType<?>> mapper) + { + // TODO - this doesn't feel right... if you are dealing with a literal then the value is `null`, so we will ignore + // if there are multiple times, we randomly select the first? This logic matches Lists.getExactListTypeIfKnown but feels flawed Review Comment: yeah, for `getCompatibleTypeIfKnown` that is true, my comment was copy/paste from my comment in `getExactListTypeIfKnown`... the comment isn't valid for `getCompatibleTypeIfKnown` -- 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]

