Fix #4201: Query with 'before' params is failing for Users API (#4211)

This commit is contained in:
Vivek Ratnavel Subramanian 2022-04-19 10:48:40 -07:00 committed by GitHub
parent ff26b6d93e
commit f5cbcd0ef0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 3 deletions

View File

@ -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 <cond> "
+ " <cond> "
+ "AND te.name = :team "
+ "AND ue.<nameColumn> < :before "
+ "GROUP BY ue.<nameColumn>, ue.json "
+ "ORDER BY ue.<nameColumn> DESC "

View File

@ -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<User, CreateUser> {
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<UUID> 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<String, String> queryParams = new HashMap<>();
queryParams.put("team", team1.getName());
ResultList<User> 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);