You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2022/06/30 15:08:11 UTC

[cayenne] 09/09: CAY-2737 Cayenne 4.3: cleanup deprecated code

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 336f0e5297fe6ccdc3b1904ab4f6ee2c6d1ab9dc
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jun 30 18:03:11 2022 +0300

    CAY-2737 Cayenne 4.3: cleanup deprecated code
---
 .../cache/invalidation/InvalidationFunction.java   |  39 --------
 .../configuration/rop/server/ROPServerModule.java  |  14 ---
 .../java/org/apache/cayenne/CayenneDataObject.java |  14 ---
 .../java/org/apache/cayenne/CayenneException.java  |  82 ----------------
 .../apache/cayenne/CayenneRuntimeException.java    |   2 +-
 .../apache/cayenne/access/OperationObserver.java   |  11 ---
 .../cayenne/dba/sqlserver/SQLServerAdapter.java    |   6 --
 .../apache/cayenne/map/SelectQueryDescriptor.java  |  32 ------
 .../java/org/apache/cayenne/query/SQLSelect.java   |  84 ----------------
 .../cayenne/tx/DefaultTransactionDescriptor.java   |   9 +-
 .../apache/cayenne/tx/TransactionDescriptor.java   |  45 +--------
 .../org/apache/cayenne/CayenneExceptionTest.java   |  75 --------------
 .../org/apache/cayenne/access/DbArcIdTest.java     |  74 --------------
 .../apache/cayenne/access/FlattenedArcKeyIT.java   |  98 -------------------
 .../java/org/apache/cayenne/query/SQLSelectIT.java |   2 +-
 .../velocity/SQLTemplateResourceManager.java       | 108 ---------------------
 .../apache/cayenne/wocompat/EOModelProcessor.java  |   3 +-
 .../java/org/apache/cayenne/wocompat/EOQuery.java  |   8 --
 18 files changed, 10 insertions(+), 696 deletions(-)

diff --git a/cayenne-cache-invalidation/src/main/java/org/apache/cayenne/cache/invalidation/InvalidationFunction.java b/cayenne-cache-invalidation/src/main/java/org/apache/cayenne/cache/invalidation/InvalidationFunction.java
deleted file mode 100644
index 59a8a2749..000000000
--- a/cayenne-cache-invalidation/src/main/java/org/apache/cayenne/cache/invalidation/InvalidationFunction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.cache.invalidation;
-
-import org.apache.cayenne.Persistent;
-
-import java.util.Collection;
-import java.util.function.Function;
-
-/**
- * @since 4.0
- * @deprecated since 4.1 plain Function&gt;Persistent, Collection&gt;CacheGroupDescriptor>> can be used.
- */
-@Deprecated
-public interface InvalidationFunction extends Function<Persistent, Collection<CacheGroupDescriptor>> {
-
-    /**
-     * @return collection of cache groups to invalidate for given object
-     */
-    Collection<CacheGroupDescriptor> apply(Persistent persistent);
-
-}
\ No newline at end of file
diff --git a/cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModule.java b/cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModule.java
index 896ff89e4..ec6a57dc5 100644
--- a/cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModule.java
+++ b/cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModule.java
@@ -55,20 +55,6 @@ public class ROPServerModule implements Module {
         return binder.bindList(String.class, ROPConstants.SERIALIZATION_WHITELIST);
     }
 
