| 649 | } |
| 650 | |
| 651 | JNIEXPORT jint JNICALL |
| 652 | Java_com_cactus_CactusJNI_nativeIndexAdd(JNIEnv* env, jobject, jlong handle, |
| 653 | jintArray ids, jobjectArray documents, |
| 654 | jobjectArray metadatas, jobjectArray embeddings, |
| 655 | jlong embeddingDim) { |
| 656 | if (handle == 0) return -1; |
| 657 | |
| 658 | jsize count = env->GetArrayLength(ids); |
| 659 | jint* idData = env->GetIntArrayElements(ids, nullptr); |
| 660 | |
| 661 | std::vector<const char*> docPtrs(count); |
| 662 | std::vector<const char*> metaPtrs(count); |
| 663 | std::vector<const float*> embPtrs(count); |
| 664 | std::vector<jstring> docStrings(count); |
| 665 | std::vector<jstring> metaStrings(count); |
| 666 | std::vector<jfloatArray> embArrays(count); |
| 667 | |
| 668 | for (jsize i = 0; i < count; i++) { |
| 669 | docStrings[i] = static_cast<jstring>(env->GetObjectArrayElement(documents, i)); |
| 670 | docPtrs[i] = jstring_to_cstr(env, docStrings[i]); |
| 671 | |
| 672 | if (metadatas != nullptr) { |
| 673 | metaStrings[i] = static_cast<jstring>(env->GetObjectArrayElement(metadatas, i)); |
| 674 | metaPtrs[i] = jstring_to_cstr(env, metaStrings[i]); |
| 675 | } else { |
| 676 | metaPtrs[i] = nullptr; |
| 677 | } |
| 678 | |
| 679 | embArrays[i] = static_cast<jfloatArray>(env->GetObjectArrayElement(embeddings, i)); |
| 680 | embPtrs[i] = env->GetFloatArrayElements(embArrays[i], nullptr); |
| 681 | } |
| 682 | |
| 683 | int result = cactus_index_add( |
| 684 | reinterpret_cast<cactus_index_t>(handle), |
| 685 | reinterpret_cast<const int*>(idData), |
| 686 | docPtrs.data(), |
| 687 | metadatas != nullptr ? metaPtrs.data() : nullptr, |
| 688 | embPtrs.data(), |
| 689 | static_cast<size_t>(count), |
| 690 | static_cast<size_t>(embeddingDim) |
| 691 | ); |
| 692 | |
| 693 | for (jsize i = 0; i < count; i++) { |
| 694 | release_jstring(env, docStrings[i], docPtrs[i]); |
| 695 | if (metadatas != nullptr) { |
| 696 | release_jstring(env, metaStrings[i], metaPtrs[i]); |
| 697 | } |
| 698 | env->ReleaseFloatArrayElements(embArrays[i], const_cast<jfloat*>(embPtrs[i]), JNI_ABORT); |
| 699 | } |
| 700 | |
| 701 | env->ReleaseIntArrayElements(ids, idData, JNI_ABORT); |
| 702 | if (result < 0) { throwOnError(env); return -1; } |
| 703 | return result; |
| 704 | } |
| 705 | |
| 706 | JNIEXPORT jint JNICALL |
| 707 | Java_com_cactus_CactusJNI_nativeIndexDelete(JNIEnv* env, jobject, jlong handle, jintArray ids) { |
nothing calls this directly
no test coverage detected