Added pagination in JSONQuery
This commit is contained in:
parent
22bedb9a75
commit
c34c5f9a59
|
@ -23,6 +23,8 @@ import org.gcube.informationsystem.resourceregistry.queries.json.base.entities.J
|
|||
import org.gcube.informationsystem.resourceregistry.queries.json.base.entities.JsonQueryResource;
|
||||
import org.gcube.informationsystem.resourceregistry.queries.json.base.relations.JsonQueryConsistsOf;
|
||||
import org.gcube.informationsystem.resourceregistry.queries.json.base.relations.JsonQueryIsRelatedTo;
|
||||
import org.gcube.informationsystem.resourceregistry.requests.RequestUtility;
|
||||
import org.gcube.informationsystem.resourceregistry.requests.ServerRequestInfo;
|
||||
import org.gcube.informationsystem.resourceregistry.types.CachedType;
|
||||
import org.gcube.informationsystem.resourceregistry.types.TypesCache;
|
||||
import org.gcube.informationsystem.resourceregistry.utils.OrientDBUtility;
|
||||
|
@ -42,8 +44,6 @@ public class JsonQuery {
|
|||
|
||||
private static Logger logger = LoggerFactory.getLogger(JsonQuery.class);
|
||||
|
||||
private static final Integer UNBOUNDED_LIMIT = -1;
|
||||
|
||||
protected ObjectMapper objectMapper;
|
||||
protected JsonNode jsonQuery;
|
||||
protected JsonQueryERElement entryPoint;
|
||||
|
@ -98,7 +98,6 @@ public class JsonQuery {
|
|||
return jsonQueryERElement;
|
||||
}
|
||||
|
||||
|
||||
public StringBuffer createQuery() throws SchemaException, InvalidQueryException, ResourceRegistryException {
|
||||
entryPoint = getJsonQueryERElement(jsonQuery);
|
||||
entryPoint.setEntryPoint(true);
|
||||
|
@ -114,11 +113,18 @@ public class JsonQuery {
|
|||
oDatabaseDocument = securityContext.getDatabaseDocument(PermissionMode.READER);
|
||||
oDatabaseDocument.begin();
|
||||
|
||||
ServerRequestInfo requestInfo = RequestUtility.getRequestInfo().get();
|
||||
int limit = requestInfo.getLimit();
|
||||
int offset = requestInfo.getOffset();
|
||||
|
||||
StringBuffer stringBuffer = createQuery();
|
||||
stringBuffer.append(" limit :limit");
|
||||
stringBuffer.append(" SKIP :offset");
|
||||
stringBuffer.append(" LIMIT :limit");
|
||||
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("limit", JsonQuery.UNBOUNDED_LIMIT);
|
||||
map.put("offset", offset);
|
||||
map.put("limit", limit);
|
||||
|
||||
|
||||
String query = stringBuffer.toString();
|
||||
logger.trace("Going to execute the following query:\n{} \n from the JSONQuery\n{}", query, objectMapper.writeValueAsString(jsonQuery));
|
||||
|
|
|
@ -5,11 +5,17 @@ import java.io.File;
|
|||
import java.io.FileReader;
|
||||
import java.io.FilenameFilter;
|
||||
import java.net.URL;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
|
||||
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.gcube.informationsystem.model.reference.entities.Entity;
|
||||
import org.gcube.informationsystem.resourceregistry.ContextTest;
|
||||
import org.gcube.informationsystem.resourceregistry.queries.json.JsonQuery;
|
||||
import org.gcube.informationsystem.serialization.ElementMapper;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
|
@ -103,7 +109,7 @@ public class JsonQueryTest extends ContextTest {
|
|||
}
|
||||
|
||||
// @Test
|
||||
public void testSingleQuery() throws Exception {
|
||||
public List<Entity> testSingleQuery(int offset, int limit) throws Exception {
|
||||
ContextTest.setContextByName(DEVVRE);
|
||||
File queriesDirectory = getQueriesDirectory();
|
||||
File jsonQueryFile = new File(queriesDirectory, "query3.json");
|
||||
|
@ -115,6 +121,72 @@ public class JsonQueryTest extends ContextTest {
|
|||
jsonQuery.setJsonQuery(jsonNode);
|
||||
String res = jsonQuery.query();
|
||||
logger.info(res);
|
||||
|
||||
List<Entity> ret = ElementMapper.unmarshalList(Entity.class, res);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
public void testLimitOffset() throws Exception {
|
||||
int limit = 2;
|
||||
|
||||
List<Entity> entities = testSingleQuery(0, limit);
|
||||
if(entities.size()==0) {
|
||||
return;
|
||||
}
|
||||
Assert.assertTrue(entities.size() <= limit);
|
||||
|
||||
if(entities.size()< limit) {
|
||||
return;
|
||||
}
|
||||
|
||||
Set<UUID> uuids = new HashSet<>();
|
||||
for(Entity entity : entities) {
|
||||
UUID uuid = entity.getID();
|
||||
uuids.add(uuid);
|
||||
logger.info("Found {} with UUID {}", Entity.NAME, uuid);
|
||||
}
|
||||
|
||||
entities = testSingleQuery(limit, limit);
|
||||
|
||||
if(entities.size()>0) {
|
||||
Assert.assertTrue(entities.size() <= limit);
|
||||
|
||||
for(Entity entity : entities) {
|
||||
UUID uuid = entity.getID();
|
||||
Assert.assertFalse(uuids.contains(uuid));
|
||||
uuids.add(uuid);
|
||||
logger.info("Found {} with UUID {}", Entity.NAME, uuid);
|
||||
}
|
||||
|
||||
if(entities.size()<limit) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int doubleLimit = limit*2;
|
||||
|
||||
entities = testSingleQuery(0, doubleLimit);
|
||||
|
||||
Assert.assertTrue(entities.size() <= doubleLimit);
|
||||
|
||||
for(Entity entity : entities) {
|
||||
UUID uuid = entity.getID();
|
||||
logger.info("Checking if {} with UUID {} was contained in the previous queries", Entity.NAME, uuid);
|
||||
Assert.assertTrue(uuids.contains(uuid));
|
||||
logger.info("As expected got {} with UUID {} and name {}", Entity.NAME, uuid);
|
||||
}
|
||||
}
|
||||
|
||||
entities = testSingleQuery(0, -1);
|
||||
|
||||
Assert.assertTrue(entities.size()>=uuids.size());
|
||||
|
||||
for(Entity entity : entities) {
|
||||
UUID uuid = entity.getID();
|
||||
logger.info("No limit listing: Got {} with UUID {}", Entity.NAME, uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue