Skip to content

Commit d0b2740

Browse files
author
hosotte
committed
[FIX] Fixed and optimized searchScientificObjects facility filter
1 parent 0198646 commit d0b2740

1 file changed

Lines changed: 62 additions & 27 deletions

File tree

‎opensilex-core/src/main/java/org/opensilex/core/scientificObject/dal/ScientificObjectDAO.java‎

Lines changed: 62 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
1414
import org.apache.jena.graph.Node;
1515
import org.apache.jena.graph.NodeFactory;
16-
import org.apache.jena.query.Query;
17-
import org.apache.jena.query.QueryFactory;
1816
import org.apache.jena.sparql.core.Var;
1917
import org.apache.jena.sparql.expr.Expr;
20-
import org.apache.jena.sparql.path.*;
18+
import org.apache.jena.sparql.expr.aggregate.AggMax;
19+
import org.apache.jena.sparql.path.P_Link;
20+
import org.apache.jena.sparql.path.P_OneOrMore1;
21+
import org.apache.jena.sparql.path.P_Seq;
22+
import org.apache.jena.sparql.path.Path;
2123
import org.apache.jena.vocabulary.DCTerms;
2224
import org.apache.jena.vocabulary.RDF;
2325
import org.apache.jena.vocabulary.RDFS;
@@ -30,9 +32,10 @@
3032
import org.opensilex.core.exception.DuplicateNameListException;
3133
import org.opensilex.core.experiment.dal.ExperimentModel;
3234
import org.opensilex.core.experiment.factor.dal.FactorLevelModel;
33-
import org.opensilex.core.germplasm.dal.GermplasmModel;
3435
import org.opensilex.core.germplasmGroup.dal.GermplasmGroupModel;
36+
import org.opensilex.core.ontology.Oeev;
3537
import org.opensilex.core.ontology.Oeso;
38+
import org.opensilex.core.ontology.Time;
3639
import org.opensilex.core.ontology.api.RDFObjectDTO;
3740
import org.opensilex.core.ontology.api.RDFObjectRelationDTO;
3841
import org.opensilex.core.ontology.dal.SPARQLRelationFetcher;
@@ -42,7 +45,6 @@
4245
import org.opensilex.nosql.mongodb.MongoDBService;
4346
import org.opensilex.security.account.dal.AccountModel;
4447
import org.opensilex.security.user.api.UserGetDTO;
45-
import org.opensilex.server.exceptions.InvalidValueException;
4648
import org.opensilex.sparql.deserializer.DateDeserializer;
4749
import org.opensilex.sparql.deserializer.SPARQLDeserializer;
4850
import org.opensilex.sparql.deserializer.SPARQLDeserializers;
@@ -539,30 +541,63 @@ private void addSearchfilter(SelectBuilder builder, boolean isCount, ScientificO
539541
}
540542

