-
Notifications
You must be signed in to change notification settings - Fork 14
/
AbstractQuery.java
93 lines (79 loc) · 3.12 KB
/
AbstractQuery.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package cz.cvut.kbss.jopa.model;
import cz.cvut.kbss.jopa.exceptions.OWLPersistenceException;
import cz.cvut.kbss.jopa.query.QueryHolder;
import cz.cvut.kbss.jopa.sessions.ConnectionWrapper;
import cz.cvut.kbss.jopa.utils.ErrorUtils;
import cz.cvut.kbss.jopa.utils.Procedure;
import cz.cvut.kbss.ontodriver.Statement;
import cz.cvut.kbss.ontodriver.exception.OntoDriverException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Objects;
/**
* Common state and behavior of both {@link cz.cvut.kbss.jopa.model.query.Query} and {@link
* cz.cvut.kbss.jopa.model.query.TypedQuery} implementations.
*/
abstract class AbstractQuery {
static final Logger LOG = LoggerFactory.getLogger(AbstractQuery.class);
final QueryHolder query;
final ConnectionWrapper connection;
private boolean useBackupOntology;
private Procedure rollbackOnlyMarker;
AbstractQuery(QueryHolder query, ConnectionWrapper connection) {
this.query = Objects.requireNonNull(query, ErrorUtils.getNPXMessageSupplier("query"));
this.connection = Objects.requireNonNull(connection, ErrorUtils.getNPXMessageSupplier("connection"));
this.useBackupOntology = false;
}
/**
* Sets ontology used for processing of this query.
*
* @param useBackupOntology If true, the backup (central) ontology is used, otherwise the transactional ontology is
* used (default)
*/
public void useBackupOntology(boolean useBackupOntology) {
this.useBackupOntology = useBackupOntology;
}
void executeUpdateImpl() {
final Statement stmt = connection.createStatement();
try {
setTargetOntology(stmt);
stmt.executeUpdate(query.assembleQuery());
} catch (OntoDriverException e) {
markTransactionForRollback();
throw queryEvaluationException(e);
} catch (RuntimeException e) {
markTransactionForRollback();
throw e;
} finally {
try {
stmt.close();
} catch (Exception e) {
LOG.error("Unable to close statement after update execution.", e);
}
}
}
void setTargetOntology(Statement stmt) {
if (useBackupOntology) {
stmt.useOntology(Statement.StatementOntology.CENTRAL);
} else {
stmt.useOntology(Statement.StatementOntology.TRANSACTIONAL);
}
}
OWLPersistenceException queryEvaluationException(OntoDriverException e) {
final String executedQuery = query.assembleQuery();
return new OWLPersistenceException("Exception caught when evaluating query " + executedQuery, e);
}
void markTransactionForRollback() {
if (rollbackOnlyMarker != null) {
rollbackOnlyMarker.execute();
}
}
/**
* Registers reference to a method which marks current transaction (if active) for rollback on exceptions.
*
* @param rollbackOnlyMarker The marker to invoke on exceptions
*/
void setRollbackOnlyMarker(Procedure rollbackOnlyMarker) {
this.rollbackOnlyMarker = rollbackOnlyMarker;
}
}