Changeset: 83776691406c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=83776691406c Added Files: java/embedded/src/main/java/org/monetdb/embedded/result/column/DoubleColumn.java java/embedded/src/main/java/org/monetdb/embedded/result/column/FloatColumn.java java/embedded/src/main/java/org/monetdb/embedded/result/column/LongColumn.java java/embedded/src/main/java/org/monetdb/embedded/result/column/ShortColumn.java java/embedded/src/main/java/org/monetdb/embedded/result/column/StringColumn.java Modified Files: java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c java/embedded/src/main/java/org/monetdb/embedded/result/column/IntegerColumn.java java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java Branch: embedded-java Log Message:
Add inital support for handling short, int, float, long, double and string diffs (truncated from 545 to 300 lines): diff --git a/java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c b/java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c --- a/java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c +++ b/java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c @@ -11,15 +11,52 @@ #include "monetdb_config.h" #include "res_table.h" +#include "mal_type.h" -JNIEXPORT jobject JNICALL Java_org_monetdb_embedded_result_EmbeddedQueryResult_getColumnWrapper -(JNIEnv *env, jobject object, jlong resultTablePointer, jint columnIndex) { - (void)object; - // The result table - res_table* result = (res_table *)resultTablePointer; - // Get the column we need - res_col col = result->cols[columnIndex]; - BAT* b = BATdescriptor(col.b); +static jobject getShortColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jshortArray values = (*env)->NewShortArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/ShortColumn"); + // from Java ShortColumn(short[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([SI[Z)V"); + + int i = 0; + short val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (short) ((short*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((short*) Tloc(b, BUNfirst(b)))[i]; + if (v == sht_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (short)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetShortArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java ShortColumn(short[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +static jobject getIntegerColumn(JNIEnv *env, BAT *b) { int size = BATcount(b); // The values and nulls arrays jintArray values = (*env)->NewIntArray(env, size); @@ -42,7 +79,7 @@ JNIEXPORT jobject JNICALL Java_org_monet else { for (i = 0; i < size; i++) { int v = ((int*) Tloc(b, BUNfirst(b)))[i]; - if (v == INT_MIN) { + if (v == int_nil) { val_tmp[i] = 0; nul_tmp[i] = true; } else { @@ -62,6 +99,216 @@ JNIEXPORT jobject JNICALL Java_org_monet return column; } +static jobject getLongColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jlongArray values = (*env)->NewLongArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/LongColumn"); + // from Java LongColumn(long[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([JI[Z)V"); + + int i = 0; + long val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (long) ((long*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((long*) Tloc(b, BUNfirst(b)))[i]; + if (v == lng_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (long)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetLongArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java LongColumn(long[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +static jobject getFloatColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jfloatArray values = (*env)->NewFloatArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/FloatColumn"); + // from Java FloatColumn(float[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([FI[Z)V"); + + int i = 0; + float val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (float) ((float*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((float*) Tloc(b, BUNfirst(b)))[i]; + if (v == flt_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (float)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetFloatArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java FloatColumn(float[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +static jobject getDoubleColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jdoubleArray values = (*env)->NewDoubleArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/DoubleColumn"); + // from Java DoubleColumn(double[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([DI[Z)V"); + + int i = 0; + double val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (double) ((double*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((double*) Tloc(b, BUNfirst(b)))[i]; + if (v == dbl_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (double)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetDoubleArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java DoubleColumn(double[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +static jobject getStringColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jclass stringClass = (*env)->FindClass(env, "java/lang/String"); + jobjectArray values = (*env)->NewObjectArray(env, size, stringClass, 0); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/StringColumn"); + // from Java StringColumn(String[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([Ljava/lang/String;I[Z)V"); + + BUN p = 0, q = 0, j = 0; + BATiter li; + li = bat_iterator(b); + + if (b->T->nonil && !b->T->nil) { + BATloop(b, p, q) { + (*env)->SetObjectArrayElement(env, values, j++, (*env)->NewStringUTF(env, (const char *) BUNtail(li, p))); + } + } + else { + BATloop(b, p, q) { + const char *t = (const char *) BUNtail(li, p); + if (ATOMcmp(TYPE_str, t, str_nil) == 0) { + (*env)->SetObjectArrayElement(env, values, j++, (*env)->NewStringUTF(env, "")); + } else { + (*env)->SetObjectArrayElement(env, values, j, (*env)->NewStringUTF(env, t)); + } + j++; + } + } + + // Create the column object + // from Java StringColumn(String[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +JNIEXPORT jobject JNICALL Java_org_monetdb_embedded_result_EmbeddedQueryResult_getColumnWrapper +(JNIEnv *env, jobject object, jlong resultTablePointer, jint columnIndex) { + (void)object; + // The result table + res_table* result = (res_table *)resultTablePointer; + // Get the column we need + res_col col = result->cols[columnIndex]; + BAT* b = BATdescriptor(col.b); + + switch (ATOMstorage(getColumnType(b->T->type))) { + case TYPE_sht: + return getShortColumn(env, b); + break; + case TYPE_int: + return getIntegerColumn(env, b); + break; + case TYPE_lng: + return getLongColumn(env, b); + break; + case TYPE_flt: + return getFloatColumn(env, b); + break; + case TYPE_dbl: + return getDoubleColumn(env, b); + break; + case TYPE_str: + return getStringColumn(env, b); + break; +#ifdef HAVE_HGE + case TYPE_hge: + // TODO: support + return NULL; + break; +#endif + default: + // TODO: support + return NULL; + } + +} + JNIEXPORT void JNICALL Java_org_monetdb_embedded_result_EmbeddedQueryResult_cleanupResult (JNIEnv *env, jobject object, jlong resultTablePointer) { (void)object; diff --git a/java/embedded/src/main/java/org/monetdb/embedded/result/column/DoubleColumn.java b/java/embedded/src/main/java/org/monetdb/embedded/result/column/DoubleColumn.java new file mode 100644 --- /dev/null +++ b/java/embedded/src/main/java/org/monetdb/embedded/result/column/DoubleColumn.java @@ -0,0 +1,30 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list