diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml
new file mode 100644
index 0000000000..318f4b7460
--- /dev/null
+++ b/persistence-modules/java-harperdb/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ java-harperdb
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 9
+
+
+
+
+
+
+ com.baeldung
+ persistence-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ com.baeldung
+ java-harperdb
+ ${haperdb-driver.version}
+ system
+ ${project.basedir}/lib/cdata.jdbc.harperdb.jar
+
+
+ org.testcontainers
+ testcontainers
+ test
+
+
+ org.apache.derby
+ derby
+ 10.13.1.1
+
+
+
+
+
+
+ org.testcontainers
+ testcontainers-bom
+ 1.19.3
+ pom
+ import
+
+
+
+
+
+ 4.2
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/main/resources/data-model.puml b/persistence-modules/java-harperdb/src/main/resources/data-model.puml
new file mode 100644
index 0000000000..8e3681c749
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/main/resources/data-model.puml
@@ -0,0 +1,41 @@
+@startuml
+'https://gist.github.com/QuantumGhost/0955a45383a0b6c0bc24f9654b3cb561
+' uncomment the line below if you're using computer with a retina display
+' skinparam dpi 300
+!theme sketchy-outline
+!define Table(name,desc) class name as "desc" << (T, #63b175) >>
+' we use bold for primary key
+' green color for unique
+' and underscore for not_null
+!define primary_key(x) x
+!define unique(x) x
+!define not_null(x) x
+' other tags available:
+'
+' , where color is a color name or html color code
+' (#FFAACC)
+' see: http://plantuml.com/classes.html#More
+hide methods
+hide stereotypes
+
+' entities
+
+
+Table(Teacher, "Teacher") {
+ primary_key(Id) Number
+ Name Varchar
+ joining_date Date
+}
+Table(Subject, "Subject") {
+ primary_key(Id) Number
+ Name Varchar
+}
+Table(Teacher_Details, "Teacher_Details") {
+ primary_key(Id) Number
+ teacher_id Number
+ subject_id Number
+}
+
+Teacher_Details "*" -left-> "1" Subject: " "
+Teacher "1" -left-> "*" Teacher_Details: " "
+@enduml
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java
new file mode 100644
index 0000000000..361e17bd83
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java
@@ -0,0 +1,78 @@
+package com.baeldung.harperdb;
+
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity;
+import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Base64;
+
+public class HarperDBApiService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class);
+ private String url;
+ private String base64auth;
+
+ public HarperDBApiService(String url, String user, String password) {
+ this.url = url;
+ this.base64auth = Base64.getEncoder()
+ .encodeToString(new StringBuilder().append(user)
+ .append(":")
+ .append(password)
+ .toString()
+ .getBytes());
+ }
+
+ public void createSchema(String schema) throws IOException {
+ String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}";
+ executeHttpPostRequest(requestBody);
+ }
+
+ public void createTable(String schema, String table, String ... attributes) throws IOException {
+ String createTableReq = "{\"operation\":\"create_table\","
+ + "\"schema\":\"" + schema
+ + "\",\"table\":\"" + table
+ + "\",\"hash_attribute\":\"id\""
+ + "}";
+ executeHttpPostRequest(createTableReq);
+ LOGGER.info("created table:" + table);
+ for (String attribute : attributes) {
+ String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\""
+ + schema + "\",\"table\":\""
+ + table + "\",\"attribute\":\""
+ + attribute + "\""
+ + "}";
+ executeHttpPostRequest(createAttrReq);
+ LOGGER.info("created attribute:" + attribute + " in table:" + table);
+ }
+ }
+
+ public void insertRecords(String schema, String table, String records) throws IOException {
+ String requestBody = "{\"table\":" + "\"" + table + "\","
+ + "\"schema\":" + "\"" + schema + "\"" + ","
+ + "\"operation\":" + "\"" + "insert" + "\"" + ","
+ + "\"records\":" + records
+ + "}";
+ executeHttpPostRequest(requestBody);
+ }
+
+ private void executeHttpPostRequest(String httpRequest) throws IOException {
+ LOGGER.info("Post request body:" + httpRequest);
+
+ try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
+ .build()) {
+ HttpPost request = new HttpPost(this.url);
+ request.addHeader("Authorization", "Basic " + this.base64auth);
+ request.addHeader("Content-Type", "application/json");
+ request.setEntity((HttpEntity) new StringEntity(httpRequest));
+ CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request);
+ LOGGER.info("REST API response:" + response.toString());
+ assert (200 == response.getCode());
+ }
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java
new file mode 100644
index 0000000000..12ef87fa99
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java
@@ -0,0 +1,36 @@
+package com.baeldung.harperdb;
+
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+
+public class HarperDBContainer {
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class);
+
+ private static final Map DEFAULT_ENV_MAP = Map.of("HDB_ADMIN_USERNAME", "admin", "HDB_ADMIN_PASSWORD", "password",
+ "OPERATIONSAPI_NETWORK_PORT", "9925", "ROOTPATH", "/home/harperdb/hdb", "LOGGING_STDSTREAMS", "true");
+
+ private static final Integer[] DEFAULT_EXPOSED_PORTS = { 9925, 9926 };
+
+ private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest";
+
+ public void stop() {
+ harperDBContainer.stop();
+ }
+
+ GenericContainer harperDBContainer;
+
+ public GenericContainer installHarperDB() {
+ harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE).withEnv(DEFAULT_ENV_MAP)
+ .withExposedPorts(DEFAULT_EXPOSED_PORTS);
+ return harperDBContainer;
+ }
+
+ public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer... exposedPorts) {
+ return new GenericContainer(dockerImgage).withEnv(envMap)
+ .withExposedPorts(exposedPorts);
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java
new file mode 100644
index 0000000000..34d2f8d29b
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java
@@ -0,0 +1,379 @@
+package com.baeldung.harperdb;
+
+import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.sql.*;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class HarperDBLiveTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class);
+
+ private static Integer port;
+
+ private static HarperDBContainer harperDBContainer;
+
+ private static HarperDBApiService harperDbApiService;
+
+ @BeforeAll
+ static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException {
+ installHarperDB();
+ initHarperDBApiService();
+ setupDB();
+ }
+
+ private static void installHarperDB() {
+ harperDBContainer = new HarperDBContainer();
+
+ GenericContainer genericContainer = harperDBContainer.installHarperDB();
+
+ genericContainer.start();
+
+ port = genericContainer.getFirstMappedPort();
+ }
+
+ private static void initHarperDBApiService() {
+ String url = "http://localhost:" + port + "/";
+ harperDbApiService = new HarperDBApiService(url, "admin", "password");
+ }
+
+ private static void setupDB() throws IOException {
+ harperDbApiService.createSchema("Demo");
+
+ harperDbApiService.createTable("Demo", "Subject", "name");
+ harperDbApiService.createTable("Demo", "Teacher", "name", "joining_date", "subject_id");
+ harperDbApiService.createTable("Demo", "Teacher_Details", "teacher_id", "subject_id");
+
+ insertSubjectRecords();
+ insertTeacherRecords();
+ insertTeacherDetailsRecords();
+ }
+
+ private static void insertSubjectRecords() throws IOException {
+ String records = "["
+ + "{\"id\":1, \"name\":\"English\"},"
+ + "{\"id\":2, \"name\":\"Maths\"},"
+ + "{\"id\":3, \"name\":\"Science\"}"
+ + "]";
+
+ harperDbApiService.insertRecords("Demo", "Subject", records);
+ }
+
+ private static void insertTeacherRecords() throws IOException {
+ String records = "[" + "{\"id\":1, \"name\":\"James Cameron\", \"joining_date\":\"04-05-2000\"}," +
+ "{\"id\":2, \"name\":\"Joe Biden\", \"joining_date\":\"20-10-2005\"}," +
+ "{\"id\":3, \"name\":\"Jessie Williams\", \"joining_date\":\"04-06-1997\"}," +
+ "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," +
+ "{\"id\":5, \"name\":\"Eric Johnson\", \"joining_date\":\"04-05-2022\"}," +
+ "{\"id\":6, \"name\":\"Raghu Yadav\", \"joining_date\":\"02-02-1999\"}" + "]";
+ harperDbApiService.insertRecords("Demo", "Teacher", records);
+ }
+
+ private static void insertTeacherDetailsRecords() throws IOException {
+ String records = "[" + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," +
+ "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," +
+ "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," +
+ "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," +
+ "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + "]";
+
+ harperDbApiService.insertRecords("Demo", "Teacher_Details", records);
+ }
+
+ @AfterAll
+ static void stopHarperDB() {
+ harperDBContainer.stop();
+ }
+
+ @Test
+ void whenConnectionInfoInURL_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+
+ try (Connection connection = DriverManager.getConnection(JDBC_URL)) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenConnectionInfoInProperties_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ Properties prop = new Properties();
+ prop.setProperty("Server", "127.0.0.1:" + port);
+ prop.setProperty("User", "admin");
+ prop.setProperty("Password", "password");
+
+ try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenConnectionPooling_thenConnectSuccess() {
+ assertDoesNotThrow(() -> {
+ HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource();
+ final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+ harperdbPoolDataSource.setURL(JDBC_URL);
+
+ try (Connection connection = harperdbPoolDataSource.getPooledConnection()
+ .getConnection()) {
+ connection.createStatement()
+ .executeQuery("select 1");
+ logger.info("Connection Pool Successful");
+ }
+ });
+ }
+
+ @Test
+ void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException {
+ final String CREATE_TABLE_PROC = "CreateTable";
+ try (Connection connection = getConnection()) {
+ CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_PROC);
+
+ callableStatement.setString("SchemaName", "prod");
+ callableStatement.setString("TableName", "subject");
+ callableStatement.setString("PrimaryKey", "id");
+ Boolean result = callableStatement.execute();
+
+ ResultSet resultSet = callableStatement.getResultSet();
+
+ while (resultSet.next()) {
+ String tableCreated = resultSet.getString("Success");
+ assertEquals("true", tableCreated);
+ logger.info("Table Created Successfully");
+ }
+ }
+ }
+
+ @Test
+ void givenStatement_whenInsertRecord_thenSuccess() throws SQLException {
+ final String INSERT_SQL = "insert into Demo.Subject(id, name) values "
+ + "(4, 'Social Studies'),"
+ + "(5, 'Geography')";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(INSERT_SQL));
+ assertEquals(2, statement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException {
+ final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values"
+ + "(?, ?, ?)";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL);
+ preparedStatement.setInt(1, 7);
+ preparedStatement.setString(2, "Bret Lee");
+ preparedStatement.setString(3, "07-08-2002");
+ preparedStatement.addBatch();
+
+ preparedStatement.setInt(1, 8);
+ preparedStatement.setString(2, "Sarah Glimmer");
+ preparedStatement.setString(3, "07-08-1997");
+ preparedStatement.addBatch();
+
+ int[] recordsInserted = preparedStatement.executeBatch();
+
+ assertEquals(2, Arrays.stream(recordsInserted).sum());
+ }
+ }
+
+ private static Connection getConnection() throws SQLException {
+ String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;";
+ return DriverManager.getConnection(URL);
+ }
+
+ private static Connection getConnection(Map properties) throws SQLException {
+ Properties prop = new Properties();
+ prop.setProperty("Server", "127.0.0.1:" + port);
+ prop.setProperty("User", "admin");
+ prop.setProperty("Password", "password");
+ for (Map.Entry entry : properties.entrySet()) {
+ prop.setProperty(entry.getKey(), entry.getValue());
+ }
+
+ return DriverManager.getConnection("jdbc:harperdb:", prop);
+ }
+
+ @Test
+ void givenStatement_whenFetchRecord_thenSuccess() throws SQLException {
+ final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(SQL_QUERY);
+ while (resultSet.next()) {
+ Integer id = resultSet.getInt("id");
+ String name = resultSet.getString("name");
+ assertNotNull(id);
+ assertEquals("Maths", name);
+ logger.info("Subject id:" + id + " Subject Name:" + name);
+ }
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenExecuteJoinQuery_thenSuccess() throws SQLException {
+ final String JOIN_QUERY = "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name "
+ + "from Demo.Teacher_Details AS td "
+ + "INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id "
+ + "INNER JOIN Demo.Subject AS s on s.id = td.subject_id "
+ + "where t.name = ?";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(JOIN_QUERY);
+ preparedStatement.setString(1, "Eric Johnson");
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while (resultSet.next()) {
+ String teacherName = resultSet.getString("teacher_name");
+ String subjectName = resultSet.getString("subject_name");
+ String joiningDate = resultSet.getString("joining_date");
+ assertEquals("Eric Johnson", teacherName);
+ assertEquals("Maths", subjectName);
+ logger.info("Teacher Name:" + teacherName + " Subject Name:" + subjectName + " Joining Date:" + joiningDate);
+ }
+ }
+ }
+
+ @Test
+ void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException {
+ final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = 2 "
+ + "where teacher_id in (2, 5)";
+ final String UPDATE_SQL_WITH_SUB_QUERY = "update Demo.Teacher_Details "
+ + "set subject_id = (select id from Demo.Subject where name = 'Maths') "
+ + "where teacher_id in (select id from Demo.Teacher where name in ('Joe Biden', 'Eric Johnson'))";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(UPDATE_SQL));
+ assertEquals(2, statement.getUpdateCount());
+ }
+
+ try (Connection connection = getConnection()) {
+ assertThrows(SQLException.class, () -> connection.createStatement().execute(UPDATE_SQL_WITH_SUB_QUERY));
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException {
+ final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = ? "
+ + "where teacher_id in (?, ?)";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL);
+ preparedStatement.setInt(1, 1);
+ //following is not supported by the HarperDB driver
+ //Integer[] teacherIds = {4, 5};
+ //Array teacherIdArray = connection.createArrayOf(Integer.class.getTypeName(), teacherIds);
+ preparedStatement.setInt(2, 4);
+ preparedStatement.setInt(3, 5);
+ assertDoesNotThrow(() -> preparedStatement.execute());
+ assertEquals(2, preparedStatement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException {
+ final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = 6 and subject_id = 3";
+
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> statement.execute(DELETE_SQL));
+ assertEquals(1, statement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException {
+ final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = ? and subject_id = ?";
+
+ try (Connection connection = getConnection()) {
+ PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL);
+ preparedStatement.setInt(1, 6);
+ preparedStatement.setInt(2, 2);
+ assertDoesNotThrow(() -> preparedStatement.execute());
+ assertEquals(1, preparedStatement.getUpdateCount());
+ }
+ }
+
+ @Test
+ void givenTempTable_whenInsertIntoSelectTempTable_thenSuccess() throws SQLException {
+ try (Connection connection = getConnection()) {
+ Statement statement = connection.createStatement();
+ assertDoesNotThrow(() -> {
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('12', 'David Flinch', '04-04-2014')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('13', 'Stephen Hawkins', '04-07-2017')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('14', 'Albert Einstein', '12-08-2020')");
+ statement.execute("insert into Teacher#TEMP(id, name, joining_date) "
+ + "values('15', 'Leo Tolstoy', '20-08-2022')");
+ });
+ assertDoesNotThrow(() -> statement.execute("insert into Demo.Teacher(id, name, joining_date) "
+ + "select id, name, joining_date from Teacher#TEMP"));
+ ResultSet resultSet = statement.executeQuery("select count(id) as rows from Demo.Teacher where id in"
+ + " (12, 13, 14, 15)");
+ resultSet.next();
+ int totalRows = resultSet.getInt("rows");
+ logger.info("total number of rows fetched:" + totalRows);
+ assertEquals(4, totalRows);
+ }
+ }
+
+ @Test
+ void givenUserDefinedView_whenQueryView_thenSuccess() throws SQLException {
+ URL url = ClassLoader.getSystemClassLoader().getResource("UserDefinedViews.json");
+
+ String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/'));
+
+ try(Connection connection = getConnection(Map.of("Location", folderPath))) {
+ PreparedStatement preparedStatement = connection.prepareStatement("select teacher_name,subject_name"
+ + " from UserViews.View_Teacher_Details where subject_name = ?");
+ preparedStatement.setString(1, "Science");
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while(resultSet.next()) {
+ assertEquals("Science", resultSet.getString("subject_name"));
+ logger.info("Science Teacher Name:" + resultSet.getString("teacher_name"));
+ }
+ }
+ }
+
+ @Test
+ void givenAutoCache_whenQuery_thenSuccess() throws SQLException {
+ URL url = ClassLoader.getSystemClassLoader().getResource("test.db");
+ String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/'));
+ logger.info("Cache Location:" + folderPath);
+ try(Connection connection = getConnection(Map.of("AutoCache", "true", "CacheLocation", folderPath))) {
+ PreparedStatement preparedStatement = connection.prepareStatement("select id, name from Demo.Subject");
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while(resultSet.next()) {
+ logger.info("Subject Name:" + resultSet.getString("name"));
+ }
+ }
+ }
+}
diff --git a/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json
new file mode 100644
index 0000000000..fba67def3c
--- /dev/null
+++ b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json
@@ -0,0 +1,5 @@
+{
+ "View_Teacher_Details": {
+ "query": "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name from Demo.Teacher_Details AS td INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id INNER JOIN Demo.Subject AS s on s.id = td.subject_id"
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/java-harperdb/src/test/resources/test.db b/persistence-modules/java-harperdb/src/test/resources/test.db
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/pom.xml b/pom.xml
index 167509d2b3..a45814cdae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -817,6 +817,7 @@
pdf
performance-tests
persistence-modules
+ persistence-modules/java-harperdb
persistence-modules/spring-data-neo4j
protobuffer
quarkus-modules