jmckenzie-dev commented on code in PR #3562:
URL: https://github.com/apache/cassandra/pull/3562#discussion_r1920450230


##########
src/java/org/apache/cassandra/cql3/constraints/FunctionColumnConstraint.java:
##########
@@ -0,0 +1,164 @@
+/*
+ * 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.constraints;
+
+import java.io.IOException;
+
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.cql3.CqlBuilder;
+import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.ColumnMetadata;
+
+public class FunctionColumnConstraint implements 
ColumnConstraint<FunctionColumnConstraint>
+{
+    public static final Serializer serializer = new Serializer();
+
+    public final ConstraintFunction function;
+    public final ColumnIdentifier columnName;
+    public final Operator relationType;
+    public final String term;
+
+    public final static class Raw
+    {
+        public final ConstraintFunction function;
+        public final ColumnIdentifier columnName;
+        public final Operator relationType;
+        public final String term;
+
+        public Raw(ColumnIdentifier functionName, ColumnIdentifier columnName, 
Operator relationType, String term)
+        {
+            this.relationType = relationType;
+            this.columnName = columnName;
+            this.term = term;
+            function = createConstraintFunction(functionName.toCQLString(), 
columnName);
+        }
+
+        public FunctionColumnConstraint prepare()
+        {
+            return new FunctionColumnConstraint(function, columnName, 
relationType, term);
+        }
+    }
+
+    private static ConstraintFunction createConstraintFunction(String 
functionName, ColumnIdentifier columnName)
+    {
+        if (LengthConstraint.FUNCTION_NAME.equalsIgnoreCase(functionName))
+            return new LengthConstraint(columnName);
+        throw new InvalidConstraintDefinitionException("Unrecognized 
constraint function: " + functionName);
+    }
+
+    private FunctionColumnConstraint(ConstraintFunction function, 
ColumnIdentifier columnName, Operator relationType, String term)
+    {
+        this.function = function;
+        this.columnName = columnName;
+        this.relationType = relationType;
+        this.term = term;
+    }
+
+    @Override
+    public void appendCqlTo(CqlBuilder builder)
+    {
+        builder.append(toString());
+    }
+
+    @Override
+    public IVersionedSerializer<FunctionColumnConstraint> serializer()
+    {
+        return serializer;
+    }
+
+    @Override
+    public void evaluate(Class<? extends AbstractType> valueType, Object 
columnValue)
+    {
+        function.evaluate(valueType, relationType, term, columnValue);
+    }
+
+    @Override
+    public void validate(ColumnMetadata columnMetadata)
+    {
+        validateArgs(columnMetadata);
+        function.validate(columnMetadata);
+    }
+
+    @Override
+    public ConstraintType getConstraintType()
+    {
+        return ConstraintType.FUNCTION;
+    }
+
+    void validateArgs(ColumnMetadata columnMetadata)
+    {
+        if (!columnMetadata.name.equals(columnName))
+            throw new InvalidConstraintDefinitionException("Function parameter 
should be the column name");
+    }
+
+    @Override
+    public String toString()
+    {
+        return function.getName() + "(" + columnName + ") " + relationType + " 
" + term;
+    }
+
+    public static class Serializer implements 
IVersionedSerializer<FunctionColumnConstraint>
+    {
+        @Override
+        public void serialize(FunctionColumnConstraint columnConstraint, 
DataOutputPlus out, int version) throws IOException
+        {
+            out.writeUTF(columnConstraint.function.getName());
+            out.writeUTF(columnConstraint.columnName.toCQLString());
+            out.writeUTF(columnConstraint.relationType.toString());
+            out.writeUTF(columnConstraint.term);
+        }
+
+        @Override
+        public FunctionColumnConstraint deserialize(DataInputPlus in, int 
version) throws IOException
+        {
+            String functionName = in.readUTF();
+            ConstraintFunction function;
+            String columnNameString = in.readUTF();
+            ColumnIdentifier columnName = new 
ColumnIdentifier(columnNameString, true);
+            try
+            {
+                function = createConstraintFunction(functionName, columnName);
+            }
+            catch (Exception e)
+            {
+                throw new IOException(e);
+            }
+            String relationTypeString = in.readUTF();
+            Operator relationType = Operator.valueOf(relationTypeString);
+            final String term = in.readUTF();
+            return new FunctionColumnConstraint(function, columnName, 
relationType, term);
+        }
+
+        @Override
+        public long serializedSize(FunctionColumnConstraint columnConstraint, 
int version)
+        {
+            FunctionColumnConstraint condition = columnConstraint;

Review Comment:
   Can remove redundant aliased variable here and just use `columnConstraint` 
directly.



-- 
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