Changeset: ba176cc66155 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ba176cc66155 Added Files: java/embedded/src/main/java/org/monetdb/embedded/result/column/BooleanColumn.java java/embedded/src/main/java/org/monetdb/embedded/result/column/ByteColumn.java Modified Files: java/embedded/org_monetdb_embedded_MonetDBEmbedded.c java/embedded/org_monetdb_embedded_result_EmbeddedQueryResult.c java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java Branch: embedded-java Log Message:
Add initial support for byte and boolean types as well diffs (truncated from 363 to 300 lines): diff --git a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c --- a/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c +++ b/java/embedded/org_monetdb_embedded_MonetDBEmbedded.c @@ -102,6 +102,12 @@ JNIEXPORT jobject JNICALL Java_org_monet char *type; switch (ATOMstorage(getColumnType(b->T->type))) { + case TYPE_bit: + type = "boolean"; + break; + case TYPE_bte: + type = "byte"; + break; case TYPE_sht: type = "short"; break; 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 @@ -13,6 +13,92 @@ #include "res_table.h" #include "mal_type.h" +static jobject getBooleanColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jbooleanArray values = (*env)->NewBooleanArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/BooleanColumn"); + // from Java BooleanColumn(boolean[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([ZI[Z)V"); + + int i = 0; + jboolean val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (jboolean) ((jboolean*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((jboolean*) Tloc(b, BUNfirst(b)))[i]; + if (v == bit_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (jboolean)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetBooleanArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java BooleanColumn(boolean[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + +static jobject getByteColumn(JNIEnv *env, BAT *b) { + int size = BATcount(b); + // The values and nulls arrays + jbyteArray values = (*env)->NewByteArray(env, size); + jbooleanArray nulls = (*env)->NewBooleanArray(env, size); + + jobject column; + jclass columnClass = (*env)->FindClass(env, "org/monetdb/embedded/result/column/ByteColumn"); + // from Java ByteColumn(byte[] values, int columnSize, boolean[] nullIndex) + jmethodID columnConstructor = (*env)->GetMethodID(env, columnClass, "<init>", "([BI[Z)V"); + + int i = 0; + bte val_tmp[size]; + jboolean nul_tmp[size]; + if (b->T->nonil && !b->T->nil) { + for (i = 0; i < size; i++) { + val_tmp[i] = (bte) ((bte*) Tloc(b, BUNfirst(b)))[i]; + nul_tmp[i] = false; + } + } + else { + for (i = 0; i < size; i++) { + int v = ((bte*) Tloc(b, BUNfirst(b)))[i]; + if (v == bte_nil) { + val_tmp[i] = 0; + nul_tmp[i] = true; + } else { + val_tmp[i] = (bte)v; + nul_tmp[i] = false; + } + } + } + // Move from the tmp C arrays to a Java arrays + (*env)->SetByteArrayRegion(env, values, 0, size, val_tmp); + (*env)->SetBooleanArrayRegion(env, nulls, 0, size, nul_tmp); + + // Create the column object + // from Java ByteColumn(byte[] values, int columnSize, boolean[] nullIndex) + column = (*env)->NewObject(env, columnClass, columnConstructor, values, size, nulls); + + return column; +} + static jobject getShortColumn(JNIEnv *env, BAT *b) { int size = BATcount(b); // The values and nulls arrays @@ -166,7 +252,7 @@ static jobject getFloatColumn(JNIEnv *en for (i = 0; i < size; i++) { int v = ((float*) Tloc(b, BUNfirst(b)))[i]; if (v == flt_nil) { - val_tmp[i] = 0; + val_tmp[i] = 0.0; nul_tmp[i] = true; } else { val_tmp[i] = (float)v; @@ -209,7 +295,7 @@ static jobject getDoubleColumn(JNIEnv *e for (i = 0; i < size; i++) { int v = ((double*) Tloc(b, BUNfirst(b)))[i]; if (v == dbl_nil) { - val_tmp[i] = 0; + val_tmp[i] = 0.0; nul_tmp[i] = true; } else { val_tmp[i] = (double)v; @@ -278,6 +364,12 @@ JNIEXPORT jobject JNICALL Java_org_monet BAT* b = BATdescriptor(col.b); switch (ATOMstorage(getColumnType(b->T->type))) { + case TYPE_bit: + return getBooleanColumn(env, b); + break; + case TYPE_bte: + return getByteColumn(env, b); + break; case TYPE_sht: return getShortColumn(env, b); break; @@ -288,9 +380,11 @@ JNIEXPORT jobject JNICALL Java_org_monet return getLongColumn(env, b); break; case TYPE_flt: + printf("float1\n"); return getFloatColumn(env, b); break; case TYPE_dbl: + printf("double1\n"); return getDoubleColumn(env, b); break; case TYPE_str: diff --git a/java/embedded/src/main/java/org/monetdb/embedded/result/column/BooleanColumn.java b/java/embedded/src/main/java/org/monetdb/embedded/result/column/BooleanColumn.java new file mode 100644 --- /dev/null +++ b/java/embedded/src/main/java/org/monetdb/embedded/result/column/BooleanColumn.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/. + * + * Copyright 2008-2015 MonetDB B.V. + */ + +package org.monetdb.embedded.result.column; + +/** + * An {@code Boolean} column. + * + */ +public class BooleanColumn extends Column<Boolean> { + private boolean[] values; + + public BooleanColumn(boolean[] values, int columnSize, boolean[] nullIndex) { + super(columnSize, nullIndex); + this.values = values; + } + + @Override + public Boolean getVaule(int index) { + if (isNullValue(index) || index < 0 || index >= columnSize()) { + return null; + } + return Boolean.valueOf(values[index]); + } +} diff --git a/java/embedded/src/main/java/org/monetdb/embedded/result/column/ByteColumn.java b/java/embedded/src/main/java/org/monetdb/embedded/result/column/ByteColumn.java new file mode 100644 --- /dev/null +++ b/java/embedded/src/main/java/org/monetdb/embedded/result/column/ByteColumn.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/. + * + * Copyright 2008-2015 MonetDB B.V. + */ + +package org.monetdb.embedded.result.column; + +/** + * An {@code Boolean} column. + * + */ +public class ByteColumn extends Column<Byte> { + private byte[] values; + + public ByteColumn(byte[] values, int columnSize, boolean[] nullIndex) { + super(columnSize, nullIndex); + this.values = values; + } + + @Override + public Byte getVaule(int index) { + if (isNullValue(index) || index < 0 || index >= columnSize()) { + return null; + } + return Byte.valueOf(values[index]); + } +} diff --git a/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java --- a/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java +++ b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java @@ -25,15 +25,24 @@ import org.monetdb.embedded.result.Embed public class EmbeddedTest { static File datbaseDirectory; static MonetDBEmbedded db; - static Object[] typeValues = new Object[]{ - Short.valueOf((short)12), - Integer.valueOf(23), - Long.valueOf(34l), - Float.valueOf(4.5f), - Double.valueOf(5.6), + static Object[] numbericTypeTestValues = new Object[]{ + Byte.valueOf((byte)12), + Short.valueOf((short)23), + Integer.valueOf(34), + Long.valueOf(45l), + Float.valueOf(5.6f), + Double.valueOf(6.7), + }; + + static Object[] charTypeTestValues = new Object[]{ "a string" }; + static Object[] booleanTypeTestValues = new Object[]{ + Boolean.valueOf(true), + Boolean.valueOf(false) + }; + @BeforeClass public static void createTestDB() throws IOException, SQLException { final Path directoryPath = Files.createTempDirectory("monetdbtest"); @@ -45,10 +54,19 @@ public class EmbeddedTest { db.query("CREATE TABLE world (id integer, val integer);"); db.query("INSERT INTO world VALUES (1, 10), (2, 20), (3, 30), (4, null);"); - db.query("CREATE TABLE typestest (fshort smallint, fint integer, flong bigint, ffloat float, fdouble double, fstring string);"); - db.query("INSERT INTO typestest VALUES (" + typeValues[0] + ", " + typeValues[1] + ", " + typeValues[2] + ", " - + typeValues[3] + ", " + typeValues[4] + ", " + "'" + typeValues[5] + "'" + ");"); - db.query("INSERT INTO typestest VALUES (null, null, null, null, null, null);"); + db.query("CREATE TABLE numeric_types_test (fbyte tinyint, fshort smallint, fint integer, flong bigint, ffloat float, fdouble double);"); + db.query("INSERT INTO numeric_types_test VALUES (" + numbericTypeTestValues[0] + ", " + numbericTypeTestValues[1] + ", " + numbericTypeTestValues[2] + ", " + + numbericTypeTestValues[3] + ", " + numbericTypeTestValues[4] + ", " + numbericTypeTestValues[5] + ");"); + db.query("INSERT INTO numeric_types_test VALUES (null, null, null, null, null, null);"); + + db.query("CREATE TABLE char_types_test (fstring string, fvarchar varchar(10));"); + db.query("INSERT INTO char_types_test VALUES ('" + charTypeTestValues[0] + "', '" + charTypeTestValues[0] + "');"); + db.query("INSERT INTO char_types_test VALUES (null, null);"); + + db.query("CREATE TABLE boolean_types_test (fboolean boolean);"); + db.query("INSERT INTO boolean_types_test VALUES (" + booleanTypeTestValues[0] + ");"); + db.query("INSERT INTO boolean_types_test VALUES (" + booleanTypeTestValues[1] + ");"); + db.query("INSERT INTO boolean_types_test VALUES (null);"); } @Test @@ -64,7 +82,7 @@ public class EmbeddedTest { } @Test - public void IntegerWithNullTest() throws IOException, SQLException { + public void integerWithNullTest() throws IOException, SQLException { try (EmbeddedQueryResult result = db.query("SELECT * FROM world;")) { assertEquals(4, result.getColumn(1).columnSize()); assertEquals(Integer.valueOf(20), result.getColumn(1).getVaule(1)); @@ -73,32 +91,55 @@ public class EmbeddedTest { } @Test - public void TypesWithNullTest() throws IOException, SQLException { - try (EmbeddedQueryResult result = db.query("SELECT * FROM typestest;")) { + public void numericTypesWithNullTest() throws IOException, SQLException { + try (EmbeddedQueryResult result = db.query("SELECT * FROM numeric_types_test;")) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list