From 351bc79324ca4213d01d101a8a758aa855f5f8c8 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Fri, 6 Aug 2021 16:17:24 +0200 Subject: [PATCH] Introduced Search Feature --- .../engine/mongo/ConcessioniMongoManager.java | 14 +++++- .../providers/StorageClientProvider.java | 2 +- .../model/internal/rest/QueryRequest.java | 27 ++++++++++++ .../service/rest/ConcessioniOverMongo.java | 32 +++++++++++++- .../service/ConcessioniOverMongoTest.java | 43 +++++++++++++++++-- .../concessioni/jsonFilters/all.json | 1 + .../concessioni/jsonFilters/legacyid.json | 3 ++ .../jsonFilters/missingCentroid.json | 4 ++ .../concessioni/jsonFilters/nonFabio.json | 3 ++ 9 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/gcube/application/geoportal/service/model/internal/rest/QueryRequest.java create mode 100644 src/test/resources/concessioni/jsonFilters/all.json create mode 100644 src/test/resources/concessioni/jsonFilters/legacyid.json create mode 100644 src/test/resources/concessioni/jsonFilters/missingCentroid.json create mode 100644 src/test/resources/concessioni/jsonFilters/nonFabio.json diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java index 73e200b..ae96d20 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java @@ -13,11 +13,11 @@ import org.gcube.application.geoportal.common.rest.TempFile; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.service.engine.ImplementationProvider; import org.gcube.application.geoportal.service.engine.SDIManager; -import org.gcube.application.geoportal.service.engine.providers.StorageClientProvider; import org.gcube.application.geoportal.service.engine.WorkspaceManager; import org.gcube.application.geoportal.service.engine.WorkspaceManager.FileOptions; import org.gcube.application.geoportal.service.engine.WorkspaceManager.FolderOptions; 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.utils.Serialization; import org.gcube.common.storagehub.client.dsl.FolderContainer; @@ -29,6 +29,7 @@ import java.sql.SQLException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; import java.util.function.Consumer; @Slf4j @@ -145,6 +146,17 @@ public class ConcessioniMongoManager extends MongoManager{ } } + public Iterable search(String filter){ + log.info("Searching concessione for filter {} ",filter); + Document filterDocument=(filter!=null&&!filter.isEmpty())?Document.parse(filter):null; + LinkedBlockingQueue queue=new LinkedBlockingQueue(); + iterate(filterDocument,collectionName).forEach( + (Consumer) (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{ diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/providers/StorageClientProvider.java b/src/main/java/org/gcube/application/geoportal/service/engine/providers/StorageClientProvider.java index a655ea9..6f4bb98 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/providers/StorageClientProvider.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/providers/StorageClientProvider.java @@ -35,7 +35,7 @@ public class StorageClientProvider extends AbstractScopedMap { @Override protected void dispose(IClient toDispose) { try { - //TODO ASK LUCA + //TODO ASK // toDispose.close(); }catch (NullPointerException e) { // expected if closed without uploading diff --git a/src/main/java/org/gcube/application/geoportal/service/model/internal/rest/QueryRequest.java b/src/main/java/org/gcube/application/geoportal/service/model/internal/rest/QueryRequest.java new file mode 100644 index 0000000..46377a8 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/service/model/internal/rest/QueryRequest.java @@ -0,0 +1,27 @@ +package org.gcube.application.geoportal.service.model.internal.rest; + +import lombok.Data; + +@Data +public class QueryRequest { + + @Data + public static class PagedRequest{ + private String OFFSET; + private String Limit; + } + + @Data + public static class OrderedRequest{ + + public static enum Direction{DSC,ASC}; + private String orderBy; + private String Limit; + } + + private String filter; + private String transformation; + + private PagedRequest paging; + +} diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java b/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java index 82645f0..3e573e7 100644 --- a/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java +++ b/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java @@ -8,6 +8,7 @@ import org.gcube.application.geoportal.service.engine.ImplementationProvider; import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.model.internal.Configuration; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; +import org.gcube.application.geoportal.service.model.internal.rest.QueryRequest; import org.gcube.application.geoportal.service.utils.Serialization; import org.json.JSONArray; import org.json.JSONObject; @@ -196,5 +197,34 @@ public class ConcessioniOverMongo { } }.execute().getResult(); } - + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+"search") + public String search(String filter){ + return new GuardedMethod() { + @Override + protected String run() throws Exception, WebApplicationException { + ConcessioniMongoManager manager=new ConcessioniMongoManager(); + JSONArray jsonArray=new JSONArray(); + manager.search(filter).forEach((Concessione c)->{jsonArray.put(c);}); + return jsonArray.toString(); + } + }.execute().getResult(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+"query") + public String search(QueryRequest queryRequest){ + return new GuardedMethod() { + @Override + protected String run() throws Exception, WebApplicationException { + //TODO IMPLEMENT + throw new Exception("TO IMPLEMENT"); + } + }.execute().getResult(); + } } diff --git a/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java b/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java index 811d310..6a2d110 100644 --- a/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java +++ b/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java @@ -18,6 +18,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.FileInputStream; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; @@ -56,6 +57,12 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ put(Entity.entity(Serialization.write(conc), MediaType.APPLICATION_JSON)); return check(resp,Concessione.class); } + private static Concessione unpublish(WebTarget target, String id) throws Exception { + Response resp=target.path(PUBLISH_PATH).path(id).request(MediaType.APPLICATION_JSON). + delete(); + return check(resp,Concessione.class); + } + private static Concessione register(WebTarget target, Concessione c) throws Exception { Response resp=target.request(MediaType.APPLICATION_JSON).post(Entity.entity(Serialization.write(c), MediaType.APPLICATION_JSON)); return check(resp,Concessione.class); @@ -64,7 +71,23 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ private static Concessione get(WebTarget target) throws Exception { return register(target,TestModel.prepareConcessione()); } - + + private static Concessione getById(WebTarget target ,String id) throws Exception { + return check(target.path(id).request(MediaType.APPLICATION_JSON).get(),Concessione.class); + } + + private static List 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 List queryFile(String filename,WebTarget target) throws Exception { + String query= Files.readFileAsString(Files.getFileFromResources( + "concessioni/jsonFilters/"+filename).getAbsolutePath(), Charset.defaultCharset()); + return query(query,target); + } + + // ********** TESTS @Test @@ -73,6 +96,17 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ System.out.println(target.request(MediaType.APPLICATION_JSON).get(List.class)); } + @Test + public void search() throws Exception { + 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()); +// 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 getConfiguration() throws Exception { @@ -108,7 +142,7 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ public void republish() throws Exception{ WebTarget target=target(PATH); Concessione published=getFullPublished(target); - check(target.path(InterfaceConstants.Methods.PUBLISH_PATH).path(published.getMongo_id()).request(MediaType.APPLICATION_JSON).delete(),null); + published = unpublish(target,published.getMongo_id()); System.out.println("Republishing.."); published=publish(target,published); Assert.assertEquals(published.getReport().getStatus(),ValidationStatus.PASSED); @@ -116,9 +150,10 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{ @Test - public void deletePrecise(){ + public void handlePrecise() throws Exception { WebTarget target=target(PATH); - String id="60195d0c02ad3d7fa3614d75"; + String id="610415af02ad3d05b5f81ee3"; + publish(target,unpublish(target,id)); target.path(id).queryParam(InterfaceConstants.Parameters.FORCE,true).request(MediaType.APPLICATION_JSON).delete(); } diff --git a/src/test/resources/concessioni/jsonFilters/all.json b/src/test/resources/concessioni/jsonFilters/all.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/src/test/resources/concessioni/jsonFilters/all.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/test/resources/concessioni/jsonFilters/legacyid.json b/src/test/resources/concessioni/jsonFilters/legacyid.json new file mode 100644 index 0000000..610e687 --- /dev/null +++ b/src/test/resources/concessioni/jsonFilters/legacyid.json @@ -0,0 +1,3 @@ +{ + "id" : {$gt : 0} +} \ No newline at end of file diff --git a/src/test/resources/concessioni/jsonFilters/missingCentroid.json b/src/test/resources/concessioni/jsonFilters/missingCentroid.json new file mode 100644 index 0000000..ab28660 --- /dev/null +++ b/src/test/resources/concessioni/jsonFilters/missingCentroid.json @@ -0,0 +1,4 @@ +{ + "centroidLat" : 0 + +} \ No newline at end of file diff --git a/src/test/resources/concessioni/jsonFilters/nonFabio.json b/src/test/resources/concessioni/jsonFilters/nonFabio.json new file mode 100644 index 0000000..b40d2fe --- /dev/null +++ b/src/test/resources/concessioni/jsonFilters/nonFabio.json @@ -0,0 +1,3 @@ +{ + "creationUser" : {$ne : "fabio.sinibaldi"} +} \ No newline at end of file