diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java index b4ac8f77a9d..d82085819c0 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/CollectionDAO.java @@ -1500,7 +1500,7 @@ public interface CollectionDAO { return EntityDAO.super.listBefore(filter, limit, before); } return listBefore( - getTableName(), getNameColumn(), filter.getCondition(), team, limit, before, Relationship.HAS.ordinal()); + getTableName(), getNameColumn(), filter.getCondition("ue"), team, limit, before, Relationship.HAS.ordinal()); } @Override @@ -1535,8 +1535,8 @@ public interface CollectionDAO { + "FROM user_entity ue " + "LEFT JOIN entity_relationship er on ue.id = er.toId " + "LEFT JOIN team_entity te on te.id = er.fromId and er.relation = :relation " - + "WHERE te.name = :team " - + "AND " + + " " + + "AND te.name = :team " + "AND ue. < :before " + "GROUP BY ue., ue.json " + "ORDER BY ue. DESC " diff --git a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java index 51f48044b6f..61d5e8b1843 100644 --- a/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java +++ b/catalog-rest-service/src/test/java/org/openmetadata/catalog/resources/teams/UserResourceTest.java @@ -23,6 +23,8 @@ import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.openmetadata.catalog.exception.CatalogExceptionMessage.entityNotFound; import static org.openmetadata.catalog.exception.CatalogExceptionMessage.noPermission; @@ -406,6 +408,68 @@ public class UserResourceTest extends EntityResourceTest { assertTrue(users.getData().stream().anyMatch(isUser2)); } + @Test + void get_listUsersWithTeamsPagination(TestInfo test) throws IOException { + TeamResourceTest teamResourceTest = new TeamResourceTest(); + Team team1 = teamResourceTest.createEntity(teamResourceTest.createRequest(test, 1), ADMIN_AUTH_HEADERS); + List team = of(team1.getId()); + + // create 15 users and add them to team1 + for (int i = 0; i < 15; i++) { + CreateUser create = createRequest(test, i).withTeams(team); + createAndCheckEntity(create, ADMIN_AUTH_HEADERS); + } + + Map queryParams = new HashMap<>(); + queryParams.put("team", team1.getName()); + + ResultList users = listEntities(queryParams, 5, null, null, ADMIN_AUTH_HEADERS); + assertEquals(5, users.getData().size()); + assertEquals(15, users.getPaging().getTotal()); + // First page must contain "after" and should not have "before" + assertNotNull(users.getPaging().getAfter()); + assertNull(users.getPaging().getBefore()); + User user1 = users.getData().get(0); + + String after = users.getPaging().getAfter(); + users = listEntities(queryParams, 5, null, after, ADMIN_AUTH_HEADERS); + assertEquals(5, users.getData().size()); + assertEquals(15, users.getPaging().getTotal()); + // Second page must contain both "after" and "before" + assertNotNull(users.getPaging().getAfter()); + assertNotNull(users.getPaging().getBefore()); + User user2 = users.getData().get(0); + + after = users.getPaging().getAfter(); + users = listEntities(queryParams, 5, null, after, ADMIN_AUTH_HEADERS); + assertEquals(5, users.getData().size()); + assertEquals(15, users.getPaging().getTotal()); + // Third page must contain only "before" since it is the last page + assertNull(users.getPaging().getAfter()); + assertNotNull(users.getPaging().getBefore()); + User user3 = users.getData().get(0); + assertNotEquals(user2, user3); + + // Now fetch previous pages using before pointer + String before = users.getPaging().getBefore(); + users = listEntities(queryParams, 5, before, null, ADMIN_AUTH_HEADERS); + assertEquals(5, users.getData().size()); + assertEquals(15, users.getPaging().getTotal()); + // Second page must contain both "after" and "before" + assertNotNull(users.getPaging().getAfter()); + assertNotNull(users.getPaging().getBefore()); + assertEquals(user2, users.getData().get(0)); + + before = users.getPaging().getBefore(); + users = listEntities(queryParams, 5, before, null, ADMIN_AUTH_HEADERS); + assertEquals(5, users.getData().size()); + assertEquals(15, users.getPaging().getTotal()); + // First page must contain only "after" + assertNotNull(users.getPaging().getAfter()); + assertNull(users.getPaging().getBefore()); + assertEquals(user1, users.getData().get(0)); + } + @Test void get_userWithInvalidFields_400_BadRequest(TestInfo test) throws HttpResponseException { User user = createEntity(createRequest(test), ADMIN_AUTH_HEADERS);