Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -469,9 +469,13 @@ public boolean isLoaded(Object object) {
public QueryImpl createQuery(String qlString) {
ensureOpen();
final QueryImpl q = getCurrentPersistenceContext().sparqlQueryFactory().createQuery(qlString);
initQueryCallbacks(q);
return q;
}

private void initQueryCallbacks(AbstractQuery q) {
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
return q;
}

@Override
Expand All @@ -483,28 +487,33 @@ public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) {
LOG.debug("CriteriaQuery translate to SOQL query: {}", soqlQuery);
final TypedQueryImpl<T> q = getCurrentPersistenceContext().sparqlQueryFactory()
.createQuery(soqlQuery, query.getResultType());
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
initTypedQueryDescriptor(query.getResultType(), q);
parameterFiller.setValuesToRegisteredParameters(q);

return q;
}

private <T> void initTypedQueryDescriptor(Class<T> resultClass, TypedQuery<T> q) {
if (getCurrentPersistenceContext().isEntityType(resultClass)) {
q.setDescriptor(descriptorFactory.createDescriptor(resultClass));
}
}

@Override
public <T> TypedQueryImpl<T> createQuery(String query, Class<T> resultClass) {
ensureOpen();
final TypedQueryImpl<T> q = getCurrentPersistenceContext().sparqlQueryFactory().createQuery(query, resultClass);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
initTypedQueryDescriptor(resultClass, q);
return q;
}

@Override
public QueryImpl createNativeQuery(String sparqlString) {
ensureOpen();
final QueryImpl q = getCurrentPersistenceContext().sparqlQueryFactory().createNativeQuery(sparqlString);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
return q;
}

Expand All @@ -513,8 +522,8 @@ public <T> TypedQueryImpl<T> createNativeQuery(String sparqlString, Class<T> res
ensureOpen();
final TypedQueryImpl<T> q = getCurrentPersistenceContext().sparqlQueryFactory()
.createNativeQuery(sparqlString, resultClass);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
initTypedQueryDescriptor(resultClass, q);
return q;
}

Expand All @@ -523,17 +532,15 @@ public QueryImpl createNativeQuery(String sparqlString, String resultSetMapping)
ensureOpen();
final QueryImpl q = getCurrentPersistenceContext().sparqlQueryFactory()
.createNativeQuery(sparqlString, resultSetMapping);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
return q;
}

@Override
public QueryImpl createNamedQuery(String name) {
ensureOpen();
final QueryImpl q = getCurrentPersistenceContext().sparqlQueryFactory().createNamedQuery(name);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
return q;
}

