diff --git a/phis2-ws/src/main/java/opensilex/service/dao/DatasetDAO.java b/phis2-ws/src/main/java/opensilex/service/dao/DatasetDAO.java index 522365c78..66dd2a40b 100644 --- a/phis2-ws/src/main/java/opensilex/service/dao/DatasetDAO.java +++ b/phis2-ws/src/main/java/opensilex/service/dao/DatasetDAO.java @@ -205,7 +205,7 @@ protected BasicDBObject prepareSearchProvenance() { private void updateScientificObjectsWithExperimentsScientificObjects() { ScientificObjectRdf4jDAO agronomicalObjectDao = new ScientificObjectRdf4jDAO(); - ArrayList scientificObjectsSearched = agronomicalObjectDao.find(null, null, null, null, experiment, null); + ArrayList scientificObjectsSearched = agronomicalObjectDao.find(null, null, null, null, experiment, null, true); scientificObjectsSearched.forEach((scientificObject) -> { this.scientificObjects.add(scientificObject.getUri()); diff --git a/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectRdf4jDAO.java b/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectRdf4jDAO.java index 9215bdf7c..5bfe17602 100644 --- a/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectRdf4jDAO.java +++ b/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectRdf4jDAO.java @@ -606,8 +606,9 @@ public ArrayList findScientificObjectProperties(String uri) { * @param alias * @return scientific objects list, result of the user query, empty if no result */ - public ArrayList find(Integer page, Integer pageSize, String uri, String rdfType, String experiment, String alias) { + public ArrayList find(Integer page, Integer pageSize, String uri, String rdfType, String experiment, String alias, Boolean withProperties) { try { + SPARQLQueryBuilder sparqlQuery = prepareSearchQuery(false, page, pageSize, uri, rdfType, experiment, alias); //SILEX:test //For pool connection issues @@ -618,7 +619,7 @@ public ArrayList find(Integer page, Integer pageSize, String u TupleQuery tupleQuery = getConnection().prepareTupleQuery(QueryLanguage.SPARQL, sparqlQuery.toString()); Map foundedScientificObjects = new HashMap<>(); - + try (TupleQueryResult result = tupleQuery.evaluate()) { while (result.hasNext()) { BindingSet bindingSet = result.next(); @@ -652,14 +653,15 @@ public ArrayList find(Integer page, Integer pageSize, String u scientificObject.setRdfType(bindingSet.getValue(RDF_TYPE).stringValue()); } } - - //Get scientific object properties - scientificObject.setProperties(findScientificObjectProperties(actualUri)); + if(withProperties){ + //Get scientific object properties + scientificObject.setProperties(findScientificObjectProperties(actualUri)); + } foundedScientificObjects.put(actualUri, scientificObject); } } - + ArrayList scientificObjectsUris = new ArrayList<>(); ArrayList scientificObjects = new ArrayList<>(); foundedScientificObjects.entrySet().forEach((entry) -> { @@ -667,14 +669,15 @@ public ArrayList find(Integer page, Integer pageSize, String u scientificObjectsUris.add(entry.getKey()); }); - //Get geometries in relational database + //Get geometries in relational database ScientificObjectSQLDAO scientificObjectDao = new ScientificObjectSQLDAO(); HashMap geometries = scientificObjectDao.getGeometries(scientificObjectsUris); - + scientificObjects.forEach((scientificObject) -> { scientificObject.setGeometry(geometries.get(scientificObject.getUri())); }); + return scientificObjects; } catch (SQLException ex) { java.util.logging.Logger.getLogger(ScientificObjectRdf4jDAO.class.getName()).log(Level.SEVERE, null, ex); @@ -721,7 +724,20 @@ protected SPARQLQueryBuilder prepareSearchQuery(boolean count, Integer page, Int sparqlQuery.appendAndFilter("REGEX ( str(?" + URI + "),\".*" + uri + ".*\",\"i\")"); } - //Label filter + + //Rdf type filter + if (rdfType != null) { + sparqlQuery.appendTriplet("?" + URI, Rdf.RELATION_TYPE.toString(), rdfType, null); + } else { + sparqlQuery.appendTriplet("?" + URI, Rdf.RELATION_TYPE.toString(), "?" + RDF_TYPE, null); + sparqlQuery.appendTriplet( + "?" + RDF_TYPE, + "<" + Rdfs.RELATION_SUBCLASS_OF.toString() + ">*", + Oeso.CONCEPT_SCIENTIFIC_OBJECT.toString(), null); + sparqlQuery.appendSelect(" ?" + RDF_TYPE); + } + + //Label filter sparqlQuery.appendSelect("?" + ALIAS); if (alias == null && !count) { sparqlQuery.beginBodyOptional(); @@ -740,17 +756,6 @@ protected SPARQLQueryBuilder prepareSearchQuery(boolean count, Integer page, Int sparqlQuery.appendOptional("?" + URI + " <" + Oeso.RELATION_PARTICIPATES_IN.toString() + "> " + "?" + EXPERIMENT + " . "); } - //Rdf type filter - if (rdfType != null) { - sparqlQuery.appendTriplet("?" + URI, Rdf.RELATION_TYPE.toString(), rdfType, null); - } else { - sparqlQuery.appendSelect(" ?" + RDF_TYPE); - sparqlQuery.appendTriplet("?" + URI, Rdf.RELATION_TYPE.toString(), "?" + RDF_TYPE, null); - sparqlQuery.appendTriplet( - "?" + RDF_TYPE, - "<" + Rdfs.RELATION_SUBCLASS_OF.toString() + ">*", - Oeso.CONCEPT_SCIENTIFIC_OBJECT.toString(), null); - } if (page != null && pageSize != null) { sparqlQuery.appendLimit(pageSize); @@ -996,7 +1001,7 @@ public void delete(List objects) throws DAOPersistenceExceptio * null if this scientific object does not exist. */ public ScientificObject getScientificObjectInContext(String uri, String context) { - ArrayList scientificObjects = find(null, null, uri, null, context, null); + ArrayList scientificObjects = find(null, null, uri, null, context, null,true); if (!scientificObjects.isEmpty()) { return scientificObjects.get(0); } else { diff --git a/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectSQLDAO.java b/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectSQLDAO.java index 73969f2e4..55aabda0c 100644 --- a/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectSQLDAO.java +++ b/phis2-ws/src/main/java/opensilex/service/dao/ScientificObjectSQLDAO.java @@ -253,10 +253,7 @@ public HashMap getGeometries(ArrayList scientificObjects query.appendSelect("ST_AsGeoJSON(ST_Transform(" + GEOMETRY + ", 4326)), ao." + URI); query.appendFrom(table, tableAlias); - for (String scientificObjectURI : scientificObjectsURIs) { - query.appendORWhereConditionIfNeeded(URI, scientificObjectURI, "=", null, tableAlias); - } - + query.appendINConditions(URI, scientificObjectsURIs, tableAlias); LOGGER.debug(getTraceabilityLogs() + " quert : " + query.toString()); ResultSet queryResult = statement.executeQuery(query.toString()); diff --git a/phis2-ws/src/main/java/opensilex/service/resource/ScientificObjectResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/ScientificObjectResourceService.java index 90c0766f9..d1269ad95 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/ScientificObjectResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/ScientificObjectResourceService.java @@ -255,11 +255,13 @@ public Response getScientificObjectsBySearch( @ApiParam(value = "Search by URI", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_URI) @QueryParam("uri") String uri, @ApiParam(value = "Search by experiment URI", example = DocumentationAnnotation.EXAMPLE_EXPERIMENT_URI) @QueryParam("experiment") @URL String experimentURI, @ApiParam(value = "Search by alias", example = DocumentationAnnotation.EXAMPLE_EXPERIMENT_ALIAS) @QueryParam("alias") String alias, - @ApiParam(value = "Search by rdfType", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_TYPE) @QueryParam("rdfType") @URL String rdfType + @ApiParam(value = "Search by rdfType", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_TYPE) @QueryParam("rdfType") @URL String rdfType, + @ApiParam(value = "Retreive detailled properties", example = "true") @DefaultValue("true") @QueryParam("withProperties") Boolean withProperties + ) { ArrayList scientificObjectsToReturn = new ArrayList<>(); ArrayList scientificObjects = new ArrayList<>(); - + ArrayList statusList = new ArrayList<>(); ResultForm getResponse; @@ -271,11 +273,13 @@ public Response getScientificObjectsBySearch( //1. Get count Integer totalCount = scientificObjectDaoSesame.count(uri, rdfType, experimentURI, alias); + // If scientific objects found if(totalCount > 0){ //2. Get list of scientific objects - scientificObjects = scientificObjectDaoSesame.find(page, pageSize, uri, rdfType, experimentURI, alias); + scientificObjects = scientificObjectDaoSesame.find(page, pageSize, uri, rdfType, experimentURI, alias, withProperties); } + if (scientificObjects == null) { //Request failure getResponse = new ResultForm<>(0, 0, scientificObjectsToReturn, true); @@ -284,11 +288,13 @@ public Response getScientificObjectsBySearch( getResponse = new ResultForm<>(0, 0, scientificObjectsToReturn, true); return noResultFound(getResponse, statusList); } else { + + //Convert all scientific objects to DTO scientificObjects.forEach((scientificObject) -> { scientificObjectsToReturn.add(new ScientificObjectDTO(scientificObject)); }); - + getResponse = new ResultForm<>(scientificObjectDaoSesame.getPageSize(), scientificObjectDaoSesame.getPage(), scientificObjectsToReturn, true, totalCount); if (getResponse.getResult().dataSize() == 0) { return noResultFound(getResponse, statusList); diff --git a/phis2-ws/src/main/java/opensilex/service/resource/brapi/StudiesResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/brapi/StudiesResourceService.java index 696209a18..a6846ff42 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/brapi/StudiesResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/brapi/StudiesResourceService.java @@ -664,7 +664,7 @@ public Response getObservationUnits ( rdfType = Oeso.NAMESPACE + observationLevel; } - ArrayList scientificObjects = scientificObjectsDAO.find(null, null, null, rdfType, studyDbId, null); + ArrayList scientificObjects = scientificObjectsDAO.find(null, null, null, rdfType, studyDbId, null, true); ExperimentSQLDAO experimentDAO = new ExperimentSQLDAO(); experimentDAO.uri = studyDbId; @@ -735,7 +735,7 @@ private ArrayList getObservationsList(StudySQLDAO studyDAO, ArrayList observations = new ArrayList(); ScientificObjectRdf4jDAO objectDAO = new ScientificObjectRdf4jDAO(); - ArrayList objectsList = objectDAO.find(null, null, null, null, studyDAO.studyDbIds.get(0), null); + ArrayList objectsList = objectDAO.find(null, null, null, null, studyDAO.studyDbIds.get(0), null, true); ArrayList variablesList = new ArrayList(); if (variableURIs.isEmpty()) { diff --git a/phis2-ws/src/main/java/opensilex/service/resource/brapi/VariableResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/brapi/VariableResourceService.java index a3bb033d6..29af19763 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/brapi/VariableResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/brapi/VariableResourceService.java @@ -390,7 +390,7 @@ private ArrayList getObservationsList(StudySQLDAO studyDAO, ArrayList observations = new ArrayList(); ScientificObjectRdf4jDAO objectDAO = new ScientificObjectRdf4jDAO(); - ArrayList objectsList = objectDAO.find(null, null, null, null, studyDAO.studyDbIds.get(0), null); + ArrayList objectsList = objectDAO.find(null, null, null, null, studyDAO.studyDbIds.get(0), null, true); ArrayList variablesList = new ArrayList(); if (variableURIs.isEmpty()) {