Skip to content

Commit

Permalink
T19191/content lib update (#234)
Browse files Browse the repository at this point in the history
* #T19191 lib update for parent child: a top level field needs to be added in elastic for this to work

* undo change

* rename variable

* refactor

* rename to content_join_field

* use Consumer instead, also revert the constructors so current projects dont get affected and use a @builder instead

* change to BiConsumer because I need to pass the type too

* replace nested conditions to make code more readable

* add postIndexInterceptor to allow editing index document before it's sent to elasticsearch

---------

Co-authored-by: domi.vds <[email protected]>
  • Loading branch information
christinaspachiou and domivds authored Apr 15, 2024
1 parent 554c0a6 commit 97bf8a8
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 41 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package zone.cogni.asquare.sparqlservice;

import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.springframework.core.io.FileSystemResource;
import zone.cogni.asquare.triplestore.RdfStoreService;
import zone.cogni.libs.jena.utils.JenaUtils;
import zone.cogni.libs.sparqlservice.SparqlService;

import java.io.File;
import java.util.function.Function;

public class RdfStoreSparqlService implements SparqlService {
private final RdfStoreService rdfStoreService;

public RdfStoreSparqlService(RdfStoreService rdfStoreService) {
this.rdfStoreService = rdfStoreService;
}

@Override
public void uploadTtlFile(File file) {
Model model = JenaUtils.read(new FileSystemResource(file));
rdfStoreService.addData(model);
}

@Override
public Model queryForModel(String query) {
return rdfStoreService.executeConstructQuery(query);
}

@Override
public void executeUpdateQuery(String updateQuery) {
rdfStoreService.executeUpdateQuery(updateQuery);
}

@Override
public boolean executeAskQuery(String updateQuery) {
return rdfStoreService.executeAskQuery(updateQuery);
}

@Override
public void upload(Model model, String graphUri) {
rdfStoreService.addData(model);
}

@Override
public <R> R executeSelectQuery(String query, Function<ResultSet, R> resultHandler) {
return rdfStoreService.executeSelectQuery(query, resultHandler::apply);
}

@Override
public void dropGraph(String graphUri) {
rdfStoreService.deleteGraph(graphUri);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import zone.cogni.asquare.access.ApplicationView;
import zone.cogni.asquare.service.elasticsearch.Params;
import zone.cogni.asquare.access.graph.GraphApplicationViewFactory;
import zone.cogni.asquare.access.graph.GraphViewService;
import zone.cogni.asquare.access.graph.SaveUtilities;
import zone.cogni.asquare.applicationprofile.model.basic.ApplicationProfile;
import zone.cogni.asquare.rdf.TypedResource;
import zone.cogni.asquare.service.async.AsyncContext;
import zone.cogni.asquare.service.elasticsearch.ElasticStore;
import zone.cogni.asquare.service.elasticsearch.Params;
import zone.cogni.asquare.service.jsonconversion.JsonConversionFactory;
import zone.cogni.asquare.triplestore.RdfStoreService;
import zone.cogni.asquare.web.rest.controller.exceptions.NotFoundException;
Expand All @@ -28,6 +28,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;

@Service
Expand All @@ -38,13 +39,15 @@ public class GraphIndexService {
private final IndexConfigProvider indexConfigProvider;
private final Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier;
private final Function<ResourceIndex, Function<TypedResource, ObjectNode>> facetConversionSupplier;
private final BiConsumer<ObjectNode, String> postIndexInterceptor;
private final ElasticStore elasticsearchStore;
private final JsonConversionFactory jsonConversion;

public GraphIndexService(IndexConfigProvider indexConfigProvider,
GraphApplicationViewFactory applicationViewFactory,
JsonConversionFactory jsonConversion) {
this.applicationViewFactory = applicationViewFactory;
this.postIndexInterceptor = indexConfigProvider.getPostIndexInterceptor();
this.jsonConversion = jsonConversion;
this.indexConfigProvider = indexConfigProvider;
this.applicationProfileSupplier = indexConfigProvider.getApplicationProfileSupplier();
Expand Down Expand Up @@ -73,16 +76,8 @@ public Boolean indexUriSync(ResourceIndex resourceIndex, ApplicationView view, P

ObjectNode json = jsonConversion.getTypedResourceToJson().withTypedResource(resource).get();

if (facetConversionSupplier != null) {
Function<TypedResource, ObjectNode> facetConversion = facetConversionSupplier.apply(resourceIndex);
ObjectNode facets = null;
if (facetConversion != null) {
facets = facetConversion.apply(resource);
}
if (facets != null) {
json.set("facets", facets);
}
}
executeFacetConversion(resourceIndex, resource, json);
executePostIndexInterceptor(json, resourceIndex.getType());

if (params.hasGraph()) {
json.set(IndexService.INDEX_GRAPH_NAME, new TextNode(params.getGraph()));
Expand All @@ -109,6 +104,20 @@ else if(StringUtils.isNotBlank(resourceIndex.getGraph())) {
return false;
}

private void executeFacetConversion(ResourceIndex resourceIndex, TypedResource resource, ObjectNode json) {
if (facetConversionSupplier == null) return;
Function<TypedResource, ObjectNode> facetConversion = facetConversionSupplier.apply(resourceIndex);
if (facetConversion == null) return;
ObjectNode facets = facetConversion.apply(resource);
if (facets == null) return;
json.set("facets", facets);
}

private void executePostIndexInterceptor(ObjectNode json, String type) {
if (postIndexInterceptor == null) return;
postIndexInterceptor.accept(json, type);
}

@Deprecated
public Boolean indexUriSync(ResourceIndex resourceIndex) {
return indexUriSync(resourceIndex, indexConfigProvider.getRdfStoreService(), null);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,79 +1,93 @@
package zone.cogni.asquare.service.index;

import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.springframework.core.io.FileSystemResource;
import zone.cogni.asquare.applicationprofile.model.basic.ApplicationProfile;
import zone.cogni.asquare.rdf.TypedResource;
import zone.cogni.asquare.service.elasticsearch.ElasticStore;
import zone.cogni.asquare.service.elasticsearch.v7.Elasticsearch7Store;
import zone.cogni.asquare.sparqlservice.RdfStoreSparqlService;
import zone.cogni.asquare.triplestore.RdfStoreService;
import zone.cogni.asquare.virtuoso.SparqlRdfStoreService;
import zone.cogni.libs.jena.utils.JenaUtils;
import zone.cogni.libs.sparqlservice.SparqlService;

import javax.annotation.Nullable;
import java.io.File;
import java.util.function.BiConsumer;
import java.util.function.Function;

@Builder
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class IndexConfigProvider {

private final RdfStoreService rdfStoreService;
private final SparqlService sparqlService;
private final Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier;
private final ElasticStore elasticStore;
@Nullable
private final Function<ResourceIndex, Function<TypedResource, ObjectNode>> facetConversionSupplier;

/**
* Post index interceptor consuming the resulting index document and receiving the Type of the object.
* This allows to tweak the index document before it's sent to elasticsearch.
*/
@Nullable
private final BiConsumer<ObjectNode, String> postIndexInterceptor;
@Getter(lazy = true)
private final SparqlService sparqlService = new RdfStoreSparqlService(rdfStoreService); //init will be done on first get call

/**
* @deprecated Use builder instead.
*/
@Deprecated
public IndexConfigProvider(RdfStoreService rdfStoreService,
Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier,
Elasticsearch7Store elasticStore,
Function<ResourceIndex, Function<TypedResource, ObjectNode>> facetConversionSupplier) {
this.rdfStoreService = rdfStoreService;
this.sparqlService = new SparqlServiceImpl(rdfStoreService);
this.elasticStore = elasticStore;
this.applicationProfileSupplier = applicationProfileSupplier;
this.facetConversionSupplier = facetConversionSupplier;
this(rdfStoreService, applicationProfileSupplier, elasticStore, facetConversionSupplier, null);
}

/**
* @deprecated Use builder instead.
*/
@Deprecated
public IndexConfigProvider(RdfStoreService rdfStoreService,
Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier,
Elasticsearch7Store elasticStore) {
this(rdfStoreService, applicationProfileSupplier, elasticStore, null);
this(rdfStoreService, applicationProfileSupplier, elasticStore, null, null);
}

/**
* @deprecated Use builder instead.
*/
@Deprecated
public IndexConfigProvider(SparqlService sparqlService,
Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier,
Elasticsearch7Store elasticStore) {
this(new SparqlRdfStoreService(sparqlService), applicationProfileSupplier, elasticStore, null);
this(new SparqlRdfStoreService(sparqlService), applicationProfileSupplier, elasticStore, null, null);
}

/**
* @deprecated Use builder instead.
*/
@Deprecated
public IndexConfigProvider(SparqlService sparqlService,
Function<ResourceIndex, ApplicationProfile> applicationProfileSupplier,
Elasticsearch7Store elasticStore,
Function<ResourceIndex, Function<TypedResource, ObjectNode>> facetConversionSupplier) {
this(new SparqlRdfStoreService(sparqlService), applicationProfileSupplier, elasticStore, facetConversionSupplier);
}

public RdfStoreService getRdfStoreService() {
return rdfStoreService;
}

public SparqlService getSparqlService() {
return sparqlService;
}

public Function<ResourceIndex, ApplicationProfile> getApplicationProfileSupplier() {
return applicationProfileSupplier;
}

public Function<ResourceIndex, Function<TypedResource, ObjectNode>> getFacetConversionSupplier() {
return facetConversionSupplier;
}

public ElasticStore getElasticStore() {
return elasticStore;
this(new SparqlRdfStoreService(sparqlService), applicationProfileSupplier, elasticStore, facetConversionSupplier, null);
}

/**
* @deprecated Use {@link RdfStoreSparqlService}
*/
@Deprecated
public static class SparqlServiceImpl implements SparqlService {
private final RdfStoreService rdfStoreService;

Expand Down

0 comments on commit 97bf8a8

Please sign in to comment.