diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a067139f4416c1a2febfc9d85398572fc1b1511..9cd7cf85fd22ebe459b0d8d614def7bb1449e20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,8 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed * Minimal changes to the error messages for invalid user names and passwords. -* Java query cache is now user specific when necessary. Thus, also more complex - queries are cached than before. ### Deprecated diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java index 44420c994bc6a7ed992efc8657651098d76145aa..81a08a9dbecbd28195172df55dfdd600ae24e53b 100644 --- a/src/main/java/org/caosdb/server/query/Query.java +++ b/src/main/java/org/caosdb/server/query/Query.java @@ -701,7 +701,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac */ private void getResultFromCache() { // try key with username and realm - this.resultSet = getCached(getCacheKey(true)); + // TODO include this again to activate the user-specific caching + // this.resultSet = getCached(getCacheKey(true)); if (this.resultSet == null) { // try key without username and realm this.resultSet = getCached(getCacheKey(false)); @@ -712,7 +713,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac // Decide whether user specific cache needs to be used or not // Currently, this is solely determined via filteredIntermediateResult. if (this.filteredIntermediateResult) { - cacheItem(getCacheKey(true), this.resultSet); + // TODO include this again to activate user-specific caching + // cacheItem(getCacheKey(true), this.resultSet); } else { cacheItem(getCacheKey(false), this.resultSet); } @@ -774,7 +776,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac cache.clear(); } - /** There are internal Entities (with ID<100) that should never be returned * */ + /** There are internal Entities (with ID<100) that should never be returned. */ private List<IdVersionAclTriplet> removeInternalEntitiesFromResultSet() { final List<IdVersionAclTriplet> filtered = new ArrayList<>(); @@ -932,9 +934,6 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac final long t1 = System.currentTimeMillis(); final IdVersionAclTriplet triplet = entityIterator.next(); - if (triplet.id <= 99) { - continue; - } if (!acl_cache.containsKey(triplet.acl)) { acl_cache.put( @@ -1105,23 +1104,26 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac String getCacheKey(boolean addUser) { final StringBuilder sb = new StringBuilder(); if (addUser && (this.user != null)) { + sb.append("U_"); String principal_desc = ((Principal) this.user.getPrincipal()).getUsername() + Principal.REALM_SEPARATOR - + ((Principal) this.user.getPrincipal()).getRealm() - + Principal.REALM_SEPARATOR; + + ((Principal) this.user.getPrincipal()).getRealm(); sb.append(principal_desc); } if (this.versioned) { - sb.append("versioned"); + sb.append("V_"); } if (this.role != null) { + sb.append("R_"); sb.append(this.role.toString()); } if (this.entity != null) { + sb.append("E_"); sb.append(this.entity.toString()); } if (this.filter != null) { + sb.append("F_"); sb.append(this.filter.getCacheKey()); } return sb.toString(); diff --git a/src/test/java/org/caosdb/server/query/QueryTest.java b/src/test/java/org/caosdb/server/query/QueryTest.java index da1df301beb48874ca62a86264318ce3cd39a054..a039f2106ab8f1a0c6ba61bdd906ba86372c9281 100644 --- a/src/test/java/org/caosdb/server/query/QueryTest.java +++ b/src/test/java/org/caosdb/server/query/QueryTest.java @@ -61,34 +61,36 @@ public class QueryTest { @Test public void testGetKey() { - assertEquals("enamePOV(pname,=,val1)", getCacheKey("FIND ename WITH pname = val1")); - assertEquals("enamePOV(pname,=,val1)", getCacheKey("COUNT ename WITH pname = val1")); - assertEquals("enamePOV(pname,=,val1)", getCacheKey("SELECT bla FROM ename WITH pname = val1")); - assertEquals("enamePOV(pname,null,null)", getCacheKey("SELECT bla FROM ename WITH pname")); + assertEquals("E_enameF_POV(pname,=,val1)", getCacheKey("FIND ename WITH pname = val1")); + assertEquals("E_enameF_POV(pname,=,val1)", getCacheKey("COUNT ename WITH pname = val1")); assertEquals( - "enamemaxPOV(pname,null,null)", + "E_enameF_POV(pname,=,val1)", getCacheKey("SELECT bla FROM ename WITH pname = val1")); + assertEquals("E_enameF_POV(pname,null,null)", getCacheKey("SELECT bla FROM ename WITH pname")); + assertEquals( + "E_enameF_maxPOV(pname,null,null)", getCacheKey("SELECT bla FROM ename WITH THE GREATEST pname")); assertEquals( - "RECORDenamePOV(pname,=,val1)", getCacheKey("FIND RECORD ename WITH pname = val1")); - assertEquals("ENTITYPOV(pname,=,val1)", getCacheKey("COUNT ENTITY WITH pname = val1")); + "R_RECORDE_enameF_POV(pname,=,val1)", getCacheKey("FIND RECORD ename WITH pname = val1")); + assertEquals("R_ENTITYF_POV(pname,=,val1)", getCacheKey("COUNT ENTITY WITH pname = val1")); assertEquals( - "enameConj(POV(pname,=,val1)POV(ename2,=,val2))", + "E_enameF_Conj(POV(pname,=,val1)POV(ename2,=,val2))", getCacheKey("SELECT bla FROM ename WITH pname = val1 AND ename2 = val2")); - assertEquals("versionedENTITYID(,>,2)", getCacheKey("FIND ANY VERSION OF ENTITY WITH ID > 2")); - assertEquals("ENTITYID(min,,)", getCacheKey("FIND ENTITY WITH THE SMALLEST ID")); - assertEquals("ENTITYSAT(asdf/%%)", getCacheKey("FIND ENTITY WHICH IS STORED AT /asdf/*")); - assertEquals("ENTITYSAT(asdf/asdf)", getCacheKey("FIND ENTITY WHICH IS STORED AT asdf/asdf")); + assertEquals("V_R_ENTITYF_ID(,>,2)", getCacheKey("FIND ANY VERSION OF ENTITY WITH ID > 2")); + assertEquals("R_ENTITYF_ID(min,,)", getCacheKey("FIND ENTITY WITH THE SMALLEST ID")); + assertEquals("R_ENTITYF_SAT(asdf/%%)", getCacheKey("FIND ENTITY WHICH IS STORED AT /asdf/*")); + assertEquals( + "R_ENTITYF_SAT(asdf/asdf)", getCacheKey("FIND ENTITY WHICH IS STORED AT asdf/asdf")); assertEquals( - "enamePOV(ref1,null,null)SUB(POV(pname,>,val1)", + "E_enameF_POV(ref1,null,null)SUB(POV(pname,>,val1)", getCacheKey("FIND ename WITH ref1 WITH pname > val1 ")); assertEquals( - "ename@(ref1,null)SUB(POV(pname,>,val1)", + "E_enameF_@(ref1,null)SUB(POV(pname,>,val1)", getCacheKey("FIND ename WHICH IS REFERENCED BY ref1 WITH pname > val1 ")); assertEquals( - "anonymous@anonymous@enamePOV(pname,=,val1)", + "U_anonymous@anonymousE_enameF_POV(pname,=,val1)", getCacheKeyWithUser("FIND ename WITH pname = val1")); }