void Java_com_spotify_voyager_jni_Index_nativeLoadFromFileWithParameters()

in java/com_spotify_voyager_jni_Index.cpp [793:856]


void Java_com_spotify_voyager_jni_Index_nativeLoadFromFileWithParameters(
    JNIEnv *env, jobject self, jstring filename, jobject spaceType,
    jint numDimensions, jobject storageDataType) {
  try {
    auto inputStream =
        std::make_shared<FileInputStream>(toString(env, filename));
    std::unique_ptr<voyager::Metadata::V1> metadata =
        voyager::Metadata::loadFromStream(inputStream);

    if (metadata) {
      if (metadata->getStorageDataType() !=
          toStorageDataType(env, storageDataType)) {
        throw std::domain_error(
            "Provided storage data type (" +
            toString(toStorageDataType(env, storageDataType)) +
            ") does not match the data type used in this file (" +
            toString(metadata->getStorageDataType()) + ").");
      }
      if (metadata->getSpaceType() != toSpaceType(env, spaceType)) {
        throw std::domain_error(
            "Provided space type (" + toString(toSpaceType(env, spaceType)) +
            ") does not match the space type used in this file (" +
            toString(metadata->getSpaceType()) + ").");
      }
      if (metadata->getNumDimensions() != numDimensions) {
        throw std::domain_error(
            "Provided number of dimensions (" + std::to_string(numDimensions) +
            ") does not match the number of dimensions used in this file (" +
            std::to_string(metadata->getNumDimensions()) + ").");
      }

      setHandle<Index>(
          env, self,
          loadTypedIndexFromMetadata(std::move(metadata), inputStream)
              .release());
      return;
    }

    switch (toStorageDataType(env, storageDataType)) {
    case StorageDataType::Float32:
      setHandle<Index>(env, self,
                       new TypedIndex<float>(inputStream,
                                             toSpaceType(env, spaceType),
                                             numDimensions));
      break;
    case StorageDataType::Float8:
      setHandle<Index>(
          env, self,
          new TypedIndex<float, int8_t, std::ratio<1, 127>>(
              inputStream, toSpaceType(env, spaceType), numDimensions));
      break;
    case StorageDataType::E4M3:
      setHandle<Index>(env, self,
                       new TypedIndex<float, E4M3>(inputStream,
                                                   toSpaceType(env, spaceType),
                                                   numDimensions));
      break;
    }
  } catch (std::exception const &e) {
    if (!env->ExceptionCheck()) {
      env->ThrowNew(env->FindClass("java/lang/RuntimeException"), e.what());
    }
  }
}