diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java index b4ad5da0fe2e00f420d0b2e90f9dbfed1892bcb3..b9fe03dd330e66073edfcd8c238c5ce7b3306b8a 100644 --- a/src/main/java/org/caosdb/server/query/Query.java +++ b/src/main/java/org/caosdb/server/query/Query.java @@ -800,17 +800,24 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac } cachable = false; try (final Statement stmt = this.getConnection().createStatement()) { + // final ResultSet rs = stmt.executeQuery("SELECT id from `" + resultSet + "`"); + String logstr = ""; final String query = ("SELECT t1.id, entity_acl.acl from (select entities.id, entities.acl from entities where id in (select id from `" + resultSet + "`) ) as t1 inner join entity_acl on t1.acl=entity_acl.id;"); + logstr += "SQL query: " + query + "\n"; + long begin_t = System.currentTimeMillis(); final ResultSet rs = stmt.executeQuery(query); final HashMap<String, Boolean> acl_cache = new HashMap<String, Boolean>(); final List<Integer> toBeDeleted = new LinkedList<Integer>(); final List<Integer> allrs = new ArrayList<Integer>(); + logstr += "Got rs: " + (System.currentTimeMillis() - begin_t) + " s\n"; + long count = 0; + long count2 = 0; // @todo here, we must operate on sql site. only retrieve different permissions while (rs.next()) { final long t1 = System.currentTimeMillis(); @@ -818,10 +825,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac if (id <= 99) { continue; } + count2 += 1; allrs.add(id); final String acl_str = bytes2UTF8(rs.getBytes("ACL")); if (!acl_cache.containsKey(acl_str)) { + count += 1; acl_cache.put( acl_str, EntityACL.deserialize(acl_str) @@ -835,8 +844,17 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac final long t2 = System.currentTimeMillis(); this.addBenchmark("filterEntitiesWithoutRetrievePermission", t2 - t1); } + logstr += "done with looking up acl: " + (System.currentTimeMillis() - begin_t) + " s\n"; + + allrs.sort(Comparator.naturalOrder()); + logstr += "iterations: " + count + "\n"; + logstr += "iterations: " + count2 + "\n"; + + logstr += "Full time: " + (System.currentTimeMillis() - begin_t) + "\n"; + + this.logger.warn(logstr); + rs.close(); - // TODO is there a better way than the following? for (final Integer id : toBeDeleted) { stmt.execute("DELETE FROM `" + resultSet + "` WHERE id = " + id); }