Skip to content

Commit 9db4d14

Browse files
committed
CAY-2912 Compact SQL logger
cleanup
1 parent 24dfb1b commit 9db4d14

13 files changed

Lines changed: 127 additions & 532 deletions

cayenne/src/main/java/org/apache/cayenne/access/DataNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ public void performQueries(Collection<? extends Query> queries, OperationObserve
262262
try {
263263
getAdapter()
264264
.getAction(nextQuery, this)
265-
.performAction(connection, new OriginalQueryObserver(instrumentedCallback, nextQuery));
265+
.performAction(connection, instrumentedCallback);
266266
} catch (Exception queryEx) {
267267
instrumentedCallback.nextQueryException(nextQuery, queryEx);
268268

cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.cayenne.access;
2121

22+
import org.apache.cayenne.CayenneRuntimeException;
2223
import org.apache.cayenne.ObjectId;
2324
import org.apache.cayenne.ResultIterator;
2425
import org.apache.cayenne.access.translator.TranslatedStatement;
@@ -29,6 +30,10 @@
2930
/**
3031
* Defines a set of callback methods that allow {@link DataNode} to pass back query
3132
* results and notify caller about exceptions.
33+
* <p>
34+
* All methods have default implementations: the result callbacks do nothing, the exception callbacks rethrow the
35+
* reported exception wrapped in a {@link CayenneRuntimeException}, and {@link #isIteratedResult()} returns false. An
36+
* implementation only needs to override the callbacks it cares about.
3237
*/
3338
public interface OperationObserver extends OperationHints {
3439

@@ -50,22 +55,33 @@ default void nextStatement(Query query, TranslatedStatement statement) {
5055
default void onSuccess() {
5156
}
5257

58+
/**
59+
* Returns whether results should be returned as a {@link ResultIterator}. Defaults to false.
60+
*/
61+
@Override
62+
default boolean isIteratedResult() {
63+
return false;
64+
}
65+
5366
/**
5467
* Callback method invoked after an updating query is executed.
5568
*/
56-
void nextCount(Query query, int resultCount);
69+
default void nextCount(Query query, int resultCount) {
70+
}
5771

5872
/**
5973
* Callback method invoked after a batch update is executed.
6074
*/
61-
void nextBatchCount(Query query, int[] resultCount);
75+
default void nextBatchCount(Query query, int[] resultCount) {
76+
}
6277

6378
/**
6479
* Callback method invoked for each processed ResultSet.
6580
*
6681
* @since 3.0
6782
*/
68-
void nextRows(Query query, List<?> dataRows);
83+
default void nextRows(Query query, List<?> dataRows) {
84+
}
6985

7086
/**
7187
* Callback method invoked for each opened ResultIterator. If this observer requested
@@ -74,24 +90,31 @@ default void onSuccess() {
7490
*
7591
* @since 3.0
7692
*/
77-
void nextRows(Query q, ResultIterator<?> it);
93+
default void nextRows(Query q, ResultIterator<?> it) {
94+
}
7895

7996
/**
8097
* Callback method invoked after each batch of generated values is read during an update.
8198
*
8299
* @since 4.2
83100
*/
84-
void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> idsToUpdate);
101+
default void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> idsToUpdate) {
102+
}
85103

86104
/**
87105
* Callback method invoked on exceptions that happen during an execution of a specific
88-
* query.
106+
* query. The default implementation rethrows the exception wrapped in a {@link CayenneRuntimeException}.
89107
*/
90-
void nextQueryException(Query query, Exception ex);
108+
default void nextQueryException(Query query, Exception ex) {
109+
throw new CayenneRuntimeException(ex);
110+
}
91111

92112
/**
93113
* Callback method invoked on exceptions that are not tied to a specific query
94-
* execution, such as JDBC connection exceptions, etc.
114+
* execution, such as JDBC connection exceptions, etc. The default implementation rethrows the exception wrapped in
115+
* a {@link CayenneRuntimeException}.
95116
*/
96-
void nextGlobalException(Exception ex);
117+
default void nextGlobalException(Exception ex) {
118+
throw new CayenneRuntimeException(ex);
119+
}
97120
}

cayenne/src/main/java/org/apache/cayenne/access/OriginalQueryObserver.java

Lines changed: 0 additions & 93 deletions
This file was deleted.

cayenne/src/main/java/org/apache/cayenne/access/flush/FlushObserver.java

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,27 @@
1919

2020
package org.apache.cayenne.access.flush;
2121

22-
import java.util.List;
23-
2422
import org.apache.cayenne.CayenneRuntimeException;
2523
import org.apache.cayenne.DataRow;
2624
import org.apache.cayenne.ObjectId;
2725
import org.apache.cayenne.ResultIterator;
2826
import org.apache.cayenne.access.OperationObserver;
2927
import org.apache.cayenne.log.SqlLogger;
3028
import org.apache.cayenne.map.DbAttribute;
31-
import org.apache.cayenne.query.BatchQuery;
3229
import org.apache.cayenne.query.InsertBatchQuery;
3330
import org.apache.cayenne.query.Query;
3431
import org.apache.cayenne.util.Util;
3532

33+
import java.util.List;
34+
3635
/**
3736
* @since 4.2
3837
*/
3938
class FlushObserver implements OperationObserver {
4039

41-
private SqlLogger logger;
40+
private final SqlLogger logger;
4241

43-
FlushObserver(SqlLogger logger) {
42+
public FlushObserver(SqlLogger logger) {
4443
this.logger = logger;
4544
}
4645

@@ -63,13 +62,11 @@ public void nextGeneratedRows(Query query, ResultIterator<?> keysIterator, List<
6362

6463
// read and close the iterator before doing anything else
6564
List<DataRow> keys;
66-
try {
65+
try (keysIterator) {
6766
keys = (List<DataRow>) keysIterator.allRows();
68-
} finally {
69-
keysIterator.close();
7067
}
7168

72-
if (!(query instanceof InsertBatchQuery)) {
69+
if (!(query instanceof InsertBatchQuery batch)) {
7370
throw new CayenneRuntimeException("Generated keys only supported for InsertBatchQuery, instead got %s", query);
7471
}
7572

@@ -80,8 +77,7 @@ public void nextGeneratedRows(Query query, ResultIterator<?> keysIterator, List<
8077
for (int i = 0; i < keys.size(); i++) {
8178
DataRow key = keys.get(i);
8279

83-
// empty key?
84-
if (key.size() == 0) {
80+
if (key.isEmpty()) {
8581
throw new CayenneRuntimeException("Empty key generated.");
8682
}
8783

@@ -91,8 +87,7 @@ public void nextGeneratedRows(Query query, ResultIterator<?> keysIterator, List<
9187
return;
9288
}
9389

94-
BatchQuery batch = (BatchQuery) query;
95-
for (DbAttribute attribute : batch.getDbEntity().getGeneratedAttributes()) {
90+
for (DbAttribute attribute : batch.getDbEntity().getGeneratedAttributes()) {
9691

9792
// batch can have generated attributes that are not PKs, e.g.
9893
// columns with
@@ -121,26 +116,6 @@ public void nextGeneratedRows(Query query, ResultIterator<?> keysIterator, List<
121116
}
122117
}
123118

124-
public void setSqlLogger(SqlLogger logger) {
125-
this.logger = logger;
126-
}
127-
128-
public SqlLogger getSqlLogger() {
129-
return this.logger;
130-
}
131-
132-
@Override
133-
public void nextBatchCount(Query query, int[] resultCount) {
134-
}
135-
136-
@Override
137-
public void nextCount(Query query, int resultCount) {
138-
}
139-
140-
@Override
141-
public void nextRows(Query query, List<?> dataRows) {
142-
}
143-
144119
@Override
145120
@SuppressWarnings("rawtypes")
146121
public void nextRows(Query q, ResultIterator it) {

cayenne/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,27 @@
1818
****************************************************************/
1919
package org.apache.cayenne.access.jdbc;
2020

21+
import org.apache.cayenne.ObjectId;
22+
import org.apache.cayenne.ResultIterator;
2123
import org.apache.cayenne.access.DataNode;
2224
import org.apache.cayenne.access.OperationObserver;
2325
import org.apache.cayenne.access.translator.ejbql.EJBQLTranslationContext;
2426
import org.apache.cayenne.access.translator.EJBQLTranslator;
27+
import org.apache.cayenne.access.translator.TranslatedStatement;
2528
import org.apache.cayenne.dba.QuotingStrategy;
2629
import org.apache.cayenne.ejbql.EJBQLBaseVisitor;
2730
import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
2831
import org.apache.cayenne.map.DbEntity;
2932
import org.apache.cayenne.ejbql.EJBQLExpression;
3033
import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
3134
import org.apache.cayenne.query.EJBQLQuery;
35+
import org.apache.cayenne.query.Query;
3236
import org.apache.cayenne.query.QueryMetadata;
3337
import org.apache.cayenne.query.SQLActionVisitor;
3438
import org.apache.cayenne.query.SQLTemplate;
3539

3640
import java.sql.Connection;
41+
import java.util.List;
3742

3843
/**
3944
* Parses an EJBQL statement, converting it to SQL. Executes the resulting SQL.
@@ -110,6 +115,69 @@ public boolean visitUpdate(EJBQLExpression expression) {
110115
sqlQuery.setQueryTimeout(queryTimeout);
111116
}
112117

113-
actionFactory.sqlAction(sqlQuery).performAction(connection, observer);
118+
// the SQLTemplate is a substitute for the original EJBQLQuery; wrap the observer so that results are reported
119+
// against the EJBQLQuery the caller submitted rather than the internally compiled SQLTemplate
120+
actionFactory.sqlAction(sqlQuery).performAction(connection, new OriginalQueryObserver(observer, query));
121+
}
122+
123+
static class OriginalQueryObserver implements OperationObserver {
124+
125+
private final OperationObserver delegate;
126+
private final Query originalQuery;
127+
128+
OriginalQueryObserver(OperationObserver delegate, Query originalQuery) {
129+
this.delegate = delegate;
130+
this.originalQuery = originalQuery;
131+
}
132+
133+
@Override
134+
public void nextStatement(Query query, TranslatedStatement statement) {
135+
delegate.nextStatement(originalQuery, statement);
136+
}
137+
138+
@Override
139+
public void onSuccess() {
140+
delegate.onSuccess();
141+
}
142+
143+
@Override
144+
public void nextCount(Query query, int resultCount) {
145+
delegate.nextCount(originalQuery, resultCount);
146+
}
147+
148+
@Override
149+
public void nextBatchCount(Query query, int[] resultCount) {
150+
delegate.nextBatchCount(originalQuery, resultCount);
151+
}
152+
153+
@Override
154+
public void nextRows(Query query, List<?> dataRows) {
155+
delegate.nextRows(originalQuery, dataRows);
156+
}
157+
158+
@Override
159+
public void nextRows(Query query, ResultIterator<?> it) {
160+
delegate.nextRows(originalQuery, it);
161+
}
162+
163+
@Override
164+
public void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> idsToUpdate) {
165+
delegate.nextGeneratedRows(originalQuery, keys, idsToUpdate);
166+
}
167+
168+
@Override
169+
public void nextQueryException(Query query, Exception ex) {
170+
delegate.nextQueryException(originalQuery, ex);
171+
}
172+
173+
@Override
174+
public void nextGlobalException(Exception ex) {
175+
delegate.nextGlobalException(ex);
176+
}
177+
178+
@Override
179+
public boolean isIteratedResult() {
180+
return delegate.isIteratedResult();
181+
}
114182
}
115183
}

0 commit comments

Comments
 (0)