541543
// Add facility filter
542-
if (searchFilter.getFacility() != null) {
543-
Node facilityNode = SPARQLDeserializers.nodeURI(searchFilter.getFacility());
544-
Var directFacility = makeVar("__directFacility");
545-
Var parentLinkURI = makeVar("__parentLinkURI");
546-
Var parentFacility = makeVar("__parentFacility");
547-
Path subPartOf = new P_ZeroOrMore1(new P_Link(Oeso.isPartOf.asNode()));
548-
if (searchFilter.getExperiment() != null) {
549-
WhereBuilder graphQuery = new WhereBuilder();
550-
graphQuery.addGraph(contextNode, uriVar, Oeso.isHosted, directFacility);
551-
graphQuery.addGraph(contextNode, uriVar, subPartOf, parentLinkURI);
552-
graphQuery.addGraph(contextNode, parentLinkURI, Oeso.isHosted, parentFacility);
553-
builder.addOptional(graphQuery);
554-
} else {
555-
WhereBuilder graphQuery = new WhereBuilder();
556-
graphQuery.addWhere(uriVar, Oeso.isHosted, directFacility);
557-
graphQuery.addWhere(uriVar, subPartOf, parentLinkURI);
558-
graphQuery.addWhere(parentLinkURI, Oeso.isHosted, parentFacility);
559-
builder.addOptional(graphQuery);
544+
/*
545+
//TODO only works on RDF4J ; for GraphDB swap the "optional" to a regular triple statement.
546+
//This also works on RDF4J but is painfully slow for some reason
547+
SELECT (?so AS ?uri)
548+
WHERE
549+
{ ?move rdf:type/(rdfs:subClassOf)* oeev:Move .
550+
?move oeev:concerns ?so ;
551+
oeev:to <http://opensilex.dev/id/organization/facility.bourdic>
552+
OPTIONAL
553+
{ ?move time:hasEnd/time:inXSDDateTimeStamp ?t}
554+
{ SELECT ?so (MAX(?endTime) AS ?t)
555+
WHERE
556+
{ ?so rdf:type/(rdfs:subClassOf)* vocabulary:ScientificObject .
557+
?move rdf:type/(rdfs:subClassOf)* oeev:Move .
558+
?move oeev:concerns ?so ;
559+
oeev:to ?facility .
560+
?move time:hasEnd/time:inXSDDateTimeStamp ?endTime}
561+
GROUP BY ?so
562+
}
560563
}
564+
}
565+
*/
566+
if (searchFilter.getFacility() != null) {
567+
ExprFactory exprFactory = SPARQLQueryHelper.getExprFactory();
568+
var hasEndHasDateTimeStamp = new P_Seq(new P_Link(Time.hasEnd.asNode()), new P_Link(Time.inXSDDateTimeStamp.asNode()));
569+
570+
var nestedSubSelect = new SelectBuilder();
571+
572+
var soVar = makeVar("_so");
573+
var moveVar = makeVar("_move");
574+
var facilityVar = makeVar("_facility");
575+
var endTimeVar = makeVar("_endTime");
576+
var lastMoveEndTimeVar = makeVar("_lastMoveEndTime");
577+
578+
nestedSubSelect.addVar(soVar);
579+
nestedSubSelect.addVar(new AggMax(exprFactory.asExpr(endTimeVar)).toString(), lastMoveEndTimeVar);
580+
581+
nestedSubSelect.addWhere(soVar, Ontology.typeSubClassAny, Oeso.ScientificObject.asNode());
582+
nestedSubSelect.addWhere(moveVar, Ontology.typeSubClassAny, Oeev.Move.asNode());
583+
nestedSubSelect.addWhere(moveVar, Oeev.concerns.asNode(), soVar);
584+
nestedSubSelect.addWhere(moveVar, Oeev.to.asNode(), facilityVar);
585+
nestedSubSelect.addWhere(moveVar, hasEndHasDateTimeStamp, endTimeVar);
586+
587+
nestedSubSelect.addGroupBy(soVar);
588+
589+
var nestedSelect = new SelectBuilder();
590+
591+
nestedSelect.addVar(exprFactory.asExpr(soVar), uriVar);
592+
593+
nestedSelect.addWhere(moveVar, Ontology.typeSubClassAny, Oeev.Move.asNode());
594+
nestedSelect.addWhere(moveVar, Oeev.concerns.asNode(), soVar);
595+
nestedSelect.addWhere(moveVar, Oeev.to.asNode(), SPARQLDeserializers.nodeURI(searchFilter.getFacility()));
596+
nestedSelect.addOptional(moveVar, hasEndHasDateTimeStamp, lastMoveEndTimeVar);
597+
598+
nestedSelect.addSubQuery(nestedSubSelect);
561599

562-
builder.addFilter(SPARQLQueryHelper.or(
563-
SPARQLQueryHelper.eq("__directFacility", facilityNode),
564-
SPARQLQueryHelper.eq("__parentFacility", facilityNode)
565-
));
600+
builder.addSubQuery(nestedSelect);
566601
}
567602

568603
// Add filter to check if object exists at given date

0 commit comments

Comments
 (0)