Expand All @@ -542,8 +549,8 @@ public <T> TypedQueryImpl<T> createNamedQuery(String name, Class<T> resultClass)
ensureOpen();
final TypedQueryImpl<T> q = getCurrentPersistenceContext().sparqlQueryFactory()
.createNamedQuery(name, resultClass);
q.setRollbackOnlyMarker(this::markTransactionForRollback);
q.setEnsureOpenProcedure(this::ensureOpen);
initQueryCallbacks(q);
initTypedQueryDescriptor(resultClass, q);
return q;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void setUp() throws Exception {
when(emfMock.getMetamodel()).thenReturn(metamodelMock);
when(emfMock.getServerSession()).thenReturn(serverSessionMock);
final NamespaceResolver nsResolver = new NamespaceResolver();
this.descriptorFactory = new DefaultEntityDescriptorFactory(metamodelMock, nsResolver);
this.descriptorFactory = spy(new DefaultEntityDescriptorFactory(metamodelMock, nsResolver));
when(metamodelMock.getNamespaceResolver()).thenReturn(nsResolver);
this.mocks = new MetamodelMocks();
mocks.setMocks(metamodelMock);
Expand Down Expand Up @@ -739,4 +739,28 @@ void cascadeRemoveTriggersLazyLoadingAndCascadesRemoval() {
verify(connectorMock).remove(eq(toRemove.getUri()), eq(OWLClassJ.class), any(Descriptor.class));
verify(connectorMock).remove(eq(a.getUri()), eq(OWLClassA.class), any(Descriptor.class));
}

@Test
void createTypedNativeQuerySetsDescriptorWhenResultTypeIsEntity() {
final EntityDescriptor d = new EntityDescriptor(Generators.createIndividualIdentifier());
when(descriptorFactory.createDescriptor(OWLClassA.class)).thenReturn(d);
final TypedQueryImpl<OWLClassA> query = em.createNativeQuery("SELECT * WHERE { ?x a ?type . }", OWLClassA.class);
verify(descriptorFactory).createDescriptor(OWLClassA.class);
assertEquals(d, query.getDescriptor());
}

@Test
void createTypedQuerySetsDescriptorWhenResultTypeIsEntity() {
final EntityDescriptor d = new EntityDescriptor(Generators.createIndividualIdentifier());
when(descriptorFactory.createDescriptor(OWLClassA.class)).thenReturn(d);
final TypedQueryImpl<OWLClassA> query = em.createQuery("SELECT a FROM OWLClassA a", OWLClassA.class);
verify(descriptorFactory).createDescriptor(OWLClassA.class);
assertEquals(d, query.getDescriptor());
}

@Test
void createTypedNativeQueryDoesNotSetDescriptorWhenResultTypeIsNotEntity() {
em.createNativeQuery("ASK WHERE { ?x a ?type } ", Boolean.class);
verify(descriptorFactory, never()).createDescriptor(Integer.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import cz.cvut.kbss.jopa.test.environment.Generators;
import cz.cvut.kbss.jopa.test.environment.PersistenceFactory;
import cz.cvut.kbss.jopa.test.environment.TestEnvironmentUtils;
import cz.cvut.kbss.jopa.vocabulary.RDFS;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;

Expand Down Expand Up @@ -238,8 +239,7 @@ void testUpdateRemoveFromReferencedListInContext() {
em.getTransaction().commit();

final OWLClassC resC = findRequired(OWLClassC.class, entityC.getUri(), cDescriptor);
assertEquals(entityC.getReferencedList().size() - removed.size(), resC.getReferencedList()
.size());
assertEquals(entityC.getReferencedList().size() - removed.size(), resC.getReferencedList().size());
for (OWLClassA a : removed) {
final OWLClassA resA = em.find(OWLClassA.class, a.getUri(), lstDescriptor);
assertNotNull(resA);
Expand Down Expand Up @@ -315,8 +315,8 @@ void testUpdateObjectPropertyInContextWithAssertionInContext() {
});

assertTrue(em.createNativeQuery("ASK { GRAPH ?g { ?s ?p ?o. }}", Boolean.class).setParameter("g", CONTEXT_TWO)
.setParameter("s", entityD.getUri()).setParameter("p", URI.create(Vocabulary.P_HAS_OWL_CLASS_A))
.setParameter("o", newA.getUri()).getSingleResult());
.setParameter("s", entityD.getUri()).setParameter("p", URI.create(Vocabulary.P_HAS_OWL_CLASS_A))
.setParameter("o", newA.getUri()).getSingleResult());
final OWLClassD result = findRequired(OWLClassD.class, entityD.getUri(), dDescriptor);
assertNotNull(result.getOwlClassA());
assertEquals(newA.getUri(), result.getOwlClassA().getUri());
Expand All @@ -336,7 +336,7 @@ void updateSupportsObjectPropertyWithMultipleContexts() {
entityF.setSimpleSet(new HashSet<>(Arrays.asList(entityA, entityA2)));
final Descriptor descriptor = new EntityDescriptor();
descriptor.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_ONE)
.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_TWO);
.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_TWO);
transactional(() -> em.merge(entityF, descriptor));

final OWLClassF result = findRequired(OWLClassF.class, entityF.getUri(), descriptor);
Expand All @@ -354,7 +354,7 @@ void updateWithinTransactionSupportsObjectPropertyWithMultipleContexts() {

final Descriptor descriptor = new EntityDescriptor();
descriptor.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_ONE)
.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_TWO);
.addAttributeContext(fieldSpecification(OWLClassF.class, "simpleSet"), CONTEXT_TWO);
transactional(() -> {
final OWLClassF toUpdate = findRequired(OWLClassF.class, entityF.getUri(), descriptor);
toUpdate.setSimpleSet(new HashSet<>(Arrays.asList(entityA, entityA2)));
Expand All @@ -367,4 +367,32 @@ void updateWithinTransactionSupportsObjectPropertyWithMultipleContexts() {
assertTrue(result.getSimpleSet().stream().anyMatch(a -> a.getUri().equals(entityA.getUri())));
assertTrue(result.getSimpleSet().stream().anyMatch(a -> a.getUri().equals(entityA2.getUri())));
}

/**
* Bug #437
*/
@Test
void updateOnEntityInAnnotationBasedContextLoadedWithQuerySavesValueInCorrectContext() {
this.em = getEntityManager("updateOnEntityInAnnotationBasedContextLoadedWithQuerySavesValueInCorrectContext", false);
final ClassInContext entity = new ClassInContext();
entity.setLabel("Initial label");
transactional(() -> em.persist(entity));

transactional(() -> {
final List<ClassInContext> loaded = em.createNativeQuery("SELECT ?x WHERE { GRAPH ?g {?x a ?type } }", ClassInContext.class)
.setParameter("type", URI.create(Vocabulary.CLASS_IRI_BASE + "classInContext"))
.getResultList();
assertEquals(1, loaded.size());
final ClassInContext loadedEntity = loaded.get(0);
loadedEntity.setLabel("Updated label");
});

final ClassInContext updatedEntity = em.find(ClassInContext.class, entity.getId());
assertEquals("Updated label", updatedEntity.getLabel());
assertTrue(em.createNativeQuery("ASK WHERE { GRAPH ?g { ?entity ?hasLabel ?label . } }", Boolean.class)
.setParameter("entity", entity)
.setParameter("g", URI.create("https://example.com/context"))
.setParameter("hasLabel", URI.create(RDFS.LABEL))
.getSingleResult());
}
}