PaintingDao.java
/*******************************************************************************
* Copyright (c) 2021 Eclipse RDF4J contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/
package org.eclipse.rdf4j.spring.domain.dao;
import static org.eclipse.rdf4j.sparqlbuilder.rdf.Rdf.iri;
import static org.eclipse.rdf4j.spring.domain.model.Painting.PAINTING_ARTIST_ID;
import static org.eclipse.rdf4j.spring.domain.model.Painting.PAINTING_ID;
import static org.eclipse.rdf4j.spring.domain.model.Painting.PAINTING_LABEL;
import static org.eclipse.rdf4j.spring.domain.model.Painting.PAINTING_TECHNIQUE;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.vocabulary.RDFS;
import org.eclipse.rdf4j.query.BindingSet;
import org.eclipse.rdf4j.sparqlbuilder.core.query.Queries;
import org.eclipse.rdf4j.spring.dao.SimpleRDF4JCRUDDao;
import org.eclipse.rdf4j.spring.dao.support.UpdateWithModelBuilder;
import org.eclipse.rdf4j.spring.dao.support.bindingsBuilder.MutableBindings;
import org.eclipse.rdf4j.spring.dao.support.sparql.NamedSparqlSupplier;
import org.eclipse.rdf4j.spring.domain.model.EX;
import org.eclipse.rdf4j.spring.domain.model.Painting;
import org.eclipse.rdf4j.spring.support.RDF4JTemplate;
import org.eclipse.rdf4j.spring.util.QueryResultUtils;
import org.springframework.stereotype.Component;
/**
* @author Florian Kleedorfer
* @since 4.0.0
*/
@Component
public class PaintingDao extends SimpleRDF4JCRUDDao<Painting, IRI> {
public PaintingDao(RDF4JTemplate rdf4JTemplate) {
super(rdf4JTemplate);
}
@Override
protected void populateIdBindings(MutableBindings bindingsBuilder, IRI iri) {
bindingsBuilder.add(PAINTING_ID, iri);
}
@Override
protected NamedSparqlSupplierPreparer prepareNamedSparqlSuppliers(NamedSparqlSupplierPreparer preparer) {
return null;
}
@Override
protected Painting mapSolution(BindingSet querySolution) {
Painting painting = new Painting();
painting.setId(QueryResultUtils.getIRI(querySolution, PAINTING_ID));
painting.setTechnique(QueryResultUtils.getString(querySolution, PAINTING_TECHNIQUE));
painting.setTitle(QueryResultUtils.getString(querySolution, PAINTING_LABEL));
painting.setArtistId(QueryResultUtils.getIRI(querySolution, PAINTING_ARTIST_ID));
return painting;
}
@Override
protected String getReadQuery() {
return Queries.SELECT(PAINTING_ID, PAINTING_LABEL, PAINTING_TECHNIQUE, PAINTING_ARTIST_ID)
.where(
PAINTING_ID.isA(iri(EX.Painting))
.andHas(iri(EX.technique), PAINTING_TECHNIQUE)
.andHas(iri(RDFS.LABEL), PAINTING_LABEL),
PAINTING_ARTIST_ID.has(iri(EX.creatorOf), PAINTING_ID))
.getQueryString();
}
@Override
protected NamedSparqlSupplier getInsertSparql(Painting painting) {
return NamedSparqlSupplier.of("insert", () -> Queries.INSERT(
PAINTING_ID.isA(iri(EX.Painting))
.andHas(iri(EX.technique), PAINTING_TECHNIQUE)
.andHas(iri(RDFS.LABEL), PAINTING_LABEL),
PAINTING_ARTIST_ID.has(iri(EX.creatorOf), PAINTING_ID))
.getQueryString());
}
@Override
protected void populateBindingsForUpdate(MutableBindings bindingsBuilder, Painting painting) {
bindingsBuilder
.add(PAINTING_LABEL, painting.getTitle())
.add(PAINTING_TECHNIQUE, painting.getTechnique())
.add(PAINTING_ARTIST_ID, painting.getArtistId());
}
@Override
protected IRI getInputId(Painting painting) {
if (painting.getId() == null) {
return getRdf4JTemplate().getNewUUID();
}
return painting.getId();
}
public void changeArtist(IRI painting, IRI newArtist) {
UpdateWithModelBuilder update = getRdf4JTemplate().updateWithBuilder();
update.remove(null, EX.creatorOf, painting);
update.add(newArtist, EX.creatorOf, painting);
update.execute();
}
}