Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions duckdb_java.def
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1begin_1row
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1close
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1end_1row
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1flush
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1register
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1stream
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1connect
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1appender
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1db_1ref
Expand Down
2 changes: 0 additions & 2 deletions duckdb_java.exp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ _Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1begin_1row
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1close
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1end_1row
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1flush
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1register
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1stream
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1connect
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1appender
_Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1db_1ref
Expand Down
2 changes: 0 additions & 2 deletions duckdb_java.map
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ DUCKDB_JAVA {
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1close;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1end_1row;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1appender_1flush;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1register;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1stream;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1connect;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1appender;
Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1db_1ref;
Expand Down
108 changes: 55 additions & 53 deletions src/jni/duckdb_java.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ extern "C" {
#include "config.hpp"
#include "duckdb.hpp"
#include "duckdb/catalog/catalog_search_path.hpp"
#include "duckdb/common/arrow/result_arrow_wrapper.hpp"
#include "duckdb/common/arrow/arrow_format.hpp"
#include "duckdb/common/operator/cast_operators.hpp"
#include "duckdb/common/shared_ptr.hpp"
#include "duckdb/common/vector/array_vector.hpp"
Expand Down Expand Up @@ -322,8 +322,8 @@ static duckdb::unique_ptr<QueryResult> execute_prepared_statement(JNIEnv *env, j
return res;
}

duckdb::unique_ptr<QueryResultStream> complete_query_streaming(JNIEnv *env, duckdb::unique_ptr<QueryResult> pending) {
auto stream = make_uniq<QueryResultStream>(std::move(pending));
duckdb::unique_ptr<QueryResultStream<>> complete_query_streaming(JNIEnv *env, duckdb::unique_ptr<QueryResult> pending) {
auto stream = make_uniq<QueryResultStream<>>(std::move(pending));
while (!duckdb::IsObservable(stream->ExecuteTask())) {
if (stream->HasError()) {
throw_execution_java_error(env, stream.get());
Expand Down Expand Up @@ -1041,69 +1041,71 @@ void _duckdb_jdbc_appender_append_null(JNIEnv *env, jclass, jobject appender_ref
get_appender(env, appender_ref_buf)->Append<std::nullptr_t>(nullptr);
}

/* TODO: ArrowFormat
jlong _duckdb_jdbc_arrow_stream(JNIEnv *env, jclass, jobject res_ref_buf, jlong batch_size) {
if (!res_ref_buf) {
throw InvalidInputException("Invalid result set");
}
auto res_ref = (ResultHolder *)env->GetDirectBufferAddress(res_ref_buf);
if (!res_ref || !res_ref->res || res_ref->res->HasError()) {
throw InvalidInputException("Invalid result set");
}

auto wrapper = new ResultArrowArrayStreamWrapper(std::move(res_ref->res), batch_size);
return (jlong)&wrapper->stream;
if (!res_ref_buf) {
throw InvalidInputException("Invalid result set");
}
auto res_ref = (ResultHolder *)env->GetDirectBufferAddress(res_ref_buf);
if (!res_ref || !res_ref->res || res_ref->res->HasError()) {
throw InvalidInputException("Invalid result set");
}

auto wrapper = new ResultArrowArrayStreamWrapper(std::move(res_ref->res), batch_size);
return (jlong)&wrapper->stream;
}

class JavaArrowTabularStreamFactory {
public:
JavaArrowTabularStreamFactory(ArrowArrayStream *stream_ptr_p) : stream_ptr(stream_ptr_p) {};

static duckdb::unique_ptr<ArrowArrayStreamWrapper> Produce(uintptr_t factory_p, ArrowStreamParameters &parameters) {

auto factory = (JavaArrowTabularStreamFactory *)factory_p;
if (!factory->stream_ptr->release) {
throw InvalidInputException("This stream has been released");
}
auto res = make_uniq<ArrowArrayStreamWrapper>();
res->arrow_array_stream = *factory->stream_ptr;
factory->stream_ptr->release = nullptr;
return res;
}

static void GetSchema(uintptr_t factory_p, ArrowSchemaWrapper &schema) {
auto factory = (JavaArrowTabularStreamFactory *)factory_p;
auto stream_ptr = factory->stream_ptr;
if (!stream_ptr->release) {
throw InvalidInputException("This stream has been released");
}
stream_ptr->get_schema(stream_ptr, &schema.arrow_schema);
auto error = stream_ptr->get_last_error(stream_ptr);
if (error != nullptr) {
throw InvalidInputException(error);
}
}

ArrowArrayStream *stream_ptr;
JavaArrowTabularStreamFactory(ArrowArrayStream *stream_ptr_p) : stream_ptr(stream_ptr_p) {};

static duckdb::unique_ptr<ArrowArrayStreamWrapper> Produce(uintptr_t factory_p, ArrowStreamParameters &parameters) {

auto factory = (JavaArrowTabularStreamFactory *)factory_p;
if (!factory->stream_ptr->release) {
throw InvalidInputException("This stream has been released");
}
auto res = make_uniq<ArrowArrayStreamWrapper>();
res->arrow_array_stream = *factory->stream_ptr;
factory->stream_ptr->release = nullptr;
return res;
}

static void GetSchema(uintptr_t factory_p, ArrowSchemaWrapper &schema) {
auto factory = (JavaArrowTabularStreamFactory *)factory_p;
auto stream_ptr = factory->stream_ptr;
if (!stream_ptr->release) {
throw InvalidInputException("This stream has been released");
}
stream_ptr->get_schema(stream_ptr, &schema.arrow_schema);
auto error = stream_ptr->get_last_error(stream_ptr);
if (error != nullptr) {
throw InvalidInputException(error);
}
}

ArrowArrayStream *stream_ptr;
};

void _duckdb_jdbc_arrow_register(JNIEnv *env, jclass, jobject conn_ref_buf, jlong arrow_array_stream_pointer,
jbyteArray name_j) {

auto conn = get_connection(env, conn_ref_buf);
if (conn == nullptr) {
return;
}
auto name = jbyteArray_to_string(env, name_j);
auto conn = get_connection(env, conn_ref_buf);
if (conn == nullptr) {
return;
}
auto name = jbyteArray_to_string(env, name_j);

auto arrow_array_stream = (ArrowArrayStream *)(uintptr_t)arrow_array_stream_pointer;
auto arrow_array_stream = (ArrowArrayStream *)(uintptr_t)arrow_array_stream_pointer;

auto factory = new JavaArrowTabularStreamFactory(arrow_array_stream);
duckdb::vector<Value> parameters;
parameters.push_back(Value::POINTER((uintptr_t)factory));
parameters.push_back(Value::POINTER((uintptr_t)JavaArrowTabularStreamFactory::Produce));
parameters.push_back(Value::POINTER((uintptr_t)JavaArrowTabularStreamFactory::GetSchema));
conn->TableFunction("arrow_scan_dumb", parameters)->CreateView(Identifier(name), true, true);
auto factory = new JavaArrowTabularStreamFactory(arrow_array_stream);
duckdb::vector<Value> parameters;
parameters.push_back(Value::POINTER((uintptr_t)factory));
parameters.push_back(Value::POINTER((uintptr_t)JavaArrowTabularStreamFactory::Produce));
parameters.push_back(Value::POINTER((uintptr_t)JavaArrowTabularStreamFactory::GetSchema));
conn->TableFunction("arrow_scan_dumb", parameters)->CreateView(Identifier(name), true, true);
}
*/

static ProfilerPrintFormat GetProfilerPrintFormat(JNIEnv *env, jobject format) {
jobject jname = env->CallObjectMethod(format, J_ProfilerPrintFormat_getName);
Expand Down
2 changes: 2 additions & 0 deletions src/jni/functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ JNIEXPORT jint JNICALL Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1fetch_1size(JN
}
}

/*
JNIEXPORT jlong JNICALL Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1stream(JNIEnv * env, jclass param0, jobject param1, jlong param2) {
try {
return _duckdb_jdbc_arrow_stream(env, param0, param1, param2);
Expand All @@ -291,6 +292,7 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1arrow_1registe

}
}
*/

JNIEXPORT jobject JNICALL Java_org_duckdb_DuckDBNative_duckdb_1jdbc_1create_1appender(JNIEnv * env, jclass param0, jobject param1, jbyteArray param2, jbyteArray param3) {
try {
Expand Down
2 changes: 1 addition & 1 deletion src/jni/holders.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ struct PendingHolder {

struct ResultHolder {
duckdb::unique_ptr<duckdb::QueryResult> res;
duckdb::unique_ptr<duckdb::QueryResultStream> stream;
duckdb::unique_ptr<duckdb::QueryResultStream<>> stream;
duckdb::unique_ptr<duckdb::DataChunk> chunk;
};

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/org/duckdb/DuckDBConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,8 @@ private static long getArrowStreamAddress(Object arrow_array_stream) {
}

public void registerArrowStream(String name, Object arrow_array_stream) {
throw new RuntimeException(new SQLFeatureNotSupportedException("registerArrowStream"));
/*
try {
checkOpen();
long array_stream_address = getArrowStreamAddress(arrow_array_stream);
Expand All @@ -572,6 +574,7 @@ public void registerArrowStream(String name, Object arrow_array_stream) {
} catch (SQLException e) {
throw new RuntimeException(e);
}
*/
}

public String getProfilingInformation(ProfilerPrintFormat format) throws SQLException {
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/org/duckdb/DuckDBNative.java
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,12 @@ static native String[] duckdb_jdbc_cast_result_to_strings(ByteBuffer res_ref, By

static native int duckdb_jdbc_fetch_size();

static native long duckdb_jdbc_arrow_stream(ByteBuffer res_ref, long batch_size);
/*
static native long duckdb_jdbc_arrow_stream(ByteBuffer res_ref, long batch_size);

static native void duckdb_jdbc_arrow_register(ByteBuffer conn_ref, long arrow_array_stream_pointer, byte[] name);
static native void duckdb_jdbc_arrow_register(ByteBuffer conn_ref, long arrow_array_stream_pointer, byte[]
name);
*/

static native ByteBuffer duckdb_jdbc_create_appender(ByteBuffer conn_ref, byte[] schema_name, byte[] table_name)
throws SQLException;
Expand Down
34 changes: 18 additions & 16 deletions src/main/java/org/duckdb/DuckDBResultSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,24 +134,26 @@ public synchronized Object arrowExportStream(Object arrow_buffer_allocator, long
throws SQLException {
checkOpen();

try {
Class<?> buffer_allocator_class = Class.forName("org.apache.arrow.memory.BufferAllocator");
if (!buffer_allocator_class.isInstance(arrow_buffer_allocator)) {
throw new RuntimeException("Need to pass an Arrow BufferAllocator");
}
Long stream_pointer = DuckDBNative.duckdb_jdbc_arrow_stream(resultRef, arrow_batch_size);
Class<?> arrow_array_stream_class = Class.forName("org.apache.arrow.c.ArrowArrayStream");
Object arrow_array_stream =
arrow_array_stream_class.getMethod("wrap", long.class).invoke(null, stream_pointer);
throw new SQLFeatureNotSupportedException("arrowExportStream");
/*
try {
Class<?> buffer_allocator_class = Class.forName("org.apache.arrow.memory.BufferAllocator");
if (!buffer_allocator_class.isInstance(arrow_buffer_allocator)) {
throw new RuntimeException("Need to pass an Arrow BufferAllocator");
}
Long stream_pointer = DuckDBNative.duckdb_jdbc_arrow_stream(resultRef, arrow_batch_size);
Class<?> arrow_array_stream_class = Class.forName("org.apache.arrow.c.ArrowArrayStream");
Object arrow_array_stream =
arrow_array_stream_class.getMethod("wrap", long.class).invoke(null, stream_pointer);

Class<?> c_data_class = Class.forName("org.apache.arrow.c.Data");
Class<?> c_data_class = Class.forName("org.apache.arrow.c.Data");

return c_data_class.getMethod("importArrayStream", buffer_allocator_class, arrow_array_stream_class)
.invoke(null, arrow_buffer_allocator, arrow_array_stream);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException |
ClassNotFoundException e) {
throw new RuntimeException(e);
}
return c_data_class.getMethod("importArrayStream", buffer_allocator_class, arrow_array_stream_class)
.invoke(null, arrow_buffer_allocator, arrow_array_stream);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException
| ClassNotFoundException e) { throw new RuntimeException(e);
}
*/
}

public Object getObject(int columnIndex) throws SQLException {
Expand Down
Loading