From a6b6eb25425a103ba49ea4ef16265aaf38181935 Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Wed, 23 May 2018 13:18:21 +0200
Subject: Work around H2 bug in operation.list()

---
 .../groupphase/einsatzverwaltung/dao/DBOperationDAO.java | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

(limited to 'src/main/java')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java
index bb6fb27..143fdd6 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java
@@ -24,6 +24,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Repository;
@@ -221,16 +222,25 @@ public class DBOperationDAO implements OperationDAO {
 
     @Override
     public Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException {
-        String sql = "SELECT * FROM Operation WHERE status IN (?)";
+        // This hack exists because H2 currently has a bug that prevents IN (?) with an array of
+        // ids, i.e. pstmt.setArray(1, con.createArrayOf("INT", intarray) from working. See
+        // commented code below.
+        String str =
+                statuses.stream()
+                        .map(Enum::name)
+                        .map(s -> "'" + s + "'")
+                        .collect(Collectors.joining(","));
+        String sql = "SELECT * FROM Operation WHERE status IN (" + str + ")";
         Set<Operation> operations = new HashSet<>();
 
         try {
             Connection con = jdbcConnectionManager.getConnection();
 
             try (PreparedStatement pstmt = con.prepareStatement(sql)) {
-                Object[] arr = statuses.stream().map(Enum::ordinal).toArray();
-                pstmt.setArray(1, con.createArrayOf("INTEGER", arr));
+                // Object[] arr = statuses.stream().map(Enum::ordinal).toArray();
+                // pstmt.setArray(1, con.createArrayOf("INT", arr));
 
+                // TODO: this should set the vehicles as well
                 try (ResultSet rs = pstmt.executeQuery()) {
                     while (rs.next()) operations.add(operationFromRS(rs));
                 }
-- 
cgit v1.2.3-70-g09d2