absl::Status ModelValidator::Validate()

in backend/schema/validators/model_validator.cc [115:181]


absl::Status ModelValidator::Validate(const Model* model,
                                      SchemaValidationContext* context) {
  ZETASQL_RET_CHECK(!model->name_.empty());
  ZETASQL_RETURN_IF_ERROR(GlobalSchemaNames::ValidateSchemaName("Model", model->name_));

  if (!model->is_remote()) {
    return error::LocalModelUnsupported(model->Name());
  }

  if (model->input_.empty()) {
    return error::NoColumnsModel(model->Name(), "Input");
  }
  if (model->input_.size() > limits::kMaxColumnsPerTable) {
    return error::TooManyModelColumns(model->Name(), "Inputs",
                                      limits::kMaxColumnsPerTable);
  }
  CaseInsensitiveStringSet unique_column_names;
  for (const Model::ModelColumn& column : model->input()) {
    ZETASQL_RETURN_IF_ERROR(ValidateModelColumn(model, column));
    if (auto i = unique_column_names.insert(column.name); !i.second) {
      if (column.name != *i.first) {
        return error::ModelCaseInsensitiveDuplicateColumn(
            absl::StrCat(model->Name(), ".", column.name),
            absl::StrCat(model->Name(), ".", *i.first));
      }

      return error::ModelDuplicateColumn(
          absl::StrCat(model->Name(), ".", column.name));
    }
  }

  if (model->output_.empty()) {
    return error::NoColumnsModel(model->Name(), "Output");
  }
  if (model->output_.size() > limits::kMaxColumnsPerTable) {
    return error::TooManyModelColumns(model->Name(), "Outputs",
                                      limits::kMaxColumnsPerTable);
  }
  for (const Model::ModelColumn& column : model->output_) {
    ZETASQL_RETURN_IF_ERROR(ValidateModelColumn(model, column));
    if (auto i = unique_column_names.insert(column.name); !i.second) {
      if (column.name != *i.first) {
        return error::ModelCaseInsensitiveDuplicateColumn(
            absl::StrCat(model->Name(), ".", column.name),
            absl::StrCat(model->Name(), ".", *i.first));
      }

      return error::ModelDuplicateColumn(
          absl::StrCat(model->Name(), ".", column.name));
    }
  }
  if (!model->endpoint_.has_value() && model->endpoints_.empty()) {
    return error::NoModelEndpoint(model->Name());
  }
  if (model->endpoint_.has_value() && !model->endpoints_.empty()) {
    return error::AmbiguousModelEndpoint(model->Name());
  }
  if (model->default_batch_size_.has_value()) {
    if (*model->default_batch_size_ <= 0 ||
        *model->default_batch_size_ > limits::kMaxModelDefaultBatchSize) {
      return error::InvalidModelDefaultBatchSize(
          model->Name(), *model->default_batch_size_,
          limits::kMaxModelDefaultBatchSize);
    }
  }
  return absl::OkStatus();
}