From 9e9c696909021e28894f88777d53f2b0d655adca Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 3 May 2022 18:07:18 +0200 Subject: [PATCH] SDI Indexer scan for coordinates --- .../AbstractProfiledDocumentsTests.java | 3 +- .../engine/bboxes/BBOXByCoordinatePaths.java | 72 ++++++ .../cms/sdi/engine/bboxes/BBOXEvaluator.java | 26 ++ .../sdi/engine/bboxes/BBOXPathScanner.java | 48 ++++ .../cms/sdi/plugins/SDIIndexerPlugin.java | 49 ++-- ...filedConcessioni.json => Concessioni.json} | 0 .../profiledDocuments/profiles/mosi.json | 239 +++++++++++++++--- 7 files changed, 385 insertions(+), 52 deletions(-) create mode 100644 sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXByCoordinatePaths.java create mode 100644 sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXEvaluator.java create mode 100644 sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXPathScanner.java rename test-data/profiledDocuments/profiles/{profiledConcessioni.json => Concessioni.json} (100%) diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java index c17bd57..87f2391 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/AbstractProfiledDocumentsTests.java @@ -42,11 +42,10 @@ public abstract class AbstractProfiledDocumentsTests extends BasicServiceTestUni } - - protected abstract WebTarget baseTarget(); + @Test public void getAll() { assumeTrue(GCubeTest.isTestInfrastructureEnabled()); diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXByCoordinatePaths.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXByCoordinatePaths.java new file mode 100644 index 0000000..df17e4f --- /dev/null +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXByCoordinatePaths.java @@ -0,0 +1,72 @@ +package org.gcube.application.cms.sdi.engine.bboxes; + +import lombok.Data; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; +import org.gcube.application.geoportal.common.model.document.filesets.sdi.GCubeSDILayer; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import java.util.List; + +@Slf4j +public class BBOXByCoordinatePaths extends BBOXEvaluator{ + + @Data + @ToString + public static class CoordinatesPathBean{ + private String x; + private String y; + private String z; + } + + + + public BBOXByCoordinatePaths() { + super("COORDINATES_PATH"); + } + + @Override + public boolean isConfigured(Document profileConfiguration) { + return profileConfiguration.containsKey("coordinatesPath"); + } + + @Override + public GCubeSDILayer.BBOX evaluate(Document profileConfiguration, UseCaseDescriptor useCaseDescriptor, JSONPathWrapper documentNavigator) { + List coordsConfig=profileConfiguration.get("coordinatesPaths",List.class); + GCubeSDILayer.BBOX toSet = null; + for(Object coordsObj:coordsConfig){ + log.debug("UseCaseDescriptor {} : Evaluating coords {} ", useCaseDescriptor.getId(),coordsObj); + CoordinatesPathBean bean = Serialization.convert(coordsObj,CoordinatesPathBean.class); + + // x + if(bean.getX()!=null) + // for found + for(Double x : documentNavigator.getByPath(bean.getX(),Double.class)) { + if(toSet == null) toSet = new GCubeSDILayer.BBOX(); + if (toSet.getMinX()==null || x< toSet.getMinX()) toSet.setMinX(x); + if (toSet.getMaxX()==null || x> toSet.getMaxX()) toSet.setMaxX(x); + } + // y + if(bean.getY()!=null) + // for found + for(Double y : documentNavigator.getByPath(bean.getY(),Double.class)) { + if(toSet == null) toSet = new GCubeSDILayer.BBOX(); + if (toSet.getMinY()==null || y< toSet.getMinY()) toSet.setMinY(y); + if (toSet.getMaxY()==null || y> toSet.getMaxY()) toSet.setMaxY(y); + } + // z + if(bean.getZ()!=null) + // for found + for(Double z : documentNavigator.getByPath(bean.getZ(),Double.class)) { + if(toSet == null) toSet = new GCubeSDILayer.BBOX(); + if (toSet.getMinZ()==null || z< toSet.getMinZ()) toSet.setMinZ(z); + if (toSet.getMaxZ()==null || z> toSet.getMaxZ()) toSet.setMaxZ(z); + } + } + return toSet; + } +} \ No newline at end of file diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXEvaluator.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXEvaluator.java new file mode 100644 index 0000000..068c0f9 --- /dev/null +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXEvaluator.java @@ -0,0 +1,26 @@ +package org.gcube.application.cms.sdi.engine.bboxes; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; +import org.gcube.application.geoportal.common.model.document.filesets.sdi.GCubeSDILayer; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import java.util.List; + +@RequiredArgsConstructor +@ToString +@Slf4j +public abstract class BBOXEvaluator { + + @NonNull + private String name; + + public abstract boolean isConfigured(Document profileConfiguration); + public abstract GCubeSDILayer.BBOX evaluate(Document profileConfiguration, UseCaseDescriptor useCaseDescriptor, JSONPathWrapper documentNavigator); + +} diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXPathScanner.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXPathScanner.java new file mode 100644 index 0000000..88f3cd4 --- /dev/null +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXPathScanner.java @@ -0,0 +1,48 @@ +package org.gcube.application.cms.sdi.engine.bboxes; + +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; +import org.gcube.application.geoportal.common.model.document.filesets.sdi.GCubeSDILayer; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; + +import java.util.List; + +@Slf4j +public class BBOXPathScanner extends BBOXEvaluator{ + + + public BBOXPathScanner() { + super("BBOX PATH SCANNER"); + } + + @Override + public boolean isConfigured(Document profileConfiguration) { + return profileConfiguration.containsKey("bboxEvaluation"); + } + + @Override + public GCubeSDILayer.BBOX evaluate(Document profileConfiguration, UseCaseDescriptor useCaseDescriptor, JSONPathWrapper documentNavigator) { + List bboxEvaluationPaths = profileConfiguration.get("bboxEvaluation",List.class); + GCubeSDILayer.BBOX toSet = null; + for(Object pathObj : bboxEvaluationPaths){ + log.debug("UseCaseDescriptor {} : Evaluating path {} ", useCaseDescriptor.getId(),pathObj); + List bboxObjects = documentNavigator.getByPath(pathObj.toString()); + log.debug("UseCaseDescriptor {} : Evaluating path {} .. results {} ", useCaseDescriptor.getId(),pathObj,bboxObjects); + for(Object bboxObject : bboxObjects) { + log.info("Matched path {}, value is {} ",pathObj.toString(),bboxObject); + GCubeSDILayer.BBOX box = Serialization.convert(bboxObject, GCubeSDILayer.BBOX.class); + + if(toSet == null) toSet = box; + if(box.getMaxX()>toSet.getMaxX()) toSet.setMaxX(box.getMaxX()); + if(box.getMaxY()>toSet.getMaxY()) toSet.setMaxY(box.getMaxY()); + + if(box.getMinX() BBOX_EVALUATORS=new ArrayList<>(); + static { DESCRIPTOR.setDescription("SDI Indexer. " + "Manage Centroids layers."); DESCRIPTOR.setVersion(new Semver("1.0.0")); + + BBOX_EVALUATORS.add(new BBOXPathScanner()); + BBOX_EVALUATORS.add(new BBOXByCoordinatePaths()); + + + } @Override @@ -151,30 +161,27 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin } else{ // unable to use current Spatial reference, try evaluating it log.debug("UseCaseDescriptor {} : Getting evaluation paths from useCaseDescriptor.. ", useCaseDescriptor.getId()); - List bboxEvaluationPaths = profileConfiguration.get("bboxEvaluation",List.class); - if(bboxEvaluationPaths==null || bboxEvaluationPaths.isEmpty()) - throw new Exception("Missing configuration bboxEvaluation"); + // for each configuration option try until found GCubeSDILayer.BBOX toSet = null; - for(Object pathObj : bboxEvaluationPaths){ - log.debug("UseCaseDescriptor {} : Evaluating path {} ", useCaseDescriptor.getId(),pathObj); - List bboxObjects = documentNavigator.getByPath(pathObj.toString()); - log.debug("UseCaseDescriptor {} : Evaluating path {} .. results {} ", useCaseDescriptor.getId(),pathObj,bboxObjects); - for(Object bboxObject : bboxObjects) { - log.info("Matched path {}, value is {} ",pathObj.toString(),bboxObject); - GCubeSDILayer.BBOX box = Serialization.convert(bboxObject, GCubeSDILayer.BBOX.class); - - if(toSet == null) toSet = box; - if(box.getMaxX()>toSet.getMaxX()) toSet.setMaxX(box.getMaxX()); - if(box.getMaxY()>toSet.getMaxY()) toSet.setMaxY(box.getMaxY()); - - if(box.getMinX()