Query Interface
This commit is contained in:
parent
3ab16c1f3e
commit
66b0f604f1
|
@ -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{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"paging" : {
|
||||
"offset" : 0,
|
||||
"limit" : 1
|
||||
},
|
||||
"ordering" : {
|
||||
"direction" : "ASCENDING",
|
||||
"fields" : ["creationTime","nome"]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"paging" : {
|
||||
"offset" : 0,
|
||||
"limit" : 1
|
||||
},
|
||||
"ordering" : {
|
||||
"direction" : "DESCENDING",
|
||||
"fields" : ["creationTime","nome"]
|
||||
}
|
||||
}
|
Reference in New Issue