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]

Reply via email to