gcube-cms-suite/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java

144 lines
4.5 KiB
Java
Raw Normal View History

2021-09-20 16:47:35 +02:00
package org.gcube.application.geoportal.service.engine.mongo;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.FindOneAndReplaceOptions;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import com.mongodb.client.model.ReturnDocument;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.gcube.application.cms.implementations.ImplementationProvider;
2022-02-04 17:45:47 +01:00
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
2022-09-26 16:11:20 +02:00
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.service.model.internal.db.Mongo;
2021-09-20 16:47:35 +02:00
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 {
2021-10-14 17:00:08 +02:00
protected Mongo client=null;
2022-03-11 16:42:33 +01:00
protected MongoCollection<Document> collection=null;
2021-09-20 16:47:35 +02:00
protected static final String ID="_id";
protected static final ObjectId asId(String id) {return new ObjectId(id);}
protected static final String asString(ObjectId id) {return id.toHexString();}
protected static final String asString(Document d) {return d.toJson();}
protected static final Document asDoc(String json) {return Document.parse(json);}
public MongoManager() throws ConfigurationException {
2022-04-27 19:36:10 +02:00
client=ImplementationProvider.get().getProvidedObjectByClass(Mongo.class);
2022-03-30 18:39:10 +02:00
log.trace("Cached client is {} ",client);
2021-09-20 16:47:35 +02:00
}
2022-03-11 16:42:33 +01:00
protected void init(String collectionName){
String toUseDB=client.getConnection().getDatabase();
2022-04-01 19:11:11 +02:00
log.info("Opening collection {} : {} ",toUseDB,collectionName);
2022-03-11 16:42:33 +01:00
collection=client.getTheClient().getDatabase(toUseDB).getCollection(collectionName);
}
2021-10-06 11:26:35 +02:00
2022-03-11 16:42:33 +01:00
MongoCollection getCollection(){
return collection;
}
2022-03-07 17:59:06 +01:00
protected abstract String mongoIDFieldName();
2021-09-20 16:47:35 +02:00
//*********** PROJECTS
// NB BsonId
2022-03-11 16:42:33 +01:00
protected ObjectId insertDoc(Document proj) {
MongoCollection<Document> collection = getCollection();
2021-09-20 16:47:35 +02:00
// Check if _id is present
2022-03-07 17:59:06 +01:00
ObjectId id=proj.getObjectId(mongoIDFieldName());
2021-09-20 16:47:35 +02:00
if(id==null) {
2022-03-07 17:59:06 +01:00
proj.append(mongoIDFieldName(), new ObjectId());
id=proj.getObjectId(mongoIDFieldName());
2021-09-20 16:47:35 +02:00
}
2022-03-11 16:42:33 +01:00
collection.insertOne(Document.parse(proj.toJson()));
2021-09-20 16:47:35 +02:00
return id;
}
2022-03-11 16:42:33 +01:00
public void deleteDoc(ObjectId id) {
MongoCollection<Document> collection = getCollection();
2022-03-07 17:59:06 +01:00
collection.deleteOne(eq(mongoIDFieldName(),id));
2021-09-20 16:47:35 +02:00
}
2022-03-24 17:44:00 +01:00
public Document getDocById(ObjectId id,Document additionalFilter) {
2022-03-11 16:42:33 +01:00
MongoCollection<Document> coll=getCollection();
2022-03-24 17:44:00 +01:00
Document condition =new Document(mongoIDFieldName(),id);
if(additionalFilter!=null)
condition.putAll(additionalFilter);
return coll.find(condition).first();
2021-09-20 16:47:35 +02:00
}
2022-03-24 17:44:00 +01:00
public Document getDocById(ObjectId id) {
return getDocById(id,null);
}
2022-03-11 16:42:33 +01:00
public FindIterable<Document> iterateDoc(Document filter, Document projection) {
MongoCollection<Document> coll=getCollection();
2021-09-20 16:47:35 +02:00
if(filter == null) filter=new Document();
2022-03-30 18:39:10 +02:00
log.trace("Applying Filter "+filter.toJson());
2021-09-20 16:47:35 +02:00
if(projection != null ) {
2022-03-30 18:39:10 +02:00
log.trace("Applying projection "+projection.toJson());
2021-09-20 16:47:35 +02:00
return coll.find(filter).projection(projection);
}else return coll.find(filter);
}
2022-03-11 16:42:33 +01:00
public FindIterable<Document> queryDoc(QueryRequest request){
2021-09-20 16:47:35 +02:00
2022-03-11 16:42:33 +01:00
FindIterable<Document> toReturn=iterateDoc(request.getFilter(), request.getProjection());
2021-09-20 16:47:35 +02:00
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;
}
2022-03-11 16:42:33 +01:00
//
// public <T> FindIterable<T> iterateForClass(Document filter,Class<T> clazz) {
// MongoCollection<Document> coll=getCollection();
// if(filter==null)
// return coll.find(clazz);
// else
// return coll.find(filter,clazz);
// }
//
public Document replaceDoc(Document toUpdate,ObjectId id) {
MongoCollection<Document> coll=getCollection();
2021-09-20 16:47:35 +02:00
return coll.findOneAndReplace(
2022-03-07 17:59:06 +01:00
eq(mongoIDFieldName(),id), toUpdate,new FindOneAndReplaceOptions().returnDocument(ReturnDocument.AFTER));
2021-09-20 16:47:35 +02:00
}
2022-11-18 14:28:15 +01:00
// public Document updateDoc() {
// MongoCollection<Document> coll=getCollection();
// return coll.findOneAndUpdate(
// eq(mongoIDFieldName(),id),
// updateSet,
// new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER));
// }
2021-09-20 16:47:35 +02:00
2022-03-11 16:42:33 +01:00
2021-09-20 16:47:35 +02:00
}