diff --git a/.gitignore b/.gitignore index f14a070a..c6a503dc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ build/* .project .settings bin/ +/.gradle/ +/build/ diff --git a/.travis.yml b/.travis.yml index 41aa7aca..5cf32dcc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ install: script: - ./gradlew checkFormat - - ./gradlew test + - ./gradlew --info test # Upload to sonatype oss for master snapshots after_success: diff --git a/CMakeLists.txt b/CMakeLists.txt index 4523fe11..d9105aa6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,7 @@ add_library(tiledbjni SHARED src/main/c/custom/tiledb_custom.cxx ) +target_compile_definitions(tiledbjni PRIVATE -DTILEDB_CORE_OBJECTS_EXPORTS) target_include_directories(tiledbjni PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swig" diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..88b3c924 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,19 @@ +version: 0.2.7.{build} + +image: Visual Studio 2019 +platform: + - x64 + +build: off + +build_script: + - gradlew assemble + +test_script: + - gradlew --info test +# Check that the NativeLibLoader functions correctly + - ps: $(ls build\libs\tiledb-java-*.jar | % {$Env:CLASSPATH += $_.FullName + ";"}) + - ps: java examples.io.tiledb.java.api.TileDBVersion + +artifacts: + - path: 'build\libs\*' diff --git a/build.gradle b/build.gradle index 28c74cc4..d4de21c3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,9 @@ plugins { - id 'java' + id 'java-library' id 'idea' id 'maven-publish' id 'signing' - id 'com.github.sherter.google-java-format' version '0.7.1' + id 'com.github.sherter.google-java-format' version '0.8' id 'io.codearte.nexus-staging' version '0.12.0' id 'com.google.osdetector' version '1.6.0' } @@ -41,74 +41,64 @@ sourceSets { } dependencies { - testCompile group: 'junit', name: 'junit', version: '4.11' + testImplementation 'junit:junit:4.12' } -def String getProjectProperty(String propertyName) -{ - String property = null - if (hasProperty(propertyName)) - { - property = this.properties[propertyName] +task cmakeTask(type: Exec) { + doFirst { + mkdir buildDir } - return property -} -task cmakeTask(type: Exec) { workingDir = buildDir executable = 'cmake' - List buildArgs = new ArrayList() - buildArgs.add("..") - String tiledb_git_repo = getProjectProperty('TILEDB_GIT_REPOSITORY') - String tiledb_git_tag = getProjectProperty('TILEDB_GIT_TAG') - String tiledb_verbose = getProjectProperty('TILEDB_VERBOSE') - String tiledb_s3 = getProjectProperty('TILEDB_S3') - String tiledb_hdfs = getProjectProperty('TILEDB_HDFS') - String tiledb_serialization = getProjectProperty('TILEDB_SERIALIZATION') - if (tiledb_git_repo != null) { - buildArgs.add("-DTILEDB_GIT_REPOSITORY=" + tiledb_git_repo) - } - if (tiledb_git_tag != null) { - buildArgs.add("-DTILEDB_GIT_TAG=" + tiledb_git_tag) - } - if (tiledb_verbose != null) { - buildArgs.add("-DTILEDB_VERBOSE=" + tiledb_verbose) - } - if (tiledb_s3 != null) { - buildArgs.add("-DTILEDB_S3=" + tiledb_s3) - } - if (tiledb_hdfs != null) { - buildArgs.add("-DTILEDB_HDFS=" + tiledb_hdfs) - } - if (tiledb_serialization != null) { - buildArgs.add("-DTILEDB_SERIALIZATION=" + tiledb_serialization) + def buildArgs = [".."] + if (project.properties.TILEDB_CMAKE_GENERATOR) { + buildArgs << "-G" << project.properties.TILEDB_CMAKE_GENERATOR + } + if (project.properties.TILEDB_CMAKE_ARCHITECTURE) { + buildArgs << "-A" << project.properties.TILEDB_CMAKE_ARCHITECTURE + } + [ + "TILEDB_GIT_REPOSITORY", + "TILEDB_GIT_TAG", + "TILEDB_VERBOSE", + "TILEDB_S3", + "TILEDB_HDFS", + "TILEDB_SERIALIZATION" + ].each { v -> + if (project.hasProperty(v)) { + buildArgs << "-D${v}=${project.property(v)}" + } } args buildArgs } -task makeTask(type: Exec) { +task cmakeBuildTask(type: Exec) { workingDir = buildDir - executable = 'make' - args "-j${Runtime.getRuntime().availableProcessors()}" -} -makeTask.dependsOn(cmakeTask) - -task makeInstallTask(type: Exec) { - workingDir = new File(buildDir, "tiledb_jni") - executable = 'make' - args 'install' + executable = 'cmake' + args "--build", ".", "--config", "release" } -makeInstallTask.dependsOn(makeTask) +cmakeBuildTask.dependsOn(cmakeTask) -assemble.dependsOn(makeInstallTask) +assemble.dependsOn(cmakeBuildTask) task generateJNI(type: Exec) { workingDir = buildDir executable = "../generate_tiledb_jni" } +import org.apache.tools.ant.taskdefs.condition.Os test { - systemProperty "java.library.path", "$buildDir/install/lib/" + useJUnit() + + maxHeapSize = '1G' + + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + systemProperty "java.library.path", "$buildDir\\install\\bin;$buildDir\\tiledb_jni\\Release" + } else { + systemProperty "java.library.path", "$buildDir/install/lib:$buildDir/install/lib64:$buildDir/tiledb_jni" + } + testLogging { showStandardStreams = true } @@ -116,15 +106,20 @@ test { jar { into(new File('lib', osdetector.classifier).toString()) { + // Linux and macOS from file("$buildDir/install/lib/${System.mapLibraryName("tiledb")}") - from file("$buildDir/install/lib/${System.mapLibraryName("tiledbjni")}") from file("$buildDir/install/lib64/${System.mapLibraryName("tiledb")}") - from file("$buildDir/install/lib64/${System.mapLibraryName("tiledbjni")}") + from file("$buildDir/tiledb_jni/${System.mapLibraryName("tiledbjni")}") + // Windows + from file("$buildDir/install/bin/${System.mapLibraryName("tbb")}") + from file("$buildDir/install/bin/${System.mapLibraryName("tiledb")}") + from file("$buildDir/tiledb_jni/Release/${System.mapLibraryName("tiledbjni")}") } + manifest { attributes("Implementation-Title": "Gradle", - "Implementation-Version": version) + "Implementation-Version": archiveVersion) } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 0d4a9516..28861d27 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 115e6ac0..21e622da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index afd0629f..4ef2ecbb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -13,5 +13,4 @@ pluginManagement { } } } -enableFeaturePreview('STABLE_PUBLISHING') rootProject.name = 'tiledb-java' \ No newline at end of file diff --git a/src/main/c/custom/tiledb_custom.cxx b/src/main/c/custom/tiledb_custom.cxx index c9009b04..e750e41c 100644 --- a/src/main/c/custom/tiledb_custom.cxx +++ b/src/main/c/custom/tiledb_custom.cxx @@ -694,7 +694,7 @@ extern "C" { jintArray jresult = jenv->NewIntArray(sz); if (!jresult) return NULL; - jenv->SetIntArrayRegion(jresult, 0, sz, arr); + jenv->SetIntArrayRegion(jresult, 0, sz, (jint*) arr); return jresult; } @@ -844,7 +844,8 @@ extern "C" { for(int i = 0; iReleaseShortArrayElements(jresult, short_arr, 0); + jenv->SetShortArrayRegion(jresult, 0, sz, short_arr); + delete short_arr; return jresult; } @@ -894,7 +895,8 @@ extern "C" { for(int i = 0; iReleaseIntArrayElements(jresult, int_arr, 0); + jenv->SetIntArrayRegion(jresult, 0, sz, int_arr); + delete int_arr; return jresult; } @@ -921,7 +923,8 @@ extern "C" { for(int i = 0; iReleaseLongArrayElements(jresult, long_arr, 0); + jenv->SetLongArrayRegion(jresult, 0, sz, long_arr); + delete long_arr; return jresult; } @@ -949,7 +952,8 @@ extern "C" { for(int i = 0; iReleaseLongArrayElements(jresult, long_arr, 0); + jenv->SetLongArrayRegion(jresult, 0, sz, long_arr); + delete long_arr; return jresult; } diff --git a/src/main/java/io/tiledb/java/api/Array.java b/src/main/java/io/tiledb/java/api/Array.java index 33608673..d8b6672a 100644 --- a/src/main/java/io/tiledb/java/api/Array.java +++ b/src/main/java/io/tiledb/java/api/Array.java @@ -72,7 +72,7 @@ public class Array implements AutoCloseable { * @exception TileDBError A TileDB exception */ public Array(Context ctx, String uri) throws TileDBError { - openArray(ctx, uri, TILEDB_READ, EncryptionType.TILEDB_NO_ENCRYPTION, new byte[] {}); + this(ctx, uri, TILEDB_READ); } /** @@ -91,7 +91,7 @@ public Array(Context ctx, String uri) throws TileDBError { * @exception TileDBError A TileDB exception */ public Array(Context ctx, String uri, BigInteger timestamp) throws TileDBError { - openArray(ctx, uri, TILEDB_READ, EncryptionType.TILEDB_NO_ENCRYPTION, new byte[] {}, timestamp); + this(ctx, uri, TILEDB_READ, timestamp); } /** @@ -110,7 +110,29 @@ public Array(Context ctx, String uri, BigInteger timestamp) throws TileDBError { * @exception TileDBError A TileDB exception */ public Array(Context ctx, String uri, QueryType query_type) throws TileDBError { - openArray(ctx, uri, query_type, EncryptionType.TILEDB_NO_ENCRYPTION, new byte[] {}); + this(ctx, uri, query_type, EncryptionType.TILEDB_NO_ENCRYPTION, new byte[] {}); + } + + /** + * Constructs an Array object, opening the array for the given query type at a user-given + * timestamp (time-travelling). + * + *
Example:
+   * {@code
+   * Context ctx = new Context();
+   * Array array new Array(ctx, "s3://bucket-name/array-name", TILEDB_READ);
+   * }
+   * 
+ * + * @param ctx TileDB context + * @param uri The array URI + * @param query_type Query type to open the array for. + * @param timestamp The timestamp + * @exception TileDBError A TileDB exception + */ + public Array(Context ctx, String uri, QueryType query_type, BigInteger timestamp) + throws TileDBError { + this(ctx, uri, query_type, EncryptionType.TILEDB_NO_ENCRYPTION, new byte[] {}, timestamp); } /** diff --git a/src/main/java/io/tiledb/java/api/Config.java b/src/main/java/io/tiledb/java/api/Config.java index 2b143115..419ce7ec 100644 --- a/src/main/java/io/tiledb/java/api/Config.java +++ b/src/main/java/io/tiledb/java/api/Config.java @@ -29,6 +29,7 @@ package io.tiledb.java.api; import io.tiledb.libtiledb.*; +import java.io.File; import java.net.URI; import java.util.HashMap; import java.util.Map; @@ -115,7 +116,7 @@ public Config(URI uri) throws TileDBError { throw new TileDBError( "Config can an only read from a local file scheme URI (file://), got: " + uri); } - init(uri.getPath()); + init(new File(uri).getAbsolutePath()); } /** @@ -298,7 +299,7 @@ public void saveToFile(URI uri) throws TileDBError { throw new TileDBError( "Config can an only save to a local file scheme URI (file://), got: " + uri); } - saveToFile(uri.getPath()); + saveToFile(new File(uri).getAbsolutePath()); } private void next(SWIGTYPE_p_tiledb_config_iter_t iterp) throws TileDBError { diff --git a/src/main/java/io/tiledb/libtiledb/NativeLibLoader.java b/src/main/java/io/tiledb/libtiledb/NativeLibLoader.java index 69ac316e..c3ea5413 100644 --- a/src/main/java/io/tiledb/libtiledb/NativeLibLoader.java +++ b/src/main/java/io/tiledb/libtiledb/NativeLibLoader.java @@ -27,9 +27,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFileAttributeView; +import java.nio.file.attribute.PosixFilePermission; +import java.util.Comparator; import java.util.Locale; import java.util.Properties; -import java.util.UUID; +import java.util.Set; +import java.util.stream.Stream; /** Helper class that finds native libraries embedded as resources and loads them dynamically. */ public class NativeLibLoader { @@ -39,6 +45,27 @@ public class NativeLibLoader { /** Path (relative to jar) where native libraries are located. */ private static final String LIB_RESOURCE_DIR = "/lib"; + /** Temporary directory where native libraries will be extracted. */ + private static Path tempDir; + + static { + try { + tempDir = Files.createTempDirectory("tileDbNativeLibLoader"); + } catch (IOException e) { + e.printStackTrace(System.err); + } + Runtime.getRuntime() + .addShutdownHook( + new Thread( + () -> { + try (Stream walk = Files.walk(tempDir)) { + walk.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } catch (IOException e) { + e.printStackTrace(System.err); + } + })); + } + /** Finds and loads native TileDB. */ static void loadNativeTileDB() { try { @@ -51,6 +78,18 @@ static void loadNativeTileDB() { } } + /** Finds and loads native Intel Thread Building Blocks. */ + static void loadNativeTBB() { + try { + loadNativeLib("tbb", true); + } catch (java.lang.UnsatisfiedLinkError e) { + // If a native library fails to link, we fall back to depending on the system + // dynamic linker to satisfy the requirement. Therefore, we do nothing here + // (if the library is not available via the system linker, a runtime error + // will occur later). + } + } + /** Finds and loads native TileDB JNI. */ static void loadNativeTileDBJNI() { try { @@ -206,56 +245,38 @@ private static String getOSClassifier() { * * @param libraryDir Path of directory containing native library * @param libraryName Name of native library - * @param targetDir Path of target directory to extract library to * @param mapLibraryName If true, transform libraryName with System.mapLibraryName * @return File pointing to the extracted library */ - private static File extractLibraryFile( - String libraryDir, String libraryName, String targetDir, boolean mapLibraryName) { + private static Path extractLibraryFile( + String libraryDir, String libraryName, boolean mapLibraryName) { String libraryFileName = mapLibraryName ? System.mapLibraryName(libraryName) : libraryName; - String nativeLibraryFilePath = new File(libraryDir, libraryFileName).getAbsolutePath(); - - // Attach UUID to the native library file to ensure multiple class loaders can read the - // native lib multiple times. - String uuid = UUID.randomUUID().toString(); - String extractedLibFileName = String.format("%s-%s-%s", libraryName, uuid, libraryFileName); - File extractedLibFile = new File(targetDir, extractedLibFileName); + String nativeLibraryFilePath = libraryDir + "/" + libraryFileName; + Path extractedLibFile = tempDir.resolve(libraryFileName); try { // Extract a native library file into the target directory - InputStream reader = null; - FileOutputStream writer = null; - try { - reader = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); - try { - writer = new FileOutputStream(extractedLibFile); + try (InputStream reader = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); + FileOutputStream writer = new FileOutputStream(extractedLibFile.toFile())) { - byte[] buffer = new byte[8192]; - int bytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - } - } finally { - if (writer != null) { - writer.close(); - } - } - } finally { - if (reader != null) { - reader.close(); + byte[] buffer = new byte[8192]; + int bytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); } - - // Delete the extracted lib file on JVM exit. - extractedLibFile.deleteOnExit(); } - // Set executable (x) flag to enable Java to load the native library - boolean success = - extractedLibFile.setReadable(true) - && extractedLibFile.setWritable(true, true) - && extractedLibFile.setExecutable(true); - if (!success) { - // Setting file flag may fail, but in this case another error will be thrown in later phase + // Set executable (x) flag to enable Java to load the native library on + // UNIX platforms + PosixFileAttributeView view = + Files.getFileAttributeView(extractedLibFile, PosixFileAttributeView.class); + if (view != null) { + // On a UNIX platform + Set permissions = view.readAttributes().permissions(); + permissions.add(PosixFilePermission.OWNER_READ); + permissions.add(PosixFilePermission.OWNER_WRITE); + permissions.add(PosixFilePermission.OWNER_EXECUTE); + view.setPermissions(permissions); } // Check whether the contents are properly copied from the resource folder @@ -264,7 +285,7 @@ private static File extractLibraryFile( InputStream extractedLibIn = null; try { nativeIn = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); - extractedLibIn = new FileInputStream(extractedLibFile); + extractedLibIn = new FileInputStream(extractedLibFile.toFile()); if (!contentsEquals(nativeIn, extractedLibIn)) { throw new IOException( @@ -280,7 +301,7 @@ private static File extractLibraryFile( } } - return new File(targetDir, extractedLibFileName); + return extractedLibFile; } catch (IOException e) { e.printStackTrace(System.err); return null; @@ -294,27 +315,18 @@ private static File extractLibraryFile( * @param mapLibraryName If true, transform libraryName with System.mapLibraryName * @return File pointing to the extracted library */ - private static File findNativeLibrary(String libraryName, boolean mapLibraryName) { + private static Path findNativeLibrary(String libraryName, boolean mapLibraryName) { String mappedLibraryName = mapLibraryName ? System.mapLibraryName(libraryName) : libraryName; - String libDir = new File(LIB_RESOURCE_DIR, getOSClassifier()).getAbsolutePath(); - File libPath = new File(libDir, mappedLibraryName); + String libDir = LIB_RESOURCE_DIR + "/" + getOSClassifier(); + String libPath = libDir + "/" + mappedLibraryName; - boolean hasNativeLib = hasResource(libPath.getAbsolutePath()); + boolean hasNativeLib = hasResource(libPath); if (!hasNativeLib) { return null; } - // Temporary folder for the extracted native lib. - File tempFolder = new File(System.getProperty("java.io.tmpdir")); - if (!tempFolder.exists()) { - boolean created = tempFolder.mkdirs(); - if (!created) { - // if created == false, it will fail eventually in the later part - } - } - // Extract and load a native library inside the jar file - return extractLibraryFile(libDir, libraryName, tempFolder.getAbsolutePath(), mapLibraryName); + return extractLibraryFile(libDir, libraryName, mapLibraryName); } /** @@ -324,10 +336,10 @@ private static File findNativeLibrary(String libraryName, boolean mapLibraryName * @param mapLibraryName If true, transform libraryName with System.mapLibraryName */ private static void loadNativeLib(String libraryName, boolean mapLibraryName) { - File nativeLibFile = findNativeLibrary(libraryName, mapLibraryName); + Path nativeLibFile = findNativeLibrary(libraryName, mapLibraryName); if (nativeLibFile != null) { // Load extracted or specified native library. - System.load(nativeLibFile.getAbsolutePath()); + System.load(nativeLibFile.toString()); } else { // Try loading preinstalled library (in the path -Djava.library.path) System.loadLibrary(libraryName); diff --git a/src/main/java/io/tiledb/libtiledb/tiledbJNI.java b/src/main/java/io/tiledb/libtiledb/tiledbJNI.java index 6bebbe9f..0ba76f87 100644 --- a/src/main/java/io/tiledb/libtiledb/tiledbJNI.java +++ b/src/main/java/io/tiledb/libtiledb/tiledbJNI.java @@ -12,6 +12,7 @@ public class tiledbJNI { static { try { + NativeLibLoader.loadNativeTBB(); NativeLibLoader.loadNativeTileDB(); NativeLibLoader.loadNativeTileDBJNI(); } catch (Exception e) { diff --git a/src/test/java/io/tiledb/java/api/ArrayTest.java b/src/test/java/io/tiledb/java/api/ArrayTest.java index 30f68821..13028cb6 100644 --- a/src/test/java/io/tiledb/java/api/ArrayTest.java +++ b/src/test/java/io/tiledb/java/api/ArrayTest.java @@ -8,8 +8,6 @@ import java.math.BigInteger; import java.nio.charset.StandardCharsets; -import java.sql.Timestamp; -import java.util.Arrays; import java.util.Map; import org.junit.*; import org.junit.rules.TemporaryFolder; @@ -90,7 +88,6 @@ public void insertArbitraryValuesVarSize( query.submit(); query.finalizeQuery(); } - array.close(); } public void insertArbitraryValuesMeth(Array array, NativeArray a_data) throws TileDBError { @@ -99,19 +96,33 @@ public void insertArbitraryValuesMeth(Array array, NativeArray a_data) throws Ti query.setLayout(TILEDB_ROW_MAJOR).setBuffer(attributeName, a_data); query.submit(); } - array.close(); } public void insertArbitraryValues(NativeArray a_data) throws TileDBError { - Array array = new Array(ctx, arrayURI, TILEDB_WRITE); - insertArbitraryValuesMeth(array, a_data); - array.close(); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + insertArbitraryValuesMeth(array, a_data); + } + } + + public void insertArbitraryValues(NativeArray a_data, BigInteger timestamp) throws TileDBError { + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE, timestamp)) { + insertArbitraryValuesMeth(array, a_data); + } } public void insertArbitraryValuesEncrypted(NativeArray a_data) throws TileDBError { - Array array = new Array(ctx, arrayURI, TILEDB_WRITE, EncryptionType.TILEDB_AES_256_GCM, key); - insertArbitraryValuesMeth(array, a_data); - array.close(); + try (Array array = + new Array(ctx, arrayURI, TILEDB_WRITE, EncryptionType.TILEDB_AES_256_GCM, key)) { + insertArbitraryValuesMeth(array, a_data); + } + } + + public void insertArbitraryValuesEncrypted(NativeArray a_data, BigInteger timestamp) + throws TileDBError { + try (Array array = + new Array(ctx, arrayURI, TILEDB_WRITE, EncryptionType.TILEDB_AES_256_GCM, key, timestamp)) { + insertArbitraryValuesMeth(array, a_data); + } } public long[] readArray(Array array) throws TileDBError { @@ -154,8 +165,9 @@ public void testArrayExists() throws Exception { Assert.assertTrue(Array.exists(ctx, arrayURI)); // Test that we can load the schema - ArraySchema schema = new ArraySchema(ctx, arrayURI); - Assert.assertEquals(schema.getArrayType(), ArrayType.TILEDB_DENSE); + try (ArraySchema schema = new ArraySchema(ctx, arrayURI)) { + Assert.assertEquals(schema.getArrayType(), ArrayType.TILEDB_DENSE); + } } @Test @@ -166,15 +178,17 @@ public void testEncryptedArrayExists() throws Exception { Assert.assertTrue(Array.exists(ctx, arrayURI)); // Test that we can decrypt the array - ArraySchema schema = new ArraySchema(ctx, arrayURI, EncryptionType.TILEDB_AES_256_GCM, key); - Assert.assertEquals(schema.getArrayType(), ArrayType.TILEDB_DENSE); + try (ArraySchema schema = + new ArraySchema(ctx, arrayURI, EncryptionType.TILEDB_AES_256_GCM, key)) { + Assert.assertEquals(schema.getArrayType(), ArrayType.TILEDB_DENSE); + } } @Test(expected = TileDBError.class) public void testLoadingEncryptedArrayNoKeyErrors() throws Exception { // Test that we can create the encrypted array Array.create(arrayURI, schemaCreate(), EncryptionType.TILEDB_AES_256_GCM, key); - ArraySchema schema = new ArraySchema(ctx, arrayURI); + new ArraySchema(ctx, arrayURI).close(); } @Test(expected = TileDBError.class) @@ -182,12 +196,12 @@ public void testLoadingEncryptedArrayWrongKeyErrors() throws Exception { // Test that we can create the encrypted array Array.create(arrayURI, schemaCreate(), EncryptionType.TILEDB_AES_256_GCM, key); String keyString = "0123456789abcdeF0123456789abcdeZ"; - ArraySchema schema = - new ArraySchema( + new ArraySchema( ctx, arrayURI, EncryptionType.TILEDB_AES_256_GCM, - keyString.getBytes(StandardCharsets.US_ASCII)); + keyString.getBytes(StandardCharsets.US_ASCII)) + .close(); } @Test(expected = TileDBError.class) @@ -195,12 +209,12 @@ public void testLoadingEncryptedArrayWrongKeyLenErrors() throws Exception { // Test that we can create the encrypted array Array.create(arrayURI, schemaCreate(), EncryptionType.TILEDB_AES_256_GCM, key); String keyString = "0123456789abcdeF0123456789a"; - ArraySchema schema = - new ArraySchema( + new ArraySchema( ctx, arrayURI, EncryptionType.TILEDB_AES_256_GCM, - keyString.getBytes(StandardCharsets.US_ASCII)); + keyString.getBytes(StandardCharsets.US_ASCII)) + .close(); } @Test @@ -208,24 +222,20 @@ public void testArrayOpenAt() throws Exception { Array.create(arrayURI, schemaCreate()); long[] array_a = new long[] {1, 2, 3, 6}; - insertArbitraryValues(new NativeArray(ctx, array_a, Long.class)); - long ts_a = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); - - Thread.sleep(1000); + BigInteger ts_a = BigInteger.valueOf(10L); + insertArbitraryValues(new NativeArray(ctx, array_a, Long.class), ts_a); long[] array_b = new long[] {1, 1, 1, 1}; - insertArbitraryValues(new NativeArray(ctx, array_b, Long.class)); - long ts_b = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); - - Thread.sleep(1000); + BigInteger ts_b = BigInteger.valueOf(20L); + insertArbitraryValues(new NativeArray(ctx, array_b, Long.class), ts_b); long[] array_c = new long[] {0, 0, 0, 0}; - insertArbitraryValues(new NativeArray(ctx, array_c, Long.class)); - long ts_c = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); + BigInteger ts_c = BigInteger.valueOf(30L); + insertArbitraryValues(new NativeArray(ctx, array_c, Long.class), ts_c); - assert Arrays.equals(readArrayAt(BigInteger.valueOf(ts_a)), array_a); - assert Arrays.equals(readArrayAt(BigInteger.valueOf(ts_b)), array_b); - assert Arrays.equals(readArrayAt(BigInteger.valueOf(ts_c)), array_c); + Assert.assertArrayEquals(array_a, readArrayAt(ts_a)); + Assert.assertArrayEquals(array_b, readArrayAt(ts_b)); + Assert.assertArrayEquals(array_c, readArrayAt(ts_c)); } @Test @@ -233,24 +243,20 @@ public void testArrayOpenAtEncrypted() throws Exception { Array.create(arrayURI, schemaCreate(), EncryptionType.TILEDB_AES_256_GCM, key); long[] array_a = new long[] {1, 2, 3, 6}; - insertArbitraryValuesEncrypted(new NativeArray(ctx, array_a, Long.class)); - long ts_a = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); - - Thread.sleep(1000); + BigInteger ts_a = BigInteger.valueOf(10L); + insertArbitraryValuesEncrypted(new NativeArray(ctx, array_a, Long.class), ts_a); long[] array_b = new long[] {1, 1, 1, 1}; - insertArbitraryValuesEncrypted(new NativeArray(ctx, array_b, Long.class)); - long ts_b = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); - - Thread.sleep(1000); + BigInteger ts_b = BigInteger.valueOf(20L); + insertArbitraryValuesEncrypted(new NativeArray(ctx, array_b, Long.class), ts_b); long[] array_c = new long[] {0, 0, 0, 0}; - insertArbitraryValuesEncrypted(new NativeArray(ctx, array_c, Long.class)); - long ts_c = new Timestamp(System.currentTimeMillis()).toInstant().toEpochMilli(); + BigInteger ts_c = BigInteger.valueOf(30L); + insertArbitraryValuesEncrypted(new NativeArray(ctx, array_c, Long.class), ts_c); - assert Arrays.equals(readArrayAtEncrypted(BigInteger.valueOf(ts_a)), array_a); - assert Arrays.equals(readArrayAtEncrypted(BigInteger.valueOf(ts_b)), array_b); - assert Arrays.equals(readArrayAtEncrypted(BigInteger.valueOf(ts_c)), array_c); + Assert.assertArrayEquals(array_a, readArrayAtEncrypted(ts_a)); + Assert.assertArrayEquals(array_b, readArrayAtEncrypted(ts_b)); + Assert.assertArrayEquals(array_c, readArrayAtEncrypted(ts_c)); } @Test @@ -260,15 +266,16 @@ public void testArraygetNonEmptyDomainFromIndex() throws Exception { long[] array_a = new long[] {1, 2, 3, 6}; insertArbitraryValues(new NativeArray(ctx, array_a, Long.class)); - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Assert.assertEquals(1L, array.getNonEmptyDomainFromIndex(0).getFirst()); - Assert.assertEquals(4L, array.getNonEmptyDomainFromIndex(0).getSecond()); + Assert.assertEquals(1L, array.getNonEmptyDomainFromIndex(0).getFirst()); + Assert.assertEquals(4L, array.getNonEmptyDomainFromIndex(0).getSecond()); - try { - array.getNonEmptyDomainFromIndex(1); - Assert.fail(); - } catch (TileDBError error) { + try { + array.getNonEmptyDomainFromIndex(1); + Assert.fail(); + } catch (TileDBError error) { + } } } @@ -279,15 +286,16 @@ public void testArraygetNonEmptyDomainFromName() throws Exception { long[] array_a = new long[] {1, 2, 3, 6}; insertArbitraryValues(new NativeArray(ctx, array_a, Long.class)); - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Assert.assertEquals(1L, array.getNonEmptyDomainFromName("d1").getFirst()); - Assert.assertEquals(4L, array.getNonEmptyDomainFromName("d1").getSecond()); + Assert.assertEquals(1L, array.getNonEmptyDomainFromName("d1").getFirst()); + Assert.assertEquals(4L, array.getNonEmptyDomainFromName("d1").getSecond()); - try { - array.getNonEmptyDomainFromName("d2"); - Assert.fail(); - } catch (TileDBError error) { + try { + array.getNonEmptyDomainFromName("d2"); + Assert.fail(); + } catch (TileDBError error) { + } } } @@ -296,15 +304,17 @@ public void testArrayGetNonEmptyDomainVarSizeFromIndex() throws Exception { Array.create(arrayURI, schemaStringDimsCreate(ArrayType.TILEDB_SPARSE)); NativeArray data = new NativeArray(ctx, "aabbccddee", TILEDB_STRING_ASCII); NativeArray offsets = new NativeArray(ctx, new long[] {0, 2, 4, 6}, TILEDB_UINT64); - insertArbitraryValuesVarSize( - new Array(ctx, arrayURI, TILEDB_WRITE), dimName, data, offsets, TILEDB_UNORDERED); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + insertArbitraryValuesVarSize(array, dimName, data, offsets, TILEDB_UNORDERED); + } - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Pair size = array.getNonEmptyDomainVarSizeFromIndex(0); + Pair size = array.getNonEmptyDomainVarSizeFromIndex(0); - Assert.assertEquals(2, size.getFirst().intValue()); - Assert.assertEquals(4, size.getSecond().intValue()); + Assert.assertEquals(2, size.getFirst().intValue()); + Assert.assertEquals(4, size.getSecond().intValue()); + } } @Test @@ -312,15 +322,17 @@ public void testArrayGetNonEmptyDomainVarSizeFromName() throws Exception { Array.create(arrayURI, schemaStringDimsCreate(ArrayType.TILEDB_SPARSE)); NativeArray data = new NativeArray(ctx, "aabbccddee", TILEDB_STRING_ASCII); NativeArray offsets = new NativeArray(ctx, new long[] {0, 2, 4, 6}, TILEDB_UINT64); - insertArbitraryValuesVarSize( - new Array(ctx, arrayURI, TILEDB_WRITE), dimName, data, offsets, TILEDB_UNORDERED); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + insertArbitraryValuesVarSize(array, dimName, data, offsets, TILEDB_UNORDERED); + } - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Pair size = array.getNonEmptyDomainVarSizeFromName(dimName); + Pair size = array.getNonEmptyDomainVarSizeFromName(dimName); - Assert.assertEquals(2, size.getFirst().intValue()); - Assert.assertEquals(4, size.getSecond().intValue()); + Assert.assertEquals(2, size.getFirst().intValue()); + Assert.assertEquals(4, size.getSecond().intValue()); + } } @Test @@ -328,19 +340,21 @@ public void testArrayGetNonEmptyDomainVarFromIndex() throws Exception { Array.create(arrayURI, schemaStringDimsCreate(ArrayType.TILEDB_SPARSE)); NativeArray data = new NativeArray(ctx, "aabbccddee", TILEDB_STRING_ASCII); NativeArray offsets = new NativeArray(ctx, new long[] {0, 2, 4, 6}, TILEDB_UINT64); - insertArbitraryValuesVarSize( - new Array(ctx, arrayURI, TILEDB_WRITE), dimName, data, offsets, TILEDB_UNORDERED); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + insertArbitraryValuesVarSize(array, dimName, data, offsets, TILEDB_UNORDERED); + } - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Pair size1 = array.getNonEmptyDomainVarFromIndex(0); - Pair size2 = array.getNonEmptyDomainFromIndex(0); + Pair size1 = array.getNonEmptyDomainVarFromIndex(0); + Pair size2 = array.getNonEmptyDomainFromIndex(0); - Assert.assertEquals("aa", size1.getFirst()); - Assert.assertEquals("ddee", size1.getSecond()); + Assert.assertEquals("aa", size1.getFirst()); + Assert.assertEquals("ddee", size1.getSecond()); - Assert.assertEquals("aa", size2.getFirst()); - Assert.assertEquals("ddee", size2.getSecond()); + Assert.assertEquals("aa", size2.getFirst()); + Assert.assertEquals("ddee", size2.getSecond()); + } } @Test @@ -348,19 +362,21 @@ public void testArrayGetNonEmptyDomainVarFromName() throws Exception { Array.create(arrayURI, schemaStringDimsCreate(ArrayType.TILEDB_SPARSE)); NativeArray data = new NativeArray(ctx, "aabbccddee", TILEDB_STRING_ASCII); NativeArray offsets = new NativeArray(ctx, new long[] {0, 2, 4, 6}, TILEDB_UINT64); - insertArbitraryValuesVarSize( - new Array(ctx, arrayURI, TILEDB_WRITE), dimName, data, offsets, TILEDB_UNORDERED); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + insertArbitraryValuesVarSize(array, dimName, data, offsets, TILEDB_UNORDERED); + } - Array array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Pair size1 = array.getNonEmptyDomainVarFromName(dimName); - Pair size2 = array.getNonEmptyDomainFromName(dimName); + Pair size1 = array.getNonEmptyDomainVarFromName(dimName); + Pair size2 = array.getNonEmptyDomainFromName(dimName); - Assert.assertEquals("aa", size1.getFirst()); - Assert.assertEquals("ddee", size1.getSecond()); + Assert.assertEquals("aa", size1.getFirst()); + Assert.assertEquals("ddee", size1.getSecond()); - Assert.assertEquals("aa", size2.getFirst()); - Assert.assertEquals("ddee", size2.getSecond()); + Assert.assertEquals("aa", size2.getFirst()); + Assert.assertEquals("ddee", size2.getSecond()); + } } @Test @@ -524,8 +540,6 @@ public void testArrayMetadata() throws Exception { public void testArrayGetMetadataMap() throws Exception { Array.create(arrayURI, schemaCreate()); - Array array = new Array(ctx, arrayURI, TILEDB_WRITE); - NativeArray metadataByte = new NativeArray(ctx, new byte[] {-7, -6, -5, 0, 100}, Byte.class); NativeArray metadataShort = new NativeArray(ctx, new short[] {18, 19, 20, 21}, Short.class); @@ -622,37 +636,38 @@ public void testArrayGetMetadataMap() throws Exception { metadataShortSingle }; - for (int i = 0; i < keysNum; i++) { - array.putMetadata(keys[i], nativeArrays[i]); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE)) { + for (int i = 0; i < keysNum; i++) { + array.putMetadata(keys[i], nativeArrays[i]); + } } - // submit changes - array.close(); // open a new session - array = new Array(ctx, arrayURI, TILEDB_READ); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ)) { - Map metadata = array.getMetadataMap(); + Map metadata = array.getMetadataMap(); - for (int i = 0; i < keys.length; ++i) { - String key = keys[i]; - Object value = metadata.get(key); + for (int i = 0; i < keys.length; ++i) { + String key = keys[i]; + Object value = metadata.get(key); - // Check if the key is contained in the metadata - Assert.assertTrue(metadata.containsKey(key)); + // Check if the key is contained in the metadata + Assert.assertTrue(metadata.containsKey(key)); - Class c = types[i].javaClass(); + Class c = types[i].javaClass(); - if (value instanceof NativeArray) { - // Check array types - Assert.assertEquals(c, ((NativeArray) value).getJavaType()); + if (value instanceof NativeArray) { + // Check array types + Assert.assertEquals(c, ((NativeArray) value).getJavaType()); - // Check array elements - for (int idx = 0; idx < nativeArrays[i].getSize(); ++idx) { - Assert.assertEquals(((NativeArray) value).getItem(idx), nativeArrays[i].getItem(idx)); + // Check array elements + for (int idx = 0; idx < nativeArrays[i].getSize(); ++idx) { + Assert.assertEquals(((NativeArray) value).getItem(idx), nativeArrays[i].getItem(idx)); + } + } else { + Assert.assertEquals(c, value.getClass()); + Assert.assertEquals(nativeArrays[i].getItem(0), value); } - } else { - Assert.assertEquals(c, value.getClass()); - Assert.assertEquals(nativeArrays[i].getItem(0), value); } } } diff --git a/src/test/java/io/tiledb/java/api/ConfigTest.java b/src/test/java/io/tiledb/java/api/ConfigTest.java index bedddfda..d27b3650 100644 --- a/src/test/java/io/tiledb/java/api/ConfigTest.java +++ b/src/test/java/io/tiledb/java/api/ConfigTest.java @@ -25,6 +25,7 @@ package io.tiledb.java.api; import java.net.URI; +import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import org.junit.Assert; @@ -95,8 +96,7 @@ public void testCtxConfig() throws Exception { @Test public void testConfigSaveLoad() throws Exception { - String configPath = - temp.getRoot().getAbsolutePath() + temp.getRoot().pathSeparator + "testConfigString"; + String configPath = temp.getRoot().toPath().resolve("testConfigString").toString(); try (Config config = new Config()) { config.set("vfs.s3.connect_timeout_ms", "5000"); config.saveToFile(configPath); @@ -109,9 +109,8 @@ public void testConfigSaveLoad() throws Exception { @Test public void testConfigSaveLoadURI() throws Exception { - String configPath = - temp.getRoot().getAbsolutePath() + temp.getRoot().pathSeparator + "testConfigStringURI"; - URI configURI = new URI("file://" + configPath); + Path configPath = temp.getRoot().toPath().resolve("testConfigStringURI"); + URI configURI = configPath.toUri(); // Try lo try (Config config = new Config()) { config.set("vfs.s3.connect_timeout_ms", "5000"); diff --git a/src/test/java/io/tiledb/java/api/HeterogeneousSparseTest.java b/src/test/java/io/tiledb/java/api/HeterogeneousSparseTest.java index 2cb2c12d..1e3e98ed 100644 --- a/src/test/java/io/tiledb/java/api/HeterogeneousSparseTest.java +++ b/src/test/java/io/tiledb/java/api/HeterogeneousSparseTest.java @@ -30,32 +30,23 @@ import static io.tiledb.java.api.QueryType.TILEDB_READ; import static io.tiledb.java.api.QueryType.TILEDB_WRITE; -import java.nio.file.Files; -import java.nio.file.Paths; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; -@SuppressWarnings("ALL") public class HeterogeneousSparseTest { + @Rule public TemporaryFolder temp = new TemporaryFolder(); + private Context ctx; - private String arrayURI = "my_sparse_array"; + private String arrayURI; @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("my_sparse_array").toString(); } @Test @@ -66,8 +57,11 @@ public void testQuickstartSparse() throws Exception { } public void arrayCreate() throws Exception { - Dimension d1 = new Dimension(ctx, "d1", Datatype.TILEDB_STRING_ASCII, null, null); - Dimension d2 = new Dimension(ctx, "d2", Datatype.TILEDB_INT32, new Pair(0, 100), 2); + Dimension d1 = + new Dimension(ctx, "d1", Datatype.TILEDB_STRING_ASCII, null, null); + Dimension d2 = + new Dimension( + ctx, "d2", Datatype.TILEDB_INT32, new Pair(0, 100), 2); // Create and set getDomain Domain domain = new Domain(ctx); @@ -95,20 +89,19 @@ public void arrayWrite() throws Exception { NativeArray a1 = new NativeArray(ctx, new int[] {1, 2, 3, 4, 5}, Integer.class); // Create query - Array array = new Array(ctx, arrayURI, TILEDB_WRITE); - Query query = new Query(array); - query.setLayout(TILEDB_GLOBAL_ORDER); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE); + Query query = new Query(array)) { + query.setLayout(TILEDB_GLOBAL_ORDER); - query.setBuffer("d1", d1_off, d1_data); - query.setBuffer("d2", d2_data); - query.setBuffer("a1", a1); + query.setBuffer("d1", d1_off, d1_data); + query.setBuffer("d2", d2_data); + query.setBuffer("a1", a1); - // Submit query - query.submit(); + // Submit query + query.submit(); - query.finalizeQuery(); - query.close(); - array.close(); + query.finalizeQuery(); + } } private void arrayRead() throws Exception { @@ -117,25 +110,26 @@ private void arrayRead() throws Exception { NativeArray d2_data = new NativeArray(ctx, 20, Datatype.TILEDB_INT32); - Query q = new Query(new Array(ctx, arrayURI), TILEDB_READ); - q.setLayout(TILEDB_GLOBAL_ORDER); + try (Query q = new Query(new Array(ctx, arrayURI), TILEDB_READ)) { + q.setLayout(TILEDB_GLOBAL_ORDER); - q.setBuffer("d1", d_off, d_data); - q.setBuffer("d2", d2_data); + q.setBuffer("d1", d_off, d_data); + q.setBuffer("d2", d2_data); - q.addRangeVar(0, "a", "z"); + q.addRangeVar(0, "a", "z"); - q.submit(); + q.submit(); - byte[] data = (byte[]) q.getBuffer("d1"); - long[] offsets = q.getVarBuffer("d1"); - int[] d2 = (int[]) q.getBuffer("d2"); + byte[] data = (byte[]) q.getBuffer("d1"); + long[] offsets = q.getVarBuffer("d1"); + int[] d2 = (int[]) q.getBuffer("d2"); - String[] results = new String[offsets.length]; + String[] results = new String[offsets.length]; - results = Util.bytesToStrings(offsets, data); + results = Util.bytesToStrings(offsets, data); - Assert.assertArrayEquals(results, new String[] {"aa", "bb", "cc", "dd", "ee"}); - Assert.assertArrayEquals(d2, new int[] {1, 4, 9, 10, 12}); + Assert.assertArrayEquals(results, new String[] {"aa", "bb", "cc", "dd", "ee"}); + Assert.assertArrayEquals(d2, new int[] {1, 4, 9, 10, 12}); + } } } diff --git a/src/test/java/io/tiledb/java/api/MultiRangeQueryTest.java b/src/test/java/io/tiledb/java/api/MultiRangeQueryTest.java index efebf02b..d61de785 100644 --- a/src/test/java/io/tiledb/java/api/MultiRangeQueryTest.java +++ b/src/test/java/io/tiledb/java/api/MultiRangeQueryTest.java @@ -5,35 +5,28 @@ import static io.tiledb.java.api.QueryType.TILEDB_READ; import static io.tiledb.java.api.QueryType.TILEDB_WRITE; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.HashMap; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; public class MultiRangeQueryTest { + + @Rule public TemporaryFolder temp = new TemporaryFolder(); + private Context ctx; - private String arrayURI = "multi_range_query"; + private String arrayURI; @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("multi_range_query").toString(); arrayCreate(); arrayWrite(); } - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - @Test public void test() throws Exception { arrayRead(); @@ -82,65 +75,63 @@ public void arrayWrite() throws Exception { Float.class); // Create query - Array array = new Array(ctx, arrayURI, TILEDB_WRITE); - Query query = new Query(array); - query.setLayout(TILEDB_ROW_MAJOR); - query.setBuffer("a1", a1); - query.setBuffer("a2", a2); - // Submit query - query.submit(); - query.close(); - array.close(); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE); + Query query = new Query(array)) { + query.setLayout(TILEDB_ROW_MAJOR); + query.setBuffer("a1", a1); + query.setBuffer("a2", a2); + // Submit query + query.submit(); + } } private void arrayRead() throws Exception { - Array array = new Array(ctx, arrayURI, TILEDB_READ); - - // Create query - Query query = new Query(array, TILEDB_READ); - - // Slice only rows 1, 2 and cols 2, 3, 4 - query.addRange(0, (int) 1, (int) 2); - query.addRange(1, (int) 2, (int) 4); - query.setLayout(TILEDB_ROW_MAJOR); - - Assert.assertEquals(1, query.getRangeNum(0)); - Assert.assertEquals(1, query.getRangeNum(1)); - Assert.assertEquals(1, query.getRange(0, 0).getFirst()); - Assert.assertEquals(2, query.getRange(0, 0).getSecond()); - Assert.assertEquals(2, query.getRange(1, 0).getFirst()); - Assert.assertEquals(4, query.getRange(1, 0).getSecond()); - - // Prepare the vector that will hold the result - // (of size 6 elements for "a1" and 12 elements for "a2" since - // it stores two floats per cell) - query.setBuffer("a1", new NativeArray(ctx, 6, Character.class)); - query.setBuffer("a2", new NativeArray(ctx, 12, Float.class)); - - // Submit query - query.submit(); - - HashMap> result_el = query.resultBufferElements(); - - byte[] a1 = (byte[]) query.getBuffer("a1"); - float[] a2 = (float[]) query.getBuffer("a2"); - - query.close(); - array.close(); - - Assert.assertArrayEquals(a1, new byte[] {'b', 'c', 'd', 'f', 'g', 'h'}); - - float[] expected_a2 = - new float[] {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, 7.2f}; - for (int i = 0; i < a2.length; i++) { - Assert.assertEquals(a2[i], expected_a2[i], 0.01f); + // Create array and query + try (Array array = new Array(ctx, arrayURI, TILEDB_READ); + Query query = new Query(array, TILEDB_READ)) { + + // Slice only rows 1, 2 and cols 2, 3, 4 + query.addRange(0, (int) 1, (int) 2); + query.addRange(1, (int) 2, (int) 4); + query.setLayout(TILEDB_ROW_MAJOR); + + Assert.assertEquals(1, query.getRangeNum(0)); + Assert.assertEquals(1, query.getRangeNum(1)); + Assert.assertEquals(1, query.getRange(0, 0).getFirst()); + Assert.assertEquals(2, query.getRange(0, 0).getSecond()); + Assert.assertEquals(2, query.getRange(1, 0).getFirst()); + Assert.assertEquals(4, query.getRange(1, 0).getSecond()); + + // Prepare the vector that will hold the result + // (of size 6 elements for "a1" and 12 elements for "a2" since + // it stores two floats per cell) + query.setBuffer("a1", new NativeArray(ctx, 6, Character.class)); + query.setBuffer("a2", new NativeArray(ctx, 12, Float.class)); + + // Submit query + query.submit(); + + HashMap> result_el = query.resultBufferElements(); + Assert.assertNotNull(result_el); + + byte[] a1 = (byte[]) query.getBuffer("a1"); + float[] a2 = (float[]) query.getBuffer("a2"); + + Assert.assertArrayEquals(a1, new byte[] {'b', 'c', 'd', 'f', 'g', 'h'}); + + float[] expected_a2 = + new float[] {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, 7.2f}; + for (int i = 0; i < a2.length; i++) { + Assert.assertEquals(a2[i], expected_a2[i], 0.01f); + } } } @Test(expected = TileDBError.class) public void wrongDatatype() throws Exception { - Array array = new Array(ctx, arrayURI, TILEDB_READ); - Query query = new Query(array, TILEDB_READ); - query.addRange(0, (long) 1, (long) 2); + try (Array array = new Array(ctx, arrayURI, TILEDB_READ); + Query query = new Query(array, TILEDB_READ)) { + query.addRange(0, (long) 1, (long) 2); + } } } diff --git a/src/test/java/io/tiledb/java/api/ObjectTest.java b/src/test/java/io/tiledb/java/api/ObjectTest.java index 8f94132d..d45ffb6a 100644 --- a/src/test/java/io/tiledb/java/api/ObjectTest.java +++ b/src/test/java/io/tiledb/java/api/ObjectTest.java @@ -3,34 +3,26 @@ import static io.tiledb.java.api.ArrayType.*; import static io.tiledb.java.api.Layout.TILEDB_ROW_MAJOR; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.nio.file.Path; import java.util.List; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; public class ObjectTest { + + @Rule public TemporaryFolder temp = new TemporaryFolder(); + private Context ctx; + private Path root; + @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get("my_group"))) { - TileDBObject.remove(ctx, "my_group"); - } - if (Files.exists(Paths.get("my_group2"))) TileDBObject.remove(ctx, "my_group2"); - } - - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get("my_group"))) { - TileDBObject.remove(ctx, "my_group"); - } - if (Files.exists(Paths.get("my_group2"))) { - TileDBObject.remove(ctx, "my_group2"); - } + root = temp.getRoot().toPath(); } @Test @@ -73,22 +65,23 @@ public void test() throws Exception { } private void moveRemoveObject() throws Exception { - TileDBObject.move(ctx, "my_group", "my_group2"); - TileDBObject.remove(ctx, "my_group2/dense_arrays"); - TileDBObject.remove(ctx, "my_group2/sparse_arrays/array_C"); + TileDBObject.move( + ctx, root.resolve("my_group").toString(), root.resolve("my_group2").toString()); + TileDBObject.remove(ctx, root.resolve("my_group2/dense_arrays").toString()); + TileDBObject.remove(ctx, root.resolve("my_group2/sparse_arrays/array_C").toString()); } private void createHierarchy() throws Exception { // Create groups - Group group1 = new Group(ctx, "my_group"); - Group group2 = new Group(ctx, "my_group/dense_arrays"); - Group group3 = new Group(ctx, "my_group/sparse_arrays"); + new Group(ctx, root.resolve("my_group").toString()); + new Group(ctx, root.resolve("my_group/dense_arrays").toString()); + new Group(ctx, root.resolve("my_group/sparse_arrays").toString()); // Create arrays - createArray("my_group/dense_arrays/array_A", TILEDB_DENSE); - createArray("my_group/dense_arrays/array_B", TILEDB_DENSE); - createArray("my_group/sparse_arrays/array_C", TILEDB_SPARSE); - createArray("my_group/sparse_arrays/array_D", TILEDB_SPARSE); + createArray(root.resolve("my_group/dense_arrays/array_A").toString(), TILEDB_DENSE); + createArray(root.resolve("my_group/dense_arrays/array_B").toString(), TILEDB_DENSE); + createArray(root.resolve("my_group/sparse_arrays/array_C").toString(), TILEDB_SPARSE); + createArray(root.resolve("my_group/sparse_arrays/array_D").toString(), TILEDB_SPARSE); } private void createArray(String arrayURI, ArrayType type) throws Exception { @@ -116,20 +109,20 @@ private void assertUriEndsWith(List objs, String[] expected) throw } private void listTest(String uri, String[] expected) throws Exception { - TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, uri); + TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, root.resolve(uri).toString()); List objs = obj_iter.getAllObjects(); assertUriEndsWith(objs, expected); } private void listPreorderTest(String uri, String[] expected) throws Exception { - TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, uri); + TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, root.resolve(uri).toString()); obj_iter.setRecursive(WalkOrder.TILEDB_PREORDER); List objs = obj_iter.getAllObjects(); assertUriEndsWith(objs, expected); } private void listPostorderTest(String uri, String[] expected) throws Exception { - TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, uri); + TileDBObjectIterator obj_iter = new TileDBObjectIterator(ctx, root.resolve(uri).toString()); obj_iter.setRecursive(WalkOrder.TILEDB_POSTORDER); List objs = obj_iter.getAllObjects(); assertUriEndsWith(objs, expected); diff --git a/src/test/java/io/tiledb/java/api/QueryTest.java b/src/test/java/io/tiledb/java/api/QueryTest.java index 74a36f3f..25da5971 100644 --- a/src/test/java/io/tiledb/java/api/QueryTest.java +++ b/src/test/java/io/tiledb/java/api/QueryTest.java @@ -8,40 +8,34 @@ import static io.tiledb.java.api.QueryType.TILEDB_WRITE; import java.math.BigInteger; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.HashMap; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.experimental.runners.Enclosed; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; @RunWith(Enclosed.class) public class QueryTest { private static Context ctx; - private static String arrayURI = "query"; public static class DenseTests { + + @Rule public TemporaryFolder temp = new TemporaryFolder(); + + private String arrayURI; + @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("query").toString(); arrayCreate(); arrayWrite(); } - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - public void arrayCreate() throws Exception { // The array will be 4x4 with dimensions "rows" and "cols", with domain [1,4]. Dimension rows = @@ -85,68 +79,60 @@ public void arrayWrite() throws Exception { Float.class); // Create query - Array array = new Array(ctx, arrayURI, TILEDB_WRITE); - Query query = new Query(array); - query.setLayout(TILEDB_ROW_MAJOR); - query.setBuffer("a1", a1); - query.setBuffer("a2", a2); - // Submit query - query.submit(); - query.close(); - array.close(); + try (Array array = new Array(ctx, arrayURI, TILEDB_WRITE); + Query query = new Query(array)) { + query.setLayout(TILEDB_ROW_MAJOR); + query.setBuffer("a1", a1); + query.setBuffer("a2", a2); + // Submit query + query.submit(); + } } @Test public void arrayReadTest() throws Exception { - Array array = new Array(ctx, arrayURI, TILEDB_READ); - - // Create query - Query query = new Query(array, TILEDB_READ); - - // Slice only rows 1, 2 and cols 2, 3, 4 - query.addRange(0, 1, 2); - query.addRange(1, 2, 4); - query.setLayout(TILEDB_ROW_MAJOR); - - // Prepare the vector that will hold the result - // (of size 6 elements for "a1" and 12 elements for "a2" since - // it stores two floats per cell) - - // Get the first 6 elements of each attribute/dimension - NativeArray dim1Array = new NativeArray(ctx, 6, Integer.class); - NativeArray dim2Array = new NativeArray(ctx, 6, Integer.class); - NativeArray a1Array = new NativeArray(ctx, 12, Character.class); - NativeArray a2Array = new NativeArray(ctx, 6, Float.class); - - query.setBuffer("rows", dim1Array); - query.setBuffer("cols", dim2Array); - query.setBuffer("a1", a1Array); - query.setBuffer("a2", a2Array); - - // Submit query - query.submit(); - - HashMap> resultElements = query.resultBufferElements(); - - Assert.assertEquals(Long.valueOf(3), resultElements.get("a1").getSecond()); - Assert.assertEquals(Long.valueOf(6), resultElements.get("a2").getSecond()); - - int[] dim1 = (int[]) query.getBuffer("rows"); - int[] dim2 = (int[]) query.getBuffer("cols"); - byte[] a1 = (byte[]) query.getBuffer("a1"); - float[] a2 = (float[]) query.getBuffer("a2"); - - Assert.assertArrayEquals(new int[] {1, 1, 1}, dim1); - Assert.assertArrayEquals(new int[] {2, 3, 4}, dim2); - Assert.assertArrayEquals(new byte[] {'b', 'c', 'd'}, a1); - Assert.assertArrayEquals(new float[] {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f}, a2, 0.01f); - - dim1Array.close(); - dim2Array.close(); - a1Array.close(); - a2Array.close(); - query.close(); - array.close(); + // Create array and query + try (Array array = new Array(ctx, arrayURI, TILEDB_READ); + Query query = new Query(array, TILEDB_READ)) { + + // Slice only rows 1, 2 and cols 2, 3, 4 + query.addRange(0, 1, 2); + query.addRange(1, 2, 4); + query.setLayout(TILEDB_ROW_MAJOR); + + // Prepare the vector that will hold the result + // (of size 6 elements for "a1" and 12 elements for "a2" since + // it stores two floats per cell) + + // Get the first 6 elements of each attribute/dimension + NativeArray dim1Array = new NativeArray(ctx, 6, Integer.class); + NativeArray dim2Array = new NativeArray(ctx, 6, Integer.class); + NativeArray a1Array = new NativeArray(ctx, 12, Character.class); + NativeArray a2Array = new NativeArray(ctx, 6, Float.class); + + query.setBuffer("rows", dim1Array); + query.setBuffer("cols", dim2Array); + query.setBuffer("a1", a1Array); + query.setBuffer("a2", a2Array); + + // Submit query + query.submit(); + + HashMap> resultElements = query.resultBufferElements(); + + Assert.assertEquals(Long.valueOf(3), resultElements.get("a1").getSecond()); + Assert.assertEquals(Long.valueOf(6), resultElements.get("a2").getSecond()); + + int[] dim1 = (int[]) query.getBuffer("rows"); + int[] dim2 = (int[]) query.getBuffer("cols"); + byte[] a1 = (byte[]) query.getBuffer("a1"); + float[] a2 = (float[]) query.getBuffer("a2"); + + Assert.assertArrayEquals(new int[] {1, 1, 1}, dim1); + Assert.assertArrayEquals(new int[] {2, 3, 4}, dim2); + Assert.assertArrayEquals(new byte[] {'b', 'c', 'd'}, a1); + Assert.assertArrayEquals(new float[] {1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f}, a2, 0.01f); + } } @Test @@ -188,26 +174,23 @@ public void arrayReadDimensionsTest() throws Exception { } public static class SparseTests { + + @Rule public TemporaryFolder temp = new TemporaryFolder(); + + private String arrayURI; + @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("query").toString(); arrayCreate(); arrayWrite(); } - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - public void arrayCreate() throws TileDBError { // The array will be 4x4 with dimensions "rows" and "cols", with domain [1,4]. - Dimension d1 = new Dimension(ctx, "d1", Datatype.TILEDB_STRING_ASCII, null, null); + Dimension d1 = + new Dimension(ctx, "d1", Datatype.TILEDB_STRING_ASCII, null, null); // Create and set getDomain Domain domain = new Domain(ctx); @@ -255,75 +238,74 @@ public void testReadStringDims() throws TileDBError { NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - Query q = new Query(new Array(ctx, arrayURI), TILEDB_READ); + try (Query q = new Query(new Array(ctx, arrayURI), TILEDB_READ)) { - q.setBuffer("d1", d_off, d_data); + q.setBuffer("d1", d_off, d_data); - q.addRangeVar(0, "a", "z"); + q.addRangeVar(0, "a", "z"); - while (q.getQueryStatus() != QueryStatus.TILEDB_COMPLETED) { - q.submit(); + while (q.getQueryStatus() != QueryStatus.TILEDB_COMPLETED) { + q.submit(); - byte[] data = (byte[]) q.getBuffer("d1"); - long[] offsets = q.getVarBuffer("d1"); + byte[] data = (byte[]) q.getBuffer("d1"); + long[] offsets = q.getVarBuffer("d1"); - String[] results = new String[offsets.length]; - int start = 0, end; + String[] results = new String[offsets.length]; + int start = 0, end; - results = Util.bytesToStrings(offsets, data); + results = Util.bytesToStrings(offsets, data); - Assert.assertArrayEquals(new String[] {"aa", "bb", "cc", "dd", "ee"}, results); + Assert.assertArrayEquals(new String[] {"aa", "bb", "cc", "dd", "ee"}, results); + } } } @Test public void testAddRangeVar() throws TileDBError { Array arr = new Array(ctx, arrayURI); - NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); - NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - - Query q = new Query(arr, TILEDB_READ); - - q.setBuffer("d1", d_off, d_data); - // Point-query - q.addRangeVar(0, "aa", "aa"); - q.submit(); - byte[] data = (byte[]) q.getBuffer("d1"); - long[] offsets = q.getVarBuffer("d1"); + try (Query q = new Query(arr, TILEDB_READ)) { + NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); + NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); + q.setBuffer("d1", d_off, d_data); + // Point-query + q.addRangeVar(0, "aa", "aa"); + q.submit(); - Assert.assertArrayEquals(new String[] {"aa"}, Util.bytesToStrings(offsets, data)); + byte[] data = (byte[]) q.getBuffer("d1"); + long[] offsets = q.getVarBuffer("d1"); - q.close(); - d_data.close(); - d_off.close(); + Assert.assertArrayEquals(new String[] {"aa"}, Util.bytesToStrings(offsets, data)); + } - d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); - d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - q = new Query(arr, TILEDB_READ); + try (Query q = new Query(arr, TILEDB_READ)) { + NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); + NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - q.setBuffer("d1", d_off, d_data); - // Range query ["dd", "ee"] - q.addRangeVar(0, "dd", "ee"); - q.submit(); + q.setBuffer("d1", d_off, d_data); + // Range query ["dd", "ee"] + q.addRangeVar(0, "dd", "ee"); + q.submit(); - data = (byte[]) q.getBuffer("d1"); - offsets = q.getVarBuffer("d1"); + byte[] data = (byte[]) q.getBuffer("d1"); + long[] offsets = q.getVarBuffer("d1"); - Assert.assertArrayEquals(new String[] {"dd", "ee"}, Util.bytesToStrings(offsets, data)); + Assert.assertArrayEquals(new String[] {"dd", "ee"}, Util.bytesToStrings(offsets, data)); + } // An invalid dimentions should throw an error - d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); - d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - q = new Query(arr, TILEDB_READ); - - q.setBuffer("d1", d_off, d_data); - // We expect an error here - try { - int dimIdx = 123; - q.addRangeVar(dimIdx, "dd", "ee"); - Assert.fail("An error should be thrown for invalid dimension: " + dimIdx); - } catch (TileDBError error) { + try (Query q = new Query(arr, TILEDB_READ)) { + NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); + NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); + + q.setBuffer("d1", d_off, d_data); + // We expect an error here + try { + int dimIdx = 123; + q.addRangeVar(dimIdx, "dd", "ee"); + Assert.fail("An error should be thrown for invalid dimension: " + dimIdx); + } catch (TileDBError error) { + } } } @@ -333,11 +315,11 @@ public void testAddRangeVarInvalidDimension() throws TileDBError { NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - Query q = new Query(arr, TILEDB_READ); - - q.setBuffer("d1", d_off, d_data); - // Point-query - q.addRangeVar(123, "aa", "aa"); + try (Query q = new Query(arr, TILEDB_READ)) { + q.setBuffer("d1", d_off, d_data); + // Point-query + q.addRangeVar(123, "aa", "aa"); + } } @Test @@ -346,34 +328,35 @@ public void testGetRangeVar() throws TileDBError { NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - Query q = new Query(arr, TILEDB_READ); + try (Query q = new Query(arr, TILEDB_READ)) { - q.setBuffer("d1", d_off, d_data); + q.setBuffer("d1", d_off, d_data); - String rangeStart1 = "aaaaaa"; - String rangeEnd1 = "aaabb"; + String rangeStart1 = "aaaaaa"; + String rangeEnd1 = "aaabb"; - String rangeStart2 = "aaaaaa"; - String rangeEnd2 = "aaabb"; + String rangeStart2 = "aaaaaa"; + String rangeEnd2 = "aaabb"; - String rangeStart3 = "aaaaaa"; - String rangeEnd3 = "aaabb"; + String rangeStart3 = "aaaaaa"; + String rangeEnd3 = "aaabb"; - // Point-query - q.addRangeVar(0, rangeStart1, rangeEnd1); - q.addRangeVar(0, rangeStart2, rangeEnd2); - q.addRangeVar(0, rangeStart3, rangeEnd3); + // Point-query + q.addRangeVar(0, rangeStart1, rangeEnd1); + q.addRangeVar(0, rangeStart2, rangeEnd2); + q.addRangeVar(0, rangeStart3, rangeEnd3); - Pair range1 = q.getRangeVar(0, BigInteger.valueOf(0)); - Pair range2 = q.getRangeVar(0, BigInteger.valueOf(1)); - Pair range3 = q.getRangeVar(0, BigInteger.valueOf(2)); + Pair range1 = q.getRangeVar(0, BigInteger.valueOf(0)); + Pair range2 = q.getRangeVar(0, BigInteger.valueOf(1)); + Pair range3 = q.getRangeVar(0, BigInteger.valueOf(2)); - Assert.assertEquals(rangeStart1, range1.getFirst()); - Assert.assertEquals(rangeEnd1, range1.getSecond()); - Assert.assertEquals(rangeStart2, range2.getFirst()); - Assert.assertEquals(rangeEnd2, range2.getSecond()); - Assert.assertEquals(rangeStart3, range3.getFirst()); - Assert.assertEquals(rangeEnd3, range3.getSecond()); + Assert.assertEquals(rangeStart1, range1.getFirst()); + Assert.assertEquals(rangeEnd1, range1.getSecond()); + Assert.assertEquals(rangeStart2, range2.getFirst()); + Assert.assertEquals(rangeEnd2, range2.getSecond()); + Assert.assertEquals(rangeStart3, range3.getFirst()); + Assert.assertEquals(rangeEnd3, range3.getSecond()); + } } @Test @@ -382,34 +365,35 @@ public void testGetRangeVarSize() throws TileDBError { NativeArray d_data = new NativeArray(ctx, 20, Datatype.TILEDB_STRING_ASCII); NativeArray d_off = new NativeArray(ctx, 20, Datatype.TILEDB_UINT64); - Query q = new Query(arr, TILEDB_READ); + try (Query q = new Query(arr, TILEDB_READ)) { - q.setBuffer("d1", d_off, d_data); + q.setBuffer("d1", d_off, d_data); - String rangeStart1 = "aaaaaa"; - String rangeEnd1 = "aaabb"; + String rangeStart1 = "aaaaaa"; + String rangeEnd1 = "aaabb"; - String rangeStart2 = "aaaaaa"; - String rangeEnd2 = "aaabb"; + String rangeStart2 = "aaaaaa"; + String rangeEnd2 = "aaabb"; - String rangeStart3 = "aaaaaa"; - String rangeEnd3 = "aaabb"; + String rangeStart3 = "aaaaaa"; + String rangeEnd3 = "aaabb"; - // Point-query - q.addRangeVar(0, rangeStart1, rangeEnd1); - q.addRangeVar(0, rangeStart2, rangeEnd2); - q.addRangeVar(0, rangeStart3, rangeEnd3); + // Point-query + q.addRangeVar(0, rangeStart1, rangeEnd1); + q.addRangeVar(0, rangeStart2, rangeEnd2); + q.addRangeVar(0, rangeStart3, rangeEnd3); - Pair size1 = q.getRangeVarSize(0, BigInteger.valueOf(0)); - Pair size2 = q.getRangeVarSize(0, BigInteger.valueOf(1)); - Pair size3 = q.getRangeVarSize(0, BigInteger.valueOf(2)); + Pair size1 = q.getRangeVarSize(0, BigInteger.valueOf(0)); + Pair size2 = q.getRangeVarSize(0, BigInteger.valueOf(1)); + Pair size3 = q.getRangeVarSize(0, BigInteger.valueOf(2)); - Assert.assertEquals(rangeStart1.length(), (long) size1.getFirst()); - Assert.assertEquals(rangeEnd1.length(), (long) size1.getSecond()); - Assert.assertEquals(rangeStart2.length(), (long) size2.getFirst()); - Assert.assertEquals(rangeEnd2.length(), (long) size2.getSecond()); - Assert.assertEquals(rangeStart3.length(), (long) size3.getFirst()); - Assert.assertEquals(rangeEnd3.length(), (long) size3.getSecond()); + Assert.assertEquals(rangeStart1.length(), (long) size1.getFirst()); + Assert.assertEquals(rangeEnd1.length(), (long) size1.getSecond()); + Assert.assertEquals(rangeStart2.length(), (long) size2.getFirst()); + Assert.assertEquals(rangeEnd2.length(), (long) size2.getSecond()); + Assert.assertEquals(rangeStart3.length(), (long) size3.getFirst()); + Assert.assertEquals(rangeEnd3.length(), (long) size3.getSecond()); + } } } } diff --git a/src/test/java/io/tiledb/java/api/QuickstartDenseTest.java b/src/test/java/io/tiledb/java/api/QuickstartDenseTest.java index 0776baab..38efe098 100644 --- a/src/test/java/io/tiledb/java/api/QuickstartDenseTest.java +++ b/src/test/java/io/tiledb/java/api/QuickstartDenseTest.java @@ -29,35 +29,26 @@ import static io.tiledb.java.api.Layout.*; import static io.tiledb.java.api.QueryType.*; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Arrays; import java.util.HashMap; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; -@SuppressWarnings("ALL") public class QuickstartDenseTest { + @Rule public TemporaryFolder temp = new TemporaryFolder(); + private Context ctx; - private String arrayURI = "my_dense_array"; + private String arrayURI; private boolean callbackCalled = false; @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("my_dense_array").toString(); } @Test @@ -186,56 +177,57 @@ private void arrayRead() throws Exception { // } // Create query - Query query = new Query(my_dense_array, TILEDB_READ); - query.setLayout(TILEDB_GLOBAL_ORDER); - query.setSubarray(subarray); - query.setBuffer( - "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); - query.setBuffer( - "a2", - new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), - new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); - query.setBuffer( - "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); - - // Submit query - query.submit(); - // System.out.println("Query submitted: " + query.submit() ); - - // Print cell values (assumes all getAttributes are read) - HashMap> result_el = query.resultBufferElements(); - - int[] a1_buff = (int[]) query.getBuffer("a1"); - long[] a2_offsets = (long[]) query.getVarBuffer("a2"); - byte[] a2_data = (byte[]) query.getBuffer("a2"); - float[] a3_buff = (float[]) query.getBuffer("a3"); - - // check a1 - Assert.assertArrayEquals( - a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}); - // check a2 - String[] a2_expected = - new String[] { - "a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh", "i", "jj", "kkk", "llll", "m", "nn", - "ooo", "pppp" - }; - - for (int i = 0; i < a2_offsets.length; i++) { - int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; - String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); - Assert.assertEquals(a2_value, a2_expected[i]); - } + try (Query query = new Query(my_dense_array, TILEDB_READ)) { + query.setLayout(TILEDB_GLOBAL_ORDER); + query.setSubarray(subarray); + query.setBuffer( + "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); + query.setBuffer( + "a2", + new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), + new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); + query.setBuffer( + "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); + + // Submit query + query.submit(); + // System.out.println("Query submitted: " + query.submit() ); - // check a3 - float[] a3_expected = - new float[] { - 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, - 7.2f, 8.1f, 8.2f, 9.1f, 9.2f, 10.1f, 10.2f, 11.1f, 11.2f, 12.1f, 12.2f, 13.1f, 13.2f, - 14.1f, 14.2f, 15.1f, 15.2f - }; - Assert.assertEquals(a3_buff.length, a3_expected.length); - for (int i = 0; i < a3_buff.length; i++) { - Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + // Print cell values (assumes all getAttributes are read) + HashMap> result_el = query.resultBufferElements(); + + int[] a1_buff = (int[]) query.getBuffer("a1"); + long[] a2_offsets = (long[]) query.getVarBuffer("a2"); + byte[] a2_data = (byte[]) query.getBuffer("a2"); + float[] a3_buff = (float[]) query.getBuffer("a3"); + + // check a1 + Assert.assertArrayEquals( + a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}); + // check a2 + String[] a2_expected = + new String[] { + "a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh", "i", "jj", "kkk", "llll", "m", "nn", + "ooo", "pppp" + }; + + for (int i = 0; i < a2_offsets.length; i++) { + int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; + String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); + Assert.assertEquals(a2_value, a2_expected[i]); + } + + // check a3 + float[] a3_expected = + new float[] { + 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, + 7.1f, 7.2f, 8.1f, 8.2f, 9.1f, 9.2f, 10.1f, 10.2f, 11.1f, 11.2f, 12.1f, 12.2f, 13.1f, + 13.2f, 14.1f, 14.2f, 15.1f, 15.2f + }; + Assert.assertEquals(a3_buff.length, a3_expected.length); + for (int i = 0; i < a3_buff.length; i++) { + Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + } } // System.out.println("Result num: " + a1_buff.length ); @@ -264,64 +256,65 @@ private void arrayReadAsync() throws Exception { HashMap> max_sizes = my_dense_array.maxBufferElements(subarray); // Create query - Query query = new Query(my_dense_array, TILEDB_READ); - query.setLayout(TILEDB_GLOBAL_ORDER); - query.setSubarray(subarray); - query.setBuffer( - "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); - query.setBuffer( - "a2", - new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), - new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); - query.setBuffer( - "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); - - // Submit query with callback - query.submitAsync(new ReadCallback()); - - // Wait for query to complete - QueryStatus status; - do { - // Wait till query is done - status = query.getQueryStatus(); - } while (status == QueryStatus.TILEDB_INPROGRESS); - - // Print cell values (assumes all getAttributes are read) - HashMap> result_el = query.resultBufferElements(); - - int[] a1_buff = (int[]) query.getBuffer("a1"); - long[] a2_offsets = (long[]) query.getVarBuffer("a2"); - byte[] a2_data = (byte[]) query.getBuffer("a2"); - float[] a3_buff = (float[]) query.getBuffer("a3"); - - Assert.assertTrue(callbackCalled); - - // check a1 - Assert.assertArrayEquals( - a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}); - // check a2 - String[] a2_expected = - new String[] { - "a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh", "i", "jj", "kkk", "llll", "m", "nn", - "ooo", "pppp" - }; - - for (int i = 0; i < a2_offsets.length; i++) { - int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; - String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); - Assert.assertEquals(a2_value, a2_expected[i]); - } + try (Query query = new Query(my_dense_array, TILEDB_READ)) { + query.setLayout(TILEDB_GLOBAL_ORDER); + query.setSubarray(subarray); + query.setBuffer( + "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); + query.setBuffer( + "a2", + new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), + new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); + query.setBuffer( + "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); + + // Submit query with callback + query.submitAsync(new ReadCallback()); + + // Wait for query to complete + QueryStatus status; + do { + // Wait till query is done + status = query.getQueryStatus(); + } while (status == QueryStatus.TILEDB_INPROGRESS); + + // Print cell values (assumes all getAttributes are read) + HashMap> result_el = query.resultBufferElements(); - // check a3 - float[] a3_expected = - new float[] { - 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, - 7.2f, 8.1f, 8.2f, 9.1f, 9.2f, 10.1f, 10.2f, 11.1f, 11.2f, 12.1f, 12.2f, 13.1f, 13.2f, - 14.1f, 14.2f, 15.1f, 15.2f - }; - Assert.assertEquals(a3_buff.length, a3_expected.length); - for (int i = 0; i < a3_buff.length; i++) { - Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + int[] a1_buff = (int[]) query.getBuffer("a1"); + long[] a2_offsets = (long[]) query.getVarBuffer("a2"); + byte[] a2_data = (byte[]) query.getBuffer("a2"); + float[] a3_buff = (float[]) query.getBuffer("a3"); + + Assert.assertTrue(callbackCalled); + + // check a1 + Assert.assertArrayEquals( + a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}); + // check a2 + String[] a2_expected = + new String[] { + "a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh", "i", "jj", "kkk", "llll", "m", "nn", + "ooo", "pppp" + }; + + for (int i = 0; i < a2_offsets.length; i++) { + int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; + String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); + Assert.assertEquals(a2_value, a2_expected[i]); + } + + // check a3 + float[] a3_expected = + new float[] { + 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, + 7.1f, 7.2f, 8.1f, 8.2f, 9.1f, 9.2f, 10.1f, 10.2f, 11.1f, 11.2f, 12.1f, 12.2f, 13.1f, + 13.2f, 14.1f, 14.2f, 15.1f, 15.2f + }; + Assert.assertEquals(a3_buff.length, a3_expected.length); + for (int i = 0; i < a3_buff.length; i++) { + Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + } } // System.out.println("Result num: " + a1_buff.length ); @@ -345,29 +338,30 @@ private void arrayReadIncomplete() throws Exception { Array my_dense_array = new Array(ctx, arrayURI); // Create query - Query query = new Query(my_dense_array, TILEDB_READ); - query.setLayout(TILEDB_GLOBAL_ORDER); - long[] subarray = {1l, 4l, 1l, 4l}; - query.setSubarray(new NativeArray(ctx, subarray, Long.class)); - query.setBuffer("a1", new NativeArray(ctx, 4, Integer.class)); - - // Loop until the query is completed - - // System.out.println("a1\n---"); - int nsubmits = 0; - do { - // System.out.println("Reading cells..."); - query.submit(); - - int[] a1_buff = (int[]) query.getBuffer("a1"); - int[] a1_expected = - new int[] {nsubmits * 4 + 0, nsubmits * 4 + 1, nsubmits * 4 + 2, nsubmits * 4 + 3}; - Assert.assertArrayEquals(a1_buff, a1_expected); - nsubmits += 1; - // for (int i =0; i< a1_buff.length; i++){ - // System.out.println(a1_buff[i]); - // } - } while (query.getQueryStatus() == QueryStatus.TILEDB_INCOMPLETE); + try (Query query = new Query(my_dense_array, TILEDB_READ)) { + query.setLayout(TILEDB_GLOBAL_ORDER); + long[] subarray = {1l, 4l, 1l, 4l}; + query.setSubarray(new NativeArray(ctx, subarray, Long.class)); + query.setBuffer("a1", new NativeArray(ctx, 4, Integer.class)); + + // Loop until the query is completed + + // System.out.println("a1\n---"); + int nsubmits = 0; + do { + // System.out.println("Reading cells..."); + query.submit(); + + int[] a1_buff = (int[]) query.getBuffer("a1"); + int[] a1_expected = + new int[] {nsubmits * 4 + 0, nsubmits * 4 + 1, nsubmits * 4 + 2, nsubmits * 4 + 3}; + Assert.assertArrayEquals(a1_buff, a1_expected); + nsubmits += 1; + // for (int i =0; i< a1_buff.length; i++){ + // System.out.println(a1_buff[i]); + // } + } while (query.getQueryStatus() == QueryStatus.TILEDB_INCOMPLETE); + } } private class ReadCallback implements Callback { diff --git a/src/test/java/io/tiledb/java/api/QuickstartSparseTest.java b/src/test/java/io/tiledb/java/api/QuickstartSparseTest.java index 03ea1716..5c2107e8 100644 --- a/src/test/java/io/tiledb/java/api/QuickstartSparseTest.java +++ b/src/test/java/io/tiledb/java/api/QuickstartSparseTest.java @@ -32,34 +32,25 @@ import static io.tiledb.java.api.QueryType.TILEDB_READ; import static io.tiledb.java.api.QueryType.TILEDB_WRITE; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Arrays; import java.util.HashMap; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; -@SuppressWarnings("ALL") public class QuickstartSparseTest { + @Rule public TemporaryFolder temp = new TemporaryFolder(); + private Context ctx; - private String arrayURI = "my_sparse_array"; + private String arrayURI; @Before public void setup() throws Exception { ctx = new Context(); - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } - } - - @After - public void teardown() throws Exception { - if (Files.exists(Paths.get(arrayURI))) { - TileDBObject.remove(ctx, arrayURI); - } + arrayURI = temp.getRoot().toPath().resolve("my_sparse_array").toString(); } @Test @@ -144,7 +135,7 @@ public void arrayWrite() throws Exception { private void arrayRead() throws Exception { // Print non-empty getDomain - Array my_sparse_array = new Array(ctx, "my_sparse_array"); + Array my_sparse_array = new Array(ctx, arrayURI); HashMap dom = my_sparse_array.nonEmptyDomain(); Assert.assertEquals(dom.get("d1").getFirst(), 1l); @@ -172,63 +163,64 @@ private void arrayRead() throws Exception { // } // Create query - Query query = new Query(my_sparse_array, TILEDB_READ); - query.setLayout(TILEDB_GLOBAL_ORDER); - query.setSubarray(subarray); - - query.setBuffer( - "d1", - new NativeArray(ctx, max_sizes.get(TILEDB_COORDS).getSecond().intValue(), Long.class)); - - query.setBuffer( - "d2", - new NativeArray(ctx, max_sizes.get(TILEDB_COORDS).getSecond().intValue(), Long.class)); - query.setBuffer( - "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); - query.setBuffer( - "a2", - new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), - new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); - query.setBuffer( - "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); - - // Submit query - query.submit(); - // System.out.println("Query submitted: " + query.submit() ); - - // Print cell values (assumes all getAttributes are read) - HashMap> result_el = query.resultBufferElements(); - long[] d1 = (long[]) query.getBuffer("d1"); - long[] d2 = (long[]) query.getBuffer("d2"); - int[] a1_buff = (int[]) query.getBuffer("a1"); - long[] a2_offsets = (long[]) query.getVarBuffer("a2"); - byte[] a2_data = (byte[]) query.getBuffer("a2"); - float[] a3_buff = (float[]) query.getBuffer("a3"); - - // check coords - Assert.assertArrayEquals(d1, new long[] {1, 1, 1, 2, 3, 4, 3, 3}); - Assert.assertArrayEquals(d2, new long[] {1, 2, 4, 3, 1, 2, 3, 4}); - - // check a1 - Assert.assertArrayEquals(a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7}); - - // check a2 - String[] a2_expected = new String[] {"a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh"}; - for (int i = 0; i < a2_offsets.length; i++) { - int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; - String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); - Assert.assertEquals(a2_value, a2_expected[i]); - } - - // check a3 - float[] a3_expected = - new float[] { - 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, 7.1f, - 7.2f - }; - Assert.assertEquals(a3_buff.length, a3_expected.length); - for (int i = 0; i < a3_buff.length; i++) { - Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + try (Query query = new Query(my_sparse_array, TILEDB_READ)) { + query.setLayout(TILEDB_GLOBAL_ORDER); + query.setSubarray(subarray); + + query.setBuffer( + "d1", + new NativeArray(ctx, max_sizes.get(TILEDB_COORDS).getSecond().intValue(), Long.class)); + + query.setBuffer( + "d2", + new NativeArray(ctx, max_sizes.get(TILEDB_COORDS).getSecond().intValue(), Long.class)); + query.setBuffer( + "a1", new NativeArray(ctx, max_sizes.get("a1").getSecond().intValue(), Integer.class)); + query.setBuffer( + "a2", + new NativeArray(ctx, max_sizes.get("a2").getFirst().intValue(), Datatype.TILEDB_UINT64), + new NativeArray(ctx, max_sizes.get("a2").getSecond().intValue(), String.class)); + query.setBuffer( + "a3", new NativeArray(ctx, max_sizes.get("a3").getSecond().intValue(), Float.class)); + + // Submit query + query.submit(); + // System.out.println("Query submitted: " + query.submit() ); + + // Print cell values (assumes all getAttributes are read) + HashMap> result_el = query.resultBufferElements(); + long[] d1 = (long[]) query.getBuffer("d1"); + long[] d2 = (long[]) query.getBuffer("d2"); + int[] a1_buff = (int[]) query.getBuffer("a1"); + long[] a2_offsets = (long[]) query.getVarBuffer("a2"); + byte[] a2_data = (byte[]) query.getBuffer("a2"); + float[] a3_buff = (float[]) query.getBuffer("a3"); + + // check coords + Assert.assertArrayEquals(d1, new long[] {1, 1, 1, 2, 3, 4, 3, 3}); + Assert.assertArrayEquals(d2, new long[] {1, 2, 4, 3, 1, 2, 3, 4}); + + // check a1 + Assert.assertArrayEquals(a1_buff, new int[] {0, 1, 2, 3, 4, 5, 6, 7}); + + // check a2 + String[] a2_expected = new String[] {"a", "bb", "ccc", "dddd", "e", "ff", "ggg", "hhhh"}; + for (int i = 0; i < a2_offsets.length; i++) { + int end = (i == a2_offsets.length - 1) ? a2_data.length : (int) a2_offsets[i + 1]; + String a2_value = new String(Arrays.copyOfRange(a2_data, (int) a2_offsets[i], end)); + Assert.assertEquals(a2_value, a2_expected[i]); + } + + // check a3 + float[] a3_expected = + new float[] { + 0.1f, 0.2f, 1.1f, 1.2f, 2.1f, 2.2f, 3.1f, 3.2f, 4.1f, 4.2f, 5.1f, 5.2f, 6.1f, 6.2f, + 7.1f, 7.2f + }; + Assert.assertEquals(a3_buff.length, a3_expected.length); + for (int i = 0; i < a3_buff.length; i++) { + Assert.assertEquals(a3_buff[i], a3_expected[i], 0.01f); + } } // System.out.println("Result num: " + a1_buff.length ); diff --git a/src/test/java/io/tiledb/java/api/VFSTest.java b/src/test/java/io/tiledb/java/api/VFSTest.java index 64a18093..56d3eeab 100644 --- a/src/test/java/io/tiledb/java/api/VFSTest.java +++ b/src/test/java/io/tiledb/java/api/VFSTest.java @@ -3,7 +3,7 @@ import java.io.File; import java.net.URI; import java.nio.file.Files; -import java.nio.file.Paths; +import java.nio.file.Path; import java.util.Arrays; import org.junit.Assert; import org.junit.Rule; @@ -62,16 +62,16 @@ public void testVFSIsSupportedFs() throws Exception { public void testVFSIsFile() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - File fooFile = tmp.newFile("foo"); - File barDir = tmp.newFolder("bar"); + Path fooFile = tmp.newFile("foo").toPath(); + Path barDir = tmp.newFolder("bar").toPath(); Assert.assertTrue(vfs.isFile(fooFile.toString())); // workaround for TileDB #1097 - Assert.assertTrue(vfs.isFile(URI.create("file://".concat(fooFile.getPath())))); + Assert.assertTrue(vfs.isFile(new File(fooFile.toUri()).toString())); Assert.assertFalse(vfs.isFile(barDir.toString())); // workaround for TileDB #1097 - Assert.assertFalse(vfs.isFile(URI.create("file://".concat(barDir.getPath())))); + Assert.assertFalse(vfs.isFile(barDir.toUri())); } } @@ -79,16 +79,16 @@ public void testVFSIsFile() throws Exception { public void testVFSIsDir() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - File fooFile = tmp.newFile("foo"); - File barDir = tmp.newFolder("bar"); + Path fooFile = tmp.newFile("foo").toPath(); + Path barDir = tmp.newFolder("bar").toPath(); Assert.assertTrue(vfs.isDirectory(barDir.toString())); // workaround for TileDB #1097 - Assert.assertTrue(vfs.isDirectory(URI.create("file://".concat(barDir.getPath())))); + Assert.assertTrue(vfs.isDirectory(barDir.toUri())); Assert.assertFalse(vfs.isDirectory(fooFile.toString())); // workaround for TileDB #1097 - Assert.assertFalse(vfs.isDirectory(URI.create("file://".concat(fooFile.getPath())))); + Assert.assertFalse(vfs.isDirectory(fooFile.toUri())); } } @@ -96,8 +96,8 @@ public void testVFSIsDir() throws Exception { public void testVFSCreateDirectory() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String dirPath = Paths.get(tmp.getRoot().toString(), "foo").toString(); - String newDir = vfs.createDirectory(dirPath); + Path dirPath = tmp.getRoot().toPath().resolve("foo"); + String newDir = vfs.createDirectory(dirPath.toString()); Assert.assertTrue(vfs.isDirectory(newDir)); } } @@ -106,9 +106,9 @@ public void testVFSCreateDirectory() throws Exception { public void testVFSCreateFile() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String filePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - vfs.createFile(filePath); - Assert.assertTrue(vfs.isFile(filePath)); + Path filePath = tmp.getRoot().toPath().resolve("bar"); + String newFile = vfs.createFile(filePath.toString()); + Assert.assertTrue(vfs.isFile(newFile)); } } @@ -116,9 +116,8 @@ public void testVFSCreateFile() throws Exception { public void testVFSCreateFileURI() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String filePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI fileURI = URI.create("file://".concat(filePath)); - vfs.createFile(fileURI); + Path filePath = tmp.getRoot().toPath().resolve("bar"); + URI fileURI = vfs.createFile(filePath.toUri()); Assert.assertTrue(vfs.isFile(fileURI)); } } @@ -127,13 +126,14 @@ public void testVFSCreateFileURI() throws Exception { public void testVFSRemoveDirectory() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String dirPath = Paths.get(tmp.getRoot().toString(), "bar").toString(); + Path dirPath = tmp.getRoot().toPath().resolve("bar"); - vfs.createDirectory(dirPath); - Assert.assertTrue(vfs.isDirectory(dirPath)); + String newDir = vfs.createDirectory(dirPath.toString()); + Assert.assertTrue(vfs.isDirectory(newDir)); - vfs.removeDirectory(dirPath); - Assert.assertFalse(vfs.isDirectory(dirPath)); + vfs.removeDirectory(newDir); + Assert.assertFalse(vfs.isFile(newDir)); + Assert.assertFalse(vfs.isDirectory(newDir)); } } @@ -141,14 +141,14 @@ public void testVFSRemoveDirectory() throws Exception { public void testVFSRemoveDirectoryURI() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String dirPath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI dirURI = URI.create("file://".concat(dirPath)); + Path dirPath = tmp.getRoot().toPath().resolve("bar"); - vfs.createDirectory(dirURI); - Assert.assertTrue(vfs.isDirectory(dirURI)); + URI newDir = vfs.createDirectory(dirPath.toUri()); + Assert.assertTrue(vfs.isDirectory(newDir)); - vfs.removeDirectory(dirURI); - Assert.assertFalse(vfs.isDirectory(dirURI)); + vfs.removeDirectory(newDir); + Assert.assertFalse(vfs.isFile(newDir)); + Assert.assertFalse(vfs.isDirectory(newDir)); } } @@ -156,13 +156,14 @@ public void testVFSRemoveDirectoryURI() throws Exception { public void testVFSRemoveFile() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String filePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); + Path filePath = tmp.getRoot().toPath().resolve("bar"); - vfs.createFile(filePath); - Assert.assertTrue(vfs.isFile(filePath)); + String newFile = vfs.createFile(filePath.toString()); + Assert.assertTrue(vfs.isFile(newFile)); - vfs.removeFile(filePath); - Assert.assertFalse(vfs.isFile(filePath)); + vfs.removeFile(newFile); + Assert.assertFalse(vfs.isFile(newFile)); + Assert.assertFalse(vfs.isDirectory(newFile)); } } @@ -170,14 +171,14 @@ public void testVFSRemoveFile() throws Exception { public void testVFSRemoveFileURI() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String filePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI fileURI = URI.create("file://".concat(filePath)); + Path filePath = tmp.getRoot().toPath().resolve("bar"); - vfs.createFile(fileURI); - Assert.assertTrue(vfs.isFile(fileURI)); + URI newFile = vfs.createFile(filePath.toUri()); + Assert.assertTrue(vfs.isFile(newFile)); - vfs.removeFile(fileURI); - Assert.assertFalse(vfs.isFile(fileURI)); + vfs.removeFile(newFile); + Assert.assertFalse(vfs.isFile(newFile)); + Assert.assertFalse(vfs.isDirectory(newFile)); } } @@ -185,11 +186,12 @@ public void testVFSRemoveFileURI() throws Exception { public void testVFSFileSize() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String filePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - vfs.createFile(filePath); - Assert.assertEquals(vfs.fileSize(filePath), 0L); - Files.write(Paths.get(filePath), new byte[] {1, 2, 3}); - Assert.assertEquals(vfs.fileSize(filePath), 3L); + Path filePath = tmp.getRoot().toPath().resolve("bar"); + + String newFile = vfs.createFile(filePath.toString()); + Assert.assertEquals(vfs.fileSize(newFile), 0L); + Files.write(filePath, new byte[] {1, 2, 3}); + Assert.assertEquals(vfs.fileSize(newFile), 3L); } } @@ -198,15 +200,15 @@ public void testVFSDirectoryMove() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { // create directory - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - vfs.createDirectory(sourcePath); - Assert.assertTrue(vfs.isDirectory(sourcePath)); + Path sourcePath = tmp.getRoot().toPath().resolve("bar"); + vfs.createDirectory(sourcePath.toString()); + Assert.assertTrue(vfs.isDirectory(sourcePath.toString())); // rename, move directory - String destPath = Paths.get(tmp.getRoot().toString(), "baz").toString(); - vfs.moveDirectory(sourcePath, destPath); - Assert.assertFalse(vfs.isDirectory(sourcePath)); - Assert.assertTrue(vfs.isDirectory(destPath)); + Path destPath = tmp.getRoot().toPath().resolve("baz"); + vfs.moveDirectory(sourcePath.toString(), destPath.toString()); + Assert.assertFalse(vfs.isDirectory(sourcePath.toString())); + Assert.assertTrue(vfs.isDirectory(destPath.toString())); } } @@ -215,15 +217,13 @@ public void testVFSDirectoryMoveURI() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { // create directory - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI sourceURI = URI.create("file://".concat(sourcePath)); - vfs.createDirectory(sourceURI); + Path sourcePath = tmp.getRoot().toPath().resolve("bar"); + URI sourceURI = vfs.createDirectory(sourcePath.toUri()); Assert.assertTrue(vfs.isDirectory(sourceURI)); // rename, move directory - String destPath = Paths.get(tmp.getRoot().toString(), "baz").toString(); - URI destURI = URI.create("file://".concat(destPath)); - vfs.moveDirectory(sourceURI, destURI); + Path destPath = tmp.getRoot().toPath().resolve("baz"); + URI destURI = vfs.moveDirectory(sourceURI, destPath.toUri()); Assert.assertFalse(vfs.isDirectory(sourceURI)); Assert.assertTrue(vfs.isDirectory(destURI)); } @@ -234,15 +234,15 @@ public void testVFSFileMove() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { // create file - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - vfs.createFile(sourcePath); - Assert.assertTrue(vfs.isFile(sourcePath)); + Path sourcePath = tmp.getRoot().toPath().resolve("bar"); + vfs.createFile(sourcePath.toString()); + Assert.assertTrue(vfs.isFile(sourcePath.toString())); // rename, move file - String destPath = Paths.get(tmp.getRoot().toString(), "baz").toString(); - vfs.moveFile(sourcePath, destPath); - Assert.assertFalse(vfs.isFile(sourcePath)); - Assert.assertTrue(vfs.isFile(destPath)); + Path destPath = tmp.getRoot().toPath().resolve("baz"); + vfs.moveFile(sourcePath.toString(), destPath.toString()); + Assert.assertFalse(vfs.isFile(sourcePath.toString())); + Assert.assertTrue(vfs.isFile(destPath.toString())); } } @@ -251,15 +251,13 @@ public void testVFSFileMoveURI() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { // create file - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI sourceURI = URI.create("file://".concat(sourcePath)); - vfs.createFile(sourceURI); + Path sourcePath = tmp.getRoot().toPath().resolve("bar"); + URI sourceURI = vfs.createFile(sourcePath.toUri()); Assert.assertTrue(vfs.isFile(sourceURI)); // rename, move file - String destPath = Paths.get(tmp.getRoot().toString(), "baz").toString(); - URI destURI = URI.create("file://".concat(destPath)); - vfs.moveFile(sourceURI, destURI); + Path destPath = tmp.getRoot().toPath().resolve("baz"); + URI destURI = vfs.moveFile(sourceURI, destPath.toUri()); Assert.assertFalse(vfs.isFile(sourceURI)); Assert.assertTrue(vfs.isFile(destURI)); } @@ -269,7 +267,7 @@ public void testVFSFileMoveURI() throws Exception { public void testVFSWriteRead() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); + String sourcePath = tmp.getRoot().toPath().resolve("bar").toString(); vfs.write(sourcePath, new byte[] {1, 2, 3}); Assert.assertEquals(vfs.fileSize(sourcePath), 3L); byte[] resultBytes = vfs.readAllBytes(sourcePath); @@ -286,9 +284,8 @@ public void testVFSWriteRead() throws Exception { public void testVFSWriteReadEmpty() throws Exception { try (Context ctx = new Context(); VFS vfs = new VFS(ctx)) { - String sourcePath = Paths.get(tmp.getRoot().toString(), "bar").toString(); - URI sourceURI = URI.create("file://".concat(sourcePath)); - vfs.write(sourceURI, new byte[] {}); + Path sourcePath = tmp.getRoot().toPath().resolve("bar"); + URI sourceURI = vfs.write(sourcePath.toUri(), new byte[] {}); Assert.assertEquals(vfs.fileSize(sourceURI), 0L); byte[] resultBytes = vfs.readAllBytes(sourceURI); Assert.assertTrue(Arrays.equals(new byte[] {}, resultBytes)); diff --git a/swig/customCode/NativeLibLoader.java b/swig/customCode/NativeLibLoader.java index 69ac316e..c3ea5413 100644 --- a/swig/customCode/NativeLibLoader.java +++ b/swig/customCode/NativeLibLoader.java @@ -27,9 +27,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFileAttributeView; +import java.nio.file.attribute.PosixFilePermission; +import java.util.Comparator; import java.util.Locale; import java.util.Properties; -import java.util.UUID; +import java.util.Set; +import java.util.stream.Stream; /** Helper class that finds native libraries embedded as resources and loads them dynamically. */ public class NativeLibLoader { @@ -39,6 +45,27 @@ public class NativeLibLoader { /** Path (relative to jar) where native libraries are located. */ private static final String LIB_RESOURCE_DIR = "/lib"; + /** Temporary directory where native libraries will be extracted. */ + private static Path tempDir; + + static { + try { + tempDir = Files.createTempDirectory("tileDbNativeLibLoader"); + } catch (IOException e) { + e.printStackTrace(System.err); + } + Runtime.getRuntime() + .addShutdownHook( + new Thread( + () -> { + try (Stream walk = Files.walk(tempDir)) { + walk.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } catch (IOException e) { + e.printStackTrace(System.err); + } + })); + } + /** Finds and loads native TileDB. */ static void loadNativeTileDB() { try { @@ -51,6 +78,18 @@ static void loadNativeTileDB() { } } + /** Finds and loads native Intel Thread Building Blocks. */ + static void loadNativeTBB() { + try { + loadNativeLib("tbb", true); + } catch (java.lang.UnsatisfiedLinkError e) { + // If a native library fails to link, we fall back to depending on the system + // dynamic linker to satisfy the requirement. Therefore, we do nothing here + // (if the library is not available via the system linker, a runtime error + // will occur later). + } + } + /** Finds and loads native TileDB JNI. */ static void loadNativeTileDBJNI() { try { @@ -206,56 +245,38 @@ private static String getOSClassifier() { * * @param libraryDir Path of directory containing native library * @param libraryName Name of native library - * @param targetDir Path of target directory to extract library to * @param mapLibraryName If true, transform libraryName with System.mapLibraryName * @return File pointing to the extracted library */ - private static File extractLibraryFile( - String libraryDir, String libraryName, String targetDir, boolean mapLibraryName) { + private static Path extractLibraryFile( + String libraryDir, String libraryName, boolean mapLibraryName) { String libraryFileName = mapLibraryName ? System.mapLibraryName(libraryName) : libraryName; - String nativeLibraryFilePath = new File(libraryDir, libraryFileName).getAbsolutePath(); - - // Attach UUID to the native library file to ensure multiple class loaders can read the - // native lib multiple times. - String uuid = UUID.randomUUID().toString(); - String extractedLibFileName = String.format("%s-%s-%s", libraryName, uuid, libraryFileName); - File extractedLibFile = new File(targetDir, extractedLibFileName); + String nativeLibraryFilePath = libraryDir + "/" + libraryFileName; + Path extractedLibFile = tempDir.resolve(libraryFileName); try { // Extract a native library file into the target directory - InputStream reader = null; - FileOutputStream writer = null; - try { - reader = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); - try { - writer = new FileOutputStream(extractedLibFile); + try (InputStream reader = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); + FileOutputStream writer = new FileOutputStream(extractedLibFile.toFile())) { - byte[] buffer = new byte[8192]; - int bytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); - } - } finally { - if (writer != null) { - writer.close(); - } - } - } finally { - if (reader != null) { - reader.close(); + byte[] buffer = new byte[8192]; + int bytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); } - - // Delete the extracted lib file on JVM exit. - extractedLibFile.deleteOnExit(); } - // Set executable (x) flag to enable Java to load the native library - boolean success = - extractedLibFile.setReadable(true) - && extractedLibFile.setWritable(true, true) - && extractedLibFile.setExecutable(true); - if (!success) { - // Setting file flag may fail, but in this case another error will be thrown in later phase + // Set executable (x) flag to enable Java to load the native library on + // UNIX platforms + PosixFileAttributeView view = + Files.getFileAttributeView(extractedLibFile, PosixFileAttributeView.class); + if (view != null) { + // On a UNIX platform + Set permissions = view.readAttributes().permissions(); + permissions.add(PosixFilePermission.OWNER_READ); + permissions.add(PosixFilePermission.OWNER_WRITE); + permissions.add(PosixFilePermission.OWNER_EXECUTE); + view.setPermissions(permissions); } // Check whether the contents are properly copied from the resource folder @@ -264,7 +285,7 @@ private static File extractLibraryFile( InputStream extractedLibIn = null; try { nativeIn = NativeLibLoader.class.getResourceAsStream(nativeLibraryFilePath); - extractedLibIn = new FileInputStream(extractedLibFile); + extractedLibIn = new FileInputStream(extractedLibFile.toFile()); if (!contentsEquals(nativeIn, extractedLibIn)) { throw new IOException( @@ -280,7 +301,7 @@ private static File extractLibraryFile( } } - return new File(targetDir, extractedLibFileName); + return extractedLibFile; } catch (IOException e) { e.printStackTrace(System.err); return null; @@ -294,27 +315,18 @@ private static File extractLibraryFile( * @param mapLibraryName If true, transform libraryName with System.mapLibraryName * @return File pointing to the extracted library */ - private static File findNativeLibrary(String libraryName, boolean mapLibraryName) { + private static Path findNativeLibrary(String libraryName, boolean mapLibraryName) { String mappedLibraryName = mapLibraryName ? System.mapLibraryName(libraryName) : libraryName; - String libDir = new File(LIB_RESOURCE_DIR, getOSClassifier()).getAbsolutePath(); - File libPath = new File(libDir, mappedLibraryName); + String libDir = LIB_RESOURCE_DIR + "/" + getOSClassifier(); + String libPath = libDir + "/" + mappedLibraryName; - boolean hasNativeLib = hasResource(libPath.getAbsolutePath()); + boolean hasNativeLib = hasResource(libPath); if (!hasNativeLib) { return null; } - // Temporary folder for the extracted native lib. - File tempFolder = new File(System.getProperty("java.io.tmpdir")); - if (!tempFolder.exists()) { - boolean created = tempFolder.mkdirs(); - if (!created) { - // if created == false, it will fail eventually in the later part - } - } - // Extract and load a native library inside the jar file - return extractLibraryFile(libDir, libraryName, tempFolder.getAbsolutePath(), mapLibraryName); + return extractLibraryFile(libDir, libraryName, mapLibraryName); } /** @@ -324,10 +336,10 @@ private static File findNativeLibrary(String libraryName, boolean mapLibraryName * @param mapLibraryName If true, transform libraryName with System.mapLibraryName */ private static void loadNativeLib(String libraryName, boolean mapLibraryName) { - File nativeLibFile = findNativeLibrary(libraryName, mapLibraryName); + Path nativeLibFile = findNativeLibrary(libraryName, mapLibraryName); if (nativeLibFile != null) { // Load extracted or specified native library. - System.load(nativeLibFile.getAbsolutePath()); + System.load(nativeLibFile.toString()); } else { // Try loading preinstalled library (in the path -Djava.library.path) System.loadLibrary(libraryName); diff --git a/swig/tiledb.i b/swig/tiledb.i index 858767f2..88f010ed 100644 --- a/swig/tiledb.i +++ b/swig/tiledb.i @@ -7,6 +7,7 @@ import io.tiledb.libtiledb.NativeLibLoader; %pragma(java) jniclasscode=%{ static { try { + NativeLibLoader.loadNativeTBB(); NativeLibLoader.loadNativeTileDB(); NativeLibLoader.loadNativeTileDBJNI(); } catch (Exception e) {