|
13 | 13 | import org.apache.jena.arq.querybuilder.handlers.WhereHandler; |
14 | 14 | import org.apache.jena.graph.Node; |
15 | 15 | import org.apache.jena.graph.NodeFactory; |
16 | | -import org.apache.jena.query.Query; |
17 | | -import org.apache.jena.query.QueryFactory; |
18 | 16 | import org.apache.jena.sparql.core.Var; |
19 | 17 | 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; |
21 | 23 | import org.apache.jena.vocabulary.DCTerms; |
22 | 24 | import org.apache.jena.vocabulary.RDF; |
23 | 25 | import org.apache.jena.vocabulary.RDFS; |
|
30 | 32 | import org.opensilex.core.exception.DuplicateNameListException; |
31 | 33 | import org.opensilex.core.experiment.dal.ExperimentModel; |
32 | 34 | import org.opensilex.core.experiment.factor.dal.FactorLevelModel; |
33 | | -import org.opensilex.core.germplasm.dal.GermplasmModel; |
34 | 35 | import org.opensilex.core.germplasmGroup.dal.GermplasmGroupModel; |
| 36 | +import org.opensilex.core.ontology.Oeev; |
35 | 37 | import org.opensilex.core.ontology.Oeso; |
| 38 | +import org.opensilex.core.ontology.Time; |
36 | 39 | import org.opensilex.core.ontology.api.RDFObjectDTO; |
37 | 40 | import org.opensilex.core.ontology.api.RDFObjectRelationDTO; |
38 | 41 | import org.opensilex.core.ontology.dal.SPARQLRelationFetcher; |
|
42 | 45 | import org.opensilex.nosql.mongodb.MongoDBService; |
43 | 46 | import org.opensilex.security.account.dal.AccountModel; |
44 | 47 | import org.opensilex.security.user.api.UserGetDTO; |
45 | | -import org.opensilex.server.exceptions.InvalidValueException; |
46 | 48 | import org.opensilex.sparql.deserializer.DateDeserializer; |
47 | 49 | import org.opensilex.sparql.deserializer.SPARQLDeserializer; |
48 | 50 | import org.opensilex.sparql.deserializer.SPARQLDeserializers; |
@@ -539,30 +541,63 @@ private void addSearchfilter(SelectBuilder builder, boolean isCount, ScientificO |
539 | 541 | } |
540 | 542 |
|
541 | 543 | // 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 | + } |
560 | 563 | } |
| 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); |
561 | 599 |
|
562 | | - builder.addFilter(SPARQLQueryHelper.or( |
563 | | - SPARQLQueryHelper.eq("__directFacility", facilityNode), |
564 | | - SPARQLQueryHelper.eq("__parentFacility", facilityNode) |
565 | | - )); |
| 600 | + builder.addSubQuery(nestedSelect); |
566 | 601 | } |
567 | 602 |
|
568 | 603 | // Add filter to check if object exists at given date |
|
0 commit comments