Example #1
0
  private static AssignmentTestable.TestResult matchAguments(
      String keyspace,
      Function fun,
      List<? extends AssignmentTestable> providedArgs,
      String receiverKs,
      String receiverCf) {
    if (providedArgs.size() != fun.argTypes().size())
      return AssignmentTestable.TestResult.NOT_ASSIGNABLE;

    // It's an exact match if all are exact match, but is not assignable as soon as any is non
    // assignable.
    AssignmentTestable.TestResult res = AssignmentTestable.TestResult.EXACT_MATCH;
    for (int i = 0; i < providedArgs.size(); i++) {
      AssignmentTestable provided = providedArgs.get(i);
      if (provided == null) {
        res = AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE;
        continue;
      }

      ColumnSpecification expected = makeArgSpec(receiverKs, receiverCf, fun, i);
      AssignmentTestable.TestResult argRes = provided.testAssignment(keyspace, expected);
      if (argRes == AssignmentTestable.TestResult.NOT_ASSIGNABLE)
        return AssignmentTestable.TestResult.NOT_ASSIGNABLE;
      if (argRes == AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE)
        res = AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE;
    }
    return res;
  }
Example #2
0
  // This method and matchArguments are somewhat duplicate, but this method allows us to provide
  // more precise errors in the common
  // case where there is no override for a given function. This is thus probably worth the minor
  // code duplication.
  private static void validateTypes(
      String keyspace,
      Function fun,
      List<? extends AssignmentTestable> providedArgs,
      String receiverKs,
      String receiverCf)
      throws InvalidRequestException {
    if (providedArgs.size() != fun.argTypes().size())
      throw new InvalidRequestException(
          String.format(
              "Invalid number of arguments in call to function %s: %d required but %d provided",
              fun.name(), fun.argTypes().size(), providedArgs.size()));

    for (int i = 0; i < providedArgs.size(); i++) {
      AssignmentTestable provided = providedArgs.get(i);

      // If the concrete argument is a bind variables, it can have any type.
      // We'll validate the actually provided value at execution time.
      if (provided == null) continue;

      ColumnSpecification expected = makeArgSpec(receiverKs, receiverCf, fun, i);
      if (!provided.testAssignment(keyspace, expected).isAssignable())
        throw new InvalidRequestException(
            String.format(
                "Type error: %s cannot be passed as argument %d of function %s of type %s",
                provided, i, fun.name(), expected.type.asCQL3Type()));
    }
  }