diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java index 1989bf5802..b8c7f3d603 100644 --- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java +++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java @@ -788,7 +788,7 @@ protected void fillAttrQuery( switch (cond.getType()) { case ISNULL: - // shouldn't occour: processed before + query.append(column).append(" IS NULL"); break; case ISNOTNULL: @@ -816,8 +816,9 @@ protected void fillAttrQuery( query.append(column); query.append('='); - if ((schema.getType() == AttrSchemaType.String - || schema.getType() == AttrSchemaType.Enum) && lower) { + if (lower + && (schema.getType() == AttrSchemaType.String || schema.getType() == AttrSchemaType.Enum)) { + query.append("LOWER(?").append(setParameter(parameters, attrValue.getValue())).append(')'); } else { query.append('?').append(setParameter(parameters, attrValue.getValue())); diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java index 1fff8d5176..0ace0bd550 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java @@ -686,6 +686,23 @@ public void asGroupOwner() { } } + @Test + public void changePwdDate() { + AnyCond statusCond = new AnyCond(AttrCond.Type.IEQ); + statusCond.setSchema("status"); + statusCond.setExpression("suspended"); + + AnyCond changePwdDateCond = new AnyCond(AttrCond.Type.ISNULL); + changePwdDateCond.setSchema("changePwdDate"); + + SearchCond cond = SearchCond.getAnd(SearchCond.getNotLeaf(statusCond), SearchCond.getLeaf(changePwdDateCond)); + assertTrue(cond.isValid()); + + List users = searchDAO.search(cond, AnyTypeKind.USER); + assertNotNull(users); + assertEquals(5, users.size()); + } + @Test public void issue202() { ResourceCond ws2 = new ResourceCond(); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java index baee67fc90..c813105a87 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java @@ -614,6 +614,14 @@ public void searchConnObjectsWithFilter() { anyMatch(connObject -> connObject.getAttr("homePhone").isEmpty())); } + @Test + public void changePwdDate() { + int users = USER_SERVICE.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM). + fiql("status!~suspended;changePwdDate==$null").build()). + getTotalCount(); + assertTrue(users > 0); + } + @Test public void issueSYNCOPE768() { int usersWithNullable = USER_SERVICE.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).