Query Interface

This commit is contained in:
Fabio Sinibaldi 2021-08-06 18:33:34 +02:00
parent 3ab16c1f3e
commit 66b0f604f1
9 changed files with 136 additions and 45 deletions

View File

@ -19,6 +19,7 @@ import org.gcube.application.geoportal.service.engine.WorkspaceManager.FolderOpt
import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex;
import org.gcube.application.geoportal.service.engine.providers.StorageClientProvider;
import org.gcube.application.geoportal.service.model.internal.faults.*;
import org.gcube.application.geoportal.service.model.internal.rest.QueryRequest;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.data.transfer.library.faults.RemoteServiceException;
@ -114,6 +115,28 @@ public class ConcessioniMongoManager extends MongoManager{
return toReturn;
}
public Iterable<Concessione> search(String filter){
log.info("Searching concessione for filter {} ",filter);
LinkedBlockingQueue queue=new LinkedBlockingQueue<Concessione>();
iterate(filter,collectionName).forEach(
(Consumer<? super Document>) (Document d)->{try{
queue.put(asConcessione(d));
}catch(Throwable t){log.warn("Unable to translate "+d);}});
log.info("Returned {} elements ",queue.size());
return queue;
}
public Iterable<Concessione> query(QueryRequest queryRequest){
log.info("Searching concessione for filter {} ",queryRequest);
LinkedBlockingQueue queue=new LinkedBlockingQueue<Concessione>();
query(queryRequest,collectionName).forEach(
(Consumer<? super Document>) (Document d)->{try{
queue.put(asConcessione(d));
}catch(Throwable t){log.warn("Unable to translate "+d);}});
log.info("Returned {} elements ",queue.size());
return queue;
}
public Concessione getById(String id)throws IOException {
log.debug("Loading by ID "+id);
return asConcessione(getById(asId(id),collectionName));
@ -146,17 +169,7 @@ public class ConcessioniMongoManager extends MongoManager{
}
}
public Iterable<Concessione> search(String filter){
log.info("Searching concessione for filter {} ",filter);
Document filterDocument=(filter!=null&&!filter.isEmpty())?Document.parse(filter):null;
LinkedBlockingQueue queue=new LinkedBlockingQueue<Concessione>();
iterate(filterDocument,collectionName).forEach(
(Consumer<? super Document>) (Document d)->{try{
queue.put(asConcessione(d));
}catch(Throwable t){log.warn("Unable to translate "+d);}});
log.info("Returned {} elements ",queue.size());
return queue;
}
public Concessione unpublish(String id) throws DeletionException {
try{

View File

@ -13,8 +13,11 @@ import org.bson.Document;
import org.bson.types.ObjectId;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.gcube.application.geoportal.service.model.internal.rest.QueryRequest;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Sorts.ascending;
import static com.mongodb.client.model.Sorts.descending;
@Slf4j
public abstract class MongoManager {
@ -77,16 +80,41 @@ public abstract class MongoManager {
}
public FindIterable<Document> iterate(Document filter,String collectionName) {
public FindIterable<Document> iterate(String filterString,String collectionName) {
MongoDatabase database=getDatabase();
MongoCollection<Document> coll=database.getCollection(collectionName);
if(filter==null)
MongoCollection<Document> coll=database.getCollection(collectionName);
if(filterString == null || filterString.isEmpty())
return coll.find();
else
return coll.find(filter);
return coll.find(Document.parse(filterString));
}
public FindIterable<Document> query(QueryRequest request,String collectionName){
MongoDatabase database=getDatabase();
MongoCollection<Document> coll=database.getCollection(collectionName);
FindIterable<Document> toReturn=iterate(request.getFilter(), collectionName);
if(request.getTransformation()!=null&&!request.getTransformation().isEmpty()){
log.warn("Transformation not YET Supported");
}
if(request.getOrdering()!=null){
if(request.getOrdering().getDirection().equals(QueryRequest.OrderedRequest.Direction.ASCENDING))
toReturn=toReturn.sort(ascending(request.getOrdering().getFields()));
else toReturn=toReturn.sort(descending(request.getOrdering().getFields()));
}
//Paging
if(request.getPaging()!=null){
QueryRequest.PagedRequest paging=request.getPaging();
toReturn=toReturn.skip(paging.getOffset()).limit(paging.getLimit());
}
return toReturn;
}
public <T> FindIterable<T> iterateForClass(Document filter,String collectionName,Class<T> clazz) {
MongoDatabase database=getDatabase();
MongoCollection<Document> coll=database.getCollection(collectionName);

View File

@ -2,26 +2,26 @@ package org.gcube.application.geoportal.service.model.internal.rest;
import lombok.Data;
import java.util.List;
@Data
public class QueryRequest {
@Data
public static class PagedRequest{
private String OFFSET;
private String Limit;
private int offset;
private int Limit;
}
@Data
public static class OrderedRequest{
public static enum Direction{DSC,ASC};
private String orderBy;
private String Limit;
public static class OrderedRequest {
public static enum Direction {ASCENDING,DESCENDING}
private Direction direction;
private String json;
private List<String> fields;
}
private String filter;
private String transformation;
private OrderedRequest ordering;
private PagedRequest paging;
}

View File

@ -202,14 +202,12 @@ public class ConcessioniOverMongo {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/"+"search")
public String search(String filter){
return new GuardedMethod<String>() {
public Iterable<Concessione> search(String filter){
return new GuardedMethod<Iterable<Concessione>>() {
@Override
protected String run() throws Exception, WebApplicationException {
protected Iterable<Concessione> run() throws Exception, WebApplicationException {
ConcessioniMongoManager manager=new ConcessioniMongoManager();
JSONArray jsonArray=new JSONArray();
manager.search(filter).forEach((Concessione c)->{jsonArray.put(c);});
return jsonArray.toString();
return manager.search(filter);
}
}.execute().getResult();
}
@ -218,12 +216,12 @@ public class ConcessioniOverMongo {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/"+"query")
public String search(QueryRequest queryRequest){
return new GuardedMethod<String>() {
public Iterable<Concessione> search(QueryRequest queryRequest){
return new GuardedMethod<Iterable<Concessione>>() {
@Override
protected String run() throws Exception, WebApplicationException {
//TODO IMPLEMENT
throw new Exception("TO IMPLEMENT");
protected Iterable<Concessione> run() throws Exception, WebApplicationException {
ConcessioniMongoManager manager=new ConcessioniMongoManager();
return manager.query(queryRequest);
}
}.execute().getResult();
}

View File

@ -7,6 +7,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
public class Serialization {
@ -24,7 +25,12 @@ public class Serialization {
public static <T> T read(String jsonString,Class<T> clazz) throws JsonProcessingException, IOException {
return mapper.readerFor(clazz).readValue(jsonString);
}
public static <T> Iterator<T> readCollection(String jsonString, Class<T> clazz) throws IOException {
return mapper.readerFor(clazz).readValues(jsonString);
}
public static String write(Object toWrite) throws JsonProcessingException {
// if(toWrite instanceof Concessione)
// detach((Concessione) toWrite);

View File

@ -72,7 +72,10 @@ public class BasicServiceTestUnit extends JerseyTest {
throw new Exception("RESP STATUS IS "+resp.getStatus()+". Message : "+resString);
System.out.println("Resp String is "+resString);
if(clazz!=null)
return Serialization.read(resString, clazz);
if (clazz==String.class)
return (T) resString;
else
return Serialization.read(resString, clazz);
else return null;
}
}

View File

@ -20,7 +20,9 @@ import javax.ws.rs.core.Response;
import java.io.FileInputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import static org.junit.Assert.*;
@ -76,15 +78,26 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
return check(target.path(id).request(MediaType.APPLICATION_JSON).get(),Concessione.class);
}
private static List<Concessione> query(String query,WebTarget target) throws Exception {
return check(target.path("search").request(MediaType.APPLICATION_JSON_TYPE).post(
Entity.entity(query,MediaType.APPLICATION_JSON)),List.class);
private static Iterator<Concessione> search(String query, WebTarget target) throws Exception {
String result= check(target.path("search").request(MediaType.APPLICATION_JSON_TYPE).post(
Entity.entity(query,MediaType.APPLICATION_JSON)),String.class);
return Serialization.readCollection(result,Concessione.class);
}
private static List<Concessione> queryFile(String filename,WebTarget target) throws Exception {
private static Iterator<Concessione> searchFile(String filename, WebTarget target) throws Exception {
String query= Files.readFileAsString(Files.getFileFromResources(
"concessioni/jsonFilters/"+filename).getAbsolutePath(), Charset.defaultCharset());
return query(query,target);
return search(query,target);
}
private static Iterator<Concessione> queryFile(String filename, WebTarget target) throws Exception {
String queryString= Files.readFileAsString(Files.getFileFromResources(
"concessioni/jsonQueries/"+filename).getAbsolutePath(), Charset.defaultCharset());
String result = check(target.path("query").request(MediaType.APPLICATION_JSON_TYPE).post(
Entity.entity(queryString,MediaType.APPLICATION_JSON)),String.class);
return Serialization.readCollection(result,Concessione.class);
}
@ -101,13 +114,23 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
WebTarget target=target(PATH);
// System.out.println("All :"+query(null,target).size());
// System.out.println("All (filter):"+queryFile("all.json",target).size());
System.out.println("Validated : "+ queryFile("validated.json",target).size());
AtomicLong validatedCount= new AtomicLong(0);
searchFile("validated.json",target).forEachRemaining(concessione -> {validatedCount.incrementAndGet();});
System.out.println("Validated : "+ validatedCount.get());
// System.out.println("Legacy ID : "+ queryFile("legacyid.json",target).size());
// System.out.println("Non fabio : "+ queryFile("nonFabio.json",target).size());
// System.out.println("Missing Centroid : "+ queryFile("missingCentroid.json",target).size());
}
@Test
public void query() throws Exception {
WebTarget target=target(PATH);
System.out.println("Last Registered : "+queryFile("lastRegistered.json",target).next().getCreationTime());
System.out.println("First Registered : "+queryFile("firstRegistered.json",target).next().getCreationTime());
}
@Test
public void getConfiguration() throws Exception {
WebTarget target=target(PATH);

View File

@ -0,0 +1,10 @@
{
"paging" : {
"offset" : 0,
"limit" : 1
},
"ordering" : {
"direction" : "ASCENDING",
"fields" : ["creationTime","nome"]
}
}

View File

@ -0,0 +1,10 @@
{
"paging" : {
"offset" : 0,
"limit" : 1
},
"ordering" : {
"direction" : "DESCENDING",
"fields" : ["creationTime","nome"]
}
}