-
-    public ROPServerModule() {}
-
-    /**
-     * @deprecated since 4.2 ROPServerModule became autoloaded.
-     * You need to contribute eventBridgeProperties yourself.
-     * Use {@link #contributeROPBridgeProperties(Binder)} to
-     * contribute properties.
-     */
-    @Deprecated
-    public ROPServerModule(Map<String, String> eventBridgeProperties) {
-        this.eventBridgeProperties = eventBridgeProperties;
-    }
-
     public void configure(Binder binder) {
         contributeSerializationWhitelist(binder);
         MapBuilder<String> mapBuilder = contributeROPBridgeProperties(binder);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
index de20ced25..72fb66835 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
@@ -140,18 +140,4 @@ public class CayenneDataObject extends BaseDataObject {
 		super.writeState(out);
 		out.writeObject(values);
 	}
-
-	/**
-	 * Convenience method to invoke {@link Cayenne#makePath(String...)} from
-	 * within a DataObject subclass to create a dotted path using the generated
-	 * string constants for attributes and relationships.
-	 *
-	 * @deprecated since 4.1, use {@link Cayenne#makePath(String...)} instead
-	 * @see Cayenne#makePath(String...)
-	 * @since 3.1
-	 */
-	@Deprecated
-	public static String makePath(String... pathParts) {
-		return Cayenne.makePath(pathParts);
-	}
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneException.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneException.java
deleted file mode 100644
index e9ccc1d34..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneException.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-
-/**
- * A generic checked exception that may be thrown by Cayenne framework. All checked
- * exceptions in Cayenne inherit from this class.
- *
- * @deprecated since 4.1 use {@link CayenneRuntimeException} instead
- */
-@Deprecated
-public class CayenneException extends Exception {
-
-    /**
-     * @deprecated since 4.1 use {@link CayenneRuntimeException#getExceptionLabel()}
-     */
-    @Deprecated
-    public static String getExceptionLabel() {
-        return CayenneRuntimeException.getExceptionLabel();
-    }
-
-    /**
-     * Creates new <code>CayenneException</code> without detail message.
-     */
-    public CayenneException() {
-    }
-
-    /**
-     * Constructs an <code>CayenneException</code> with the specified detail message.
-     * 
-     * @param messageFormat the detail message format string.
-     */
-    public CayenneException(String messageFormat, Object... messageArgs) {
-        super(String.format(messageFormat, messageArgs));
-    }
-
-    /**
-     * Constructs an <code>CayenneException</code> that wraps a <code>cause</code> thrown
-     * elsewhere.
-     */
-    public CayenneException(Throwable cause) {
-        super(cause);
-    }
-
-    public CayenneException(String messageFormat, Throwable cause, Object... messageArgs) {
-        super(String.format(messageFormat, messageArgs), cause);
-    }
-
-    /**
-     * Returns exception message without Cayenne version label.
-     * 
-     * @since 1.1
-     */
-    public String getUnlabeledMessage() {
-        return super.getMessage();
-    }
-
-    @Override
-    public String getMessage() {
-        String message = super.getMessage();
-        return (message != null) ? getExceptionLabel() + message : getExceptionLabel()
-                + "(no message)";
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneRuntimeException.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneRuntimeException.java
index c6a687285..083dd124d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneRuntimeException.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneRuntimeException.java
@@ -36,7 +36,7 @@ public class CayenneRuntimeException extends RuntimeException {
     }
 
     /**
-     * @since 4.1 moved from deprecated {@link CayenneException}
+     * @since 4.1
      */
     public static String getExceptionLabel() {
         return exceptionLabel;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
index 955383124..721a6de11 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java
@@ -58,17 +58,6 @@ public interface OperationObserver extends OperationHints {
      */
     void nextRows(Query q, ResultIterator<?> it);
 
-    /**
-     * Callback method invoked after each batch of generated values is read during an update.
-     * 
-     * @since 4.0
-     * @deprecated since 4.2, use {@link #nextGeneratedRows(Query, ResultIterator, List)}
-     */
-    @Deprecated
-    default void nextGeneratedRows(Query query, ResultIterator<?> keys, ObjectId idToUpdate) {
-        nextGeneratedRows(query, keys, Collections.singletonList(idToUpdate));
-    }
-
     /**
      * Callback method invoked after each batch of generated values is read during an update.
      * @since 4.2
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 6642e8e5e..401fa1d63 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -82,12 +82,6 @@ public class SQLServerAdapter extends SybaseAdapter {
 	 */
 	private Integer version;
 
-	/**
-	 * @deprecated since 4.2 unused
-	 */
-	@Deprecated
-	public static final String TRIM_FUNCTION = "RTRIM";
-
 	private final List<String> SYSTEM_SCHEMAS = Arrays.asList(
 			"db_accessadmin", "db_backupoperator",
 			"db_datareader", "db_datawriter", "db_ddladmin", "db_denydatareader",
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
index 8722cd0d4..ae6ac57f6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
@@ -110,16 +110,6 @@ public class SelectQueryDescriptor extends QueryDescriptor {
         return prefetchesMap;
     }
 
-    /**
-     * Returns list of prefetch paths for this query.
-     *
-     * @deprecated since 4.1 use {@link #getPrefetchesMap()}.
-     */
-    @Deprecated
-    public List<String> getPrefetches() {
-        return new ArrayList<>(prefetchesMap.keySet());
-    }
-
     /**
      * Sets map of prefetch paths with semantics for this query.
      *
@@ -129,18 +119,6 @@ public class SelectQueryDescriptor extends QueryDescriptor {
         this.prefetchesMap = prefetchesMap;
     }
 
-    /**
-     * Sets list of prefetch paths for this query.
-     *
-     * @deprecated since 4.1 use {@link #setPrefetchesMap(HashMap)}.
-     */
-    @Deprecated
-    public void setPrefetches(List<String> prefetches) {
-        for(String prefetch : prefetches){
-            this.prefetchesMap.put(prefetch, PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-        }
-    }
-
     /**
      * Adds prefetch path with semantics to this query.
      *
@@ -150,16 +128,6 @@ public class SelectQueryDescriptor extends QueryDescriptor {
         this.prefetchesMap.put(prefetchPath, semantics);
     }
 
-    /**
-     * Adds single prefetch path to this query.
-     *
-     * @deprecated since 4.1 use {@link #addPrefetch(String, int)}
-     */
-    @Deprecated
-    public void addPrefetch(String prefetchPath) {
-        this.prefetchesMap.put(prefetchPath, PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-    }
-
     /**
      * Removes single prefetch path from this query.
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
index 3278036fd..2e5fda6ec 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
@@ -93,27 +93,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return new SQLSelect<>(type, sql);
 	}
 
-	/**
-	 * Creates a query that selects scalar values and uses default routing.
-	 * @deprecated since 4.2. Use {@link #scalarQuery(String, Class)} method.
-	 */
-	@Deprecated
-	public static <T> SQLSelect<T> scalarQuery(Class<T> type, String sql) {
-		return scalarQuery(sql, type);
-	}
-
-	/**
-	 * Creates a query that selects scalar values and uses routing based on the
-	 * provided DataMap name.
-	 * @deprecated since 4.2. Use {@link #scalarQuery(String, String, Class)} method.
-	 */
-	@Deprecated
-	public static <T> SQLSelect<T> scalarQuery(Class<T> type, String dataMapName, String sql) {
-		SQLSelect<T> query = new SQLSelect<>(sql);
-		query.dataMapName = dataMapName;
-		return query.resultColumnsTypes(type).useScalar();
-	}
-
 	/**
 	 * Creates query that selects scalar value and uses default routing
 	 *
@@ -135,18 +114,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return query.resultColumnsTypes(type).useScalar();
 	}
 
-	/**
-	 * Creates query that selects scalar value and uses default routing
-	 *
-	 * @since 4.1
-	 * @deprecated since 4.2. Use {@link #columnQuery(String)}
-	 */
-	@Deprecated
-	public static SQLSelect<Object[]> scalarQuery(String sql) {
-		SQLSelect<Object[]> query = new SQLSelect<>(sql);
-		return query.useScalar();
-	}
-
 	/**
 	 *  Creates query that selects scalar values (as Object[]) and uses default routing
 	 *
@@ -157,19 +124,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return query.useScalar();
 	}
 
-	/**
-	 * Creates query that selects scalar values (as Object[]) and uses routing based on the
-	 * provided DataMap name.
-	 * @since 4.1
-	 * @deprecated since 4.2. Use {@link #columnQuery(String, String)}
-	 */
-	@Deprecated
-	public static SQLSelect<Object[]> scalarQuery(String sql, String dataMapName) {
-		SQLSelect<Object[]> query = new SQLSelect<>(sql);
-		query.dataMapName = dataMapName;
-		return query.useScalar();
-	}
-
 	/**
 	 * Creates query that selects scalar values (as Object[]) and uses routing based on the
 	 * provided DataMap name.
@@ -182,18 +136,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return query.useScalar();
 	}
 
-	/**
-	 * Creates query that selects scalar values (as Object[]) and uses default routing
-	 *
-	 * @since 4.1
-	 * @deprecated since 4.2. Use {@link #columnQuery(String, Class...)}
-	 */
-	@Deprecated
-	public static SQLSelect<Object[]> scalarQuery(String sql, Class<?>... types) {
-		SQLSelect<Object[]> query = new SQLSelect<>(sql);
-		return query.resultColumnsTypes(types).useScalar();
-	}
-
 	/**
 	 * Creates query that selects scalar values (as Object[]) and uses default routing
 	 *
@@ -204,22 +146,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return query.resultColumnsTypes(types).useScalar();
 	}
 
-	/**
-	 * Creates query that selects scalar values (as Object[]) and uses routing based on the
-	 * provided DataMap name.
-	 *
-	 * @since 4.1
-	 * @deprecated since 4.2. Use {@link #columnQuery(String, String, Class...)}
-	 */
-	@Deprecated
-	public static SQLSelect<Object[]> scalarQuery(String sql,
-												  String dataMapName,
-												  Class<?>... types) {
-		SQLSelect<Object[]> query = new SQLSelect<>(sql);
-		query.dataMapName = dataMapName;
-		return query.resultColumnsTypes(types).useScalar();
-	}
-
 	/**
 	 * Creates query that selects scalar values (as Object[]) and uses routing based on the
 	 * provided DataMap name.
@@ -321,16 +247,6 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
 		return this;
 	}
 
-	/**
-	 * @deprecated since 4.2
-	 * Use {@link #param(String, Object)}
-	 */
-	@Deprecated
-	public SQLSelect<T> params(String name, Object value) {
-		params(Collections.singletonMap(name, value));
-		return this;
-	}
-
 	/**
 	 * @since 4.2
 	 */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/tx/DefaultTransactionDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/tx/DefaultTransactionDescriptor.java
index b5933164c..76fff71b3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/tx/DefaultTransactionDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/tx/DefaultTransactionDescriptor.java
@@ -24,13 +24,14 @@ package org.apache.cayenne.tx;
  */
 public class DefaultTransactionDescriptor extends TransactionDescriptor {
 
-    private static final DefaultTransactionDescriptor instance = new DefaultTransactionDescriptor();
+    private static final TransactionDescriptor instance = TransactionDescriptor
+            .builder()
+            .isolation(TransactionDescriptor.ISOLATION_DEFAULT)
+            .propagation(TransactionPropagation.NESTED)
+            .build();
 
     public static TransactionDescriptor getInstance() {
         return instance;
     }
 
-    private DefaultTransactionDescriptor() {
-        super(TransactionDescriptor.ISOLATION_DEFAULT, TransactionPropagation.NESTED);
-    }
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionDescriptor.java
index 734132a9f..54d769c26 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionDescriptor.java
@@ -47,50 +47,7 @@ public class TransactionDescriptor {
 
     private Supplier<Connection> connectionSupplier;
 
-    private TransactionDescriptor() {
-    }
-
-    /**
-     * @param isolation   one of the following <code>Connection</code> constants:
-     *                    <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
-     *                    <code>Connection.TRANSACTION_READ_COMMITTED</code>,
-     *                    <code>Connection.TRANSACTION_REPEATABLE_READ</code>,
-     *                    <code>Connection.TRANSACTION_SERIALIZABLE</code>, or
-     *                    <code>TransactionDescriptor.ISOLATION_DEFAULT</code>
-     * @param propagation transaction propagation behaviour
-     * @see TransactionPropagation
-     * @deprecated since 4.2. Use {@link #builder()} method instead.
-     */
-    @Deprecated
-    public TransactionDescriptor(int isolation, TransactionPropagation propagation) {
-        this.isolation = isolation;
-        this.propagation = propagation;
-    }
-
-    /**
-     * Create transaction descriptor with desired isolation level and <code>NESTED</code> propagation
-     *
-     * @param isolation one of the following <code>Connection</code> constants:
-     *                  <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
-     *                  <code>Connection.TRANSACTION_READ_COMMITTED</code>,
-     *                  <code>Connection.TRANSACTION_REPEATABLE_READ</code>,
-     *                  <code>Connection.TRANSACTION_SERIALIZABLE</code>, or
-     *                  <code>TransactionDescriptor.ISOLATION_DEFAULT</code>
-     * @deprecated since 4.2. Use {@link #builder()} method instead.
-     */
-    @Deprecated
-    public TransactionDescriptor(int isolation) {
-        this(isolation, TransactionPropagation.NESTED);
-    }
-
-    /**
-     * @param propagation transaction propagation behaviour
-     * @see TransactionPropagation
-     * @deprecated since 4.2. Use {@link #builder()} method instead.
-     */
-    @Deprecated
-    public TransactionDescriptor(TransactionPropagation propagation) {
-        this(ISOLATION_DEFAULT, propagation);
+    protected TransactionDescriptor() {
     }
 
     /**
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/CayenneExceptionTest.java b/cayenne-server/src/test/java/org/apache/cayenne/CayenneExceptionTest.java
deleted file mode 100644
index 6a82b1894..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/CayenneExceptionTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@Deprecated
-public class CayenneExceptionTest {
-
-    @Test
-    public void testConstructor1() throws Exception {
-        CayenneException ex = new CayenneException();
-        assertNull(ex.getCause());
-        assertTrue(ex.getMessage().startsWith(CayenneException.getExceptionLabel()));
-    }
-
-    @Test
-    public void testConstructor2() throws Exception {
-        CayenneException ex = new CayenneException("abc");
-        assertNull(ex.getCause());
-        assertEquals(CayenneException.getExceptionLabel() + "abc", ex.getMessage());
-    }
-
-    @Test
-    public void testConstructor3() throws Exception {
-        Throwable cause = new Throwable();
-        CayenneException ex = new CayenneException(cause);
-        assertSame(cause, ex.getCause());
-        assertEquals(CayenneException.getExceptionLabel() + cause.toString(), ex
-                .getMessage());
-    }
-
-    @Test
-    public void testConstructor4() throws Exception {
-        Throwable cause = new Throwable();
-        CayenneException ex = new CayenneException("abc", cause);
-        assertSame(cause, ex.getCause());
-        assertEquals(CayenneException.getExceptionLabel() + "abc", ex.getMessage());
-    }
-
-    @Test
-    public void testMessageFormatting1() throws Exception {
-        CayenneException ex = new CayenneException("x%sx%sx", "a", "b");
-        assertEquals("xaxbx", ex.getUnlabeledMessage());
-    }
-
-    @Test
-    public void testMessageFormatting2() throws Exception {
-        Throwable cause = new Throwable();
-        CayenneException ex = new CayenneException("x%sx%sx", cause, "a", "b");
-        assertEquals("xaxbx", ex.getUnlabeledMessage());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DbArcIdTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DbArcIdTest.java
deleted file mode 100644
index dacd23954..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DbArcIdTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.access;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.map.DbRelationship;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-public class DbArcIdTest {
-
-    @Test
-    public void testHashCode() {
-
-        DbArcId id1 = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r1"));
-        int h1 = id1.hashCode();
-        assertEquals(h1, id1.hashCode());
-        assertEquals(h1, id1.hashCode());
-
-        DbArcId id1_eq = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r1"));
-        assertEquals(h1, id1_eq.hashCode());
-
-        DbArcId id2 = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r2"));
-        assertNotEquals(h1, id2.hashCode());
-
-        DbArcId id3 = new DbArcId(ObjectId.of("y", "k", "v"),
-                new DbRelationship("r1"));
-        assertNotEquals(h1, id3.hashCode());
-    }
-
-    @Test
-    public void testEquals() {
-
-        DbArcId id1 = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r1"));
-        assertEquals(id1, id1);
-
-        DbArcId id1_eq = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r1"));
-        assertEquals(id1, id1_eq);
-        assertEquals(id1_eq, id1);
-
-        DbArcId id2 = new DbArcId(ObjectId.of("x", "k", "v"),
-                new DbRelationship("r2"));
-        assertNotEquals(id1, id2);
-
-        DbArcId id3 = new DbArcId(ObjectId.of("y", "k", "v"),
-                new DbRelationship("r1"));
-        assertNotEquals(id1, id3);
-
-        assertNotEquals(id1, new Object());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java
deleted file mode 100644
index ea8116659..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.access;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest1;
-import org.apache.cayenne.testdo.relationships_flattened.FlattenedTest3;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.RELATIONSHIPS_FLATTENED_PROJECT)
-public class FlattenedArcKeyIT extends ServerCase {
-
-    @Inject
-    private EntityResolver entityResolver;
-
-    @Test
-    public void testAttributes() {
-        ObjectId src = ObjectId.of("X");
-        ObjectId target = ObjectId.of("Y");
-        ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship(
-                FlattenedTest3.TO_FT1.getName());
-
-        FlattenedArcKey update = new FlattenedArcKey(src, target, r1);
-
-        assertSame(src, update.id1.getSourceId());
-        assertSame(target, update.id2.getSourceId());
-        assertSame(r1, update.relationship);
-    }
-
-    @Test
-    public void testHashCode() {
-        ObjectId src = ObjectId.of("X");
-        ObjectId target = ObjectId.of("Y");
-        ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship(
-                FlattenedTest3.TO_FT1.getName());
-
-        FlattenedArcKey update = new FlattenedArcKey(src, target, r1);
-        FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship());
-
-        ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship(
-                FlattenedTest1.FT3OVER_COMPLEX.getName());
-
-        FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3);
-
-        int h = update.hashCode();
-        int h1 = update1.hashCode();
-        int h2 = update2.hashCode();
-        assertTrue(h == h1);
-        assertTrue(h == update.hashCode());
-        assertFalse(h == h2);
-    }
-
-    @Test
-    public void testEquals() {
-        ObjectId src = ObjectId.of("X");
-        ObjectId target = ObjectId.of("Y");
-        ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship(
-                FlattenedTest3.TO_FT1.getName());
-
-        FlattenedArcKey update = new FlattenedArcKey(src, target, r1);
-        FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship());
-
-        ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship(
-                FlattenedTest1.FT3OVER_COMPLEX.getName());
-
-        FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3);
-
-        assertTrue(update.equals(update1));
-        assertFalse(update.equals(update2));
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
index 0a4e71ece..7c0128c83 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectIT.java
@@ -270,7 +270,7 @@ public class SQLSelectIT extends ServerCase {
 	public void testObjectArrayWithCustomTypeMappedToPojo() throws SQLException {
 		createArtistDataSet();
 
-		List<ArtistDataWrapper> result = SQLSelect.scalarQuery("SELECT * FROM ARTIST_CT",
+		List<ArtistDataWrapper> result = SQLSelect.columnQuery("SELECT * FROM ARTIST_CT",
 				Integer.class, String.class, LocalDateTime.class)
 				.map(ArtistDataWrapper::new)
 				.select(context);
diff --git a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/SQLTemplateResourceManager.java b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/SQLTemplateResourceManager.java
deleted file mode 100644
index 20fbefb08..000000000
--- a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/SQLTemplateResourceManager.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.velocity;
-
-import org.apache.cayenne.util.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
-import org.apache.velocity.Template;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
-import org.apache.velocity.runtime.RuntimeServices;
-import org.apache.velocity.runtime.resource.Resource;
-import org.apache.velocity.runtime.resource.ResourceManager;
-import org.apache.velocity.runtime.resource.loader.ResourceLoader;
-import org.apache.velocity.util.ExtProperties;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.Map;
-
-/**
- * An implementation of the Velocity ResourceManager and ResourceLoader that
- * creates templates from in-memory Strings.
- *
- * @since 1.1
- * @deprecated since 4.1 is unused
- */
-@Deprecated
-public class SQLTemplateResourceManager
-    extends ResourceLoader
-    implements ResourceManager {
-
-    protected Map<String, Template> templateCache;
-
-    public void initialize(RuntimeServices rs) {
-        super.rsvc = rs;
-        this.templateCache = new ConcurrentLinkedHashMap.Builder<String, Template>().maximumWeightedCapacity(100).build();
-    }
-
-    public void clearCache() {
-        templateCache.clear();
-    }
-
-    /**
-     * Returns a Velocity Resource which is a Template for the given SQL.
-     */
-    public Resource getResource(String resourceName, int resourceType, String encoding)
-        throws ResourceNotFoundException, ParseErrorException {
-
-        synchronized (templateCache) {
-            Template resource = templateCache.get(resourceName);
-
-            if (resource == null) {
-                resource = new Template();
-                resource.setRuntimeServices(rsvc);
-                resource.setResourceLoader(this);
-                resource.setName(resourceName);
-                resource.setEncoding(encoding);
-                resource.process();
-
-                templateCache.put(resourceName, resource);
-            }
-
-            return resource;
-        }
-    }
-
-    public String getLoaderNameForResource(String resourceName) {
-        return getClass().getName();
-    }
-
-    @Override
-    public long getLastModified(Resource resource) {
-        return -1;
-    }
-
-    @Override
-    public Reader getResourceReader(String source, String charset)
-        throws ResourceNotFoundException {
-        return new InputStreamReader(new ByteArrayInputStream(source.getBytes()));
-    }
-
-    @Override
-    public void init(ExtProperties configuration) {
-
-    }
-
-    @Override
-    public boolean isSourceModified(Resource resource) {
-        return false;
-    }
-}
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index 5708bc1ff..cb925f487 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SQLTemplateDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.query.Ordering;
+import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.wocompat.parser.Parser;
@@ -271,7 +272,7 @@ public class EOModelProcessor {
 		if (prefetches != null && !prefetches.isEmpty()) {
 			Iterator it = prefetches.iterator();
 			while (it.hasNext()) {
-				descriptor.addPrefetch((String) it.next());
+				descriptor.addPrefetch((String) it.next(), PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 			}
 		}
 
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
index e06efa6a7..5e14c8176 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
@@ -109,14 +109,6 @@ public class EOQuery<T> extends SelectQuery<T> {
 		}
 	}
 
-	/**
-	 * Since 4.1 is unused.
-	 */
-	@Deprecated
-	public String getEOName() {
-		return null;
-	}
-
 	public Collection getBindingNames() {
 		if (bindings == null) {
 			initBindings();