Fixed Projections in queries

This commit is contained in:
Fabio Sinibaldi 2021-09-09 13:35:09 +02:00
parent 76d1113af0
commit ab3bfe0cd3
12 changed files with 197 additions and 33 deletions

View File

@ -111,7 +111,7 @@ public class WorkspaceManager {
// STATIC SYNCH METHODS
@Synchronized
private static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException {
public static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException {
FolderContainer vre=sgClient.openVREFolder();
try {
return vre.openByRelativePath(APP_FOLDER).asFolder();

View File

@ -100,7 +100,7 @@ public class ConcessioniMongoManager extends MongoManager{
public Iterable<Concessione> list(){
LinkedBlockingQueue queue=new LinkedBlockingQueue<Concessione>();
iterate(null, collectionName).forEach(
iterate(null,null, collectionName).forEach(
new Consumer<Document>() {
@Override
public void accept(Document d) {
@ -115,10 +115,10 @@ public class ConcessioniMongoManager extends MongoManager{
return queue;
}
public Iterable<Concessione> search(String filter){
public Iterable<Concessione> search(Document filter){
log.info("Searching concessione for filter {} ",filter);
LinkedBlockingQueue queue=new LinkedBlockingQueue<Concessione>();
iterate(filter,collectionName).forEach(
iterate(filter,null,collectionName).forEach(
(Consumer<? super Document>) (Document d)->{try{
queue.put(asConcessione(d));
}catch(Throwable t){log.warn("Unable to translate "+d);}});
@ -126,12 +126,12 @@ public class ConcessioniMongoManager extends MongoManager{
return queue;
}
public Iterable<Concessione> query(QueryRequest queryRequest){
public Iterable<Document> 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));
queue.put(d);
}catch(Throwable t){log.warn("Unable to translate "+d);}});
log.info("Returned {} elements ",queue.size());
return queue;
@ -301,7 +301,7 @@ public class ConcessioniMongoManager extends MongoManager{
}
private static Concessione removeFromIndex(Concessione record) {
log.info("Removing from index {} ",record.getId());
log.info("Removing from index {} ",record.getMongo_id());
ValidationReport report= new ValidationReport("Remove From Index Report ");
PostgisIndex index;
try {
@ -372,7 +372,6 @@ public class ConcessioniMongoManager extends MongoManager{
list.addAll(concessione.getPianteFineScavo());
for(AssociatedContent c:list) {
if(c instanceof LayerConcessione) {
//TODO actually delete
List<PersistedContent> contents=c.getActualContent();
List<PersistedContent> toRemove=new ArrayList<>();
for(PersistedContent p:contents){

View File

@ -1,6 +1,7 @@
package org.gcube.application.geoportal.service.engine.mongo;
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
@ -80,23 +81,27 @@ public abstract class MongoManager {
}
public FindIterable<Document> iterate(String filterString,String collectionName) {
public FindIterable<Document> iterate(Document filter, Document projection, String collectionName) {
log.debug("Iterate over {} ",collectionName);
MongoDatabase database=getDatabase();
MongoCollection<Document> coll=database.getCollection(collectionName);
if(filterString == null || filterString.isEmpty())
return coll.find();
else
return coll.find(Document.parse(filterString));
if(filter == null) filter=new Document();
log.debug("Applying Filter "+filter.toJson());
if(projection != null ) {
log.debug("Applying projection "+projection.toJson());
return coll.find(filter).projection(projection);
}else return coll.find(filter);
}
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");
}
FindIterable<Document> toReturn=iterate(request.getFilter(), request.getProjection(),collectionName);
if(request.getOrdering()!=null){

View File

@ -1,6 +1,7 @@
package org.gcube.application.geoportal.service.rest;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.model.rest.Configuration;
@ -9,6 +10,7 @@ import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager;
import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex;
import org.gcube.application.geoportal.service.model.internal.faults.DeletionException;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.json.JSONArray;
import javax.ws.rs.*;
@ -208,7 +210,7 @@ public class ConcessioniOverMongo {
@Override
protected Iterable<Concessione> run() throws Exception, WebApplicationException {
ConcessioniMongoManager manager=new ConcessioniMongoManager();
return manager.search(filter);
return manager.search(Document.parse(filter));
}
}.execute().getResult();
}
@ -217,13 +219,29 @@ public class ConcessioniOverMongo {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/"+InterfaceConstants.Methods.QUERY_PATH)
public Iterable<Concessione> search(QueryRequest queryRequest){
return new GuardedMethod<Iterable<Concessione>>() {
public String query(String queryString){
return new GuardedMethod<String>() {
@Override
protected Iterable<Concessione> run() throws Exception, WebApplicationException {
protected String run() throws Exception, WebApplicationException {
ConcessioniMongoManager manager=new ConcessioniMongoManager();
return manager.query(queryRequest);
Document queryDocument=Document.parse(queryString);
QueryRequest req=new QueryRequest();
if(queryDocument.containsKey("ordering"))
req.setOrdering(Serialization.read(((Document)queryDocument.get("ordering")).toJson(),QueryRequest.OrderedRequest.class));
if(queryDocument.containsKey("paging"))
req.setPaging(Serialization.read(((Document)queryDocument.get("paging")).toJson(),QueryRequest.PagedRequest.class));
req.setProjection(queryDocument.get("projection",Document.class));
req.setFilter(queryDocument.get("filter",Document.class));
StringBuilder builder=new StringBuilder("[");
manager.query(req).forEach(d->{builder.append(d.toJson()+",");});
builder.deleteCharAt(builder.length()-1);
builder.append("]");
return builder.toString();
}
}.execute().getResult();
}
}

View File

@ -10,6 +10,7 @@ import org.gcube.application.geoportal.common.rest.TempFile;
import org.gcube.application.geoportal.common.utils.Files;
import org.gcube.application.geoportal.common.utils.StorageUtils;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@ -97,15 +98,18 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
return search(query,target);
}
private static Iterator<Concessione> queryFile(String filename, WebTarget target) throws Exception {
private static <T> Iterator<T> queryFile(String filename, WebTarget target, Class<T> clazz) throws Exception {
String queryString= Files.readFileAsString(Files.getFileFromResources(
"concessioni/jsonQueries/"+filename).getAbsolutePath(), Charset.defaultCharset());
String result = check(target.path(InterfaceConstants.Methods.QUERY_PATH).request(MediaType.APPLICATION_JSON_TYPE).post(
Entity.entity(queryString,MediaType.APPLICATION_JSON)),String.class);
return Serialization.readCollection(result,Concessione.class);
return Serialization.readCollection(result,clazz);
}
private static Iterator<Concessione> queryFile(String filename, WebTarget target) throws Exception {
return queryFile(filename,target,Concessione.class);
}
// ********** TESTS
@ -128,8 +132,12 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
public void query() throws Exception {
WebTarget target=target(PATH);
try {
System.out.println("Last Registered : " + queryFile("lastRegistered.json", target).next().getCreationTime());
System.out.println("First Registered : " + queryFile("firstRegistered.json", target).next().getCreationTime());
// System.out.println("Last Registered : " + queryFile("lastRegistered.json", target).next().getCreationTime());
// System.out.println("First Registered : " + queryFile("firstRegistered.json", target).next().getCreationTime());
System.out.println("Last Names by Fabio : ");
queryFile("lastNamesRegisteredByFabio.json", target, JSONObject.class).forEachRemaining(c -> {System.out.println(c);});
System.out.println("Publication warning messages : ");
queryFile("publicationWarningMessages.json", target, JSONObject.class).forEachRemaining(c -> {System.out.println(c);});
}catch(NoSuchElementException e){
System.out.println("NO element found, probably empty DB");
}

View File

@ -1,11 +1,14 @@
package org.gcube.application.geoportal.service.legacy;
package org.gcube.application.geoportal.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Projections;
import org.bson.Document;
import org.gcube.application.geoportal.service.TokenSetter;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.mongo.MongoManager;
import org.gcube.application.geoportal.service.engine.providers.MongoClientProvider;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.junit.BeforeClass;
@ -15,12 +18,26 @@ import java.io.IOException;
public class MongoTests {
public static class MongoTester extends MongoManager {
public MongoTester() throws ConfigurationException {
}
public MongoCollection<Document> getCollection(){return getDatabase().getCollection("legacyConcessioni");}
@Override
protected MongoDatabase getDatabase() {
return client.getDatabase("gna_dev");
}
}
@BeforeClass
public static final void init() {
ImplementationProvider.get().setMongoClientProvider(new MongoClientProvider() {
@Override
public MongoClient getObject() throws ConfigurationException {
TokenSetter.set("/gcube/devNext/NextNext");
TokenSetter.set("/gcube/devsec/devVRE");
return super.getObject();
}
});
@ -39,10 +56,27 @@ public class MongoTests {
// MongoManager manager=new MongoManager();
// Profile f=Serialization.mapper.readerFor(Profile.class).readValue(
// Files.getFileFromResources("fakeProfile.json"));
//
//
// manager.iterate(new Document(),f).forEach(printBlock);
}
@Test
public void queries() throws ConfigurationException {
MongoTester tester=new MongoTester();
System.out.println("Using builders..");
tester.getCollection().find(Document.parse("{\"report.status\" : \"WARNING\"}")).
projection(Projections.include("nome")).forEach(printBlock);
System.out.println("Deserializing documents");
tester.getCollection().find(Document.parse("{\"report.status\" : \"WARNING\"}")).
projection(Document.parse("{\"nome\" : 1}")).forEach(printBlock);
}
@Test
public void checkQuerySerialization(){
System.out.println(Projections.include("nome"));
}
// @Test
// public void writeProject() {
// MongoManager manager=new MongoManager();

View File

@ -0,0 +1,31 @@
package org.gcube.application.geoportal.service.ws;
import org.gcube.application.geoportal.service.TokenSetter;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.common.storagehub.model.items.*;
public class DescribeWSFolder {
public static void main(String[] args) throws StorageHubException {
String context="/gcube/devsec/devVRE";
String folderID="fea4a885-7e60-4294-83d0-82162e7462f4";
TokenSetter.set(context);
StorageHubClient shc = new StorageHubClient();
FolderItem folder=shc.open(folderID).asFolder().get();
System.out.println("PATH : "+folder.getPath());
System.out.println("HIDDEN : "+folder.isHidden());
System.out.println("Description : "+folder.getDescription());
System.out.println("Listing... ");
for (Item item : shc.open(folderID).asFolder().list().getItems()) {
System.out.println("name:" + item.getName() + " is a File?: " + (item instanceof AbstractFileItem));
System.out.println("name:" + item.getName() + " is a folder?: " + (item instanceof FolderItem));
System.out.println("name:" + item.getName() + " is a shared folder?: " + (item instanceof SharedFolder));
System.out.println("name:" + item.getName() + " is a VRE folder?: " + (item instanceof VreFolder));
}
}
}

View File

@ -0,0 +1,12 @@
package org.gcube.application.geoportal.service.ws;
public class DisplayWorkspaceTree {
public static void main(String[] args) {
String context="/gcube/devsec/devVRE";
String folderId=null; // NB null ==
}
}

View File

@ -0,0 +1,28 @@
package org.gcube.application.geoportal.service.ws;
import org.gcube.application.geoportal.service.TokenSetter;
import org.gcube.application.geoportal.service.engine.WorkspaceManager;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
public class SetWSFolderVisibility {
public static void main(String[] args) throws StorageHubException {
String context="/gcube/devsec/devVRE";
Boolean setVisible=true;
TokenSetter.set(context);
StorageHubClient shc = new StorageHubClient();
FolderContainer folderContainer = WorkspaceManager.getApplicationBaseFolder(shc);
if(setVisible)
folderContainer.setVisible();
else
folderContainer.setHidden(); //will not appear in the workspace GUI
System.out.println("Done, children count "+folderContainer.list().getItems().size());
}
}

View File

@ -0,0 +1,18 @@
{
"paging" : {
"offset" : 0,
"limit" : 1
},
"ordering" : {
"direction" : "DESCENDING",
"fields" : ["creationTime","nome"]
},
"filter" : {
"creationUser" : {$eq : "fabio.sinibaldi"}
},
"projection" : {
"nome" : 1
}
}

View File

@ -7,4 +7,5 @@
"direction" : "DESCENDING",
"fields" : ["creationTime","nome"]
}
}

View File

@ -0,0 +1,10 @@
{
"ordering" : {
"direction" : "DESCENDING",
"fields" : ["nome"]
},
"filter" : {"report.status" : {"$eq" : "WARNING"}},
"projection" : {"report.warningMessages" : 1}
}